爆弾を撃破せよ!


214

あなたは、善良な人が仕事を成し遂げ、世界を救うことができるように、秘密のエージェントの相棒としてあなたの技術知識のために雇われました。

これは、高い給料と全世界の感謝の気持ちで引退する前の最後の使命です。しかし、あなたは邪悪な天才の巨大な超巨大爆弾を武装解除しなければならない前に(邪悪な天才は再帰的な頭字語が好きな賢い尻だと思われます)。とにかく、あなたとあなたの仲間は邪悪な天才の秘密基地のまさに核心にあり、大陸を一掃できる爆弾を武装解除する準備ができています。前のミッションでは、驚いたことに「PASSWORD_01」という武装解除コードを取得できました。キーボードをBOMBに接続しますが、準備ができたら、邪悪な天才の子分が弾丸の弾丸で入ります。残念ながら、これらの箇条書きの1つはキーボードに影響を与えます。「私はそれらのd * ckheadsをそらす間、仕事を終えなさい!」相棒が言ってから銃を撃ち始めます。

スペック

  1. 任意の方法で文字列を出力するプログラムを作成しますPASSWORD_01(大文字)。
  2. キーボードが弾丸に当たったため、これらのキーのみを使用できます。

    1 2 3 4 5

    Q W E R T

    A S D F G

    < > Z X C

    Ctrl Shift Tab Space

    Shiftキーを使用すると、キーボードで次の文字を使用できます。

    ! " · $ %

  3. キーボードと画面(マウスなど)以外のハードウェアも、コンピューターに書き込まれたパスワード付きのファイルもありません。

  4. インターネットに接続していません。

  5. 箇条書きに入る前にインタープリターシェル/ソースエディターを開いていると仮定できます。悲しいことに、キーボードを押す前に何も書いていません。

  6. 仮想キーボードがありません。実際、BOMBにはTOO_FUNNY検出器があり、標準の抜け穴を使用しようとすると爆発します。

  7. あなたの仲間はあなたが秘密基地から脱出するためにあなたがすぐに終わるのを待っているので、あなたは可能な限り最小のコードを書く必要があります(そのため、です!)。

カウントダウンが始まったので頑張ってください!

ヘルプモード:また、KEY(一つだけ、あなたがキーボードから必要なキーではなく、Shiftキー+キーまたは任意の他の組み合わせ)が奇跡的にあまりにも生き残っています。例えば:あなたが使用することができ=、または0あるいは/...この余分なキーは、の文字のいずれかにすることはできませんPASSWORD_01(あなたが追加することはできませんPO)。答えにそのキーの名前を付けます。このキーの使用回数に関係なく、このキーの使用に対して10文字のペナルティが課せられます。


67
キーボードのレイアウトをDVORAKに変更できますか?
n̴̖̋h̷͉a̷̭̿h̸̡̅ẗ̵̨d̷̰ĥ̷̳

42
少なくともEnterキーを取得しますか?
Οurous

72
空白、ここにあなたの大きなチャンスがあります!
german_guy 14年

43
なぜパスワードができなかったのですstewardessesか?
コードブレーカー14年

24
冗談の答え:私はスパイです。時計に隠されているバックアップキーボードに切り替えます。
Nzall

回答:



136

bash、vim、dc(343)

私は悪魔の天才によって設定されたbashプロンプトに座っていますVISUAL=vim。もちろん彼はデフォルトの環境にいます。edit-and-execute-commandC-x C-e)bashにデフォルトのbashバインディングを使用する$VISUALと、終了時にバッファーの内容が呼び出され、実行されます(ZZ)。次のシーケンスを入力します(注:kbd-modeは、通常モードおよび制御シーケンスで発行されるコマンドです):

  1. C-xC-e
  2. acat <<< 45 C-c4C-aaa

    現在、vimバッファにはが含まれていますcat<<<49a。続く...

  3. 45 C-c3C-aaa

  4. 54 C-c41C-aaa
  5. 55 C-c13C-aaa

    現在、vimバッファにはが含まれていますcat<<<49a48a95a68a。続く...

  6. 51 C-c31C-aaa

  7. 55 C-c24C-aaa
  8. 44 C-c43C-aaa
  9. 42 C-c41C-aaa
  10. 42 C-c41C-aaa
  11. 54 C-c11C-aaa
  12. 55 C-c25C-aaa> s

    現在、vimバッファには cat<<<49a48a95a68a82a79a87a83a83a65a80a>s

    挿入モードを終了し、保存して終了します

  13. C-cZZ

    sファイルは現在含まれているdcスタック上に目的の文字列を生成するスクリプトを、今、私たちは、印刷コマンドを追加する必要があります。

  14. C-xC-eadc <<< 55 C-c25C-aaa >> sC-cZZ

    上記のコマンドを9回繰り返します。

  15. C-xC-eadc <<< 55 C-c25C-aaa >> sC-cZZ

  16. C-xC-eadc <<< 55 C-c25C-aaa >> sC-cZZ

  17. C-xC-eadc <<< 55 C-c25C-aaa >> sC-cZZ

  18. C-xC-eadc <<< 55 C-c25C-aaa >> sC-cZZ

  19. C-xC-eadc <<< 55 C-c25C-aaa >> sC-cZZ

  20. C-xC-eadc <<< 55 C-c25C-aaa >> sC-cZZ

  21. C-xC-eadc <<< 55 C-c25C-aaa >> sC-cZZ

  22. C-xC-eadc <<< 55 C-c25C-aaa >> sC-cZZ

  23. C-xC-eadc <<< 55 C-c25C-aaa >> sC-cZZ

  24. C-xC-eacat <<< f >> s

    dcスクリプトを実行します。

  25. C-xC-eadc sC-cZZ

