답변:
>>>>>+>,[>++++++[-<-------->]<+>,]<[-[█<█<]++++++++++<]>[-]>>██[>█>>█>]+[<]<<[<]>█<<+>>[>]█>[>]█+[<]<<[<]>-█>]>>[->]<[-[[<]<]++++++++++<]>[-]>[<█]>]>[>]<[[█]<]<<<<<[<]<<██>>[>]<█[->+<]<█>>[>]<[-[[<]<]++++++++++<]>███>[<<]>[[[>]>████[<]<[-[[<]<]++++++++++<]>[-]>[█<]>]>[>]<[[-]>+[>]<-<[<]<]+<<<<<[<]>[[>]+[[>]>]>[>]>[-<+>]<[<]<[>+[<]>>-<<<<<[[<]<]>>███████>[[█]>]<]<[[<]<]<[█]>]>>>[[>]<->>]]>[[>]>]<<[[[█]<]<]<<<[█]<<█>>>[>]█[-[[<]<]++++++++++<]>>[[>]+[------->++<]>.+.+++++.[---->+<]>+++.>>]>[>]+[------->++<]>++.++.---------.++++.--------.
>>>>>+>,[>++++++[-<-------->]<+>,]<[-[[<]<]++++++++++<]>[-]>>[[[>]>>[>]+[<]<<[<]>[<<+>>[>]>>[>]<+[<]<<[<]>-]>]>>[->]<[-[[<]<]++++++++++<]>[-]>[<<]>]>[>]<[[-]<]<<<<<[<]<<[>>>[>]<[[->+<]<]>>[>]<[-[[<]<]++++++++++<]>[-]>[<<]>[[[>]>[>]+[<]<[-[[<]<]++++++++++<]>[-]>[<<]>]>[>]<[[-]>+[>]<-<[<]<]+<<<<<[<]>[[>]+[[>]>]>[>]>[-<+>]<[<]<[>+[<]>>-<<<<<[[<]<]>>[[-]+>]>[[>]>]<]<[[<]<]<[<]>]>>>[[>]<->>]]>[[>]>]<<[[[-]<]<]<<<[<]<<]>>>[>]<[-[[<]<]++++++++++<]>>[[>]+[------->++<]>.+.+++++.[---->+<]>+++.>>]>[>]+[------->++<]>++.++.---------.++++.--------.
이것은 에라토스테네스의 체를 구현합니다.
초기 값은 >>>>>+>,[>++++++[-<-------->]<+>,]
각 숫자를 문자 코드로 입력하고 47을 빼서 1-10 범위에 놓습니다. 이를 통해 셀 값 0은 숫자 사이의 간격을 나타냅니다. +>
이 섹션의 시작 부분 이 가까워지면 숫자가 두 자리 이상이되며 곧 중요합니다.
다음으로, 내가 알아 낸 첫 번째 항목 중 하나는 섹션 <[-[[<]<]++++++++++<]>[-]>
입니다. 이것은 코드에 여러 번 나타나며 각각 다른 패턴의 편집이 있지만 해당 인스턴스가 모두 동일한 코드 일 것이라고 추측하기는 어렵지 않았습니다. 이 코드는 테이프에서 10 진수 왼쪽에 3 개의 0이 필요하며 그 효과는 숫자를 줄이는 것입니다. 루프의 마지막 반복은 숫자 10 두 셀 왼쪽에 값을 넣지 만 [-]
정리합니다.
10 진수가 0이면 외부 10 개가 만들어지지 않으며 0으로 셀 [-]
이 가장 큰 숫자입니다. 테이프 헤드는 두 번째로 큰 유효 자릿수에 있습니다 (따라서 최소 두 자릿수가 필요합니다). 이 스 니펫의 대부분의 인스턴스는 바로 뒤에옵니다 [<<]>
. 이는 정상적인 조건에서 0이 아닌 셀에 머리를, 원래 10 진수가 0 인 경우 0 셀입니다. 이 프로그램에서의 10 진수 표시는를 나타내는 n-1
데 사용 n
되므로 감소하는 0
대신에 감소하는 것이 잡힌 것 같습니다 -1
.
다음 부분은 테이프에 n-1 (n)부터 0 (1)까지의 숫자를 넣습니다.
>[ until the number reaches zero:
[ for each digit:
[>]>>[>]+[<]<<[<]> create a placeholder for the next copy
[ while the original value of the digit is nonzero:
<<+ add 1 to copy two cells left (to keep one copy)
>>[>]>>[>]<+ go to new copy and increment that cell
[<]<<[<]>- go back to original digit and decrement
] (this is effectively the same as [<+>>+<-] but with the cells at variable locations)
>] next digit
>>[->] cancel the placeholder 1s that were used for the new copy
<[-[[<]<]++++++++++<]>[-]>[<<]> decrement
]
>[>]<[[-]<] clean up the trash 10s on the tape while ending at a known location relative to the last number
이제이 숫자는 모두 테이프에 두 개의 0 개의 셀이 분리되어 있습니다. <<<<<[<]<<
우리는 테이프의 두 번째 숫자의 마지막 셀에 우리를 배치합니다. 원본을 제외한 모든 숫자를 처리하면 루프가 종료됩니다.
루프가 시작될 때 현재 숫자 (테이프에있는 마지막 숫자)를 셀 하나만큼 오른쪽으로 이동하여 감소시킬 공간을 확보 한 다음 계속 진행하십시오.
[>>>[>]<[[->+<]<]>>[>]<[-[[<]<]++++++++++<]>[-]>[<<]>
이 감소가 언더 플로되지 않은 경우 숫자를 단항으로 변환합니다.
[[[>]>[>]+[<]<[-[[<]<]++++++++++<]>[-]>[<<]>]
이 틈새에는 닫히지 않은 점이 [
있습니다. 결과적으로 숫자가 0 (1을 나타내는) 인 경우이 루프의 나머지 부분은 건너 뜁니다. 단항으로 변환 한 후 남은 10 초를 지우고 단항 표현을 왼쪽으로 드래그합니다.
>[>]<[[-]>+[>]<-<[<]<]+
나는 지금까지 이것을 작성하기까지는 알지 못했지만 +
이 스 니펫의 끝에는 단일 0으로 단항 표현과 분리되어 있습니다. 단항 표현의 일부이기도합니다. 시퀀스 1011...11
는 0 mod k를 나타냅니다. 다음 <<<<<[<]>
은 번호의 시작 부분에 k+1
새로운 루프를 시작하게합니다.
여기의 내부 루프는 테이프의 모든 숫자를 셀에 1로 바로 표시하고, 단수 표현을 시계로 사용하여 어떤 숫자가의 배수인지 결정 k
합니다.
[
[>]+ mark the current decimal number
[[>]>] move to end of decimal part of tape
>[>] move to 0 in middle of unary "clock"
>[-<+>] move the following 1 to the left if possible
<[<]< if a 1 was moved this will bring us back to a zero before the start of this "clock";
otherwise the looped move command doesn't move us at all and we are at the final 1
[ if there was no gap (happens every kth iteration):
>+[<]>>- reset to original position
<<<<<[[<]<]>> go to number that was just marked
[[-]+>] replace digits with 0s (cell value 1)
>[[>]>]< go back to where we would be without this conditional
]
<[[<]<]<[<]> return to first unmarked number
]
그 [[-]+>]
부분의 내가 알아 낸 마지막 부분이었습니다. 그 전에는 프로그램이 시험 분할을하고 있다고 가정했지만 결과가 어디에 사용되는지 알 수 없었습니다.
이 루프는 맨 왼쪽 숫자의 두 셀 왼쪽을 끝내고 >>>[[>]<->>]]
테이프에 놓인 마커를 제거하고 테이프의 끝으로 다시 이동합니다. 그 후 >[[>]>]<<[[[-]<]<]
단항 시계 또는이 전체 세그먼트를 건너 뛰면 남은 10 초가 제거됩니다. 을 사용하여 루프를 시작 조건으로 설정합니다 <<<[<]<<]
.
그런 다음 입력 번호가 1로 대체되었는지 여부를 읽습니다.
>>>[>]<[-[[<]<]++++++++++<]>> do the check
[[>]+[------->++<]>.+.+++++.[---->+<]>+++.>>] conditionally print "not "
>[>]+[------->++<]>++.++.---------.++++.--------. unconditionally print "prime"
다행히 실제 출력은 전혀 수정되지 않았습니다.
f[x_]:=(p=ToString@Boole@PrimeQ@x;StringMatchQ[p&@@Infinity,RegularExpression@"(\
\n{}\b+, )?1"])
Boole
not not PrimeQ
.
(({████){██[████)█>(({}))<>}<>{}███{}((██({}))█████{}]██)({}(<>))<>{(({})){({}[()])<>}{}}{}<>([{}()]{})██[██()██(()█[()]██{}██}{}<>{})
(({})<>){([[]]{})<>(({}))<>}<>{}{}{{}(([]({}))[({}[{}])])({}(<>))<>{(({})){({}[()])<>}{}}{}<>([{}()]{})}([][()])((){[()](<{}>)}{}<>{})
이 프로그램은 n-2에서 1까지 시험 분할을 수행 한 다음 인수 1로 종료 된 경우에만 1을 출력합니다.
xxd
인코딩과 널 바이트 및 기타 무서운 것들로 인해 표현 :
00000000: 31c0 b90a 0031 dbbe 8100 ac3c 0d74 3c3c 1....1.....<.t<<
00000010: 2075 f7ac 3c0d 7410 2c30 7c2f 3c09 7f2b u..<.t.,0|/<..+
00000020: 93f7 e193 01c3 ebeb 83fb 027c 19c6 0653 ...........|...S
00000030: 0159 b902 0039 d974 1289 d831 d2f7 f109 .Y...9.t...1....
00000040: d274 0341 ebef c606 5301 4eb4 09ba 5301 .t.A....S.N...S.
00000050: cd21 c341 0d0a 24 .!.A..$
먼저 경찰을 수동으로 분해 한 다음 yasm을 사용하여 조립합니다. 일부 바이트는 Joshua가 사용한 conerter에 의해 손상되었지만 방금 바이트로 처리했습니다. 실제 콘텐츠에 대해 99.72 % 확신합니다. 그래도 잘못하면 문제를 해결하는 데 시간이 오래 걸리지 않습니다. 즐겨:
; A COM file is just a 16-bit flat binary
; loaded at 0x100 in some segment by DOS
org 0x100
bits 16
; Unsurprisingly, we start by converting
; the commandline string to a number. During
; the conversion, SI is a pointer to the
; string, CX is the base, and BX holds the
; partial result
parse_input:
; We'll read the input character by character
; into AL, but we need the resulting digit as
; a 16-bit number. Therefore, initialise AX to
; zero.
xor ax, ax
mov cx, 10
xor bx, bx
; When a DOS program is loaded, it's preceded
; in memory by the Program Segment Prefix,
; which holds the commandline arguments at
; offset 0x81, terminated by a carriage return
mov si, 0x81
.skip_prog_name:
; Load a character and move the pointer
lodsb
; If we find the terminator here, the program
; was not given any arguments.
cmp al, 13
je finish
cmp al, ' '
jne .skip_prog_name
.input_loop:
lodsb
cmp al, 13
je got_input
; If the ASCII value of the character is less
; than the one of '0', error out. Adjust the
; value in AL so that it holds the digit
; itself. This exploits the fact that the
; comparison instruction is just a subtraction
; that throws away the actual result.
sub al, '0'
jl finish
; If we have a value larger than 9, this
; character wasn't a digit.
cmp al, 9
jg finish
; Multiply the intermediate result by 10 and
; add the new digit to it.
xchg ax, bx
mul cx
xchg ax, bx
add bx, ax
jmp .input_loop
got_input:
; The loop below would go haywire when given a
; zero or a one, so make them a special case.
cmp bx, 2
jl composite
; Patch the output string to say that it's
; prime
mov byte[outstr], 'Y'
; BX = number being checked
; CX = loop counter, potential divisor of BX
mov cx, 2
.loop:
; If CX = BX, we looked everywhere and couldn't
; find a divisor, therefore the number is prime
cmp cx, bx
je finish
; DIV takes DX:AX as a 32-bit number for the
; dividend. We don't want nor need the extra
; precision, so we set DX to 0.
mov ax, bx
xor dx, dx
div cx
; DX now contains the remainder. To check if
; it's 0, we perform some noop operation, that
; happens to set the flags appropriately. AND
; and OR are commonly used for this purpose.
; Because of what's presumably a bug in the
; encoder used by Joshua, I do not yet know
; which for certain. However, I can make an
; educated guess. All other instances of the
; bug happened with a codepoint below 32.
; Moreover, no other bytes from that range
; occur in the code. Because an AND would be
; encoded as an exclamation mark, while OR -
; - as a tab, I am highly confident that Joshua
; used an OR.
or dx, dx
jz composite
; Increment the counter and loop again!
inc cx
jmp .loop
composite:
mov byte[outstr], 'N'
finish:
mov ah, 9
mov dx, outstr
int 0x21
ret
outstr:
db 'A', 13, 10, '$'
bx < 2
복합재가 아니라 마무리하는 것입니다. 참고로 손상은 원래 X를 마스크 문자로 사용하고 █로 전환 할 때 모든 것이 올바르게 수정되지 않았기 때문에 발생했습니다.
25██26█966836897364918299█0█1█65849159233270█02█837903312854349029387313█ị██v
250126,9668368973649182994001,658491592332700020837903312854349029387313ṖịØJv
설명:
ị
and를 보면서 v
숫자 목록을 ị
작성하고 ndex로 목록을 작성하고 평가한다고 생각합니다.
Jelly에서 우선 순위를 확인하는 "사소한"방법은 ÆP
다음과 같습니다 (제출이 크랙 될 수있는 경우).
Æ
및 P
.256
과 일치하는 모듈로 여야합니다 [14, 81]
.그래서 ... 프로그램 시작시 목록은 [14, 81, 49]
mod 256 ( TIO )에 Ṗ
부합하고 마지막 요소를 팝합니다.
e█ec█s█ █c "██████WyAkKHNoIC1jICJg█WNobyBabUZqZEc5eWZIUnlJQ2█2SnlBblhHNG5m██JoYVd3Z0t6SjhkMk1nTFhjSyB8YmFzZTY0IC1kYCIpIC1lcSAxIF0K█b█se6███d`"
exec sh -c "`echo WyAkKHNoIC1jICJgZWNobyBabUZqZEc5eWZIUnlJQ2M2SnlBblhHNG5mSFJoYVd3Z0t6SjhkMk1nTFhjSyB8YmFzZTY0IC1kYCIpIC1lcSAxIF0K|base64 -d`"
아니요 온라인으로 사용해보십시오! 이번에는 몇 가지 문제로 인해 . 그러나 jdoodle 을 사용할 수 있습니다 .
종료 코드로 반환합니다. 0
(성공) 프라임, 1
(오류) 합성.
실행 된 실제 명령은
factor|tr ':' '\n'|tail +2|wc -w
base64
명령 사용법을 배우십시오 .+
유효한 base64로 문자입니다.sh -c "`echo ...|base64 -d`"
를 원래 프로그램에 다시 적용하십시오 .tail +n
. 직장에서 기계에 균열을 시도했을 때 그것에 대해 불평했습니다. 올바른 코드를 마스크 해제했습니다. ... :(
@(x)eval([(str2num(cell2mat([cellstr(reshape('0█1███1█0█0█00',████))])')█'█')','(x)'])
@(x)eval([(str2num(cell2mat([cellstr(reshape('04141113040800',2,[]))])')+'e')','(x)'])
이것은 재미 있었다! 나는 좋은 며칠 동안 이것으로 고투했다.
첫 번째 단서는 인식 된 eval([...,'(x)'])
받는 호출 만드는 구조로 isprime
의 연결과 같은 기능을 ints
하고 char
암시 적으로 배열을 변환합니다 char
너무, ...
이어야 할 필요 isprime
하거나의 ASCII 값을 가지고 배열 isprime
, [105, 115, 112, 114, 105, 109, 101]
.
그 나머지는 그냥 알아 내기 위해 문서를 강타했다 reshape
하나 알 수없는 차원이 걸릴 수 있습니다 []
내가 할 수 있었던 생각하지만, reshape(...,2, 7)
동일한 바이트 수에.
사용 +'e'
대신 (101) +'d'
나는 (읽을 수있게) 마지막 자리가 있었다 발견 될 때까지 다른 몇 분 동안 저를 던졌다 멋진 터치 (100) 된 00
것이 아니라 01
, 그것이 쉽다고으로는.
x=>{if(x<4)return(!0);for(y=x>>>Math.log10(p=████;--y-1;(p=x/y%1)████if(██&&(███))break████return(███)}
x=>{if(x<4)return(!0);for(y=x>>>Math.log10(p=2-1);--y-1;(p=x/y%1)){;;if(!p&&(1<2))break;;;}return(!!p)}
나는 이것이 당신이 생각한 것과 정확히 일치하는지 의심하지만 작동합니다.
:1@v>~~:?1n;█$-1<█?=2:}*{█@:$@:
에
:1@v>~~:?1n;
$-1</?=2:}*{%@:$@:
개행을 영리하게 사용하는 것은 나를 혼란스럽게했습니다. 1 또는 2에서 작동하지 않는 것 같습니다.
^
, v
, /
, 또는 \
두 번째 빈 거기 일 수 있었다. 나는 지금 *
대신에 그것을 커버했으면 좋겠다 /
.
class X{public static void main(String[]args){System.out.println(new String(████████[Integer.parseInt(args[0])]).matches("█████████████")?███);}}
class X{public static void main(String[]args){System.out.println(new String(new char[Integer.parseInt(args[0])]).matches(".?|(..+?)\\1+")?0:1);}}
코드에서 가져 RosettaCode 및 SO에 설명했다 .
p=lambda x,i=2:i>=x or(x%i and p(x,i+1))or 0
x <2 인 경우 작동하지 않습니다. 는 or 0
로 대체 될 수 >0{2 spaces}
또는 4 개 공백
x <2 문제의 i>=x
경우 전면에 배치해야하기 때문에 (그렇지 않으면 무한 루프가있을 것입니다) i>=x
x <2 일 때 즉시 true를 반환 하므로 그에 대한 해결책이 없다고 생각합니다.
ÆPø“;;“»VOḣ2S⁵++3Ọ;”Pv
이것은 아마도 의도 된 해결책이 아니 었습니다.
ÆP
기본 제공 테스트입니다.
ø
새로운 닐라 딕 체인입니다. 이전 반환 값 (의 결과 ÆP
)이 범위를 벗어나므로 암시 적으로 인쇄됩니다.
“;;“»
문자열의리스트로 평가 ["< Aalst" ""]
하고, V
시도 그들을 평가 후면합니다. s
인수를 길이가 0 인 청크로 분할하려고 시도 하면 M 인터프리터가 중단되어 추가 출력이 억제됩니다.
q]tQ #aQ{*MyP
import random
def f(z):
if z<4:return z>>1
d,s,n,e,c=~-z,0,z,0,50
while not d&1:d//=2;s+=1
while n>0:n//=2;e+=1
random.seed()
while c>0:
a=0
while a<2or a>z-1:
a,b=0,e
while b>0:a=a*2+random.randint(0,1);b-=1
x,r=pow(a,d,z),~-s
if ~-x and x!=~-z:
while r>0:
x,r=pow(x,2,z),~-r
if not ~-x:return 0
elif x==~-z:break
else:return 0
c-=1
else:return 1