Sadece Hatta Baytlar


64

Senaryo

Son zamanlarda en sevdiğiniz metin editörüyle ilgili garip davranışlar fark ettiniz. İlk başta, diske yazarken kodunuzdaki rasgele karakterleri görmezden geliyor gibiydi. Bir süre sonra bir kalıp farkettiniz; garip ASCII değerleri olan karakterler göz ardı edildi. Daha fazla inceleme yaptığınızda, yalnızca her sekizinci bit sıfırsa dosyalara doğru şekilde yazabileceğinizi keşfettiniz. Şimdi değerli dosyalarınızın bu garip hatadan etkilenip etkilenmediğini bilmeniz gerekiyor.

Görev

Bir dosyanın tek bir bayt içerip içermediğini belirleyen tam bir program yazmalısınız (bozuk olduğunu gösteren). Ancak, metin düzenleyiciniz nedeniyle kaynak kodunuzda hiçbir tuhaf bayt yazamazsınız. Girdi için önceden var olan herhangi bir kodlamayı varsayabilirsin, ancak yine de sadece karakterleri değil her bir baytı kontrol etmelisin.

Giriş

Programınız içeriğini veya bir dosyanın yolunu stdin veya komut satırından alır.

Çıktı

Verilen dosya tek bir bayt içeriyorsa programınız stdout değerine ya da her sekizinci bit sıfırsa bir yanlışlık çıkarır.

Kriterler

Bu kod golf, görevi tamamlayan en kısa program. Geçerli bir başvuru olması için, dosya kaynak kodundaki her sekizinci bit bir sıfır olmalıdır. Kaynak kodunuzun ikili dosyalarının bir kopyasını gönderiminize eklemenizi öneririm.

Standart boşluklar uygulanır.

Test Kılıfları

(ASCII kodlamasında) Giriş:

"$&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~

Output:
falsy

Input:
!#%')+-/13579;=?ACEGIKMOQSUWY[]_acegikmoqsuwy{}

Output:
truthy

Input:
LOREMIPSVMDOLORSITAMETCONSECTETVRADIPISCINGELITSEDDOEIVSMODTEMPORINCIDIDVNTVTLABOREETDOLOREMAGNAALIQVA
VTENIMADMINIMVENIAMQVISNOSTRVDEXERCITATIONVLLAMCOLABORISNISIVTALIQVIPEXEACOMMODOCONSEQVAT
DVISAVTEIRVREDOLORINREPREHENDERITINVOLVPTATEVELITESSECILLVMDOLOREEVFVGIATNVLLAPARIATVR
EXCEPTEVRSINTOCCAECATCVPIDATATNONPROIDENTSVNTINCVLPAQVIOFFICIADESERVNTMOLLITANIMIDESTLABORVM

Output:
truthy

İpuçları

  • Akıllıca dil seçin Bu meydan okuma her dilde mümkün olmayabilir

  • Unix komutu xxd -b <file name>, bir dosyanın ikili dosyalarını konsola yazdıracak (bazı ekstra biçimlendirme öğeleriyle birlikte)

  • Tüm diğer kurallara uyulduğu sürece, UTF-8 gibi ASCII dışındaki diğer kodlamaları kullanabilirsiniz.


2
Bazı diller çok satırlı girişi okumakta zorlanıyor, ancak bu zorluğun kolay olması gerektiği gibi değil, o yüzden sorun değil. : P Giriş boş olabilir mi?
Dennis,

9
!#%')+-/13579;=?ACEGIKMOQSUWY[]_acegikmoqsuwy{}umurunda olan herkes için yasak yazdırılabilir ASCII karakterleridir. İzin verilen yazdırılabilir ASCII karakterleri" $&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~
Patrick Roberts

9
Tüm ünlülerin yasaklı olması oldukça kullanışlı ... ;-)
owacoder

4
Welp, BF için bu zorlukta bir şansı var.
TLW

2
Ayrıca, bir DOS / Windows dosyasında satır sonları [CR]varsa, tek biti bulunduğunu unutmayın. WhiteSpace'in güvende olduğunu umuyordum, ama ne yazık ki [TAB]. Eski okula gitmek istiyorsanız, EBCDIC size üç sesli harf verir.
GuitarPicker

