回答:
元のコード:
[[ ! "${1////x}" =~ [[:alnum:]] ]]&&[[ $# = 1 ]]&&bash -c "$1"
入力:
__=; (( __++, __-- ));
(( ___ = __, ___++));
(( ____ = ___, ____++));
(( _____ = ____, _____++));
(( ______ = _____, ______++));
(( _______ = ______, _______++));
(( ________ = _______, ________++));
(( _________ = ________, _________++));
${!__##-} <<<\$\'\\$___$______$_______\\$___$______$_____\\$___$_______$__\\$___$_______$_________\'\ \$\'\\$___$___$__\\$___$______$_______\\$___$_______$______\\$___$_______$______\\$___$_______$_________,\ \\$___$____$_________\\$___$_______$_________\\$___$________$____\\$___$_______$______\\$___$______$______\\$__$______$___\'
説明:
これは「echo Hello、World!」をエンコードします 8進エスケープシーケンス(\ xxx)として。
数字も使用できないことを除いて、最初の部分では数字0〜7の変数を作成します。これらを使用して、実際のコマンドを提供するために評価される8進数のシーケンスで文字列を作成できます。
しかしeval
、英数字でもあります。その代わり、これはその文字列をの別のインスタンスへの入力としてパイプしますbash
。$0
Bashを起動するために使用されるコマンドの名前が含まれています。これは、通常(TIOを介して、または端末に貼り付けて)実行している場合は通常bash
(または-bash
ログインシェル用)です。(これは、スクリプトに貼り付けて実行しようとすると、何度もフォークしようとするため、事態がひどく悪くなることを意味します。)
しかし、とにかく、$0
直接言うことはできません。代わりに、( "0")$__
の名前が含まれ、$0
間接展開を使用してそれにアクセスできます(${!__}
のコンテンツを$0
参照します)。
そして、それは最後に、あなたに必要なすべての部分を提供します。
•GG∍Mñ¡÷dÖéZ•2ô¹βƵ6B
-107
•GG∍Mñ¡÷dÖéZ• - big number
2ô - split into twos (base-10-digit-wise)
¹β - to base of input
B - convert to base (using 012...ABC...abc...):
Ƶ6 - 107 (ToBase10(FromBase255(6))+101 = 6+101 = 107)
〡㋄ⶐ✐сᑀ⟙ⶐⶐ〡ސЀᶑ〡㋄ⶐ✐сᑀ⟙ⶐⶐ〡ސЀᶑ〡㋄ⶐ✐сᑀ⟙ⶐⶐ〡ސЀᶑ〡㋄ⶐ✐сᑀ⟙ⶐⶐ〡ސЀᶑ〡㋄ⶐ✐сᑀ⟙ⶐⶐ〡ސЀᶑ〡㋄ⶐ✐сᑀ⟙ⶐⶐ〡ސЀᶑ〡㋄ⶐ✐сᑀ⟙ⶐⶐ〡ސЀᶑ〡㋄ⶐ✐сᑀ⟙ⶐⶐ〡ސЀᶑ〡㋄ⶐ✐сᑀ⟙ⶐⶐ〡ސЀᶑ〡㋄ⶐ✐сᑀ⟙ⶐⶐ〡ސЀᶑ〡㋄ⶐ✐сᑀ⟙ⶐⶐ〡ސЀᶑ〡㋄ⶐ✐сᑀ⟙ⶐⶐ〡ސЀᶑ〡㋄ⶐ✐сᑀ⟙ⶐⶐ〡ސЀᶑ
sLƽ$Xṙ5O½Ọ
元のコードは次のように説明できます。
sLƽ$Xṙ5O½Ọ Main link; argument is z
s Split z into n slices, where n is:
$
ƽ The integer square root of
L the length of z
X Random of a list. Returns a random row of the input put into a square
ṙ5 Rotate the list left 5 times
O Get codepoints
½ Floating-point square root
Ọ From codepoints
だから、「Hello、World!」コードポイントを取得し、それらを二乗し、コードポイントにキャストバックし、右に5回回転してから、結果を二乗して平坦化します。
これが正しい解決策であるかどうかはわかりません(TIOでは\00
文字を出力します)が、私のoctave-cli
シェルでは次のようになります。
また、元のチャレンジでは、何も印刷しない(またはヌル文字)と表示されるため、何も同じでない場合は\00
これで問題ありません。
[72, 101, 108, 108, 111, 44, 32, 87, 111, 114, 108, 100, 33, 0]
0
をに置き換え10
ます)。
Hello, World!
と改行を出力するプログラムまたは関数を書くことです。」チャレンジからの正確な引用です。そして確かに、それは答えを些細なものにします。
{length:1, charCodeAt:()=>(e='Hello, World!', String.fromCharCode=()=>'')}
それはとても簡単でした。
Hello, World!
内部のすべてString.fromCharCode
が4の倍数のみを返し!
、33のcharコードを持っているため、文字列の入力は出力できないことに気付きました。したがって、プログラム全体をハックする必要があります。JavaScriptにビルトインをハッキングするのは、止めようとしないのであれば簡単です(たとえそうしても、多くの回避策があります...)。
呼び出された3回ごとに必要な文字のみを返す単純なプロキシ。
var i = 0;
var string = "Hello, World!";
var proxy = new Proxy([], {
get: function(target, property) {
if (!(++i%3)) {
return string[property];
}
return [1];
}
});
魔法の入力は次のとおりです。 1767707618171221 30191World!
1767707618171221
は素数であり、36進数で書かれてい"hello"
ます。大文字にすると"Hello"
、が生成されます。$><<
$><<", #$'"if/30191/
は30191
入力で番号を探し、stdoutにコンマ、スペース、およびその後の入力に含まれる文字列で構成される文字列を書き込みます30191
($POSTMATCH
ここでは、短いバリアントで参照されます$'
)。これを最初の引数として渡します:
C=("").char;_G[C(112,114,105,110,116)](C(72,101,108,108,111,44,32,87,111,114,108,100,33))
元のコードがfileにあると仮定してtehtmi.lua
、実行します(bashまたは同様のシェルで):
lua tehtmi.lua 'C=("").char;_G[C(112,114,105,110,116)](C(72,101,108,108,111,44,32,87,111,114,108,100,33))'
TIOが使用するLua 5.3でも動作します。オンラインで試してみませんか?「PUC-RioのLua 5.1」コアを使用する実装でテストしたことはありません(実際には情報が見つからないため)が、おそらく私のソリューションもそこで機能します。
最初の引数をコードとして実行しますが、含まれる小文字が5文字未満の場合のみです。
トリックは実行することprint("Hello, World!")
です。これを実行する別の方法は_G["print"]("Hello, World!")
、文字列のみを使用するを使用することです。
しかし、小文字カウントの制限のために文字列を直接使用することはできませんが、一連のバイトから文字列に変換できる("").char
関数を取得するために実行string.char
できます。上記のように使用できる文字列print
との両方を構築するために使用できるように、大文字の変数に割り当てました(制限に達しないHello, World!
ように)。
next
代わりにchar
、反復順序のランダム化のためにLua 5.3では機能しないものを使用することを考えていました。
入力はこれを含む文字列でなければなりません:
e(
`\
_\
=\
>\
"\
H\
e\
l\
l\
o\
,\
\
W\
o\
r\
l\
d\
!\
"\
+\
\`
\`
`)
これを使って試してください:
const e=eval,p=''.split,c=''.slice,v=[].every,f=s=>(t=c.call(s),typeof s=='string'&&t.length<81&&v.call(p.call(t,`\n`),l=>l.length<3)&&e(t)(t))
input='e(\n`\\\n_\\\n=\\\n>\\\n\"\\\nH\\\ne\\\nl\\\nl\\\no\\\n,\\\n \\\nW\\\no\\\nr\\\nl\\\nd\\\n!\\\n\"\\\n+\\\n\\`\n\\`\n`)'
console.log(f(input))
出力の末尾の改行の要件を気にしない場合は、代わりに最後の6行をこれで置き換えることができます。
!"
`)
入力の制限は、文字列であり、各行の長さが2バイト以下であり、合計の長さが80バイト以下であることです。正しく理解した後の私の最初の試みはこれでした:
_
=>
`\
H\
e\
l\
l\
o\
,\
\
W\
o\
r\
l\
d\
!
`
注:\
sは、入力の文字列の改行を無視します。これは答えにとって非常に重要であり、偶然に私がつまずいたとは信じられません。(以前はそれを知っていましたが、それを忘れていました)
しかし、これは機能しませんでした、なぜなら=>
引数は引数と同じ行になければならないからです。ありがたいことに、文字列で似たようなものをラップし、入力にevalを入れて1行に減らすというアイデアがあり、最終的な答えが得られました。入力でevalが発生すると、次の文字列として生成されます(関数にevalされてから実行されます)。
_=>"Hello, World!"+`
`
これをクラックするのは本当に大変でしたが、最終的には成功しました。
また、最初の亀裂!
これは常に危険だと思いますが、インタプリタにバグがあるという点で正しいと判断するまで、ひびが入っていると思います(今コンパイルしたばかりです)。
私の入力
0 1 0 1 0 1 0 1 1 0 1 0 0
出力はHello, World!\n\n\n\n\n\n\n\n\n\n.....
、終わりのない改行で行われます。
しかし、コードの最後のセクションに気付きました。
:1/1+1$(@6)7
0x0A
怖い方法でメモ帳を(改行)に設定し、面7(入力面)への入力を読み取り、7面がゼロになるまで6面(メモ帳の面)を繰り返し印刷します。面7をゼロに設定した場合、改行を1つだけ取得する必要があります。しかし、無限の改行があり、13番目の入力はゼロでした。ループに「7面からの印刷番号」を挿入することで、7面が常にゼロであることを確認できます。
:1/1+1$(@6%7)7
次に、終わりのない\n0
ペアを出力します。
私は立方体のgithubページの仕様を見ていますが、この動作は非常にバグのように見えます。元のプログラムの最後の文字7
をa からに変更する0
と、予期される動作が発生します。TIOインタープリターは、同じ誤った動作を示します。
q5/:i:c
00072001010010800108001110004400032000870011100114001080010000033
q - Take input (string)
5/ - split into chunks of five
:i - cast to integers
:c - cast to characters
私が見つけた解決策は、印刷できない文字を非常に多く使用するため、ここに貼り付けようとしてもうまくいきませんでした。入力のバイト値は次のとおりです。
109, 89, 4, 121, 3, 11, 8, 29, 37, 38, 27, 25, 72, 4, 4, 4, 3, 3, 3, 4, 4, 37, 3, 27, 4, 3
または、TIOリンクの入力フィールドで文字列バージョンを使用できます。
元のプログラムは、入力で個別の文字を使用し、入力を逆にして、2つのリストの要素を乗算します。したがって、最初の13文字が区別される26文字の文字列を作成し、最後の13文字もすべて最初の13文字に出現し、インデックスの各ペア[i, 26-i]
にのi番目の文字のバイト値を乗算しましたHello, World!
。
n[>n]<[8+o<]
2 25 92100106103 79 24 36 103100100 93 64
ここで試してみてください(ただし、ページは改行をレンダリングしません)。
n
入力を受け取り、スペースで分割してintにキャストしようとすると、これらはスタックに置かれます。o
序数を印刷し、8+
考えていることを行います。そのため、入力は、スペースで区切られた逆順のコードポイントよりも8少ない必要があります。
2
うまくいくと思っていただろう-それだけでherokuappページがそれをレンダリングしていないのですか?
元のコード:
#define O(c)(((char**)v)+c)
#define W(c)*(O(c)-**O(2)+x)
main(x,v){puts(W(42));}
引数:
"Hello, World!" ","
説明:
W(c)
引数リストから文字列のアドレスを計算して出力します。O(c)
この場合の42番目の引数であるc番目の引数()のアドレスで始まり**O(2)
、整数オフセットとして2番目の引数()の最初の文字を減算し、引数x
の数であるを追加します。
W(c)
2番目の引数を使用するため、少なくとも3つ(0、1、2)が必要であることがわかります。その後、「こんにちは、世界!」最初の引数に入ることができ、その引数に対応するには、ASCII値が式「42-x + 3 = 1」に適合する文字が必要です。それはたまたま「、」です。
解析されたオブジェクトのメソッドvalueOf()
とtoString()
メソッドをオーバーライドして、強制がaで失敗するようにしますTypeError
。
{"valueOf": 7, "toString": 7}
正解は、52768,23です
説明は少し複雑です。
00 c0 ;load address
20 fd ae jsr $aefd ; checks for comma
20 eb b7 jsr $b7eb ; reads arguments
コードは最初にコンマ(構文の必要性)をチェックし、次に2つの引数を読み込みます。最初の引数はWORDで、メモリ位置0014および0015にリトルエンディアンが格納され、後者はXレジスタに格納されます。
8a TXA ;Store second argument into A (default register)
0a ASL ; bitshifts the second argument left (doubles it)
45 14 EOR $14 ; XOR that with the low byte of first argument
8d 21 c0 STA $c021 ; Drop that later in the program
入力を使用してプログラムを書き換えるのは、かなり賢い方法です。最終的に、プログラムの最後に出力ループのカウンターを書き換えます。
45 15 EOR $15 ; XOR that with the high byte of the first argument
85 15 STA $15 ; Put the result in $15
49 e5 EOR #$e5 ; XOR that with the number $e5
85 14 STA $14 ; Put that in $14
不正な部分があります。
8e 18 d0 STX $d018 ; stores the original second argument in d018
C64では、d018は非常に重要なバイトです。画面の出力に関連するものの参照ポイントを保存します。詳細はこちらをご覧ください。これが間違った値を取得すると、C64がクラッシュします。必要な大文字と小文字を混ぜて印刷するには、17ドルである必要があります。
次に、出力ループを開始します。
a0 00 ldy #$00 ; zeroes out the Y register
b1 14 lda ($14),y ; puts the memory referenced by the byte
; starting at $14 (remember that byte?)
; into the default register
20 d2 ff jsr $ffd2 ; calls the kernal routine to print the char stored in A
c8 iny ; increment Y
c0 0e cpy #$0e ; test for equality with the constant $0e
その定数は、以前に上書きされたものです。ループの実行時間を明確に決定します。たまたま正しい値になっていますが、再び0eを付ける必要があります。
d0 f6 bne *-8 ; jump back 8 bytes if y and that constant weren't equal
60 rts ; ends the program
残りは、メモリアドレスc025から始まる、印刷する必要がある情報のみです。
ですから、そこから数学に従っているだけです。
$FF
た。
正解は
8bitsareenough
コードはかなり複雑で、多くの自己修正を伴います。したがって、完全にリバースエンジニアリングする代わりに、自分自身をクラックするために使用できます。
何が起こったのかを理解するのを助けるために、コードの逆アセンブリをもう少し役立ちます。構文はKickAssembler用です。
*=$c000 // LOAD ADDRESS
jsr $aefd //checks for a comma
jsr $ad9e /*Reads in an argument. Stores length of it into
$61, with the address of the stored arg in $62-3*/
jsr $b6a3 /*Evaluates the string, leaving the pointer on $22-3
and the length on A*/ //I think
ldy #$00
loop: lda thedata,y
cpy #$01
beq shuffle
cpy #$07
beq shuffle
cpy #$0b
beq shuffle
tricks: jsr output
iny
bne loop
output: eor ($22),y //XOR's A with the y-eth letter of our input
jmp $ffd2 //good old CHROUT, returns to tricks above
thedata: .byte $f0,$48,$fa,$a2, $1c,$6d,$72,$30
.byte $06,$a9,$03,$48,$7c,$a3
shuffle: sta $c048 //drops A in mystery+4, over the constant
lda $c026,y
sta $c045 //overwrites the low byte of mystery
lda $c027,y
sta $c046 //overwrites the high byte of mystery
ldx #$00
mystery: lda $aefd,x
eor #$23
jsr output
iny
inx
cpx #$03
bne mystery
cpy #$0e
bne loop
eor #$1a
sta $d018
rts
このようにラベルを付けると、コードが必要なものを印刷するために隠されている一連の定数をXORすることがわかります。XORは可逆なので、目的の出力を入力すると、キーが何であるかがわかります。
だから私は最後の行を切り替えました
/*from sta $d018
to*/ jsr $ffd2
したがって、間違った入力でクラッシュするのではなく、最後に必要な入力を出力します。
それだけです!
興味があれば、コードをさらにクラックします。
vice
drops A in mystery+1, over the constant
" <-それは実際mystery+4
にあなたのラベルにあります。攻撃はバイト単位です:)およびFWIW、コードがRAMから実行される限り、深刻な 6502コードでも自己修正は非常に一般的です。
元のコード:
œ?“¥ĊɲṢŻ;^»œ?@€⁸ḊFmṪ⁷
入力:
1,2586391,2949273,3312154,3312154,1134001,362881,2223505,766081,1134001,1497601,3312154,1860601,140
説明:
主に、コードの機能を理解する必要があります。最初に行うことは、文字列を取得することです
"!,Word Hel"
(改行を除く必要なすべての文字を含む)、それらの順列の束を作成します。入力は順列番号を指定し、入力からの順列の各ペアは、最初の順列が最初に適用されるストリング除外ペアに適用されます。基本的に、P2(P1(S))、P2(P2(S)、P2(P3(S))、...、P2(PN(S))、P3(P1(S))、...、P3 (PN(S))、... ...、PN(P1(S))、...、PN(PN(S))これらはすべて連結され、最後の入力はすべてのPNthを取得するために再利用されます。この大きな文字列の文字です。PN= len(S)* N = 10 * Nを使用します。これは、P3(P1(S)の最初の文字であるP2(P1(S))の最初の文字を取得することを意味します))、PN(P1(S))の最初の文字までずっと。さらに単純化するために、P1 = 1を同一性の順列とします。その後、「H」を最初に置換するP2を選択するだけで十分です。ポジション、「e」を最初の位置に並べ替えるP3など。幸いなことに、PNにすでに選択されているような小さな順列番号は、文字列内の初期の文字に影響を与えないため、PNは「!」を残します。文字列の先頭。(これが当てはまらない場合でも、別のP1を選択することで解決できます。)
4195875
2番目の引数を文字列として出力しようとします。これは、入力で決定できるポインターです。ちょうどメモリ4195875
が"Hello, World!\n"
文字列を開始することが起こります。
番号は、のprint("%p", "Hello, World!");
前にprintf
16進数を10進数に変換して追加することで決定され、元のTIOで試されました。ただし、printf
書式文字列は表示されました。いくつかの数字を試してみると、文字列がフォーマット文字列の前にあることがわかりました。
したがって、メモリでは、次のようになります(C文字列として):
Hello, World!\n\0%2$s\0
これは、コンパイラの更新がソリューションを破壊する可能性があることも意味します。
[1, "HH", 1, "eellloo", 1, ",,", 1, " WWoo", 1, "rr", 1, "ll", 1, "dd", 1, "!!"]
説明が少し入っています...
var i = 0;
var string = `"${t}"`;
var answer = "i++?0:q=string";
console.log( f(answer) );
PDO,FETCH_CLASSTYPE
(TIOにはPDOクラスが定義されていないため、上記のデモではコードパッドを使用します)
別の解決策:
ReflectionFunction,IS_DEPRECATED
81文字という制限を考えると、これはおそらく意図した解決策ではありません
global.g = ()=>"Hello, World!";
var str = "g";