자체 검증 삼각 바둑판 프로그램


10

바둑판 프로그램은 줄 종결 자 (모든 표준 줄 끝이 될 수 있음)를 제외하고 각 개별 문자의 서수 값이 짝수에서 홀수로 번갈아 나타나는 프로그램입니다.

삼각 프로그램은 각 행이 선행 행보다 하나의 추가 문자를 갖고 첫 번째 행이 하나의 문자를 갖는 프로그램입니다. 빈 입력을 처리 할 필요가 없습니다.

당신의 임무는 주어진 입력이 그 기준을 준수하는지 확인하고 프로그램이 기준을 충족하면 진실한 것을 출력 / 반환하거나 그렇지 않으면 거짓을 출력하는 프로그램을 구축하는 것입니다.

프로그램도 이러한 기준을 충족해야합니다.

유효한 프로그램의 예

G
`e
@u^
5r{B

^
cB
+$C
VA01

규칙

  • 문자의 패리티가 대체되는 한 프로그램은 홀수 또는 짝수 바이트로 시작할 수 있습니다.
  • 프로그램은 홀수 또는 짝수 문자로 시작하는 프로그램의 유효성을 검사해야합니다.
  • 유니 코드 문자의 경우 기본 바이트 값이 교대로 패리티되어야합니다.
  • 입력에 인쇄 가능한 문자 만 포함되어 있다고 가정 할 수 있습니다. 프로그램에 인쇄 할 수없는 파일이 포함되어 있으면 여전히 자체 검증 할 수 있어야합니다.
  • 프로그램에 하나의 마지막 줄 바꿈이 포함될 수 있습니다. 유효성 검사 전에이를 제거한다고 가정 할 수 있으므로 유효성 검사에서이를 허용하지 않아도됩니다.
  • 표준 허점은 금지되어 있습니다.
  • 각 언어에서 가장 짧은 바이트 코드가 이깁니다.

@MartinEnder 입력 해 주셔서 감사합니다! 잘만되면 이것은 분명하다. 이것과 관련하여 샌드 박스에 더 오랫동안 남겨 두어야합니까?
Dom Hastings

1
짝수 / 홀수는 가로와 세로가 교대로 있습니까? 나는 "바둑판"에서 예라고 가정하지만, 당신이 그렇게 말하는 곳은 보이지 않습니다.
Ton Hospel

@DomHastings 일주일은 괜찮은 것 같습니다. 며칠 후에도 의견이 없으면 다른 사람이 더 이상 의견이 있는지 채팅으로 문의 할 수 있습니다 .
Martin Ender

1
@TonHospel 내 원래 예제는이 작업을 수행했지만 내 설명과 모순되었으므로이 구현에서는 아니요 : E\nOE\nOEO. 희망이 도움이됩니다!
Dom Hastings

2
내 의견 : 대답은 입력이 개행으로 시작하거나 끝나지 않는다고 가정합니다.
Lynn

답변:


3

Stax , 26 바이트

L
Y$
i:-
 {2%
*OFyF
%vi =*

온라인 테스트 사례 실행

3 개의 정크 문자를 소개해야했습니다. i모든 루프 구조 외부에있을 때는 작동하지 않습니다. 항상 no-op입니다. O스택 맨 아래에 1을 넣지 만 값은 프로그램에서 사용되지 않습니다.

LY      move input lines into a list and store in Y register
$       flatten
i       no-op
:-      get pairwise differences
{2%*OF  foreach delta, mod by 2, and multiply, then tuck a 1 under the top of stack
yF      foreach line in original input do...
  %v    subtract 1 from length of line
  i=    is equal to iteration index?
  *     multiply

이것을 실행


이봐, 이것이 코드를 너무 엉망으로하지 않기를 희망하지만 주요 줄 바꿈 유효성 검사를 취소 할 수 있습니다.
Dom Hastings

8

C (gcc), 189 바이트

j
;l
;b;
d;f␉
(char
␉*␉t) 
{b=*␉t%
2;for␉(␉
j=d=0;j=j
+ 1,␉l=j+ 
1,␉*␉t; ) {
for␉(;l=l- 1
 ;t=t+ 1 )b= 
!b␉,␉d=d+ !(␉*
␉t␉*␉(␉*␉t- 10)
*␉(␉*␉t%2-b) ) ;
d␉|=*␉t- 10;t=t+ 
1 ; }b= !d; } ␉ ␉ 

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

탭 문자를 나타냅니다 (죄송합니다). 후행 공백 / 탭이 여러 개 있습니다 (죄송합니다). 탭이있는 원본은 vim에서 가장 잘 볼 :set tabstop=1수 있습니다 (단어는 내가 얼마나 미안한지를 표현할 수 없습니다).

f문자열을 인수로 사용하여 0또는을 반환 하는 함수 (,라는 것을 즉시 알 수는 없음)입니다 1.

나는 이것을 적어도 하나 또는 아마 두 줄 이상 줄일 수는 있지만, 결국 PPCG 표준조차도 그런 끔찍한 코드를 작성하면 나쁜 사람처럼 느끼게되므로 결국 점점 더 지저분 해지고 노력이 줄어 듭니다. 최대한 빨리 멈추고 싶었습니다.

여기에 기본적인 아이디어는 반드시 (형식을 깰 것을 구조물 방지하는 것입니다 ++, +=, return, 등). 기적적으로, 중요한 키워드가 좋아하는 for, char그리고 while(내가 사용 끝나지 않았다)는 교류 패리티 규칙에 맞게 일어난다. 그런 다음 공백 (짝수 패리티)과 탭 (홀수 패리티)을 패딩으로 사용하여 나머지가 규칙에 맞도록했습니다.


1
나는 C에서 해결책을 기대하지 않았다!
Dom Hastings

"Header"및 "Footer"섹션에 다른 항목을 넣어 TIO에서 프로그램의 솔루션 부분을 분리하면 사람들이 바이트 수를 쉽게 확인할 수 있습니다.
Jakob

4

하스켈 , 1080 1033 바이트

;
f=
 g 
ij=f
a =hi
hi = g
hij= ij
g ' ' =0
g '"' =0;
 g '$' =0;
 g '&' =0-0
g '(' =0-0-0
g '*' =0-0-0;
 g ',' =0-0-0;
 g '.' =0-0-0-0
g '0' =0-0-0-0-0
g '2' =0-0-0-0-0;
 g '4' =0-0-0-0-0;
 g '6' =0; g '8' =0
g ':' =0; g '<' =0-0
g '>' =0; g '@' =0-0;
 g 'B' =0; g 'D' =0-0;
 g 'F' =0; g 'H' =0-0-0
g 'J' =0; g 'L' =0-0-0-0
g 'N' =0; g 'P' =0-0-0-0;
 g 'R' =0; g 'T' =0-0-0-0;
 g 'V' =0; g 'X' =0-0-0-0-0
g 'Z' =0; g '^' =0; g '`' =0
g 'b' =0; g 'd' =0; g 'f' =0;
 g 'h' =0; g 'j' =0; g 'l' =0;
 g 'n' =0; g 'p' =0; g 'r' =0-0
