Cubix, 16 byte
$-!u'HIa'@/1@O<
Bentuk bersih:
$ -
! u
' H I a ' @ / 1
@ O < . . . . .
. .
. .
Cobalah sendiri
Anda harus memasukkan nilai byte desimal file dalam daftar yang terpisah. Pemisah tidak masalah, apa pun yang bukan angka atau tanda minus sudah cukup. Kode ini benar-benar hanya peduli pada byte pertama, sehingga Anda dapat meninggalkan sisa file jika Anda mau. Output program 0
untuk lossless, dan 1
lossy. Coba di sini ! Input default menggunakan header FLAC.
Penjelasan
Yang menyenangkan tentang file adalah (hampir) semuanya memiliki keajaiban. Itu adalah beberapa byte pertama dari file. Perangkat lunak yang baik tidak memeriksa ekstensi file, tetapi sihir file untuk melihat apakah ia dapat menangani file tertentu.
Dennis telah menemukan cara untuk menggunakan sihir ini untuk menemukan tipe kompresi, tetapi fakta bahwa ia membuang byte pertama membuat saya ingin mencoba membuat metode yang menggunakan byte pertama, bukan yang kedua. Bagaimanapun, komunitas ini adalah tentang cara menyimpan byte.
Berikut adalah daftar byte pertama dari berbagai jenis file. Saya memesannya dalam dua kelompok: lossy dan lossless. Berikut adalah nilai byte pertama mereka dalam desimal, heksadesimal, dan biner. Anda mungkin sudah melihat pola ...
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
Pola yang saya lihat, adalah bahwa bit kedua (dihitung dari kiri ke kanan) selalu menyala pada byte "lossless" dan bit kelima selalu mati. Kombinasi ini tidak muncul dalam format lossy mana pun. Untuk "mengekstrak" ini, kita cukup melakukan biner AND (oleh 0b01001000 (=72)
) dan kemudian membandingkannya dengan 0b01000000 (=64)
. Jika keduanya sama, format input adalah lossless, jika tidak lossy.
Sayangnya, Cubix tidak memiliki operator pembanding seperti itu, jadi saya menggunakan pengurangan (jika hasilnya 64, ini menghasilkan 0, dan hasilnya 8, -56 atau -64 sebaliknya. Saya akan kembali ke sini nanti.
Pertama, mari kita mulai dari awal program. Biner AND dilakukan dengan menggunakan a
perintah:
'HIa
'H # Push 0b01001000 (72)
I # Push input
a # Push input&72
Kemudian, kami membandingkan dengan 64 menggunakan pengurangan (perhatikan kami menabrak cermin yang mencerminkan IP ke wajah atas [baris pertama, karakter kedua, menunjuk ke selatan] di tengah bagian ini).
'@-
'@ # Push 0b01000000 (64)
- # Subtract from (input&72)
# Yields 0 for lossy, non-zero otherwise
Setelah IP diputar oleh u
, kami menggunakan beberapa aliran kontrol untuk mendorong a 1
ke tumpukan jika (dan hanya jika) bagian atas tumpukan tidak nol:
!$1
! # if top = 0:
$1 # do nothing
# else:
1 # push 1
Setelah kami membungkus kubus, kami menekan <
instruksi, yang menunjuk IP barat di baris keempat. Yang harus dilakukan hanyalah output dan terminasi.
O@
O # Output top of the stack as number
@ # End program
Jadi, output program 0
untuk lossless, dan 1
untuk lossy.