Diberikan file audio, tentukan apakah itu dikodekan dalam format lossy atau format lossless. Untuk keperluan tantangan ini, hanya format berikut yang perlu diklasifikasikan:
Aturan
- Jika input diambil dalam bentuk nama file, tidak ada asumsi yang harus dibuat tentang nama file (misalnya ekstensi tidak dijamin benar untuk format, atau bahkan ada).
- Tidak akan ada metadata ID3 atau APEv2 yang ada dalam file input.
- Dua output unik dan dapat dibedakan dapat digunakan, seperti
0
dan1
,lossy
danlossless
,foo
danbar
, dll.
Uji Kasus
Kasing uji untuk tantangan ini terdiri dari file zip yang terletak di sini yang berisi dua direktori: lossy
dan lossless
. Setiap direktori berisi beberapa file audio yang semuanya 0,5 detik gelombang sinus 440 Hz, disandikan dalam berbagai format. Semua file audio memiliki ekstensi yang cocok dengan format di atas, dengan pengecualian A440.m4a
(yang merupakan audio AAC dalam wadah MPEG Layer 4).
Jawaban:
Jelly ,
75 byteFormat lossy mengembalikan 0 , format lossless mengembalikan 1 .
Cobalah online! (permalinks dalam Gist)
Latar Belakang
Format yang harus kita dukung memiliki angka ajaib berikut, yakni mulai dengan byte ini.
Entri lekukan adalah wadah untuk format sebelumnya yang muncul dalam kasus uji.
?
menunjukkan byte variabel..
menunjukkan byte yang tidak dapat dicetak. Semua byte lainnya ditampilkan sebagai karakter ISO 8859-1 mereka.Dengan hanya melihat byte kedua, kita dapat menentukan format dengan cara yang mudah:
Format lossless memiliki huruf besar sebagai byte kedua, sedangkan format lossy tidak.
Bagaimana itu bekerja
sumber
C,
828032 byteTerinspirasi oleh jawaban @Dennis , ini dapat dikurangi lebih jauh:
Pipa data file ke stdin. Mengembalikan 0 untuk lossless, atau bukan nol untuk lossy.
Atau cek lagi yang asli:
Pipa data file ke stdin. Mengembalikan bukan nol (1) untuk lossless, atau 0 untuk lossy.
Dari apa yang bisa saya katakan, semua format yang Anda daftarkan memiliki angka ajaib yang terpisah (kecuali AIFF / WAV, tetapi keduanya sama-sama lossless), jadi ini hanya memeriksa angka ajaib itu untuk nilai lossless yang diketahui. Ini
*v&&
hanya untuk melindungi file yang cocok yang dimulai dengan byte nol (M4A).Saya telah memasukkan nilai yang saya temukan di lembar spesifikasi (
fLaC
= FLAC,RIFF
= WAV / AIFF,TTA1
= TTA), danFORM
= AIFF danFFM2
= TTA berasal dari file sampel yang disediakan (Saya hanya bisa menebak ini adalah format pembungkus atau versi yang lebih baru).Atau alternatif kecurangan yang terasa seperti:
File Bash +, 61 byte
Mengambil nama file sebagai argumen. Mengembalikan 0 untuk lossless, atau bukan nol untuk lossy.
Lakukan persis seperti yang Anda harapkan; bertanya
file
apa jenis file itu, kemudian memeriksa pola yang dikenal. Pertandingan TTA: d
(: data
), pertandingan AIFF / WAVIF
, dan FLACFL
. Tak satu pun dari hasil lossless cocok dengan semua ini, dan saya telah menguji bahwa itu masih berfungsi jika nama file dihapus.Pengujian:
sumber
file
juga tidak percaya ekstensi (banyak pengguna mengubah nama png menjadi jpeg sama dengan mengonversinya!)GS2 , 3 byte
Format lossy mengembalikan 0 , format lossless mengembalikan 1 .
Cobalah online! (permalinks dalam Gist)
Latar Belakang
Format yang harus kita dukung memiliki angka ajaib berikut, yakni mulai dengan byte ini.
Entri lekukan adalah wadah untuk format sebelumnya yang muncul dalam kasus uji.
?
menunjukkan byte variabel..
menunjukkan byte yang tidak dapat dicetak. Semua byte lainnya ditampilkan sebagai karakter ISO 8859-1 mereka.Dengan hanya melihat byte kedua, kita dapat menentukan format dengan cara yang mudah:
Format lossless memiliki huruf besar sebagai byte kedua, sedangkan format lossy tidak.
Bagaimana itu bekerja
sumber
JavaScript (ES6), 20 byte
Penjelasan
Mengambil isi file sebagai input dan kembali
true
jika file tersebut lossless ataufalse
jika lossy dengan menguji karakter pertama dari masukan itu untuk melihat apakah itu adalahf
,F
,R
atauT
.Cobalah
Rekatkan isi file ke dalam
textarea
.Upaya kedua,
8163 byteMengambil konten file dari URL yang disediakan, yang ternyata berlebihan.
Upaya pertama,
14611689 byteTidak valid karena tipe mime terkait dengan ekstensi dan, tampaknya, header respons memenuhi syarat sebagai input tambahan.
sumber
AddType <mime> <extension>
, atau IIS<MimeMap>
. Tentu saja alat penyiapan atau penginangan file tertentu dapat melakukan inspeksi yang tepat, dan itu pantas membuat pilihan server menjadi bagian dari jawabannya (karena serverlah yang menentukan jenis file!)Chip , 11 byte
Tanpa malu-malu meniru jawaban Dennis 'Jelly di Chip.
Returnless loss
0x0
, returny lossy0x1
.Cobalah online , tautan di intisari (terima kasih Dennis untuk strategi TIO di sini)
Menjelaskan!
Porsi ini adalah housekeeping: ia
S
mengambil byte pertama, dant
berkembang setelah byte kedua.Ini adalah daging keputusan. Setiap byte input diakses oleh bit
HGFEDCBA
. JikaG
diatur, danF
tidak, itu berarti byte berada dalam kisaran0x40
ke0x5f
(yang kira-kira setara dengan 'huruf besar', dan cukup baik untuk tugas yang dihadapi).Namun, untuk penghematan byte, saya membalikkan keputusan ini dari
G and (not F)
menjadi(not G) or F
, karena atau dapat tersirat dalam Chip.Nilai true / false yang dihasilkan ini kemudian ditempatkan ke dalam
a
, yang merupakan bit terendah dari output. (Semua bit lainnya akan menjadi nol). Di TIO, saya menjalankan output melalui hexdump sehingga nilainya terlihat.Secara ekuivalen, dalam C-ish, orang akan mengatakan sesuatu seperti:
sumber
Cubix, 16 byte
Bentuk bersih:
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, dan1
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 ...
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 dengan0b01000000 (=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: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).
Setelah IP diputar oleh
u
, kami menggunakan beberapa aliran kontrol untuk mendorong a1
ke tumpukan jika (dan hanya jika) bagian atas tumpukan tidak nol:Setelah kami membungkus kubus, kami menekan
<
instruksi, yang menunjuk IP barat di baris keempat. Yang harus dilakukan hanyalah output dan terminasi.Jadi, output program
0
untuk lossless, dan1
untuk lossy.sumber