g 't' =0; g 'v' =0; g 'x' =0-0-0
g 'z' =0; g '\92' =0-0; g '|' =0;
 g '~' =0; g y = 1 ;z=0; i(-0)z=z;
 i m('\10':y ) ="y"; ; ; ; ; ; ; ; 
i m(mnmnmnmnm:y ) = i(m - 1 ) y ; ; 
i k m ="y"; ; k i [ ] =01<1010101010;
 k m('\10':y ) = k(m + 1 )(i m y ) ; ;
 k m y =01>10; m o = k 1$'\10':o ; ; ; 
o i('\10':y ) = o i y ; ; ; ; ; ; ; ; ; 
o i(k:y )|g k<i = o(1 - i ) y ; ; ; ; ; ;
 o i(k:y )|g k>i = o(1 - i ) y ; ; ; ; ; ;
 o i [ ] =01<10; o i y =01>10;v=01>10101010
s y|o 1 y = m y|o(-0) y = m y ; s y =v; ; ; 

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

설명

이것은 하스켈에게 매우 흥미로운 일이었습니다.

동등

시작하려면 캐릭터에 짝수 또는 홀수 코드 포인트가 있는지 확인하는 방법이 필요합니다. 일반적인 방법은 코드 포인트를 가져 와서 2 씩 수정하는 것입니다. 그러나 알 수 있듯이 문자의 코드 포인트를 가져 오려면 가져 오기가 필요합니다. 소스 제한으로 인해 코드 포인트를 가져올 수 없습니다. 익숙한. 숙련 된 Haskeller는 재귀를 사용한다고 생각합니다. 는 전임자와 후임자를 얻을 수 있도록 typeclass의 Char일부입니다 Enum. 그러나 predsucc그들이 대체 바이트 패리티를하지 않기 때문에도 모두 사용할 수 있습니다.

