このプログラムには印刷できない文字がいっぱいです。そのため、hexdumpがあります。
00000000: 2573 dc01 7e13 dcb6 1f %s..~....
注:これは、負の数値を入力できない数値入力ルーチンを使用するため、この送信は非負の整数のみに制限されます。
警官と強盗の課題の1つの問題は、コードの説明を書かないことです(解読を難しくするため)。一方、これは私がここでトラブルに行く必要がないことを意味します。
特に圧縮表記では読みにくいので、言語として7を選択しました。8ビットのプログラムの塊を移動する手間をかけなければならないのはなぜ私だけなのかわかりません。3ビットエンコーディング。がんばろう!
説明
プログラムがクラックされたので(残念ながらブルートフォースにより、これらの短いソリューションでは常に危険です)、私が何を得たかを説明することもできます。これは、実際にプログラムを読むことでかなり解決できました。もっと難しくすることもできましたが、ブルートフォースクラックが存在する場合、それは悪い考えのように感じました。
プログラムをより自然なエンコードで表現することから始めます。;いつものように、太字の数字は(プログラムで表現されていないすべてがすぐに実行するコマンドを示している6
と7
されているが、2
に5
、unbolded数字はそのエスケープ同等物(表現していない)0
に5
、元のプログラムで表現されているすべてがする、;注意をそれ0
はエスケープされ6
て1
おり、エスケープされています7
):
112 7 1 7 34002 77 023 67 13303
それは基本的に、元のスタック(そこのあなただけのエスケープコマンドで行うことができます何もない、ただ表しリテラルだと7プログラムのソース平均で利用可能なコマンドのセット6
と7
)を。そのため、プログラムが最初に行うことは、大量のものをスタックにプッシュすることです。次に、プログラムの実行後のスタックの様子を示します(|
7で通常のようにスタック要素を分離します)。
772 | 7 | 34662 | 023 | 73363
次に、最後のスタック要素がコピーされ、実行されるコードになります(スタックに残ります)。たまたま、これはコードであるプログラムの唯一の部分です。それ以外はすべてデータです。以下がその意味です:
73363
7 空の要素をスタックにプッシュする
3 最上位スタック要素を出力し、その下の要素を破棄する
73 これらの複合効果: 最上位スタック要素を破棄する3最上位スタック要素を
出力し、下位要素を破棄する
6 最上位スタック要素をエスケープしてから、それを下の要素に追加します
3 一番上のスタック要素を出力し、下の要素を破棄します
言い換えれば、これは主に単なる一連のI / O命令です。これを詳細に分析しましょう。
73
73363
スタックの一番上にあるものを破棄します。
3
を出力し023
、を破棄し34662
ます。したがって34662
、これは他のバージョンのプログラムで必要なバイトを保存するために使用されたコメントであることがわかります。023
出力時に何を行うかについては、I / Oフォーマット0(整数)を選択し23
、実装に整数の入力を要求するディレクティブです(7では、入力を要求する特定のコードを出力して入力を行います)。入力は、以下のスタック要素のコピーを作成することによって行われます。たとえば、入力整数が10の場合、次のスタック要素(現在7
)はになり7777777777
ます。したがって、ユーザーからの入力を10進数で受け入れていますが、単項として格納されています。
6
上のスタック要素をエスケープし(7
toの各インスタンスを変更し1
ます;これは7
s のみで構成される文字列をエスケープする方法です)、それをスタック要素の前に追加します(772
)。したがって、データはのようなものになりました7721111111111
。
- 最後に、
3
問題のスタック要素を出力します(デフォルトの初期スタックの一部である空のスタック要素をポップします)。その値は数取ることによって計算され1
、Sと7
Sを、そして多くの減算0
Sおよび6
Sを。(2
ほとんどの場合、中央の文字は無視されます。文字列の末尾にある場合、無視される代わりに末尾の改行になりますが、PPCGルールはそれを気にしません。)入力プラス2。
この時点では、スタック上に有用なものもプログラム内にも何もないため、プログラムは終了します。
これを逆にするにはどうすればよいですか?11
to を変更するだけの簡単なことな00
ので、入力に文字を追加して、それを2高くするのではなく2低くします。あります00
さらに、プログラム内の便利な隠された8進数字(ように8進数は、互いにラインアップバイト)、我々がそれを簡単に入れ替えることができますので、11
スタート時。