짝수 바이트


64

시나리오

최근에 좋아하는 텍스트 편집기를 사용하여 이상한 동작을 감지했습니다. 처음에는 디스크에 쓸 때 코드에서 임의의 문자를 무시하는 것처럼 보였습니다. 잠시 후 패턴을 발견했습니다. ASCII 값이 홀수 인 문자는 무시되었습니다. 추가 검사를 통해 매 8 번째 비트가 0 인 경우에만 파일에 올바르게 쓸 수 있음을 발견했습니다. 이제 귀중한 파일이이 이상한 버그의 영향을 받았는지 알아야합니다.

작업

파일에 홀수 바이트가 포함되어 있는지 판별하는 완전한 프로그램을 작성해야합니다 (손상되지 않음). 그러나 텍스트 편집기로 인해 소스 코드에 홀수 바이트를 작성할 수 없습니다. 기존의 입력 인코딩을 가정 할 수 있지만 문자뿐만 아니라 모든 개별 바이트를 계속 확인해야합니다.

입력

프로그램은 stdin 또는 명령 행에서 파일의 내용 또는 파일 경로를 가져옵니다.

산출

주어진 파일에 홀수 바이트가 포함되어 있으면 프로그램이 정확한 값을 출력하거나 매 8 번째 비트가 0이면 거짓을 출력합니다.

기준

이것은 작업이 완료되는 가장 짧은 프로그램 인 코드 골프입니다. 파일 소스 코드에서 8 비트마다 유효한 제출이 되려면 0이어야합니다. 제출시 소스 코드 바이너리의 사본을 포함시키는 것이 좋습니다.

표준 허점이 적용됩니다.

테스트 사례

(ASCII 인코딩으로) 입력 :

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

Output:
falsy

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

Output:
truthy

Input:
LOREMIPSVMDOLORSITAMETCONSECTETVRADIPISCINGELITSEDDOEIVSMODTEMPORINCIDIDVNTVTLABOREETDOLOREMAGNAALIQVA
VTENIMADMINIMVENIAMQVISNOSTRVDEXERCITATIONVLLAMCOLABORISNISIVTALIQVIPEXEACOMMODOCONSEQVAT
DVISAVTEIRVREDOLORINREPREHENDERITINVOLVPTATEVELITESSECILLVMDOLOREEVFVGIATNVLLAPARIATVR
EXCEPTEVRSINTOCCAECATCVPIDATATNONPROIDENTSVNTINCVLPAQVIOFFICIADESERVNTMOLLITANIMIDESTLABORVM

Output:
truthy

  • 현명하게 언어를 선택하십시오이 언어가 모든 언어에서 가능한 것은 아닙니다

  • 유닉스 명령 xxd -b <file name>은 파일의 바이너리를 콘솔에 인쇄합니다 (일부 추가 서식과 함께)

  • 다른 모든 규칙을 따르는 한 UTF-8과 같은 ASCII 이외의 다른 인코딩을 사용할 수 있습니다.


2
일부 언어는 여러 줄로 된 입력을 읽는 데 어려움을 겪지 만이 문제가 쉽지 않은 것은 아니기 때문에 아마 괜찮습니다. : P 입력을 비울 수 있습니까?
Dennis

9
!#%')+-/13579;=?ACEGIKMOQSUWY[]_acegikmoqsuwy{}걱정하는 사람에게는 금지 된 인쇄 가능한 ASCII 문자입니다. 허용되는 인쇄 가능한 ASCII 문자는 다음과 같습니다." $&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~
Patrick Roberts

9
모든 모음이 금지되어있어 매우 편리합니다 ... ;-)
owacoder

4
웰프, BF는이 도전에 기회를 너무 많이.
TLW

2
또한 DOS / Windows 파일에 줄 바꿈이 있으면 [CR]홀수 비트가 있음에 유의하십시오 . 나는 WhiteSpace가 안전하기를 바랐지만, 아아 [TAB]. 구식 학교에 가고 싶다면 EBCDIC은 세 모음을 제공합니다.
GuitarPicker