그래서 이것은 우리가 꽤 붙어있어서 우리는 거의 문자로 조작 할 수 없습니다. 이에 대한 해결책은 모든 것을 하드 코딩하는 것입니다. 우리는 문자를 리터럴로 (대부분의) 짝수로 나타낼 수 있습니다. '홀수 이기 때문에 문제가 발생할 확률 은 문자 자체 옆에있을 수 없으므로 문자 그대로 홀수 문자를 표현할 수 없습니다. 따라서 모든 짝수 바이트를 하드 코딩 한 다음 끝에 홀수 바이트를 모두 잡습니다.

문제 바이트

작은 따옴표로 감싸서 리터럴을 만들 수없는 짝수 바이트가 있음을 알 수 있습니다. 그들은 인쇄 할 수없는, 개행 및 \입니다. 인쇄 할 수없는 것을 사용할 필요가없는 한 인쇄 할 수없는 것에 대해 걱정할 필요가 없습니다. 사실 우리는 여전히 탭과 같은 이상한 인쇄 불가능한 것을 사용할 수 있습니다. 줄 바꿈은 어쨌든 프로그램에서 다듬어지기 때문에 현명하게 무시 될 수 있습니다. (코드 포인트가 다소 편리하기 때문에 개행을 포함 할 수는 있지만 필요하지는 않습니다). 이 코드는 \이제 \코드 포인트 92를 가지며,이 코드 포인트는 편리하게 홀수 뒤에 짝수가옵니다. 따라서 짝수 \92와 확률 사이에서 교대로'\92'완벽하게 유효합니다. 나중에 우리는 개행을 나타낼 필요가있을 때 운 좋게도 같은 속성을 가지고 있음을 알 수있을 것 '\10'입니다.

간격 문제

이제 실제 코드 작성을 시작하려면 한 줄에 많은 수의 문자를 넣을 수 있어야합니다. 이를 위해 모자를 썼습니다.

;
f=
 g 
ij=f
a =hi
hi = g
hij= ij

모자는 유효한 Haskell을 제외하고는 아무것도하지 않습니다. 처음에는 나중에 코드에서 우리를 도울 정의를 만들고 싶었지만 그렇지 않았습니다. 공백과 세미콜론과 같이 대문자를 만드는 더 쉬운 방법이 있지만이 방법으로 바이트를 절약하지 않으므로 변경하지 않아도됩니다.

하드 코더

이제 줄에 충분한 공간이 있으므로 값을 하드 코딩하기 시작합니다. 이것은 대부분 지루하지만, 몇 가지 흥미로운 점이 있습니다. 한 줄이 더 길어지기 시작하면 한 줄 ;에 여러 선언을 넣을 수 있으므로 많은 바이트가 절약됩니다.

두 번째는 항상 줄을 시작할 수 없기 g때문에 줄을 조금 들여 써야한다는 것입니다. 이제 Haskell은 실제로 들여 쓰기에 관심이 있으므로 이에 대해 불평합니다. 그러나 들여 쓰기 된 줄 앞의 마지막 줄이 세미콜론으로 끝나는 경우 허용됩니다. 왜? 나는 가장 희미하지는 않지만 작동합니다. 따라서 우리는 줄 끝에 세미콜론을 넣는 것을 기억해야합니다.

기능 빌딩 블록

