循環文字シフト後に有効なプログラムを書く


17

非常に難しい可能性がありますが、このサイトから驚くべきことが出てきました。

目標は、任意の言語で任意のプログラムを作成することです。キャッチは、プログラムが後に有効でなければならないということである任意の文字の循環シフト。

循環文字シフトは、循環シフトに非常に似ています。いくつかの例で明確なことがわかります。

プログラムについて int main() { return 0; }

6文字左にシフトすると、次のようになります。 in() { return 0; }int ma

左に1文字シフトすると、次の結果が得られます。 nt main() { return 0; }i

10文字右にシフトすると次のようになります。 eturn 0; }int main() { r

ただし、このプログラムは明らかにルールに準拠していません。

ルール

  • どんな言語でも
  • 勝者は投票数によって決定されます
  • 同じことを行うソリューション、またはローテーションごとにまったく異なることを行うソリューションは、100の仮想アップ投票をスコアに受け取ります。

更新これは十分長い間続いていると思います。最も多くの票(仮想票を含む)を獲得した勝者はマークバイヤーズです。よくやった!


5
intリテラルが有効なプログラムである言語には、非常に退屈な潜在的な答えがいくつかあります。仮想-100を受け取りますか?
ピーターテイラー

1
@PeterTaylor退屈な答えは投票数が減ると思います。
グリフィン

「潜在的に非常に難しい」この種の発言を一般的な方法で行う前に、多くの奇妙な言語に精通していることが常に役立ちます。確かにcやjavaでは難しいですが、1文字のコマンドと単純な構文を持つ言語ではどうでしょうか?そんなにない。
dmckee

@dmckeeしたがって、「潜在的に」...-
グリフィン

@PeterTaylorまた、言語の多くでは、空のプログラムが有効なプログラムです
JK。

回答:


31

タスクに適切な言語を使用します。この場合、それはBefungeです。

この言語は、当然次の理由で回転を許可します。

  • すべてのコマンドは単一の文字です。
  • コントロールは、プログラムの最後に到達すると、最初から再び開始してラップアラウンドします。

このBefungeプログラムは、使用する「循環文字シフト」の数に関係なく、まったく同じ出力(「Hello」)を出力します。

86*01p75*1-02p447**1-03p439**04p439**05p455**1+06p662**07p75*1-08p645**2-09p69*4+019+p57*029+p59*1-039+p555**1-049+p88*059+p86*01p75*1-02p447**1-03p439**04p439**05p455**1+06p662**07p75*1-08p645**2-09p69*4+019+p57*029+p59*1-039+p555**1-049+p88*059+p645**2-00p645**2-00p

Befungeeで実行されます。ボードを増やす必要があります(80文字のデフォルトではありません)。次のように実行できます。

python befungee.py -w400 hello.bef

「Hello」を出力するプログラムを最初に動的に生成して保存し、次に最初のバイトを上書きして、新しく作成されたプログラムにコントロールをリダイレクトします。プログラムは2回書き込まれるため、バイトが最初に正しく書き込まれなかった場合、2回目に修正されます。

このアイデアを拡張して、任意の複雑さのプログラムを作成できます。


とてもいいエントリーです!
クリストフ

22

Brainf * ck

仕事に適したツールを選択してください-この仕事よりも関連性の高い格言はここにあります!

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++.>+++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++.+.>++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++.++++++++++++++.>++++++++++.+

ここに表示されるシフトされていないプログラムは、単に印刷SHIFT(および改行)されます。任意の循環シフトは他のさまざまな出力を生成しますが、常に6つのASCII文字を出力します。


私は質問を読んで、ブレインファック、それがチケットだと思ったが、あなたはそれに私を打ち負かした。
jmoreno

12

Commodore 64 BASIC

?略でPRINT、かつ:ので、文の区切りであります:

?1:?2:?3:          // prints 1, 2, and 3
:?1:?2:?3          // prints 1, 2, and 3
3:?1:?2:?          // adds a program line 3 :PRINT1:PRINT2:PRINT
?3:?1:?2:          // prints 3, 1, and 2
:?3:?1:?2          // prints 3, 1, and 2
2:?3:?1:?          // adds a program line 2 :PRINT3:PRINT1:PRINT
?2:?3:?1:          // prints 2, 3, and 1
:?2:?3:?1          // prints 2, 3, and 1
1:?2:?3:?          // adds a program line 1 :PRINT2:PRINT3:PRINT

もちろん、より長いバリエーションも可能です。

?1:?2:?3:?4:?5:?6:?7:?8:?9:?10:?11:

等...


11

Golfscript

このプログラムは、プログラムのシフト方法に関係なく、常に合計2になるいくつかの数字を出力します。

10 2 base
0 2 base1
 2 base10
2 base10 
 base10 2
base10 2 
ase10 2 b
se10 2 ba
e10 2 bas

最初の行が印刷され1010(バイナリで10)、2行目が印刷され02、他のすべての行が印刷されます2

更新:

ここでプログラムをテストできます出力をフォーマットするためだけに各行の最後にsを追加したことに注意してくださいn。これらは削除してもプログラムは動作します。


10

Ruby、おそらく最短の解決策の1つ:

p

そして、もう少し長く、より興味深いもの:

;;p";p;";p

9

x86 16ビットバイナリ

これらの(1 2)テーブル、nasmおよびndisasmを使用して手動で構築されました。バイトがジャンプしたりスタックを変更したりすることはretなく、いずれの場合もシングルバイト命令で終了するNOPで埋められているため、これは常にクラッシュまたは無限ループなしで戻ります。

ほとんどの場合、これは出力FOOまたはそのサブストリングです。AXが壊れている場合、これはランダムなint 10を呼び出します(これにより、テストの1つでカーソルの点滅速度が変更されました)が、通常はクラッシュしません。

試すには、hexdumpをファイルに入れてを使用しxxd -r foo.hex > foo.com、次にdos環境で実行します(dosboxを使用しました)。

このファイルの16進ダンプは次のとおりです。

0000000: b846 0d90 90fe c490 9090 bb05 0090 9043  .F.............C
0000010: 43cd 1090 b84f 0d90 90fe c490 9090 bb05  C....O..........
0000020: 0090 9043 43cd 1090 b84f 0d90 90fe c490  ...CC....O......
0000030: 9090 bb05 0090 9043 43cd 1090 9090 c3    .......CC......

そして、いくつかの興味深い逆アセンブルされたオフセット:

+0

00000000  B8420D            mov ax,0xd42
00000003  90                nop
00000004  90                nop
00000005  FEC4              inc ah
00000007  90                nop
00000008  90                nop
00000009  90                nop
0000000A  BB0500            mov bx,0x5
0000000D  90                nop
0000000E  90                nop
0000000F  43                inc bx
00000010  43                inc bx
00000011  CD10              int 0x10
00000013  90                nop
00000014  B84F0D            mov ax,0xd4f
00000017  90                nop
00000018  90                nop
00000019  FEC4              inc ah
0000001B  90                nop
0000001C  90                nop
0000001D  90                nop
0000001E  BB0500            mov bx,0x5
00000021  90                nop
00000022  90                nop
00000023  43                inc bx
00000024  43                inc bx
00000025  CD10              int 0x10
00000027  90                nop
00000028  B84F0D            mov ax,0xd4f
0000002B  90                nop
0000002C  90                nop
0000002D  FEC4              inc ah
0000002F  90                nop
00000030  90                nop 
00000031  90                nop
00000032  BB0500            mov bx,0x5
00000035  90                nop
00000036  90                nop
00000037  43                inc bx
00000038  43                inc bx
00000039  CD10              int 0x10
0000003B  90                nop
0000003C  90                nop
0000003D  90                nop
0000003E  C3                ret

(以下の例では、残りのバイナリはまだ有効です)

+1

00000000  42                inc dx
00000001  0D9090            or ax,0x9090
00000004  FEC4              inc ah
00000006  90                nop

+2

00000001  0D9090            or ax,0x9090
00000004  FEC4              inc ah
00000006  90                nop

+6

00000000  C4909090          les dx,[bx+si-0x6f70]
00000004  BB0500            mov bx,0x5
00000007  90                nop
00000008  90                nop
00000009  43                inc bx
0000000A  43                inc bx
0000000B  CD10              int 0x10

+11

00000000  050090            add ax,0x9000
00000003  90                nop
00000004  43                inc bx
00000005  43                inc bx
00000006  CD10              int 0x10

+12

00000000  00909043          add [bx+si+0x4390],dl
00000004  43                inc bx
00000005  CD10              int 0x10

+18

00000000  1090B84F          adc [bx+si+0x4fb8],dl
00000004  0D9090            or ax,0x9090
00000007  FEC4              inc ah
00000009  90                nop

(他のオフセットは上記の単なる繰り返しです)

+58

00000000  10909090          adc [bx+si-0x6f70],dl
00000004  C3                ret

7

単項回答:

000000 ... 00000

^ 44391ゼロ

猫プログラム。どのように回転させても、同じプログラムです。


6

PHP

有効なPHPプログラムは次のとおりです。

Is this still funny?

2
各文字シフトが実際の単語になるように、「ate」などの単語を使用する必要があります(長いものがあると確信しています)。
ピーター

10
これを+1するのか-1するのかわからない
ライライアン

6

スカラ

ネストされた引用符:

""""""""""""""""""""""""""""""""

C ++ / Java / C#/ Scala

コメント:

///////////////////////////////////

空のコマンド:

;;;;;;;;;;;;;;;

バッシュ

コメント、ホワイトスペースとシェルの組み込みの組み合わせ:

#

:

セド

スタンドアロンの有効なコマンド:

p P n N g G d D h H

上記の組み合わせ:

p;P;n;N;g;G;d;D;h;H;

AWK

ファイルのすべての行を印刷するには:

1

または

//

何も印刷しないでください:

0

Perl

abcd

SEDは奇妙な回転で失敗するように見えますか?ある;P;n;N;g;G;d;D;h;H有効?
captncraig

@CMP:はい、有効です。
ジョンウェスリー王子

5

J

まず、プログラムの有効なローテーションを確認するスクリプトs

check =: 3 :'((<;(". :: (''Err''"_)))@:(y |.~]))"0 i.#y'

たとえば、プログラム+/1 5(1と5の合計)は以下を提供します。

 check '+/1 5'
┌───────┬───┐
│┌─────┐│6  │
││+/1 5││   │
│└─────┘│   │
├───────┼───┤
│┌─────┐│Err│
││/1 5+││   │
│└─────┘│   │
├───────┼───┤
│┌─────┐│Err│
││1 5+/││   │
│└─────┘│   │
├───────┼───┤
│┌─────┐│6  │
││ 5+/1││   │
│└─────┘│   │
├───────┼───┤
│┌─────┐│6  │
││5+/1 ││   │
│└─────┘│   │
└───────┴───┘

次に、退屈で有効なプログラム:

check '1x1'
┌─────┬───────┐
│┌───┐│2.71828│ NB. e^1
││1x1││       │
│└───┘│       │
├─────┼───────┤
│┌───┐│       │ NB. Value of variable x11
││x11││       │ 
│└───┘│       │
├─────┼───────┤
│┌───┐│11     │ NB. Arbitrary precision integer
││11x││       │
│└───┘│       │
└─────┴───────┘

2

dc

dcプログラムは、どの回転でも簡単に有効です。例えば:

4 8 * 2 + p  # 34
8 * 2 + p 4  # stack empty / 10
...

1

機械コード

NOP用のZ80 / Intel 8051マシンコードはどうですか。

動作しませんが、1〜2サイクルかかります。必要な数だけ、または数だけ減らすことができます。

そして、私は上記のRubyの答えに同意しません-シングルバイト00hはRubyよりも短いと思いますp


1

k

.""

空の文字列を評価します

"."

ピリオド文字を返します

"".

「。」の部分適用を返します (2進形式)を空の文字リストに。


1

sh、bash

cc
cc: no input files

回転したccは再びccですが、そのように裸で呼び出された場合、あまりフレンドリーではありません。

dh 
dh: cannot read debian/control: No such file or directory
hd 

dh debhelperはあまり協力的ではありませんが、hexdumpは入力を待つだけです。

gs
sg 

Ghostscriptは対話モードを開始し、グループ切り替えますは使用方法のメッセージを表示します-ここでも有効な解決策です。

そして、そのようなプログラムの候補を見つけるためのスクリプトは次のとおりです。

#!/bin/bash
for name in /sbin/* /usr/sbin/* /bin/* /usr/bin/*
do 
    len=${#name}
    # len=3 => 1:2 0:1, 2:1 0:2
    # len=4 => 1:3 0:1, 2:2 0:2, 3:1 0:3
    for n in $(seq 1 $((len-1)))
    do
        init=${name:n:len-n}
        rest=${name:0:n}
        # echo $init$rest
        which /usr/bin/$init$rest 2>/dev/null >/dev/null && echo $name $init$rest $n
    done 
done

(arj、jar)や(luatex、texlua)のように、すべてのシフトの後ではなく、特定のシフトの後のみ有効な長いシーケンスも見つけた場合手でそれらをフィルタリングする。


3文字以上の例は無効です。OPは「プログラムが後に有効でなければならないと述べた任意の循環シフト」。したがって、arj/ jarは無効です。rjaコマンドがないためです(この例は気に入っていますが)。スクリプトの+
1-

私は英語が母国語ではないので確信が持てなかったので、辞書を調べましたが、どちらかと言えば曖昧でした every、または意味しますa random one。例shift left by 6left by 1およびright by 10私は1つだけシフトする可能性を見つける必要があることを、解釈で私を保証しました。
ユーザー不明

あいまいではありません。あるランダムシフト後にプログラムを有効にする必要がある場合は、可能なすべてのシフトに対しても有効でなければなりません。
グリフィン

@グリフィン:わかりました-あなたは質問を書きました。長い例を削除しました。幸いなことに、gsやsgのようなUNIXには十分なcrptc abbrv prgnmsがあります。:)ところで:あなたは英語を母国語としていますか?前の文で、あなたは書いた... in any language ... -私のソリューションはbash(およびsh、zsh、ashおよび他のいくつか)でのみ動作しますが、他のすべてのソリューションもプログラム名を取ります。
ユーザー不明

0

簡単なPythonの例:

"a""b""c""d""e""f""g""h""i""j""k""l""m""n""o""p""q""r""s""t""u""v""w""x""y""z""";print

より多くのアルファベットを明らかにするために、3つの文字を繰り返しシフトします。


申し訳ありませんが、質問を明確にする必要がありました。どのシフトでも有効なプログラムを作成する必要があります。質問を更新しました。
グリフィン

0

Python

123456789.0

いくつかの数字を評価するだけです


0

dcはすでに使用されていますが、次のプログラムは回転に関係なく常に同じを出力します:D

d

出力

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