出力:

PASSWORD_01

sファイルの内容:

49a48a95a68a82a79a87a83a83a65a80a
P
P
P
P
P
P
P
P
P
P
f

4
私はキャラクターのvimために台本を書くことを考えていましたCtrl。ペアリングするのは良い考えdcです!また、優れたソリューション:)
nneonneo 14年

2
これらすべての<kbd> </ kbd>タグを書くのにどれくらい時間がかかりましたか?
ちょうど半分14年

15
@justhalf:<Leader>kこのようにバインドしてvimで書いたので、map <Leader>k i<kbd></kbd>^[F>a見た目ほど悪くはありませんでした:-)。
トール

18
エージェントトールが彼のツールを完全に知っていることは明らかです。引退に値する、先生!
ちょうど半分

67

ルビー、57 + 10(*)= 67

$*<<4*4*5<<214%135<<44%25*5<<1%1
$><<"%cASSW%cRD%c%d1"%$*

この回答では*、と%を使用して、欠落している文字のASCII値(およびFixnumとして0)を構築し、それらを$*ARGV)にプッシュします。次に、この配列をフォーマット文字列と組み合わせて使用​​して、正しいパスワードを生成します。このパスワードは$><<$>で出力されます)。

ルビー、62 + 10(.)= 72、改行なし

$>.<< "%cASSW%cRD%c%d1".% %w%%<<311%231<<214%135<<321%113<<1%1

上記のバージョンとほぼ同じ原理ですが、ここでは配列は空の配列リテラル(%w%%)から構築されます。.必要な演算子の優先順位を取得するには、いじる必要があります。


13
「これは、高い給料と全世界の感謝で引退する前の最後の使命です。」おめでとう、私たちはすべてあなたに感謝します:)
ティムテック

4
PerlがRubyの最大のインスピレーションの1つであるという究極の証拠。
ピエールアラード

11
どうやって改行をしましたか?
頭足類14年

4
@Arian nneonneoがPythonコードをREPLに入力した後に実行するのと同じように...改行なしのバージョンを追加します。
Ventero 14年

邪悪な天才にはルビーがインストールされていますか?
Mhmd 14年

36

空白(148 + 10 = 158)

Enter ここでキーを使用する必要があります。

SS+1010000L // Push code of P
TLSS        // Output character
SS+1000001L // Push code of A
TLSS        // Output character
SS+1010011L // Push code of S
SLS         // Duplicate top stack
TLSS
TLSS
SS+1010111L // Push code of W
TLSS
SS+1001111L // Push code of O
TLSS
SS+1010010L // Push code of R
TLSS
SS+1000100L // Push code of D
TLSS
SS+1011111L // Push code of _
TLSS
SS+0L       // Push 0
TLST        // Output number
SS+1L       // Push 1
TLST        // Output number
LLL         // End program

私の表記法の説明:

  • S+0空間です。
  • T1タブです。
  • L 改行です。
  • // コメントを開始します。

各行は空白言語のコマンドです。

デモ