하드 코더가 완료되면 프로그램 끝까지 부드럽게 항해합니다. 몇 가지 간단한 함수를 만들어야합니다. 먼저 drop이라는 버전을 빌드합니다 i. 우리가 문자열의 끝을 지나서 떨어지려고하면 그냥 반환한다는 점 i과 다릅니다 . 그것이 반환하는 줄 바꿈을 삭제하려고하면 그 또한 드롭 다른 , 이들은 도움이 될 것입니다 나중에 우리 프로그램이 우리가 반환 할 수 있도록 삼각형 것을 확인하는 경우 때문에 마지막 줄이 완료 될 때, 또는하지 않을 때 줄은 일찍 끝납니다.drop"y"i"y"False

kk에스에스Truek+1False

우리는 다음의 별칭을 k, m. m그냥 k1제 인수 및 개행 번째 인수 앞에 추가.

다음으로 우리는 o. o숫자와 문자열을받습니다. g입력 번호로 시작 하여 문자열 바이트 (개행 무시)가 패리티에서 번갈아 가며 (우리의 사용) 여부를 결정합니다 .

마지막으로 우리는 둘 다로 s실행 하고 , 성공하면o10m . 둘 다 실패하면 그냥 반환합니다 False. 이것이 우리가 원하는 기능입니다. 입력이 삼각형이고 교대로 결정됩니다.


1
삼각형 문자열은 빈 줄이 아니라 1 자 라인으로 시작합니다.
Jakob

@ 야콥 나는 그것이 멍청하다고 생각하지만 충분히 쉽게 해결할 수있었습니다.
Ad Hoc Garf Hunter

3

05AB1E , 34 26 바이트

