警官と強盗:編集された素数(強盗のスレッド)


9

これは強盗のスレッドです。警官のスレッドはこちらです。

あなたの課題は、警官のスレッドからひびの入っていない提出物を取り、元の編集されていないプログラムを見つけようとすることです。コードをクラックしたら、警官の提出にコメントしてください。

回答:


6

ブレインファックジョーキング

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

オンラインでお試しください!

これはエラトステネスのふるいを実装します。

最初>>>>>+>,[>++++++[-<-------->]<+>,]は、各桁を文字コードとして入力し、47を減算して1〜10の範囲にします。これにより、セル値0は数値間の間隔を示すことができます。の+>このセクションの冒頭近くには重要とすぐになり、少なくとも2桁、する番号を強制します。

次に、そして私が最初に理解したことの1つは、セクション<[-[[<]<]++++++++++<]>[-]>です。これはコードに数回表示され、それぞれ編集のパターンが異なりますが、これらのインスタンスがすべて同じコードであると推測するのは難しくありませんでした。このコードでは、テープの10進数の左側に3つのゼロが必要であり、その効果は数値を減らすことです。ループの最後の反復では、値の10の2セルが数値の左[-]に配置されますが、クリーンアップされます。

10進数が0の場合、余分な10は作成されず、0でゼロ設定されたセル[-]が最上位の桁になります。その場合、テープヘッドは最上位の2桁目です(そのため、少なくとも2桁が必要です)。このスニペットのほとんどのインスタンスの直後にが続きます。これにより[<<]>、通常の状態ではゼロ以外のセルにヘッドが配置され、元の10進数がゼロの場合はゼロのセルに配置されます。このプログラムでは、の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

現在、これらの数値はすべてテープ上にあり、2つのゼロセルで区切られています。 <<<<<[<]<<テープの最後から2番目の番号の最後のセルに移動します。これは、ループのすべての反復での位置です。ループは、元の数を除くすべての数が処理されたときに終了します。

ループの開始時に、現在の番号(テープに残っている最後の番号)を1セル右に移動して減分する余地を作り、次に進み、減分します。

[>>>[>]<[[->+<]<]>>[>]<[-[[<]<]++++++++++<]>[-]>[<<]>

この減少がアンダーフローしなかった場合、数値を単項に変換します:

[[[>]>[>]+[<]<[-[[<]<]++++++++++<]>[-]>[<<]>]

この省略されたものは閉じられていないことに注意してください[。その結果、数値が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
]

[[-]+>]そのセクションでは、私は考え出した最後の部分でした。その前は、プログラムは試験的な分割だけをしていると思いましたが、結果がどこで使用されているのかわかりませんでした。

このループは、左端の番号の左側の2つのセルを終了>>>[[>]<->>]]し、テープに配置されたマーカーを削除して、再びテープの最後に移動します。その後>[[>]>]<<[[[-]<]<]、単項クロック、またはこのセグメント全体がスキップされた場合は、残りの10秒が削除されます。ループは、で開始条件に設定され<<<[<]<<]ます。

この後、入力番号がいつでも1に置き換えられたかどうかを読み取っているだけです。

>>>[>]<[-[[<]<]++++++++++<]>>                      do the check
[[>]+[------->++<]>.+.+++++.[---->+<]>+++.>>]      conditionally print "not "
>[>]+[------->++<]>++.++.---------.++++.--------.  unconditionally print "prime"

幸い、実際の出力はまったく編集されませんでした。


「夜は長く、日を見つけることはありません。」今夜まだですか?:P
Stewie Griffin、

@StewieGriffin私はその夜それをすることができなかった、そしてそれはそれが私の心を滑らせた。念押し有難う。
ニトロドン

ここで説明したように、自分のコードを説明できなかったと思います。とてもいい仕事です。
ジョーキング

5

Wolfram言語(Mathematica)

この答えをクラック。

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

オンラインでお試しください!


コードを読むためにスクロールする必要はありません:)
user202729

いいね!意図したソリューションとはかなり異なるため、まだ明らかにしません。
Pavel

@Pavel これはどうですか?それとも「基本的には同じ」ですか?
user202729

ヒントは次のとおりです。その大きなblobには、どちらも含まれていBooleませんPrimeQ
Pavel

5

ブレインフラック、メガトム

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

オンラインでお試しください!

このプログラムは、n-2から1までの試行除算を実行し、これが因数1で終了した場合にのみ1を出力します。


4

ジョシュアによる8086 DOS COM

xxd エンコーディング、nullバイト、およびその他の恐ろしいものによる表現:

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を使用して組み立てました。ジョシュアが使用した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私も最初はそこでfinishを使用しましたが、1を正しく処理する必要があることを思い出しました。腐敗について-それは私が想像したシナリオの1つです
NieDzejkob

3

ゼリー

この答えをクラックます。

25██26█966836897364918299█0█1█65849159233270█02█837903312854349029387313█ị██v
250126,9668368973649182994001,658491592332700020837903312854349029387313ṖịØJv

オンラインでお試しください!


説明:

とを見て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バイト、Stewie Griffin

@(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]

残りは、ドキュメントを調べて、でreshape1つの未知の次元をとることができることを理解するだけでしたが、同じバイトカウントで[]実行できたと思いreshape(...,2, 7)ます。

(100 +'e')の代わりに(101)を使用+'d'すると、最後の数字(解読されていない)が00ではなく01、であることに気づくまでさらに数分間私を投げてくれたので、簡単でした。


2

JavaScript

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

> <>孤独な果実

:1@v>~~:?1n;█$-1<█?=2:}*{█@:$@:

:1@v>~~:?1n;
$-1</?=2:}*{%@:$@:

オンラインでお試しください!

改行の編集の巧妙な使用は、少し混乱しました。1か2のために働かないようです。


いいね。いずれかが^v/、または\ 第二のブランクのためにそこに働いている可能性があります。*代わりにをカバーしていればよかったのですが/
2018

2

Java(OpenJDK 8)Magic Octopus Urn

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説明されています。


それがその人気のあるハハであるとは知らなかった!これを長い間バックポケットに入れていました。私は正直に私がそれ以来持っていたユーティリティファイルからそれを盗みました... Jeez ... 2014?
マジックタコの壺

2

Python 3、44バイト、osuka_

p=lambda x,i=2:i>=x or(x%i and p(x,i+1))or 0

オンラインでお試しください!

x <2の場合は機能しません。は4個のスペースでor 0置き換えることもでき>0{2 spaces}ます。

x <2の問題のi>=x場合、先頭に配置する必要があるため(そうしないと、無限ループが発生します)、i>=xx <2の場合はすぐにtrue が返されるため、これで修正できないと思います。


結局のところ、私のコードはx <2でも機能しません。おっとっと。(私は愚かなので、おそらくrange(2、...)でテストしただけです)
osuka_

2

M、ディルナン

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

これはおそらく意図された解決策ではありませんでした。

オンラインでお試しください!

使い方

ÆP 組み込みの素数性テストです。

ø新しいニラディックチェーン。以前の戻り値(の結果ÆP)はスコープ外になるため、これは暗黙的にそれを出力します。

“;;“»文字列のリストに評価["< Aalst" ""]し、Vそれをevalにしようとします。s引数を長さ0のチャンクに分割しようとします。これにより、Mインタープリターがクラッシュし、それ以上の出力が抑制されます。


意図したソリューションではありませんが、素晴らしいです。すぐにポストをクラックするように更新します。私が「動物園」という言葉を言ったら、それはあなたを別の可能な解決策に導きますか?
ディルナン

うーん、それは複雑な無限のように聞こえます。
デニス


1

Python 3user71546

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.