1
ああ男...私はちょうどそれに取り組んでいた:(
Teun Pronk 14年

1
私もそうですが、私はより高速になり、この知っている誰かをあきらめた
german_guy

「L」は使用できないと思いましたか?
内部サーバーエラー

@ 500-InternalServerError:実際にLは改行文字を表します。実際のコードについては、デモを確認してください。私が投稿したのは読みやすいバージョンです。
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ 14年

ああ、私は今それを得る。
内部サーバーエラー

25

パイソン(2200 395 + 10)

exec"""exec"exec"+"%ca"%34+"%c52+53"""+"%c55+55"%44+"%c34"%44+"%c45+35"%44+"%c"%44+"""34%%cexec"%"""+"%c"%54+"""1+"%c"%34+"%%5%c+"%5"""+"%c"%55+"""+"%c"%34+"%c"""+"%c"%112+"""r%%c%%ct%%c%%cASSW"+"%c%%34+"%34+"%c%%cRD"%34+"%c%%"""+"%c"%55+""""%34+"%c+"%5"""+"%c"%55+"""+"%c%%c"%34+"%c%%"%34+"%c5+"%5"""+"%c"%55+"""+"%c"%34+"%c1%%c"+"%c%%4"%34+"%c+"%5"""+"%c"%54+"""+"%c"%34+"%c%%a"+"%c%%34"%34"""

+テンキー(または特定のキーレイアウト)から取得できる文字(+10のコスト)が必要でした。

ええ、私がそれをタイプしている間、おそらくBOMBは消えました。

基本的なアプローチは、とを使用してexec、さらに大きな文字セットを作成すること"%c"%(number)です。exec相互にネストされた4つのがあります。徐々に、私の数字セットは

  1. 12345
  2. 1234567(6 = ASCII 54、7 = ASCII 55)
  3. 123456789(8 = ASCII 56、9 = ASCII 57)
  4. 0x0123456789abcdef

そのため、最後の反復で任意の文字を表現できます(したがって、最も内側のバージョンが実際にすべてのプログラムを実行できるようになります)。

ステートメントの"%c"%34ネストされた性質はexec引用文字を積極的に「エスケープ」する必要があるため、プログラムの約50%は単なる引用文字です(二重引用符です)。


数字キーパッドから「+」を使用すると、キーボードの言語に依存しなくなります。
celtschk 14年

@celtschk:良い点!それを編集します。
nneonneo14年

1
ネストされたexecを使用して数字セットを構築するのではなく、算術を使用して数値を取得できませんでしたか?例 exec '%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c'%(112,114,51+54,55+55,1+115,32,4+35,25+55,11+54,31+52,31+52,32+55,24+55,31+51,13+55,41+54,3+45,4+45,4+35)
ケビン14年

2
両方のかっこを取得することはできません。(私はこれを考慮しました!)
nneonneo 14年

さらに、Pythonには、%よりも強力にバインドする演算子が多くありません。**は1つですが、ほとんどの用語の作成にはほとんど役に立たない傾向があります。
nneonneo 14年

25

不眠症 39 35 31 29

この言語は、命令を単一のASCII文字でエンコードする言語を探していたときに登場します。この言語は実際には文字の10進ASCIIコードで動作するため、キーボードの半分が破壊されていても非常に柔軟です。

さらに29文字にドロップダウンします。これは、メモリ使用量を減らして検索スペースを増やした後に可能になります。

FdFzt%dF<rGdt>tt Gtreeet t%4s

許可された文字の完全なセットで微調整したプログラムを実行し、解決策を31文字に削減することにしました。

FdFGt dtreeC>tt FFdx<Fdtr ztq4s

このソリューションを検索するためにプログラムを使用しました。これは、私のプログラムによって返される多くのソリューションの1つであり、すべて同じサイズです。

Fddx>"eCeezdC>CefCdddzCzzfCqred>r4s

手作業で構築された古いバージョン。これをするために朝まで起きていたことを覚えています。

Fddx>"eCeezdC>Cef>dx"dCezeeedeCrqeeC%4s

これがテスト用の不眠症通訳です。


3
プログラミング言語の選択と一致する「午前中まで」の+1。
ちょうど半分14

20

一部のウィンドウマネージャーでのVim + PHP

44ストロークで65キー、使用すると10ポイントのペナルティがあり=ます。

aEACE<Alt+Tab>z=5<Alt+Tab>$xxxxaASSWRD<Alt+Tab>z=1<Alt+Tab>
$a$aA<Alt+Tab>==wxx$r1<^X>a1

内訳:

  • Alt+TabEscVim、またはおそらくこのターミナルエミュレータで動作するように見えます。新しいことを教えてくれてありがとう!
  • aEACE<Alt+Tab>:追加モードに入り、「EACE」を挿入します。出口。
  • z=5<Alt+Tab>:スペル訂正を実行します。5、「PEACE」を選択します。出口。(ここでEsc動作するようEnterです!)
  • $xxxxaASSWRD<Alt+Tab>:行の最後に移動します。4文字を削除して追加ASSWRDPASSWRDます。通常モードに戻ります。(いいえ、4x動作しません。)
  • z=1<Alt+Tab>PASSWORDされ、おそらくこのための第一の補正になるだろう。選択してください。
  • $a$aA<Alt+Tab>:行の最後に移動して、を追加し$aAます。通常モードに戻ります。
  • ==:PHPのこの行を適切$aAにフォーマットし、camelCase をに変更し$a_aます。これにより、カーソルが行の先頭に戻ります。
  • wxx:単語を進めます。カーソルはの前になりました$。を作成するには$、2つの文字を削除します- とa-- PASSWORD_a
  • $r1:行の最後に移動し、現在の文字(つまりa)を1に置き換えて、結果をPASSWORD_1
  • ^X:カーソルの下の整数をデクリメントして、結果をにしPASSWORD_0ます。
  • a1:最後に、追加1のために、PASSWORD_01

==コマンドを複製できません。viセットアップで大きなインデントモードを切り替えるだけです(debian 7、v7.3.547)
Cengiz Can

11

Python 2、75889バイト

余分なキャラクターはありません!

残念ながら、コードは非常に長いです。その代わり、プログラムを生成するコードは次のとおりです。

x=[2**n for n in xrange(16)]
y=-5
print('exec"""exec'+x[7]*'%'+'c""'+x[6]*'%'+'cr'+x[-2]*'%'+'c'+x[-1]*'%'+'ct'+x[8]*'%'+'c'+x[-4]*'%'+'cASSW'+x[-5]*'%'+'cRD'+x[-3]*'%'+'c'+x[0]*'%'+'s1'+x[10]*'%'+'c '+x[9]*'%'+'c""'+x[y]*'%'+x[1]*'%'+'s'+x[y]*'%'+x[2]*'%'+'s'+x[y]*'%'+x[3]*'%'+'s'+x[y]*'%'+x[4]*'%'+'s'+x[y]*'%'+x[5]*'%'+'s"""'+'%`1>>1`%`2531>>5`%`321>>2`%`1521>>4`%`211>>1`%`221>>1`%112%34%34%34%34')

オンラインで試す

(コードを実行するには、外側printexec。に変更します。または、プログラムを生成し、貼り付けて実行します。または、下にリンクされているpastebinからコピーします。)

説明:

目標は、実行することです:

print"PASSWORD_01"

使用しないようにするには()+文字を、私たちは一緒に連鎖し、複数の文字列フォーマット操作を使用する必要があります。これは、追加される各ステップが、前の各ステップに必要な文字数を事実上2倍にすることを意味します%

print"%cASSW%%cRD%%%%c%%%%%%%%c1"%80%79%95%48

ただし、必要な数値の一部は作成できず、を作成することもできないため、これでは十分ではありませんprint。そこでexecprinting の抽象化レベルと、フォーマットするために作成できないASCIIコードポイントのレベルを追加します。以下は基本的に私の答えですが、各文字列を%1つに減らしています(%s%s%s%s%sこれは正確な表現ではなく、各文字列の%前に必要なリテラルを考慮に入れていないことに注意してください):

exec"""exec%c""%cr%c%ct%c%cASSW%cRD%c%s1%c %c""%s%s%s%s%s""" % `1>>1`%`2531>>5`%`321>>2`%`1521>>4`%`211>>1`%`221>>1`%112%34%34%34%34

最初のステップ:最外部exec

exec""" ... ASSW%cRD ... %s%s%s%s%s""" % `1>>1` % `2531>>5` % `321>>2` % `1521>>4` % `211>>1` % `221>>1`
  1. 1>>10、のために使用0PASSWORD_01
  2. 2531>>579作成する内部execに使用O
  3. 321>>280作成する内部execに使用P
  4. 1521>>495作成する内部execに使用_
  5. 211>>1105作成する内部execに使用i
  6. 221>>1110作成する内部execに使用n

2番目のステップ:内部を準備する exec

上記の後、内部execは次のようになります。

exec%c""%cr%c%ct%c%cASSWORD%c01%c %c""%79%80%95%105%110

あなたはそれをまったく得られないことを除いて。単純化したままで、次のようになります:

exec%c""%cr%c%ct%c%cASSWORD%c01%c %c""798095105110

リテラルを%含める必要があります。したがって、基本的には、すべての書式設定後に%sリテラル%のが残るように、それぞれの前にそれらの束を追加する必要がありました。2**11そのうちの。5回。

残りの外部exec文字列形式の操作は%112%34%34%34%34です。112用でp、その他は引用符です。これらを適用すると、結果は次のようになります。

exec"""pr%c%ct"%cASSW%cRD%c01" """%79%80%95%105%110

しかし、実際にはもっとたくさんあります%。これです:

exec"""pr%%%%%%%%c%%%%%%%%%%%%%%%%ct"%%cASSW%cRD%%%%c01" """%79%80%95%105%110

最後の手順は、単にそれを実行することです。その後、必要な出力を取得します。


完全なコードはこちら: http : //pastebin.com/rSFs6DiH


7
印象的!BOMBが爆発する前に、すべてを手で入力しましたか?ミスを犯さずに(バックスペースキーなし)?あなた、サーまたはマダム、あなたの年金に値する。; D
DLosc

10

bash + vim(56)

Ctrl-XCtrl-EThorのソリューションからbashトリックを借りて、bash + vimでそれを行う方法を次に示します。

C-XC-E デフォルトのエディターを起動します(通常はvim)

a 挿入モードを開始します

.space ASSW

C-Vx4f 挿入物 O

RD

C-Vx5f 挿入物 _

1

C-3escape(vimだけでなく、端末内のどこでも)と同等です

C-X1入力したばかりのi から1を引きます

a もう一度挿入モード

1 C-3

バッファの内容は現在 . ASSWORD_01

<< 行のインデントを解除し(行はインデントされないため、何もしません)、カーソルを最初の列に移動します

a

C-X 単語補完を開始

C-V exコマンドで完了

C-V さらに9回エントリを選択します Print

C-3 通常モードに戻る

XXXxx 削除する rint 

< < 列1に戻る

s削除.、挿入モードの開始

e c C-X C-Vexコマンドの完了、もう一度入力したエントリがecho既に選択さecれている

space C-3 コンテンツを今すぐバッファリング echo PASSWORD_01

Z Z バッファを保存し、vimを閉じ、bashはファイルコンテンツを実行します。 echo PASSWORD_01

ちなみに、C-3多くの便利な兄弟がいます:C-Jis EnterC-Iis TabC-His BackspaceC-2is C-@(つまり、nullバイト)。そしてemacsユーザーにとっては、Escapeその後に別のキーが続くことは、そのキーと同等であることを知っていると便利ですAlt。したがって、たとえなくてもEscapeAlt次のようにMeta-xを入力できます。C-3x


9

Perl、(31 + 10/41 + 10/64 + 10)

^キーを使用、3つの方法)