Yanıtlar:


26

GS2 , 4 bayt

dΦ("

Çevrimiçi deneyin!

HexDump

0000000: 64 e8 28 22                                      d.("

Nasıl çalışır

      (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 bayt

Bunun eski bir soru olduğunu biliyorum, ama denemek istedim çünkü Befunge'de ilginç bir zorluk olacağını düşündüm.

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

Çevrimiçi deneyin!

Bu çıktılar 1girişi (yani bir tek bayt içerir) bozuksa ve 0sorun olup olmayacağını.

açıklama

Sorun, (bayt /) veya %(modulo) komutlarına erişmeden tek baytların nasıl belirleneceğidir . Çözüm, değeri 128 (dizi 28*8**) ile çarpmak ve sonra bu sonucu oyun alanına yazmaktı. Kesinlikle standart bir yorumlayıcıda, oyun alanı hücreleri 8 bitlik değerlere imzalanır, böylece 128 ile çarpılan tek sayı, çift sayı 0 olurken -1 ile kesilir.

Diğer numara, g(get) komutuna erişmeden, oyun alanından -1 veya 0 değerini geri okumaktı . Bunun için geçici çözüm, değeri varolan bir dize dizisinin ( " ") ortasına yazmak , ardından ekteki değeri yığının üzerine itmek için bu diziyi yürütmekti. Bu noktada, baytın tuhaflığını belirlemek, sıfırdan küçük bir testtir.

Tartışmaya değer son bir sonuç çıktı. Yanlış durumda, >$.yığında yalnızca bir değer bulunan diziye ulaşırız , bu nedenle çıktısını sıfır $yapan yığını temizler .. Gerçek durumda, yolu takip ediyoruz 20`:>$.. İkisi sıfırdan büyük olduğundan, karşılaştırma birini istifin üzerine iter ve :yinelenen bir kopya oluşturur, böylece $çıktı alınmadan önce bırakmaz.


1
Bu geç ve yeni olabilir, ama zaten en sevdiğim cevap.
Buğday Sihirbazı,

@WheatWizard Sadece şimdi bu cevabın neden bu kadar dikkat çektiğini anladım. Ödül için teşekkürler!
James Holderness,

12

CJam (11 bayt)

"r2":(~f&2b

Çevrimiçi demo

Tek baytları önlemek için hileleri uzağa atmak, bu azalır

q1f&2b

Bu, girişi okuyan, bitli bir şekilde VE ile eşlenen 1ve ardından bir AND dönüşümü gerçekleştirerek, AND'lerin tümü sıfır olduğunda sıfır verir.


3
Bu kod üzücü:(
Aralık'ta

Çünkü sadece @ betseg karakterinin yarısına sahip olabilir
Roman Gräf

9

Yazdırılabilir .OM dosyası, 100 bayt

^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

Bir kullanılması çok gevşek makul bir insan tarafından yazılan ve ilham edilebilir bir şey olarak kaynağın tanımı EICAR Standart Antivirüs Testi Dosya (en fazla bilgi "en EICAR test dosyası ile eğlenelim" Bugtraq at).

Yalnızca yazdırılabilir tek olmayan ASCII baytları kullanarak (yan not: kelimeleri etkileyen kodlar garip olma eğilimindedir, W bit bazı kodların lsb'sidir), SP'de bir kod parçası oluşturur (bu kod üretme kodumuzu sadece uygun bir şekilde koyarız) ve yürütme oluşturulan koda düşen biter.

Yığının başlangıçta PSP'nin başlangıcına yakın bir işaretçi içermesi ve PSP'nin başlangıcının INT 20htalimatları içermesi gerçeğini kullanır (bu konuda daha fazla bilgi için https://stackoverflow.com/questions/12591673/ ).

Gerçek kaynak:

; 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 bayt

l$Z$2\z

Kaynak kod UTF-8 kodlamasını kullanır. Böylece kaynak baytları (ondalık)

108    36    90    36    50    92   122

Giriş, tek tırnak işareti içine alınmış bir dize olarak alınan bir dosya adıdır. Çıktı, dosyadaki tek bayt sayısıdır; ki bu, sıfırdan farklıdır.

açıklama

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 bayt

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

Yerel ayarın Latin-1 olarak ayarlandığını varsayar. Çevrimiçi deneyin!

Nasıl çalışır

Basit çözüm şu şekildedir.

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.

Ne yazık ki, karakterler qve ikaynak kodunda görünmüyor. Bu soruna geçici bir çözüm bulmak için, yukarıdaki kaynak kodun bir bölümünü dinamik olarak oluşturacağız, sonra dizgiyi değerlendireceğiz.

"<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 bayt

vj0>LhZ.BRj.z

Veya ikili olarak:

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

Çevrimiçi deneyin

Nasıl çalışır

           .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

Sonuçta ortaya çıkan tamsayı, baytların herhangi biri garip olduğu halde, gerçeğe yakın (sıfır olmayan).


4

Jöle , 13 bayt

24‘ịØBvF|\ṪBṪ

Girdiyi bir komut satırı argümanı olarak bekler. Çevrimiçi deneyin!

HexDump

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

Garip bayt kısıtlama olmasaydı, bu eşit 6 bayt çalışmak olacaktır: O%2¬Ạ¬.
Outgolfer Erik

4

Retina , 106 bayt

İzin verilen her karakteri siler, ardından kalan karakterlerle eşleşir. Gerçek değerler, bulunan karakter sayısı olacaktır. Falsey değerleri olacaktır 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|\||~

.

Çevrimiçi deneyin

Yana .varsayılan olarak yeni satır uymuyor, ben bunları kaldırmak gerekmez.


1

Perl 5 + -p0, 136 bayt

Diğer cevaplara benzer şekilde, bu işlem tüm baytları bile kaldırır ve tuhaf baytları bırakır (ki bu truthy'dir).

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

Çevrimiçi deneyin!


-0newlines'a hiçbir şey yapmaz . Yalnızca girişin nasıl bölüneceğini belirler , karakterleri kaldırmaz.
Ørjan Johansen

Ah, bu çok kötü.
Ørjan Johansen

@ ØrjanJohansen Evet, haklısınız -0, tüm bloğu bir topak olarak yapmak istedim, ama bu önemli olmamalı, ancak bunun üstesinden gelemem ... Çok kötü! Bu yorumları temizleyeceğim. Yine de kafaların için teşekkürler!
Dom Hastings

Yani şimdi çalışıyor mu? Sanırım bazı yorumlarmı silmeliyim. Düzenleme farkından, artık programdaki her bir baytı dahil ettiğinizi görüyorum. Bence açıkça söylemek istersin, çünkü bu karakterlerin hepsi görünmüyor (en azından benim için).
Ørjan Johansen

@ ØrjanJohansen evet! Sanırım şimdi anladım. Diğer tüm cevapların bile baytları kapsadığını sanmıyorum, sadece birkaçının yazdırılabilir ASCII üzerinde çalıştığını düşünüyorum. Şu an istediğimi yaptığına eminim. Her neyse umarım!
Dom Hastings,

0

Japt , 10 bayt

ø0ôH² ®dZÄ

Çevrimiçi deneyin!

Japt'in kod sayfası ISO-8859-1. Kod falsekendisi bir dize olarak girildiğinde verir , bu nedenle geçerli bir gönderi.

Ambalajsız ve Nasıl Çalışır?

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

Sahip olmamak String.c(charCode olsun veya charcodes üzerinde harita) bir ağrı oldu, ama neyse orada Number.d(char numarasını dönüştürün).

Japt’in CJam, Pyth ve Jelly ile kazandığı anlaşıldı :)


Kısıtlama olmadan, bunu 6 baytta yapmanın birkaç yolu vardır (tekrar CJam ve Jelly ile aynı olacak şekilde):

®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"ne kadar uzun olduğuna bakılmaksızın 0 numarasına (sahte) dönüştürülür. Öte yandan, 1 içeren herhangi bir şey sıfır olmayan bir şeye dönüştürülür doubleveya Infinityçok büyükse (her ikisi de truthy).

¬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

Doğrudan trueveya daha fazla verim sağlayan daha basit bir yaklaşım false.

Veya 5 baytlık çözüm -dbayrak yardımı ile bile mümkündür :

¨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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.