Hanya Even Bytes


64

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


2
Beberapa bahasa memiliki kesulitan membaca input multi-baris, tetapi tidak seperti tantangan ini dimaksudkan untuk menjadi mudah, jadi mungkin tidak masalah. : P Bisakah input kosong?
Dennis

9
!#%')+-/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|~
Patrick Roberts

9
Cukup praktis bahwa semua vokal dilarang ... ;-)
owacoder

4
Welp, sangat banyak bagi BF yang memiliki peluang dalam tantangan ini.
TLW

2
Juga perhatikan bahwa jika Anda memiliki jeda baris dalam file DOS / Windows, [CR]memiliki sedikit aneh. Saya berharap WhiteSpace aman, tetapi sayang sekali [TAB]. Jika Anda ingin sekolah tua, EBCDIC memberi Anda tiga vokal.
GuitarPicker

Jawaban:


26

GS2 , 4 byte

dΦ("

Cobalah online!

Hexdump

0000000: 64 e8 28 22                                      d.("

Bagaimana itu bekerja

      (implicit) Read all input and push it on the stack.
 Φ    Map the previous token over all characters in the string:
d       Even; push 1 for even characters, 0 for odd ones.
  (   Take the minimum of the resulting list of Booleans.
   "  Negate the minimum.

21

Befunge, 36 byte

Saya tahu ini adalah pertanyaan lama, tetapi saya ingin mencobanya karena saya pikir ini akan menjadi tantangan yang menarik di Befunge.

>~:0`|
>20`:>$.@
|` " "<
*8*82<^p24*

Cobalah online!

Ini output 1jika input rusak (yaitu berisi byte aneh), dan 0jika 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 (urutan 28*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 jalan 20`:>$.. Karena dua lebih besar dari nol, perbandingan mendorong satu ke tumpukan, dan :membuat salinan duplikat sehingga $tidak akan menjatuhkannya sebelum mendapat hasil.


1
Ini mungkin terlambat dan baru tetapi sudah menjadi jawaban favorit saya.
Wheat Wizard

@Watwizard Saya baru saja menyadari sekarang mengapa jawaban ini telah mendapatkan begitu banyak perhatian. Terima kasih atas hadiahnya!
James Holderness

12

CJam (11 byte)

"r2":(~f&2b

Demo online

Mengurangi trik untuk menghindari byte aneh, ini berkurang menjadi

q1f&2b

yang membaca input, memetakan bitwise AND dengan 1, dan kemudian melakukan konversi basis, memberikan nol jika semua ANDs adalah nol.


3
Kode ini menyedihkan:(
betseg

Karena hanya dapat memiliki setengah dari karakter @betseg
Roman Gräf

9

File .COM yang dapat dicetak, 100 byte

^FZjfDXVL\,LPXD$$4"PXD,lHPXDjJXDRDX@PXDjtXDH,nPXDj@XD4`@PXD,ZHPXD4,@PXD4:4"PXDH,\PXD4"PXD,hPXDRDX@P\

Hexdump:

00000000  5e 46 5a 6a 66 44 58 56  4c 5c 2c 4c 50 58 44 24  |^FZjfDXVL\,LPXD$|
00000010  24 34 22 50 58 44 2c 6c  48 50 58 44 6a 4a 58 44  |$4"PXD,lHPXDjJXD|
00000020  52 44 58 40 50 58 44 6a  74 58 44 48 2c 6e 50 58  |RDX@PXDjtXDH,nPX|
00000030  44 6a 40 58 44 34 60 40  50 58 44 2c 5a 48 50 58  |Dj@XD4`@PXD,ZHPX|
00000040  44 34 2c 40 50 58 44 34  3a 34 22 50 58 44 48 2c  |D4,@PXD4:4"PXDH,|
00000050  5c 50 58 44 34 22 50 58  44 2c 68 50 58 44 52 44  |\PXD4"PXD,hPXDRD|
00000060  58 40 50 5c                                       |X@P\|
00000064

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 20hinstruksi (info lebih lanjut tentang ini di https://stackoverflow.com/questions/12591673/ ).

Sumber nyata:

; we want to generate the following fragment of code

;  5E                pop si             ; zero SI (pop near pointer to start of PSP)
;  46                inc si             ; set SI to 1
; loop:
;  B406              mov ah,0x6         ; \
;  99                cwd                ; >
;  4A                dec dx             ; > D-2106--DLFF
;  CD21              int 0x21           ; > DIRECT CONSOLE INPUT
;  7405              jz end             ; > jump if no more input
;  40                inc ax             ; > lsb 0/1 odd/even
;  21C6              and si,ax          ; > zero SI on first odd byte
;  EBF3              jmp short loop     ; /
; end:
;  96                xchg ax,si         ; return code
;  B44C              mov ah,0x4c        ; D-214C
;  CD21              int 0x21           ; TERMINATE WITH RETURN CODE

 pop si             ; this two opcodes don't need to be encoded
 inc si

 pop dx             ; DX = 20CD (int 0x20 at start of PSP)
 push byte +0x66
 inc sp
 pop ax
 push si
 dec sp
 pop sp             ; SP = 0x0166
 sub al,0x4c        ; B4
 push ax
 pop ax
 inc sp
 and al,0x24
 xor al,0x22        ; 06
 push ax
 pop ax
 inc sp
 sub al,0x6c
 dec ax             ; 99
 push ax
 pop ax
 inc sp
 push byte +0x4a    ; 4A
 pop ax
 inc sp
 push dx            ; [20]CD
 inc sp
 pop ax
 inc ax             ; 21
 push ax
 pop ax
 inc sp
 push byte +0x74    ; 74
 pop ax
 inc sp
 dec ax
 sub al,0x6e        ; 05
 push ax
 pop ax
 inc sp
 push byte +0x40    ; 40
 pop ax
 inc sp
 xor al,0x60
 inc ax             ; 21
 push ax
 pop ax
 inc sp
 sub al,0x5a
 dec ax             ; C6
 push ax
 pop ax
 inc sp
 xor al,0x2c
 inc ax             ; EB
 push ax
 pop ax
 inc sp
 xor al,0x3a
 xor al,0x22        ; F3
 push ax
 pop ax
 inc sp
 dec ax
 sub al,0x5c        ; 96
 push ax
 pop ax
 inc sp
 xor al,0x22        ; B4
 push ax
 pop ax
 inc sp
 sub al,0x68        ; 4C
 push ax
 pop ax
 inc sp
 push dx            ; [20]CD
 inc sp
 pop ax
 inc ax
 push ax            ; 21
 pop sp             ; now get the stack out of the way

9

MATL , 7 byte

l$Z$2\z

Kode sumber menggunakan pengkodean UTF-8. Jadi byte sumber adalah (dalam desimal)

108    36    90    36    50    92   122

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

l    % Push a 1. We use `l` instead of `1` to have an even value
$    % Input specificication. This indicates that the next function takes 1 input
Z$   % Input file name implicitly, read its raw bytes and push them as an array of chars
2\   % Modulo 2
z    % Number of nonzero values. This gives the number of odd bytes. Implicitly display

8

CJam, 18 17 15 byte

"<rj":(((*~:|X&

Diasumsikan bahwa lokal diatur ke Latin-1. Cobalah online!

Bagaimana itu bekerja

Solusi langsungnya adalah sebagai berikut.

q       e# Read all input from STDIN and push it as a string on the stack.
 :i     e# Cast each character to its code point.
   :|   e# Take the bitwise OR of all code points.
     X  e# Push 1.
      & e# Take the bitwise AND of the logical OR and 1.

Sayangnya, karakter qdan itidak dapat muncul dalam kode sumber. Untuk mengatasi masalah ini, kita akan membuat bagian dari kode sumber di atas secara dinamis, kemudian mengevaluasi string.

"<rj"         e# Push that string on the stack.
     :(       e# Decrement all characters, pushing ";qi".
       (      e# Shift out the first character, pushing "qi" and ';'.
        (     e# Decrement ';' to push ':'.
         *    e# Join "qi" with separator ':', pushing "q:i". 
          ~   e# Evaluate the string "q:i", which behaves as explained before.

7

Pyth, 20 13 byte

vj0>LhZ.BRj.z

Atau dalam biner:

00000000: 01110110 01101010 00110000 00111110 01001100 01101000  vj0>Lh
00000006: 01011010 00101110 01000010 01010010 01101010 00101110  Z.BRj.
0000000c: 01111010                                               z

Cobalah online

Bagaimana itu bekerja

           .z   all lines of input
          j     join on newline
       .BR      convert each character to binary
   >LhZ         take the last (0 + 1) characters of each binary string
 j0             join on 0
v               evaluate as an integer

Bilangan bulat yang dihasilkan adalah benar (bukan nol) jika salah satu byte aneh.


4

Jelly , 13 byte

24‘ịØBvF|\ṪBṪ

Mengharapkan input sebagai argumen baris perintah yang dikutip. Cobalah online!

Hexdump

0000000: 32 34 fc d8 12 42 76 46 7c 5c ce 42 ce           24...BvF|\.B.

Jika bukan karena pembatasan byte aneh, ini sama-sama akan bekerja di 6 bytes: O%2¬Ạ¬.
Erik the Outgolfer

4

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.

`"| |\$|&|\(|\*|,|\.|0|2|4|6|8|:|<|>|@|B|D|F|H|J|L|N|P|R|T|V|X|Z|\\|\^|`|b|d|f|h|j|l|n|p|r|t|v|x|z|\||~

.

Cobalah online

Karena .secara default tidak cocok dengan baris baru, saya tidak harus menghapusnya.


1

Perl 5 + -p0, 136 byte

Mirip dengan jawaban lain, ini menghapus semua byte bahkan dan meninggalkan byte aneh (yang benar).

tr<�
 "$&(*,.02468:<>@BDFHJLNPRTVXZ\\^`bdfhjlnprtvxz|~€‚„†ˆŠŒŽ’”–˜šœž ¢¤¦¨ª¬®°²´¶¸º¼¾ÀÂÄÆÈÊÌÎÐÒÔÖØÚÜÞàâäæèêìîðòôöøúüþ><>d

Cobalah online!


-0tidak melakukan apa pun pada baris baru. Ini hanya menentukan cara membagi input, tidak menghapus karakter apa pun.
Ørjan Johansen

Aduh, itu terlalu buruk.
Ørjan Johansen

@ ØrjanJohansen Ya, Anda benar tentang -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!
Dom Hastings

Jadi itu berhasil sekarang? Kira saya harus menghapus beberapa komentar. Dari edit diff, saya melihat Anda sekarang termasuk setiap byte bahkan dalam program ini. Saya pikir Anda mungkin ingin mengatakan itu secara eksplisit, karena tidak semua karakter muncul (setidaknya untuk saya).
Ørjan Johansen

@ ØrjanJohansen ya! Saya pikir saya sudah mendapatkannya sekarang. Saya tidak berpikir semua jawaban lain mencakup semua bahkan byte, saya pikir beberapa hanya berfungsi pada ASCII yang dapat dicetak. Saya cukup yakin ini melakukan apa yang saya inginkan sekarang. Saya berharap demikian!
Dom Hastings

0

Japt , 10 byte

ø0ôH² ®dZÄ

Cobalah online!

Codepage Japt adalah ISO-8859-1. Kode memberi falseketika dirinya dimasukkan sebagai string, oleh karena itu pengajuan yang valid.

Dibongkar & Cara kerjanya

Uø0ôHp2  mZ{ZdZ+1

Uø      Does input string contain any element in the following array...?
0ôHp2     Range of 0 to 32**2, inclusive
mZ{       Map...
ZdZ+1       Convert the number Z to a char having charcode 2*Z+1

Tidak memiliki String.c(mendapatkan kode sandi, atau memetakan di atas kode karakter) itu menyebalkan, tapi untungnya ada Number.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):

®c uÃn

Unpacked: UmZ{Zc u} n

UmZ{   Map on each char...
Zc u     Convert to charcode modulo 2
}
n      Convert the resulting string to number

"000..000"dikonversi ke angka 0 (falsy) terlepas dari berapa lama itu. Di sisi lain, apa pun yang mengandung 1 dikonversi menjadi bukan nol double, atau Infinityjika terlalu besar (keduanya benar).

¬d_c u

Unpacked: q dZ{Zc u

q    Convert to array of chars
dZ{  Is something true when mapped with...
Zc u   Convert each char to charcode modulo 2

Pendekatan yang lebih langsung yang langsung menghasilkan trueatau false.

Atau, solusi 5 byte bahkan dimungkinkan dengan bantuan -dflag:

¨c u

Unpacked: q mZ{Zc u

q     Convert to array of chars
mZ{   Map...
Zc u    Convert to charcode modulo 2

      Result is array of zeros and ones
-d    Apply .some() on the resulting array
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.