Cubix, 16 bayt
$-!u'HIa'@/1@O<
Net form:
$ -
! u
' H I a ' @ / 1
@ O < . . . . .
. .
. .
Kendin dene
Dosya ondalık bayt değerlerini ayrı bir listeye girmelisiniz. Ayırıcı önemli değildir, basamak veya eksi işareti olmayan herhangi bir şey yeterlidir. Kod gerçekten sadece ilk baytı önemser, böylece isterseniz dosyanın geri kalanını dışarıda bırakabilirsiniz. Program 0
kayıpsız ve 1
kayıplı için çıktı. Burada deneyin ! Varsayılan giriş bir FLAC üstbilgisi kullanır.
açıklama
Dosyalar hakkında güzel olan şey, (neredeyse) hepsinin sözde sihire sahip olmasıdır. Bunlar dosyanın ilk birkaç baytıdır. İyi bir yazılım dosya uzantısını kontrol etmez, bunun yerine belirli bir dosyayı işleyip işleyemeyeceğini görmek için dosya büyüsünü kontrol eder.
Dennis, sıkıştırma türünü bulmak için bu büyüyü kullanmanın bir yolunu buldu, ancak ilk baytı atması beni ikinci bayttan ziyade ilk baytı kullanan bir yöntem bulmaya çalışmak istedi. Sonuçta, bu topluluk tamamen bayt tasarrufu ile ilgilidir.
Farklı dosya türlerinin ilk baytlarının listesi. Onları iki gruba ayırdım: kayıplı ve kayıpsız. Ondalık, onaltılı ve ikili sayıdaki ilk bayt değerleri aşağıda verilmiştir. Zaten bir desen görebilirsiniz ...
Lossy: Lossless:
255:0xFF:0b11111111 102:0x66:0b01100110
79:0x4F:0b01001111 84:0x54:0b01010100
35:0x23:0b00100011 82:0x52:0b01010010
11:0x0B:0b00001011 70:0x46:0b01000110
0:0x00:0b00000000
Gördüğüm desen, ikinci bitin (soldan sağa sayılan) her zaman "kayıpsız" baytlarda açık olması ve beşinci bitin her zaman kapalı olmasıydı. Bu kombinasyon hiçbir kayıplı formatta görünmez. Bunu "ayıklamak" için, basitçe bir ikili AND (by 0b01001000 (=72)
) yapar ve sonra karşılaştırırız 0b01000000 (=64)
. Her ikisi de eşitse, giriş biçimi kayıpsızdır, aksi takdirde kayıptır.
Ne yazık ki, Cubix'in böyle bir karşılaştırma operatörü yok, bu yüzden çıkarma kullandım (sonuç 64 ise, bu 0 verir ve aksi takdirde 8, -56 veya -64 ile sonuçlanır. Buna daha sonra geri döneceğim.
İlk olarak, programın başından başlayalım. İkili AND a
komutu kullanılarak yapılır :
'HIa
'H # Push 0b01001000 (72)
I # Push input
a # Push input&72
Daha sonra, çıkarma kullanarak 64 ile karşılaştırırız (bu kısmın ortasında IP'yi üst yüze [ilk satır, ikinci karakter, güneyi işaret eder) yansıtan bir aynaya çarptığımızı unutmayın).
'@-
'@ # Push 0b01000000 (64)
- # Subtract from (input&72)
# Yields 0 for lossy, non-zero otherwise
IP, tarafından döndürüldükten sonra, yığının üst kısmı sıfır değilse (ve yalnızca) yığına u
itmek için bir miktar kontrol akışı kullanırız 1
:
!$1
! # if top = 0:
$1 # do nothing
# else:
1 # push 1
Küpün etrafına sarıldıktan sonra <
, IP'yi dördüncü satırda gösteren talimatı vurduk. Tek yapmanız gereken çıktı ve sonlandırmak.
O@
O # Output top of the stack as number
@ # End program
Böylece, program 0
kayıpsız ve 1
kayıplı için çıktı.