回答:
>>>>>+>,[>++++++[-<-------->]<+>,]<[-[█<█<]++++++++++<]>[-]>>██[>█>>█>]+[<]<<[<]>█<<+>>[>]█>[>]█+[<]<<[<]>-█>]>>[->]<[-[[<]<]++++++++++<]>[-]>[<█]>]>[>]<[[█]<]<<<<<[<]<<██>>[>]<█[->+<]<█>>[>]<[-[[<]<]++++++++++<]>███>[<<]>[[[>]>████[<]<[-[[<]<]++++++++++<]>[-]>[█<]>]>[>]<[[-]>+[>]<-<[<]<]+<<<<<[<]>[[>]+[[>]>]>[>]>[-<+>]<[<]<[>+[<]>>-<<<<<[[<]<]>>███████>[[█]>]<]<[[<]<]<[█]>]>>>[[>]<->>]]>[[>]>]<<[[[█]<]<]<<<[█]<<█>>>[>]█[-[[<]<]++++++++++<]>>[[>]+[------->++<]>.+.+++++.[---->+<]>+++.>>]>[>]+[------->++<]>++.++.---------.++++.--------.
>>>>>+>,[>++++++[-<-------->]<+>,]<[-[[<]<]++++++++++<]>[-]>>[[[>]>>[>]+[<]<<[<]>[<<+>>[>]>>[>]<+[<]<<[<]>-]>]>>[->]<[-[[<]<]++++++++++<]>[-]>[<<]>]>[>]<[[-]<]<<<<<[<]<<[>>>[>]<[[->+<]<]>>[>]<[-[[<]<]++++++++++<]>[-]>[<<]>[[[>]>[>]+[<]<[-[[<]<]++++++++++<]>[-]>[<<]>]>[>]<[[-]>+[>]<-<[<]<]+<<<<<[<]>[[>]+[[>]>]>[>]>[-<+>]<[<]<[>+[<]>>-<<<<<[[<]<]>>[[-]+>]>[[>]>]<]<[[<]<]<[<]>]>>>[[>]<->>]]>[[>]>]<<[[[-]<]<]<<<[<]<<]>>>[>]<[-[[<]<]++++++++++<]>>[[>]+[------->++<]>.+.+++++.[---->+<]>+++.>>]>[>]+[------->++<]>++.++.---------.++++.--------.
これはエラトステネスのふるいを実装します。
最初>>>>>+>,[>++++++[-<-------->]<+>,]
は、各桁を文字コードとして入力し、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"
幸い、実際の出力はまったく編集されませんでした。
この答えをクラック。
f[x_]:=(p=ToString@Boole@PrimeQ@x;StringMatchQ[p&@@Infinity,RegularExpression@"(\
\n{}\b+, )?1"])
Boole
ませんPrimeQ
。
(({████){██[████)█>(({}))<>}<>{}███{}((██({}))█████{}]██)({}(<>))<>{(({})){({}[()])<>}{}}{}<>([{}()]{})██[██()██(()█[()]██{}██}{}<>{})
(({})<>){([[]]{})<>(({}))<>}<>{}{}{{}(([]({}))[({}[{}])])({}(<>))<>{(({})){({}[()])<>}{}}{}<>([{}()]{})}([][()])((){[()](<{}>)}{}<>{})
このプログラムは、n-2から1までの試行除算を実行し、これが因数1で終了した場合にのみ1を出力します。
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をマスク文字として使用していて、█に切り替えるときにすべてを正しく修正しなかったことが原因でした。
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)に一致しṖ
、最後の要素をポップします。
この答えをクラック。
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
1つの未知の次元をとることができることを理解するだけでしたが、同じバイトカウントで[]
実行できたと思いreshape(...,2, 7)
ます。
(100 +'e'
)の代わりに(101)を使用+'d'
すると、最後の数字(解読されていない)が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)}
どういうわけか、これがまさにあなたが心に描いていたものだとは思えませんが、うまくいきます。
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ø“;;“»VOḣ2S⁵++3Ọ;”Pv
これはおそらく意図された解決策ではありませんでした。
ÆP
組み込みの素数性テストです。
ø
新しいニラディックチェーン。以前の戻り値(の結果ÆP
)はスコープ外になるため、これは暗黙的にそれを出力します。
“;;“»
文字列のリストに評価["< Aalst" ""]
し、V
それをevalにしようとします。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