Skenarionya
Akhir-akhir ini Anda telah memperhatikan beberapa perilaku aneh dengan editor teks favorit Anda. Pada awalnya sepertinya mengabaikan karakter acak dalam kode Anda saat menulis ke disk. Setelah beberapa saat Anda memperhatikan suatu pola; karakter dengan nilai ASCII ganjil diabaikan. Di bawah pemeriksaan lebih lanjut Anda menemukan bahwa Anda hanya dapat menulis ke file dengan benar jika setiap bit kedelapan adalah nol. Sekarang Anda perlu tahu apakah file Anda yang berharga telah dipengaruhi oleh bug aneh ini.
Tugas
Anda harus menulis program lengkap yang menentukan apakah file berisi byte aneh (menunjukkan tidak rusak). Tetapi karena editor teks Anda, Anda tidak dapat menulis byte aneh di kode sumber Anda. Anda dapat mengasumsikan setiap pengkodean input yang sudah ada untuk input, namun Anda masih harus memeriksa setiap byte individu, bukan hanya karakter.
Memasukkan
Program Anda akan mengambil konten atau path ke file dari stdin atau baris perintah.
Keluaran
Program Anda akan menghasilkan stdout baik nilai kebenaran jika file yang diberikan berisi byte aneh atau palsu jika setiap bit kedelapan adalah nol.
Kriteria
Ini adalah kode golf, program terpendek yang menyelesaikan tugas yang menang. Untuk menjadi kiriman yang valid setiap bit kedelapan dalam kode sumber file harus berupa nol. Saya akan merekomendasikan untuk menyertakan salinan binari kode sumber Anda dalam kiriman Anda.
Celah standar berlaku.
Uji Kasus
(Dalam pengkodean ASCII) Input:
"$&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~
Output:
falsy
Input:
!#%')+-/13579;=?ACEGIKMOQSUWY[]_acegikmoqsuwy{}
Output:
truthy
Input:
LOREMIPSVMDOLORSITAMETCONSECTETVRADIPISCINGELITSEDDOEIVSMODTEMPORINCIDIDVNTVTLABOREETDOLOREMAGNAALIQVA
VTENIMADMINIMVENIAMQVISNOSTRVDEXERCITATIONVLLAMCOLABORISNISIVTALIQVIPEXEACOMMODOCONSEQVAT
DVISAVTEIRVREDOLORINREPREHENDERITINVOLVPTATEVELITESSECILLVMDOLOREEVFVGIATNVLLAPARIATVR
EXCEPTEVRSINTOCCAECATCVPIDATATNONPROIDENTSVNTINCVLPAQVIOFFICIADESERVNTMOLLITANIMIDESTLABORVM
Output:
truthy
Kiat
Pilih bahasa dengan bijak tantangan ini mungkin tidak dapat dilakukan di setiap bahasa
Perintah Unix
xxd -b <file name>
akan mencetak binari file ke konsol (bersama dengan beberapa hal pemformatan tambahan)Anda dapat menggunakan penyandian lain selain ASCII seperti UTF-8 selama semua aturan lain diikuti
sumber
!#%')+-/13579;=?ACEGIKMOQSUWY[]_acegikmoqsuwy{}
adalah karakter ASCII yang dapat dicetak yang dapat dicetak, untuk siapa saja yang peduli. Karakter ASCII yang dapat dicetak yang dapat dicetak adalah" $&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~
[CR]
memiliki sedikit aneh. Saya berharap WhiteSpace aman, tetapi sayang sekali[TAB]
. Jika Anda ingin sekolah tua, EBCDIC memberi Anda tiga vokal.Jawaban:
GS2 , 4 byte
Cobalah online!
Hexdump
Bagaimana itu bekerja
sumber
Befunge, 36 byte
Saya tahu ini adalah pertanyaan lama, tetapi saya ingin mencobanya karena saya pikir ini akan menjadi tantangan yang menarik di Befunge.
Cobalah online!
Ini output
1
jika input rusak (yaitu berisi byte aneh), dan0
jika tidak apa-apa.Penjelasan
Masalahnya adalah bagaimana menentukan byte aneh tanpa memiliki akses ke
/
(membagi) atau%
(modulo) perintah. Solusinya adalah dengan mengalikan nilainya dengan 128 (urutan28*8**
), kemudian tulis hasilnya ke dalam playfield. Pada interpreter yang benar-benar standar, sel-sel playfield ditandatangani nilai 8 bit, sehingga angka ganjil dikalikan dengan 128 menjadi terpotong menjadi -1 sedangkan angka genap menjadi 0.Trik lainnya adalah membaca -1 atau 0 kembali dari playfield tanpa memiliki akses ke perintah
g
(get). Solusi untuk ini adalah menulis nilai ke tengah-tengah urutan string yang ada (" "
), kemudian jalankan urutan itu untuk mendorong nilai terlampir ke tumpukan. Pada saat itu, menentukan keanehan byte adalah tes sederhana yang kurang dari nol.Satu aspek terakhir yang layak dibahas adalah output. Dalam kasus yang salah, kita mencapai
>$.
urutan hanya dengan satu nilai pada tumpukan, jadi$
bersihkan tumpukan tersebut sehingga.
hasilnya menjadi nol. Dalam kasus yang sebenarnya, kita mengikuti jalan20`:>$.
. Karena dua lebih besar dari nol, perbandingan mendorong satu ke tumpukan, dan:
membuat salinan duplikat sehingga$
tidak akan menjatuhkannya sebelum mendapat hasil.sumber
CJam (11 byte)
Demo online
Mengurangi trik untuk menghindari byte aneh, ini berkurang menjadi
yang membaca input, memetakan bitwise AND dengan
1
, dan kemudian melakukan konversi basis, memberikan nol jika semua ANDs adalah nol.sumber
:(
File .COM yang dapat dicetak, 100 byte
Hexdump:
Menggunakan definisi sumber yang sangat longgar sebagai sesuatu yang dapat diketik secara wajar oleh manusia, dan terinspirasi oleh File Uji Antivirus Standar EICAR (info lebih lanjut di "Mari bersenang-senang dengan file uji EICAR" di Bugtraq).
Hanya menggunakan byte ASCII yang tidak dapat dicetak (catatan: opcodes yang mempengaruhi kata-kata cenderung aneh, bit W adalah lsb dari beberapa opcodes), ia membangun fragmen kode di SP (yang kami setel dengan mudah melewati kode penghasil kami) , dan eksekusi akhirnya jatuh ke kode yang dihasilkan.
Ia menggunakan fakta bahwa tumpukan awalnya berisi pointer dekat ke awal PSP, dan bahwa awal PSP berisi
INT 20h
instruksi (info lebih lanjut tentang ini di https://stackoverflow.com/questions/12591673/ ).Sumber nyata:
sumber
MATL , 7 byte
Kode sumber menggunakan pengkodean UTF-8. Jadi byte sumber adalah (dalam desimal)
Input adalah nama file, diambil sebagai string yang dilampirkan dalam tanda kutip tunggal. Outputnya adalah jumlah byte aneh dalam file, yang sebenarnya bukan nol.
Penjelasan
sumber
CJam,
181715 byteDiasumsikan bahwa lokal diatur ke Latin-1. Cobalah online!
Bagaimana itu bekerja
Solusi langsungnya adalah sebagai berikut.
Sayangnya, karakter
q
dani
tidak dapat muncul dalam kode sumber. Untuk mengatasi masalah ini, kita akan membuat bagian dari kode sumber di atas secara dinamis, kemudian mengevaluasi string.sumber
Pyth,
2013 byteAtau dalam biner:
Cobalah online
Bagaimana itu bekerja
Bilangan bulat yang dihasilkan adalah benar (bukan nol) jika salah satu byte aneh.
sumber
Jelly , 13 byte
Mengharapkan input sebagai argumen baris perintah yang dikutip. Cobalah online!
Hexdump
sumber
O%2¬Ạ¬
.Retina , 106 byte
Hapus setiap karakter yang diizinkan, lalu cocokkan dengan karakter yang tersisa. Nilai yang sebenarnya adalah jumlah karakter yang ditemukan. Nilai-nilai Falsey akan menjadi
0
.Cobalah online
Karena
.
secara default tidak cocok dengan baris baru, saya tidak harus menghapusnya.sumber
Perl 5 +
-p0
, 136 byteMirip dengan jawaban lain, ini menghapus semua byte bahkan dan meninggalkan byte aneh (yang benar).
Cobalah online!
sumber
-0
tidak melakukan apa pun pada baris baru. Ini hanya menentukan cara membagi input, tidak menghapus karakter apa pun.-0
, saya ingin melakukan seluruh blok sebagai benjolan, tapi itu tidak masalah, tapi saya tidak bisa mengatasi ini ... Sayang sekali! Saya akan membersihkan komentar ini. Terimakasih untuk pemberitahuannya!Japt , 10 byte
Cobalah online!
Codepage Japt adalah ISO-8859-1. Kode memberi
false
ketika dirinya dimasukkan sebagai string, oleh karena itu pengajuan yang valid.Dibongkar & Cara kerjanya
Tidak memiliki
String.c
(mendapatkan kode sandi, atau memetakan di atas kode karakter) itu menyebalkan, tapi untungnya adaNumber.d
(mengubah nomor menjadi char).Ternyata Japt menang atas CJam, Pyth, dan Jelly :)
Tanpa batasan, ada beberapa cara untuk melakukannya dalam 6 byte (sesuai dengan CJam dan Jelly lagi):
"000..000"
dikonversi ke angka 0 (falsy) terlepas dari berapa lama itu. Di sisi lain, apa pun yang mengandung 1 dikonversi menjadi bukan noldouble
, atauInfinity
jika terlalu besar (keduanya benar).Pendekatan yang lebih langsung yang langsung menghasilkan
true
ataufalse
.Atau, solusi 5 byte bahkan dimungkinkan dengan bantuan
-d
flag:sumber