경찰과 강도 : 개정 된 우선 순위 (고무의 실)


9

이것은 강도의 실입니다. 경찰의 실은 여기에 있습니다 .

당신의 도전은 경찰의 스레드에서 균열없이 제출하고 원래의 수정되지 않은 프로그램을 찾으려고 노력하는 것입니다. 경찰이 코드를 해독했을 때 제출 한 내용에 대해 의견을 말하십시오.

답변:


6

brainfuck , 조 킹

>>>>>+>,[>++++++[-<-------->]<+>,]<[-[█<█<]++++++++++<]>[-]>>██[>█>>█>]+[<]<<[<]>█<<+>>[>]█>[>]█+[<]<<[<]>-█>]>>[->]<[-[[<]<]++++++++++<]>[-]>[<█]>]>[>]<[[█]<]<<<<<[<]<<██>>[>]<█[->+<]<█>>[>]<[-[[<]<]++++++++++<]>███>[<<]>[[[>]>████[<]<[-[[<]<]++++++++++<]>[-]>[█<]>]>[>]<[[-]>+[>]<-<[<]<]+<<<<<[<]>[[>]+[[>]>]>[>]>[-<+>]<[<]<[>+[<]>>-<<<<<[[<]<]>>███████>[[█]>]<]<[[<]<]<[█]>]>>>[[>]<->>]]>[[>]>]<<[[[█]<]<]<<<[█]<<█>>>[>]█[-[[<]<]++++++++++<]>>[[>]+[------->++<]>.+.+++++.[---->+<]>+++.>>]>[>]+[------->++<]>++.++.---------.++++.--------.
>>>>>+>,[>++++++[-<-------->]<+>,]<[-[[<]<]++++++++++<]>[-]>>[[[>]>>[>]+[<]<<[<]>[<<+>>[>]>>[>]<+[<]<<[<]>-]>]>>[->]<[-[[<]<]++++++++++<]>[-]>[<<]>]>[>]<[[-]<]<<<<<[<]<<[>>>[>]<[[->+<]<]>>[>]<[-[[<]<]++++++++++<]>[-]>[<<]>[[[>]>[>]+[<]<[-[[<]<]++++++++++<]>[-]>[<<]>]>[>]<[[-]>+[>]<-<[<]<]+<<<<<[<]>[[>]+[[>]>]>[>]>[-<+>]<[<]<[>+[<]>>-<<<<<[[<]<]>>[[-]+>]>[[>]>]<]<[[<]<]<[<]>]>>>[[>]<->>]]>[[>]>]<<[[[-]<]<]<<<[<]<<]>>>[>]<[-[[<]<]++++++++++<]>>[[>]+[------->++<]>.+.+++++.[---->+<]>+++.>>]>[>]+[------->++<]>++.++.---------.++++.--------.

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

이것은 에라토스테네스의 체를 구현합니다.

초기 값은 >>>>>+>,[>++++++[-<-------->]<+>,]각 숫자를 문자 코드로 입력하고 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"

다행히 실제 출력은 전혀 수정되지 않았습니다.


"날을 찾지 못하는 밤이 길다." 아직도 오늘 밤입니까? : P
Stewie Griffin

@StewieGriffin 나는 그날 밤에 그것을 할 수 없었고, 그때 내 마음이 미끄러졌습니다. 알림 주셔서 감사합니다.
Nitrodon

나는 당신이 여기 에서뿐만 아니라 내 자신의 코드를 설명 할 수 있다고 생각하지 않습니다. 아주 좋은 일입니다.
조 왕

5

볼프람 언어 (수학)

이 답변을 해독 합니다 .

f[x_]:=(p=ToString@Boole@PrimeQ@x;StringMatchQ[p&@@Infinity,RegularExpression@"(\
\n{}\b+, )?1"])

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


어떤 코드 : 읽기 위해 필요 스크롤하지
user202729

좋은! 의도 된 솔루션과는 상당히 다르므로 아직 밝히지 않습니다.
Pavel

@Pavel 이것대해 ? 아니면 여전히 "기본적으로 같은"?
user202729

힌트는 다음과 같습니다. 큰 얼룩에는 Boolenot not PrimeQ.
Pavel