¶
¡D
©€g
´ā´Q
´sJÇÈ
¥Ä{´нP

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

입력을 여러 줄 문자열 ( "" " 사이에 입력)로 취합니다 . 나중에 설명합니다.


1
규칙을 이해하지 못한 경우 프로그램은 줄 바꿈으로 시작하는 입력의 유효성을 검사 할 수 있어야합니다.
Emigna

@Emigna 나는 프로그램이 그 자체로 주요 개행으로 시작하는 경우에만 주요 개행을 확인할 수 있어야한다고 생각합니다.
Ton Hospel

이것이 올바른지 전혀 모르겠습니다 (사양을 읽는 것이 끔찍합니다) : 온라인으로보십시오!
Magic Octopus Urn

@MagicOctopusUrn 귀하의 답변은 저에게 괜찮아 보이지만 입력에 대해 궁금합니다. 배열로 사용할 수 있습니까? 링크에서 첫 번째 입력은 개행 문자가 아닌 빈 공간입니다.
Kaldo

1
이봐, 이것이 코드를 너무 엉망으로하지 않기를 희망하지만 주요 줄 바꿈 유효성 검사를 취소 할 수 있습니다.
Dom Hastings

1

자바 10, 209 바이트

의 반복 가능한 또는 배열을 취하는 void 람다 byte. 정상적으로 예외를 반환하여 true를 나타내고 런타임 예외를 발생시켜 false를 나타냅니다. 프로그램은 최종 행이 올바르게 종료 될 것으로 예상합니다. 즉, 개행 문자로 끝납니다. 프로그램의 마지막 줄도 비슷하게 종료됩니다.

"문자"는 유니 코드 코드 포인트를 의미한다는 해석과 함께 UTF-8 하에서 모든 것이 수행됩니다.

이보기에서는 탭이 공백으로 바뀝니다.

d
->
{  
long
f= 1,
 h=0 ,
c = - 1
,e ;for 
( byte a:
 d) {var b
=(e = a^10)
<1&e>- 1 ;f=
b?( h ^ f)> 0
?0/0 : f+ 1: f
;h=b?0 :a>-65 ?
h+ 1: h; c =b? c
:c>=0 & ( (c^a )&
1 )<1 ?0/0 :a ; } 
/*1010101010101*/ }

온라인 시도

육각 덤프

로 되돌리기 xxd -p -r유닉스.

640a2d3e0a7b20090a6c6f6e670a663d20312c0a09683d30092c0a63203d
202d20310a2c65203b666f72090a28096279746520613a0a096429207b76
617209620a3d2865203d20615e3130290a3c3126653e2d2031203b663d0a
623f280968095e0966293e09300a3f302f30093a09662b20313a09660a3b
683d623f30093a613e2d3635203f0a682b20313a09683b2063203d623f20
630a3a633e3d30092609280928635e612029260a3120293c31203f302f30
093a61203b207d200a2f2a313031303130313031303130312a2f207d0a

언 골프

d -> {
    long f = 1, h = 0, c = ~h, e;
    for (byte a : d) {
        var b = (e = a^10) < 1 & e > -1;
        f = b ?
            (h^f) > 0 ? 0/0 : f + 1
            : f
        ;
        h = b ? 0 :
            a > -65 ? h + 1 : h
        ;
        c = b ? c :
            c >= 0 & ((c^a) & 1) < 1 ? 0/0 : a
        ;
    }
}

f현재 줄에서 예상되는 문자 수, 현재 줄에서 h지금까지 본 문자 수 c, 마지막으로 본 바이트 , 개행 b여부 a입니다.

조건 은 문자의 첫 번째 바이트 a > -65인지 테스트합니다 a. 단일 바이트 (ASCII) 문자는 8 비트 2의 보수에서 음수가 아니고, 긴 문자의 첫 번째 바이트는 2 진 형태 11xxxxxx(2의 보수에서 -64 이상)를 가지며 해당 문자의 선행 바이트는 10xxxxxx2의 보수에서 최대 -65 의 형태 . ( 소스 )

문자가 삼각형 또는 바둑판 패턴을 위반하면 (즉, 줄 바꿈이 늦거나 늦게 나타나거나 잘못된 패리티의 바이트가 나타남) 해당 삼항의 왼쪽 분기 ( f또는 에 할당 됨 c)가 활성화되고 메소드에서 산술 예외가 발생합니다.


0

파이썬 3 (3.4?), 350 바이트

파이썬 3과 같이 공백에 관한 언어에 대한 까다로운 과제 0 되거나 1일부 출력에서 ​​표준 출력으로 충돌합니다. 프로그램은 최종 행이 올바르게 종료 될 것으로 예상합니다. 즉, 개행 문자로 끝납니다. 프로그램의 마지막 줄도 비슷하게 종료됩니다. UTF-8은 바이트 패리티를 확인하는 데 사용됩니다.

이보기에서는 탭이 공백으로 바뀝니다.

0
i\
= 1
t=(#
 '0'*
 0) ;(
g,) =(#
 open (1
, "w"),) 
k = eval (
'p' + 'rin'
 + 't' ) #01
for  a in (#0
open ( 0) ):#0
#01010101010101
 a = a [:- 1 ] #
 if ( len (a )<i\
or len (a )>i ):[\
k('0' ),1 /0] #0101
 i, t= -~i, t+ a #01
(k( 2-len ({(c^i )&1\
 for  i,c in  eval (#0
 "enu"+"m"+"erate")(#01
 eval ( " byte"+"s")( t#
,' u8' ) ) } ) ) ) #01010

Python 3.4.2에서 작동합니다. TIO의 Python 3에서는 작동하지 않습니다. TIO 통역가의 버그 인 것 같습니다.

육각 덤프

로 되돌리기 xxd -p -r유닉스.

300a695c0a3d20310a743d28230a202730272a0a093029203b280a672c29
203d28230a206f70656e0928310a2c09227722292c29200a6b203d206576
616c09280a277027202b202772696e270a202b202774272029202330310a
666f7209206120696e092823300a6f70656e092809302920293a23300a23
30313031303130313031303130310a2061203d2061205b3a2d2031205d20
230a2069660928096c656e09286120293c695c0a6f72096c656e09286120
293e6920293a5b5c0a6b2827302720292c31202f305d2023303130310a20
692c09743d202d7e692c09742b2061202330310a286b2809322d6c656e09
287b28635e69202926315c0a09666f720920692c6320696e09206576616c
092823300a0922656e75222b226d222b2265726174652229282330310a20
6576616c092809220962797465222b22732229280974230a2c2720753827
20292029207d202920292029202330313031300a
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.