exec"easswsrdcqw"^"5    <  <AF"                   # exec "PASSWORD_01"

  • システムコマンドとして実行することが「出力」として適格である場合に有効です。

exec"QQZSqeasswsrdcqw"^"422<Q5    <  <AF"         # exec "echo PASSWORD_01"
  • external / OSコマンドの使用を許可されている場合に有効です。(ここで実行)

exec"EQAXqwQqQZQxqeasswsrdcqwxqq"^q!5434QZ4S534$S5    <  <AF$SS! 
                  # exec "perl -e\"die\\\"PASSWORD_01\\\"\""
  • システムを介してPerlを実行できる場合に有効です。(ここで実行) <-これprintdie

スクリプト^は、2つの文字列の文字ビットに対してXORを実行するPerlのビットごとの文字列XOR演算子を使用します。これにより、PASSWORD_01の欠落文字を再作成し、システムコマンドの文字を作成できます。

ルールの寛大さに応じて3つのバリアントを作成しました。バリアント2と3は実際にIdeoneで単語を出力するため、ソリューションは有効であると思います。誰も読んでくれないと思ったので、ここにあった小さな話を削除しましたが、興味があれば編集で読むことができます!


4

oOoコード(300)

QwerTaSdfGzxCqwertAsDfgZxCQwerTasDfgZxcQweRtaSDfgZxCqwertAsDFgZXcQWeRtaSdFGzxcQwERTasdfGzxc
QwErtAsdFgzxcqWeRtaSdFGzxcQweRtaSDfGZxCqWErTAsDFgZXCqWerTasDfgZxcQweRtaSdfGzxCQwErTAsDFgZXC
qWertAsDfgzxcQwERtASdFGzXcqWeRTasdFGzXcQWeRtAsDfgzxcQwERtASdFGzXCqWerTaSDfgzXcQWErTaSdFgZxc
QwertaSdFgzXcQWertASdFgZXCq