답변:


26

GS2 , 4 바이트

dΦ("

온라인으로 사용해보십시오!

육각 덤프

0000000: 64 e8 28 22                                      d.("

작동 원리

      (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

펀드, 36 바이트

나는 이것이 오래된 질문이라는 것을 알고 있지만 Befunge에서 흥미로운 도전이 될 것이라고 생각했기 때문에 시도해보고 싶었습니다.

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

온라인으로 사용해보십시오!

출력은 1입력 (즉 홀수 바이트 포함)이 손상된 경우, 그리고 0그것은 OK 인 경우.

설명

문제는 /(divide) 또는 %(modulo) 명령에 액세스하지 않고 홀수 바이트를 결정하는 방법 입니다. 해결책은 값에 128을 곱한 28*8**다음 그 결과를 운동장에 기록하는 것이 었습니다 . 엄밀히 표준 인터프리터에서, playfield 셀은 8 비트 값으로 서명되므로, 128을 곱한 홀수는 -1로 절단되고 짝수는 0이됩니다.

다른 트릭은 g(get) 명령에 액세스하지 않고 운동장에서 -1 또는 0을 다시 읽는 것 입니다. 이에 대한 해결 방법은 기존 문자열 시퀀스 ( " ") 의 중간에 값을 쓴 다음 해당 시퀀스를 실행하여 동봉 된 값을 스택으로 푸시하는 것입니다. 이 시점에서 바이트의 홀수를 결정하는 것은 0보다 간단한 테스트입니다.

논의 할 가치가있는 마지막 측면은 결과입니다. 거짓 인 경우 >$.스택에서 하나의 값만으로 시퀀스에 도달 하므로 $스택을 지우면 .출력이 0이됩니다. 실제의 경우 경로를 따릅니다 20`:>$.. 2가 0보다 크므로 비교는 1을 스택으로 푸시 :하고 복제본은 복사본을 만들어 $출력을 가져 오기 전에 삭제하지 않습니다.


1
이것은 늦고 새로운 것이지만 이미 내가 가장 좋아하는 대답입니다.
밀 마법사

@WheatWizard 나는이 답변이 왜 그렇게 많은 주목을 받고 있는지 깨달았습니다. 현상금에 감사드립니다!
James Holderness

12

CJam (11 바이트)

"r2":(~f&2b

온라인 데모

홀수 바이트를 피하기 위해 트릭을 제거하면 다음과 같이 줄어 듭니다.

q1f&2b

입력을 읽고 비트 AND를로 매핑 한 1다음 기본 변환을 수행하여 모든 AND가 0 인 경우 0을 제공합니다.


3
이 코드는 슬프다:(
betseg dec

@betseg 문자의 절반 만 가질 수 있기 때문에
Roman Gräf

9

인쇄 가능한 .COM 파일, 100 바이트

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

16 진 덤프 :

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

인간에 의해 합리적으로 입력 할 수 있고 EICAR 표준 바이러스 백신 테스트 파일에서 영감을 얻은 것으로 소스 의 매우 느슨한 정의를 사용합니다 ( Bugtraq의 "EICAR 테스트 파일에 대해 자세히 알아보십시오 "에 대한 자세한 정보 ).

인쇄 가능한 비 홀수 ASCII 바이트 만 사용 (측면 참고 : 단어에 영향을주는 opcode는 홀수 인 경향이 있고 W 비트는 일부 opcode의 lsb 임) SP에서 코드 조각을 생성합니다 (생성 코드를 지나서 편리하게 설정). 실행이 생성 된 코드로 넘어갑니다.

스택에는 처음에 PSP 시작에 대한 거의 포인터가 포함되어 있고 PSP 시작에 INT 20h지침이 포함되어 있다는 사실을 사용합니다 ( https://stackoverflow.com/questions/12591673/ 참조 ).

실제 출처 :

; 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 바이트

l$Z$2\z

소스 코드는 UTF-8 인코딩을 사용합니다. 소스 바이트는 (10 진수)

108    36    90    36    50    92   122

입력은 파일 이름이며 작은 따옴표로 묶은 문자열로 사용됩니다. 출력은 파일의 홀수 바이트 수이며, 0이 아닌 경우에는 사실입니다.

설명

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 바이트

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

로케일이 Latin-1로 설정되어 있다고 가정합니다. 온라인으로 사용해보십시오!

작동 원리

간단한 해결책은 다음과 같습니다.

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.

불행하게도, 문자 qi소스 코드에 나타나지 않을 수 있습니다. 이 문제를 해결하기 위해 위의 소스 코드의 일부를 동적으로 생성 한 다음 문자열을 평가합니다.

"<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 바이트

vj0>LhZ.BRj.z

또는 이진으로 :

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

온라인으로 사용해보십시오

작동 원리

           .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

결과로 나오는 정수는 임의의 바이트가 홀수이면 참입니다 (0이 아님).



4

망막 , 106 바이트

허용 된 모든 문자를 제거한 다음 나머지 문자와 일치시킵니다. 확실한 값은 찾은 문자 수입니다. Falsey 값은입니다 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|\||~

.

온라인으로 사용해보십시오

때문에 .기본적으로 줄 바꿈과 일치하지 않는, 내가 그들을 제거 할 필요는 없습니다.


1

Perl 5 + -p0, 136 바이트

다른 답변과 마찬가지로 이것은 모든 짝수 바이트를 제거하고 홀수 바이트를 남깁니다 (정확한).

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

온라인으로 사용해보십시오!


-0개행 에는 아무것도 하지 않습니다 . 입력 을 나누는 방법 만 결정 하고 문자를 제거하지 않습니다.
Ørjan Johansen

너무 나쁘다.
Ørjan Johansen

@ ØrjanJohansen 그래, 당신 말이 맞아요 -0. 전체 블록을 덩어리로하고 싶었지만 중요하지는 않지만이 문제를 해결할 수는 없습니다 ... 너무 나쁩니다! 이 의견을 정리하겠습니다. 그래도 감사합니다!
Dom Hastings

이제 작동합니까? 의견 중 일부를 삭제해야한다고 생각합니다. 편집 차이점에서, 이제 프로그램에 모든 짝수 바이트를 포함시키는 것을 볼 수 있습니다. 나는 모든 캐릭터가 (나에게 최소한) 나타나지 않기 때문에 명시 적으로 말하고 싶을 것이라고 생각합니다.
Ørjan Johansen

@ ØrjanJohansen 네! 나는 지금 그것을 가지고 있다고 생각합니다. 나는 다른 모든 대답이 모든 짝수 바이트를 포함한다고 생각하지 않으며, 인쇄 가능한 ASCII에서만 작동하는 것으로 생각합니다. 나는 이것이 내가 원하는 것을 할 것이라고 확신합니다. 어쨌든 그렇게 바랍니다!
Dom Hastings

0

Japt , 10 바이트

ø0ôH² ®dZÄ

온라인으로 사용해보십시오!

Japt의 코드 페이지는 ISO-8859-1입니다. 코드 false자체가 문자열로 입력되면 유효한 제출이 제공됩니다.

포장 풀기 및 작동 방식

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

String.c( Number.d문자 코드를 얻거나 문자를 매핑) 하지 않는 것은 고통 스럽지만 다행히도 (숫자를 문자로 변환)됩니다.

Japt가 CJam, Pyth Jelly 보다 승리 한 것으로 나타났습니다. :)


제한없이 6 바이트 로 처리하는 몇 가지 방법이 있습니다 (CJam 및 Jelly와 동등).

®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"길이에 관계없이 0은 숫자 0 (거짓)으로 변환됩니다. 반면에 1을 포함하는 모든 것은 0이 아닌 값으로 변환 double되거나 Infinity너무 큰 경우 (둘 다 진실한) 것입니다.

¬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

보다 직접적인 접근 방식 true또는 false.

또는 플래그를 사용하여 5 바이트 솔루션을 사용할 수도 있습니다 -d.

¨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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.