より長い言語プログラムを作成する


16

Lenguageは、ソース制限の課題を解決することで有名な頭の痛い方言です。これは、Lenguageがコンテンツではなくソースの長さのみを考慮しているためです。

まず、プログラムの長さが計算されます。次に、上記の長さをバイナリに変換し、ゼロで左に3の倍数でパディングします。結果のバイナリ文字列は3ビットのチャンクに分割され、それぞれがBrainfuckコマンドに変換されます。

000 -> +
001 -> -
010 -> >
011 -> <
100 -> .
101 -> ,
110 -> [
111 -> ]

最後に、プログラムはbrainfuck 1として実行されます。

ここからの挑戦は非常に簡単です。入力を受け取らず、回繰り返される整数で構成される出力を生成する言語プログラムを作成します。ここで、は厳密にプログラムの長さよりも大きくなります。nn

回答はバイト単位でスコアリングされ、バイト数が少ないほど優れています。

Brainfuckから言語を計算するためのハックプログラムです。


1:この課題では、ラッピングセルと非ラッピングテープを使用します。


3
+[.]勝ちますか?:P
Quintec

3
おそらく、出力の長さをスコア化する方が面白いでしょうか?
ジョーキング

@JoKingそれは良いアイデアです。残念ながら、それには少し遅れているようです。
ウィートウィザード

2
また、なぜこのタグ付けされたクインはなぜですか?
無知の具現化

1
+]23n

回答:


15

8437495638205698686671バイト

これはBrainfuckプログラムに変換されます。

-[>>[>]+[->[>]+.[<]+<]<-]

231584178474632390847141970017375815706539969331281128078915168015826259279614

これは関数によって計算されます

f(n)=2*f(n-1)+n
f(0)=0

入力が255の場合。

説明:

-[         Loop 255 times
  >>[>]    Move to the end of a series of positive cells (initially empty)
  +        Add one cell to the end
  [-       Loop over each cell 
    >[>]+  Add one cell to the end
    .      Print a SOH byte
    [<]+   Restore current cell
  <]       Move to next cell
<-]        Decrement counter

4

9093903938998324939360576240306155985031832511491088836321985855167849863863065731015823バイト

>>>>>>-[[->>>+<<<]------>>>-]<<<[<<<]+[+[>>>]<<<->+[<[+>-]>[-<<<<->+>>------>>]<<<<]>>-[<<<].>>>-]

正確に印刷するもの

298333629248008269731638612618517353495058861384016275770860733328251135402804732197446995616017112134460464130233444058136509123809012106419446593183683387659250431692751255099808162970657410517657862174602556590616568690423540284801267472920128909691902547970614008613488242333460665145840144517097342073878746293059960326132795671583153307437896728515625000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

250255

このBrainfuckの回答クレジットが@hvdに渡されるため、必ず彼に賛成てください!

説明:

私は自分自身の説明を書くつもりでしたが、@hvdの説明がすでに重要であることに気づいたので、代わりにここで引用します:

>>>>>> 少しの作業スペースを残すために必要です。

-255を生成します(セルをラッピングするとき0-1 = 255であるため)。

[[->>>+<<<]------>>>-] これを値250の255個のコピーに変換し、次のようなテープを作成します。

0 0 0 0 0 0 250 0 0 250 0 0 ... 250 0 0 [0]

<<<[<<<]+ データポインターを戻し、初期データを終了します。

0 0 0 [1] 0 0 250 0 0 250 0 0 ...

次にループが発生します。[+...-]最初は1を2に設定し、ループの最後で1に戻します。ループ本体がすでに2を1に設定すると、ループは終了します。

現在、2 250 250 250 ... 250という数字は、ベース250のカウンターを表しており、各数字はそれが表す数字よりも1つ大きくなっています。

  • [>>>]<<<ずっと右に移動します。各数字はゼロ以外の数字で表されるため、これは簡単です。

  • ->+[<[+>-]>[-<<<<->+>>------>>]<<<<]>>-カウンターを1減らします。最後の桁から開始します:桁が減ります。肯定的なままであれば、完了です。ゼロになったら、250に設定し、前の数字で続行します。

  • [<<<].>>>ポインターを左端の数字の前に戻します。これは、NULバイトを出力する良い機会です。次に、左端の桁に正確に移動して、完了したかどうかを確認します。

正確性を確認するには、250 2に対して250 1 NULバイトを印刷-する+ようにイニシャルを変更します。++


4

19326644346528796447バイト

Brainfuckコード:

>+[+[[+>->-<<]->>+].<]

プリント

57896044618658097711785492504343953926634992332820282019728792003956564819967

nullバイト。

それはこのように動作します:

mem[i]=255;
do
    while(--mem[i]){
        mem[i+1]=mem[i+2]=mem[i];
        mem[i]=1;
        i+=2;
    }
while(mem[--i]);

非常に簡単な再帰。

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