簡単です。(改行はオプションであり、コードをより読みやすくするためにここにあります)使用されるコードジェネレーター:

o=lambda b,c:"".join(i.upper()if j else i for i,j in zip(__import__('itertools').cycle(c),map(int,"".join((3-len(i))*'0'+i for i in(bin('><[]-+.,'.index(i))[2:]for i in b)))))

それほど愚かではないエンコーディングの同じコード:

EeeeEeEeeEeeEeeeeeEeEeeEeEEeeeEeeEeeEeeEeeEeeEEeeEeEeeeeeEeEEeEEeEEeEeeEeEEeeeEeEEEeeeeEeee
EeEeeEeeEeeeeeEeEeeEeEEeeeEeeEeeEEeEEeEeEEeEEeEEeEEEeEeeEeeEeeEeeEeeEeeEeeEeeEEeEeEEeEEeEEE
eEeeeEeEeeeeeEeEEeEEeEEeEeeEeEEeeeEEeEeEEeEeEeEeeeeeEeEEeEEeEEeEEeEeeEeEEeeeEeEEEeEeEeEeEee
EeeeeeEeEeeEeEEeeeEEeEeEEEe


3

ferNANDo、179 + 10 = 189バイト

2 1
1 2 1 2 1 1 1 1
1 2 1 1 1 1 1 2
1 2 1 2 1 1 2 2
1 2 1 2 1 1 2 2
1 2 1 2 1 2 2 2
1 2 1 1 2 2 2 2
1 2 1 2 1 1 2 1
1 2 1 1 1 2 1 1
1 2 1 2 2 2 2 2
1 1 2 2 1 1 1 1
1 1 2 2 1 1 1 2

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

Enter中古。とを使用01てコードを読みやすくしますが、使用できません0


エンターは許可されていると思います。
コナーオブライエン

2
OPはEnterが許可されたとは言いませんでした。
アクロリス

3

JS-Forth、103バイト

文字列は、文字の配列としてスタックに返されます。

12544 1 3 << >> 24 1 << 1521 4 >> 34 1 << 41 1 << 2531 5 >> 351 2 >> 332 2 >> 32 2 >> 131 1 >> 321 2 >>

オンラインで試す -コメント付きバージョン


説明:

最初に許可された単語のリストを見つけました。基本的に、私が使用できる有用なものは次のとおりです。

  • 12345 数値定数
  • << 左にシフト
  • >> 右にシフト
  • s>f シングルをプッシュしてフロートスタック
  • f>d floatスタックからdoubleをポップします
  • fsqrt フロートスタックの平方根

したがって、数値定数、ビットシフトを使用し、次を使用して平方根を計算することができます(>>replaces drop、shifting by 0を削除0)。

s>f fsqrt f>d >>

幸いなことに、平方根を使用するよりも短い、作成する必要のあるすべての定数について、可能なビットシフトが見つかりました。ほとんどの場合、各数字を2乗するか、数字に数字が含まれている場合は2のべき乗を単に印刷して検索しました6-0。その後、f>dより多くの可能性を見つけるために精度の低下を使用できることに気付きました。(数値に追加することはできますが、同じ整数平方根を取得できます。)少し後に、ビットシフトを使用して定数の一部を検索し、次にすべての定数を検索し始めました。>>ビットシフトが大きければ大きいほど、「マジックナンバー」に追加しても同じ結果が得られます。そこで、必要な結果を得るために使用できる最小のビットシフトを見つけました。偶数が時々使用できましたが<<、オッズは使用しなければなりませんでした>>

コメント付きコード(\コメントを開始):

\ 49
12544 1 3 << >>

\ 48
24 1 <<

\ 95
1521 4 >>

\ 68
34 1 <<

\ 82
41 1 <<

\ 79
2531 5 >>

\ 87
351 2 >>

\ 83 (x2)
332 2 >> 332 2 >>

\ 65
131 1 >>

\ 80
321 2 >>

gForthには単語<<またはがありません>>。代わりにlshiftand がありrshift、私は使用できませんでした


3

10進数190180 + 10 = 190バイト

12055D12025D41D301212055D12010D41D301212055D12025D41D12003D41D30130112004D41D301212055D12024D41D30112003D41D301212055D12013D41D301212055D12040D41D301212045D12003D41D30112001D41D301

オンラインでお試しください!10進数は、10進数と文字のみを使用する難解な言語ですD。ただし、ほとんどすべてのコマンドがを使用するため、+ 10のペナルティが必要でした0

幸いなことに、印刷に必要なコマンドはすべて、次のPASSWORD_01数字を必要としません6

  • 12...D -キャラクターをプッシュする
  • 2 -値をポップ
  • 41D -上位2つのスタック値をポップし、結果を乗算してプッシュします
  • 301 -DSIの出力(デフォルトのスタックインデックス)

1から5の数字のみを使用する文字値を繰り返しプッシュしてから追加することで、の各文字の文字値を作成できますPASSWORD_01