5

브레인 플락, 메가 톰

(({████){██[████)█>(({}))<>}<>{}███{}((██({}))█████{}]██)({}(<>))<>{(({})){({}[()])<>}{}}{}<>([{}()]{})██[██()██(()█[()]██{}██}{}<>{})
(({})<>){([[]]{})<>(({}))<>}<>{}{}{{}(([]({}))[({}[{}])])({}(<>))<>{(({})){({}[()])<>}{}}{}<>([{}()]{})}([][()])((){[()](<{}>)}{}<>{})

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

이 프로그램은 n-2에서 1까지 시험 분할을 수행 한 다음 인수 1로 종료 된 경우에만 1을 출력합니다.


4

Joshua의 8086 DOS COM

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를 마스크 문자로 사용하고 █로 전환 할 때 모든 것이 올바르게 수정되지 않았기 때문에 발생했습니다.
Joshua

@Joshua 나는 처음에도 마무리를 사용했지만 1을 올바르게 처리해야한다는 것을 기억했습니다. 부패에 관하여-그것은 내가 상상 한 시나리오 중 하나입니다
NieDzejkob

3

젤리

답변을 해독 합니다 .

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 )에 부합하고 마지막 요소를 팝합니다.


3

sh + coreutils

이 답변을 해독 합니다 .

eecs 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

균열하는 방법

  1. 코드를보고 Base64를 인식하십시오.
  2. base64명령 사용법을 배우십시오 .
  3. 그것이 알고 +유효한 base64로 문자입니다.
  4. 디코딩을 시도하십시오 .
  5. 랩퍼 sh -c "`echo ...|base64 -d`"원래 프로그램에 다시 적용하십시오 .
  6. 명령에서 중첩 된 base64를 생성하십시오 .

올바른 방법. "일부 문제"가 모든 기계에 대해 아는 것은 아닙니다 tail +n. 직장에서 기계에 균열을 시도했을 때 그것에 대해 불평했습니다. 올바른 코드를 마스크 해제했습니다. ... :(
Joshua

3

옥타브 86 바이트 스튜 그리핀 .

@(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, 그것이 쉽다고으로는.


2

자바 스크립트

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)}

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

나는 이것이 당신이 생각한 것과 정확히 일치하는지 의심하지만 작동합니다.



2

자바 (OpenJDK 8) , 매직 문어 항아리

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);}}

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

코드에서 가져 RosettaCodeSO에 설명했다 .


그것이 인기가 있다는 것을 전혀 몰랐습니다! 내 뒷주머니에 오랫동안이 있었어요. 솔직히 내가 가지고 있던 유틸리티 파일에서 그것을 훔쳤다 ... Jeez ... 2014?
Magic Octopus Urn

2

파이썬 3 , 44 바이트, osuka_

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>=xx <2 일 때 즉시 true를 반환 하므로 그에 대한 해결책이 없다고 생각합니다.


결과적으로, 내 코드는 x <2에서도 작동하지 않습니다. 죄송합니다. (아마도 내가 방금 범위 (2, ...)로 테스트했을 것입니다)
osuka_

2

M, 딜난

ÆPø“;;“»VOḣ2S⁵++3Ọ;”Pv

이것은 아마도 의도 된 해결책이 아니 었습니다.

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

작동 원리

ÆP 기본 제공 테스트입니다.

ø새로운 닐라 딕 체인입니다. 이전 반환 값 (의 결과 ÆP)이 범위를 벗어나므로 암시 적으로 인쇄됩니다.

“;;“»문자열의리스트로 평가 ["< Aalst" ""]하고, V시도 그들을 평가 후면합니다. s인수를 길이가 0 인 청크로 분할하려고 시도 하면 M 인터프리터가 중단되어 추가 출력이 억제됩니다.


의도 된 해결책은 아니지만 훌륭합니다. 게시물이 금이 간 것으로 업데이트됩니다. 내가“동물원”이라는 단어를 말하면 다른 해결책으로 이어질까요?
dylnan 2019

흠, 그것은 복잡한 무한대처럼 들립니다.
Dennis


1

파이썬 3 , 사용자

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

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

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