非ゴルフとコメント:

12055D     ; push char 55 to stack
12025D     ; push char 25 to stack
41D        ; pop [DSI] and [DSI-1], add and push result
3012       ; print from stack to output, pop
12055D     ; push char 55 to stack
12010D     ; push char 10 to stack
41D        ; pop top two stack values, add and push result
3012       ; print from stack to output, pop
12055D     ; push char 55 to stack
12025D     ; push char 25 to stack
41D        ; pop x2, add, push
12003D     ; push char 3 to stack
41D        ; pop x2, add, push
301301     ; print, print
12004D     ; push char 4 to stack
41D        ; pop x2, add, push
3012       ; print, pop
12055D     ; push char 55 to stack
12024D     ; push char 24 to stack
41D        ; pop x2, add, push
301        ; print
12003D     ; push char 4 to stack
41D        ; pop x2, add, push
3012       ; print, pop
12055D     ; push char 55 to stack
12013D     ; push char 13 to stack
41D        ; pop x2, add, push
3012       ; print, pop
12055D     ; push char 55 to stack
12040D     ; push char 40 to stack
41D        ; pop x2, add, push
3012       ; print, pop
12045D     ; push char 45 to stack
12003D     ; push char 3 to stack
41D        ; pop x2, add, push
301        ; print
12001D     ; push char 1 to stack
41D        ; pop x2, add, push
301        ; print

3

空白、スコア:111(101バイト+の10 Enter

[S S T  T   T   T   T   T   N
_Push_-31_1][S S T  T   S S S S S N
_Push_-32_0][S S S T    T   T   T   N
_Push_15__][S S T   T   T   S S N
_Push_-12_D][S S S T    S N
_Push_2_R][S S T    T   N
_Push_-1_O][S S S T T   T   N
_Push_7_W][S S S T  T   N
_Push_3_S][S N
S _Duplicate_3_S][S S T T   T   T   T   N
_Push_-15_A][S S S N
_Push_0_P][N
S S N
_Create_Label_LOOP][S S S T S T S S S S N
_Push_80][T S S S _Add][T   N
S S _Output_as_character][N
S N
N
_Jump_to_Label_LOOP]

強調表示としてのみ追加される文字S(スペース)、T(タブ)、およびN(改行)。
[..._some_action]説明としてのみ追加。

オンラインで試してください(未加工のスペース、タブ、改行のみ)。

擬似コードの説明:

この解決策はこのホワイトスペースのヒントを利用することにより、既存のホワイトスペースの回答@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀h golfがゴルフとして提案したときに別の回答として投稿するように求められました)よりも短くなっています。

Push the code-points for the characters of "10_DROWSSAP" minus constant 80 to the stack
Start LOOP:
  Add 80 to the current code-point
  Pop and output it as character
  Go to the next iteration of LOOP

定数80は、このJavaプログラムで生成されました。これは、以前のホワイトスペースの回答のいくつかで作成して使用しました。


2

スタックス、91 + 10バイト

"W"EEEd$"$"1 !$Re]"$""ASSW"R"$""a"EEE$"$"a$Re]R"$""RD"R"$""a"EEEd$"$""5"Re]R"$"1 !$R"$""1"R

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

]シングルトンを作成するために使用します。

説明

通常のを使用せずにが"P"どのように生成され、どのように"ASSW"追加されるかを見てみましょう+

"W"                             Push "W", or [87]
   E                            Convert to a scalar, 87
    E                           Convert to an array of digits, [8,7]
     E                          Push 8 on the stack, then push 7.
      d                         Pop the 7 and discard it.

                                Start making components of regex substitution
       $                        Pop 8, push "8"
        "$"                     Push "$"
           1 !                  Push 0. The space is necessary because normally one doesn't do 1! to obtain 0
              $                 Pop 0, push "0"
               R                Do regex substitution 's/$/0/g' on the string "8"

                                Basically doing "8"+"0" without using +
                e               Pop "80", push 80
                 ]              Singleton. Pop 80, push [80], or "P"
                  "$""ASSW"R    Use the same trick again to append "ASSW" to "P"

残りは同じトリックを繰り返しています。

"a"EEE$"$"a$Re]R数字を入れ替え"a"たり[97]作るため[79]"O"、文字列に追加します。

"$""RD"R appends "RD"

"$""a"EEEd$"$""5"Re]R"a"再度使用してを取得"9"して破棄し、をリテラルと"7"組み合わせてまたはを形成し、それを文字列に追加します。"9""5"[95]"_"

"$"1 !$R 1ではなく論理値でゼロを取得し、それを文字列に追加します。

"$""1"R最後に追加し"1"て完了です。

暗黙的な出力。


1
O_O ...これは賢い。
再帰的

感謝します。ただし、(おそらく別のキーを選択することで)短くすることができると思います。
ウェイジュン周

2

brainfuck、400 + 10(+)= 410バイト

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.<.>>+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++..++++.<<++++++++++++++.+++.>>>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.<++++++++.>>>>++++++++++++++++++++++++++++++++++++++++++++++++.+.<

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


2

MS-DOS .COM 8086マシンコード(72バイト)

時間は貴重なので、コンパイラーやインタープリターと一緒に忙しくする時間はありません!選択したテキストエディターを開き、次のように入力します(\tTABに置き換えます)。

451D<1DAQX1D11D3AQX4c1DDQX4<SZ!Gq\tGq3WqEEEEESX5\t\t2!<<<<<<<<<eASSWzRD<11$

hexdumpとして:

00000000 : 34 35 31 44 3C 31 44 41 51 58 31 44 31 31 44 33 : 451D<1DAQX1D11D3
00000010 : 41 51 58 34 63 31 44 44 51 58 34 3C 53 5A 21 47 : AQX4c1DDQX4<SZ!G
00000020 : 71 09 47 71 33 57 71 45 45 45 45 45 53 58 35 09 : q.Gq3WqEEEEESX5.
00000030 : 09 32 21 3C 3C 3C 3C 3C 3C 3C 3C 3C 65 41 53 53 : .2!<<<<<<<<<eASS
00000040 : 57 7A 52 44 3C 31 31 24                         : WzRD<11$

.COMファイルとして保存し、それを実行して日を保存します。

このコードでは、特定のレジスタの開始値を想定しているため、すべてのDOSフレーバーで機能するとは限りません。誰かがIBMを購入しないことで解雇される危険を冒すことを願っています。

少しわかりやすい表現:

org 0x100
bits 16
cpu 8086

; Assumes the following start values for registers (as per http://www.fysnet.net/yourhelp.htm):
;
;   AX = 0
;   BX = 0
;   CX = 0x00ff
;   SI = 0x100

; Change e => P and z => O
    xor al, 0x35
    xor [si+0x3c], ax
    xor [si+0x41], ax

; Fix int 0x21 and ret
    push cx
    pop ax              ; AX = 0xFF
    xor [si+0x31], ax
    xor [si+0x33], ax

; Change <1 => _0
    inc cx              ; CX = 0x100
    push cx
    pop ax              ; AX = 0x100
    xor al, 0x63        ; AX = 0x163
    xor [si+0x44], ax

; We're using DOS interrupt 0x21, function 0x09 to output the final string.

; AH must equal 0x09 to select the function.
; DS:DX must point to the $-terminated string we want to output.

; Get DX to the correct value (0x13c)
    push cx
    pop ax              ; AX = 0x100
    xor al, 0x3c        ; AX = 0x13c
    push bx
    pop dx              ; DX = 0

; We use part of the Program Segment Prefix to temporarily store the value,
; since MOVing or PUSHing AX is impossible.
; The part in question is the second File Control Block, which we will not use anyway.
    and [bx+0x71], ax
    or [bx+0x71], ax
    xor dx, [bx+0x71]   ; DX = 0x13c

; NOPs to get int 0x21 and ret on high enough addresses
    inc bp
    inc bp
    inc bp
    inc bp
    inc bp

; Set AH to the correct value. AL is set too, but is ignored by the DOS interrupt.
    push bx
    pop ax              ; AX = 0
    xor ax, 0x0909      ; AX = 0x0909

; What will become instructions int 0x21 and ret
    db 0x32, 0x21
    db 0x3c

; Padding to have the password at an address we can refer to.
    times 60-($-$$) db '<'

; Password
    pw  db  "eASSWzRD<11$"

1

Befunge-98、43 +10 = 53バイト

"1qA·DR·WSSA·g"%,$,,,,$"s"%,,,$"c"%,%,,q

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

10バイトのペナルティは、,キーの使用に対するものです(これをShift+ <で達成できなかった理由はわかりませんが、それがルールのようです)。そして、ソースは技術的には40文字ですが、3 ·文字はUTF-8エンコードのために3バイトを追加します。


1

05AB1E87 86バイト

"."A1.$R24.$AT<.$R15>.$A21<.$R5.$.V.VD21s.V.V15>X.V"ASSW"15X.V"RD"122D<s2X.V.VTRTX.V.V

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

たぶんこれまでで最も長い05AB1Eコードでしょうか?

残念ながら、この言語は"Q"<「Qを減らしてPを取得する」などをサポートしていません。

私の余分なキーはVです。

-1バイトの@Kevin Cruijssenに感謝します。

コード:

Build the string ".b". This is the code to turn integers to upper case letters:
"."             push "."
A               push the lower case alphabet
1.$             drop the first letter of that
R               reverse the remaining string 
24.$            drop the first 24 letters of that, so only "b" remains
AT<.$R15>.$     do the same trick for "j"
A21<.$R5.$      and for "u" 
.V              run "u" as code to turn "j" to "J"
.V              run "J" as code, to join ".", "b" to ".b"

Save that string for later use:
D               duplicate
21              push 21
s               switch the top two elements [".b", 21, ".b"]
.V              run ".b" as code, to get "U"
.V              run "U" as code, to save ".b" in X

Build password string:
15>X.V          push the 16th letter of the alphabet ("P")
"ASSW"          push "ASSW"
15X.V           push "O"
"RD"            push "RD"
122D<s2X.V      push 121, 122, "B"
.V              run that as code to push "_"
TR              push 01
TX.V            push "J"
.V              run that as code, to join everything to the desired string 

比較のため:「PASSWORD_01」を印刷する最短の方法は6バイト長です

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


おそらくこれまでで最も長い05AB1Eコードですか?いやこれはほぼ6倍の大きさです。; p関係なく素敵な答え。許可されたASCII文字を一定量だけ使用することは困難です。多くの便利なビルトインは、このチャレンジには許可されていません。:(
ケビンクルーッセン

1
-1使って、バイトTRの代わり1<1のための01出力の一部。
ケビンクルイッセン

1

Emacs、26バイト(+ 10 = 36、または− 2 = 24)

この回答に必要な追加キーはEscです。これはキーボードの半分にあり、まだ元のままですが、何らかの理由で質問に記載されていないため、スコアにペナルティを与える場合と与えない場合があります。(EscAltEmacsで等価である。Altあるにもキーボードの完全な半分ではなく、質問には言及されていませんが、開催されたのではなく、私は私の余分なキーとして使用することはできませんので、タップする必要がありますそれは、2つのバイトを保存します。 、ただし、エンコーディングが短いためEsc

プログラム自体(コンマは、Emacsが入力を受け入れるために使用するワイヤ上の形式でバイト間の境界を区切る):

WSEsc$DACtrl- 、TSRWDEsc$5- CtrlQ5f- CtrlXr- CtrlSpace1- CtrlXr、、g -1CtrlT

バイトカウントを証明するために、これを生バイトとしてエンコードします。

00000000: 5753 1b24 4441 1453 5257 441b 2435 1135  WS.$DA.SRWD.$5.5
00000010: 6618 7200 3118 7267 3114                 f.r.1.rg1.

(注:詳細の一部は、Emacsの構成方法によって異なる場合があります。この回答では、quoted-char-radixを16に設定する必要があります。妥当な構成設定が好きですが、Emacsのコピーが異なるように構成されている可能性があります。異なる辞書でも26バイトのプログラムが得られる可能性がありますが、必要な修正を受け入れるために、わずかに異なるスペル弾丸に乗っていないキー。)

説明

編集者の戦争に影響を与えるかどうかはわかりませんが、少なくともこの質問の場合、Emacsはvimを打ち負かすようです。Emacsは、複数のキーを押すが1バイトのみを使用するコードに大きく依存しているため、バイト単位のエディターゴルフに非常に適しています(したがって、Emacsプログラムは、同等のVimプログラムよりもタイプが遅く、ディスク上では短いことが多いため)。さらに、最も重要なEmacsコマンドのほとんどは、キーボードの左下隅にあり、に近いためCtrl、このような質問に非常に役立ちます。

「弾丸が来る前にインタプリタシェル/ソースエディタを開いていると仮定できます。悲しいことに、キーボードが打たれる前に何も書いていないのです。」ですから、Emacsで空のファイルを開いており、パスワードを入力する必要があります。(後でファイルを保存し、おそらくEmacsを終了する必要がありますが、そのバイトは他の人の回答ではカウントされないので、ここでもカウントしません。それは、左側を使用して完全に実行可能です。ただし、キーボード、Ctrl- XCtrl- SCtrl- XCtrl- C、.)

一度にコマンド(または同様のコマンドのブロック)を取得する:

  • WSWSドキュメントに入力します。
  • Esc$:スペルチェッカーを呼び出します。WSは本当の単語ではありませんが、似たような2文字の単語をたくさん見つけます。
  • D:スペルチェッカーを使用して、に修正WSPSます。(ここで起こったようにAlt- を使用してスペルチェッカーが呼び出されると$EscそしてAltEmacs と同等です)、1つの単語のみをチェックするため、これを行った後に非アクティブになります。)
  • A:挿入A、与えるPSA
  • Ctrl- T:前の2文字を交換して、を与えPASます。
  • SRWD:タイプSRWD、与えますPASSRWD
  • Esc$5:私たちは私たちのスペルが間違って修正したいので、私たちは、再びスペルチェッカーを呼び出すPASSRWDPASSWORDPASSWRD最も近い実際の単語を受け入れるためのキー0は押すことができないため、最初の試行で必要な単語を推測させることはできないことに注意してください。その結果、わずかに極端なスペルミスPASSRWDを使用して、希望する単語を位置5にプッシュし、そこで受け入れます。
  • Ctrl- 、Q5f文字コードU + 5F、すなわちの文字を挿入します_。これでドキュメントが読み込まれますPASSWORD_(または、次のコマンドの入力を開始すると、その前に別の16進数を入力してもアンダースコアは表示されません)。
  • Ctrl- 、、X - 、いくつかの奇妙な理由レジスタ1(ファイルの先頭からの相対位置)現在のカーソルの位置を保存し、これはカーソル位置にある、1インデックスので(これまでに9つの文字を書いている)です。rCtrlSpace110
  • Ctrl- 、Xrg1ドキュメントにレジスタ1の内容をコピーします。現在は読み取りますPASSWORD_10
  • Ctrl- T:カーソルの前の2文字を交換します。PASSWORD_01質問が要求するように、私たちは今、持っています。

を使用することが許可されている場合はAlt、「スペルチェッカーを呼び出す」コマンドを、次のようにa4綴るのではなく、1バイトとしてエンコードすることができ1b 24ます。2回表示されるため、2バイトの節約になります。(最近の端末のほとんどは、UTF-8との衝突を避ける1b 24ためにAlt- のエンコーディングとして使用します$が、a4エンコーディングは時々設定オプションとして利用できることもあります。)

バイト節約の可能性には、おそらくゴルファーのスペルミスがあります。PSASWRD入力は1バイト短くなりますが、残念ながら、スペルチェッカーはそれを収集PASSWORDすることができないようですPASSRWD。したがって、これまでに見つけた最良のアプローチです。レジスタベースの獲得方法10もばかげて扱いにくいですが、Emacsのどこからでも数字を作成する方法は多くなく、0他の方法で手に入れるには苦痛なキャラクターです。(少なくとも驚くほど便利な偶然がいくつかありました:カーソルがたまたま必要な位置10にを含むposition 0にたどり着きました;そして、Emacs gがドキュメントのレジスターの内容を挿入するために冗長なレジスター操作を受け入れるという事実、より直感的なことに加えてi

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.