印刷可能なASCIIに関連する多作の完全なパングラムプログラム


23

更新:時間制限が削除されました。出力を記述することができる必要があります-新しいルールを参照してください。

パングラムはのような、少なくとも一度アルファベットのすべての文字を使用する文です。

速い茶色のキツネは怠laな犬を飛び越えます。

完璧なパングラムは正確に一度、すべての文字を使用しています。

95個の印刷可能なASCII文字(16進コード20から7E)をアルファベットとして使用して、完璧なパングラムであるプログラムの作成を検討してください。

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~

このようなプログラムには、正確に95文字が含まれている必要があり、各印刷可能なASCII文字は1回だけ、ただし任意の順序で発生します。(したがって95!= 1.03×10 148の可能性があります。)

あなたの仕事は、stdoutに印刷される印刷可能なASCII文字の数が可能な限り多くなるように(つまり多作になるように)このプログラムを書くことです。

スコアは、プログラムが出力する印刷可能なASCII文字の数です明確な量ではなく、合計量:スコア4対スコア3)AABCABC。最高のスコアが勝ちます。

詳細

  • 出力には任意の文字(重複を含む)が含まれる場合がありますが、95個の印刷可能なASCII文字のインスタンスのみがスコアにカウントされます。
    • このJSFiddleを使用して、文字列内の印刷可能なASCII文字の数をカウントできます。
  • 言語にstdoutがない場合は、最も適切な代替手段を使用してください。
  • あなたのプログラム...
    • 有限のランタイムが必要です(時間制限は削除されています)
    • 出力が有限でなければならない
    • コメントを含めることができます
    • (キャッチされない)エラーなしでコンパイルおよび実行する必要があります
    • 入力を促したり、入力したりしてはいけません
    • 時不変で決定論的でなければならない
    • 外部ライブラリを使用しないでください
    • ネットワーク接続を必要としないでください
    • 外部ファイルを使用してはいけません
      • (ファイル名を変更してもプログラムの動作が変わらない限り、プログラムファイル自体を使用できます)
  • このタスクが不可能な場合、言語があまりにも悪いです。
  • 投稿に収まるには大きすぎる場合は、正確な出力を提供するか、正確に説明する必要があります。実際にプログラムを実行する必要はありません。限り、それはようですそれが有効であるメモリの無限の量をコンピューターに有限の時間で実行されます。

この単純なPython 2プログラムは、可能な解決策です。

print 9876543210#!"$%&'()*+,-./:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghjklmoqsuvwxyz{|}~

987654321010個の印刷可能なASCII文字を含む10個のスコアを出力します。


14
連合が表示されるのと同じくらい驚くほど素晴らしいが、パングラムは非常に厄介なので、強力なパンチを詰め込んでいます。
ジオビット14年

2
私はまったく異なるルールも読み直しました。私は以前にそれをざっと読みましたが、それは明らかに完全ではなく明確なルールであると結論付けaました文字カウント。とにかく、私は95を誇りに思っています。たとえ小さなものであってもです。サイズがすべてではありません。
COTO 14年

HQ9 +では、なぜこのタスクは不可能だと思いますか?
ピーターテイラー14年

FORTRANでこれを試してみます(大文字と小文字を区別しないようにします)。---そしてそれをスクラッチします。文字Oが4回必要です。プログラム宣言に2回、ループ宣言に2回です。
Nzall 14年

1
@デニス第5回
カルビンの趣味14年

回答:


12

GolfScript、2↑↑↑(9871↑↑2)文字以上

2 9871.?,{;0$[45)63]n+*~}/
#!"%&'(-:<=>@ABCDEFGHIJKLMNOPQRSTUVWXYZ\^_`abcdefghijklmopqrstuvwxyz|

整数を出力します。無制限のCPUレジスタサイズ(Rubyの最大文字列長を決定する)、メモリ、および実行時間を活用します。改行は読みやすさだけのためです。

コード

2             # Push 2.
9871.?        # Push b := 9871↑↑2 = 9871↑9871 = 9871**9871.
,{            # For each i from 0 to b - 1:
  ;0$         #   Discard i and duplicate the integer on the stack.
  [45)63]n+*  #   Replicate ".?\n" that many times.
  ~           #   Evaluate.
 }/           #

スコア

b = 9871↑↑2を定義します(Knuthの上矢印表記を参照)。

  • 。?f:x↦x↑xを実行します。

  • 内部ブロックはg:x↦f x(x)を実行します。

    以来、F(X)= X↑X = X↑↑2F 2(x)=(x↑X)↑(X↑X)> X↑↑X X = X↑↑3
    F 3(X)= ((x↑x)↑(x↑x))↑((x↑x)↑(x↑x))>(x↑x↑x)↑(x↑x↑x)> x↑x↑x↑ x = x↑↑4など、
    g(x)> x↑↑(x + 1)> x↑↑xがあります。

  • 外側のブロックはh:x↦g b(x)を実行します。

    以来、G(X)= X↑↑X = X↑↑↑2G 2(x)=(X↑↑X)↑↑(X↑↑X)> X↑↑X↑↑X = X↑↑↑ 3
    g 3(x)=((x↑↑x)↑↑(x↑↑x))↑↑((x↑↑x)↑↑(x↑↑x))>(x↑↑x↑↑ x)↑(x↑↑x↑↑x)> x↑↑x↑↑x↑↑x = x↑↑↑4など、h(x)> x↑↑↑(b + 1)があります。

  • スタック上の整数2から開始するため、コードはh(2)> 2↑↑↑(b + 1)を計算します。

  • スコアが小数点以下の桁数であり、H(2)で、ログ(H(2))+ 1>ログ(2↑↑↑(B + 1))> 2↑↑↑B

したがって、スコアは2↑↑↑(9871↑↑2)よりも大きくなります。

2↑↑↑nは、nが大きくなるととんでもないペースで成長します。2↑↑↑4:= 2↑↑2↑↑2↑↑2 = 2↑↑2↑↑4 = 2↑↑65536、これは265536コピーの右結合パワータワーです:

                                                                2↑↑↑4                                                                 

同様に、2↑↑↑5:= 2↑↑(2↑↑↑4)のパワー塔で2つの↑↑↑4のコピー2

現在、スコアは2↑↑↑4または2↑↑↑5ではなく、2↑↑↑bより大きく、ここでb> 2×10 39 428です。それは大きな数字です...


@DigitalTrauma-確認してください;)
オプティマイザー14年

@デニス-おおよそいくらですか?
オプティマイザー14年

@Optimizerあなたは私を手に入れました;-)
デジタルトラウマ14年

驚くばかり!それはグラハムの数を思い出させます...それは大きいです!
書き換え

3
これは一方で、という注意理論的にゼロの非常に大きな数を印刷する必要があり、実際にはそれだけでインタプリタをクラッシュin `*': bignum too big to convert into `long' (RangeError)
イルマリカロネン14年

22

Perl、70 * 18446744073709551615 * 10 ^ 987654320

say q{!"#%&'+,-./:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\]^_`bcdfghijklmnoprtuvwz|}x(1e987654320*~$[)

出力:

!"#%&'+,-./:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\]^_`bcdfghijklmnoprtuvwz|

18446744073709551615 * 10 ^ 987654320回繰り返されました。

$[はデフォルト0であるため、~$[と同等18446744073709551615です。

補足として、数値を作成しようとしてメモリ不足になりました10^987654320


古い回答(7703703696):

say qw(!"#$%&'*+,-./:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`bcdefghijklmnoprtuvz{|}~10)x98765432

出力は次のとおりです。

!"#$%&'*+,-./:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`bcdefghijklmnoprtuvz{|}~10

98765432回繰り返されました。

注:すべてのサンプルを実行するには perl -Mbignum -E


いいね!しかし、再帰性を使用できるかどうかは疑問に思います... ?またはPerlの変数の他)..またはヒープ)入力せずに(賢く$ 0コールを使用する
オリヴィエ・デュラック

あなたが十分なメモリを持っていた場合、あなたは何ができるperl -E'say qw{m}x(9876543210*ord$")'
hmatt1

2
役立つ場合は、時間やメモリの制限はありません。
カルビンの趣味14年

2
Perlがべき乗に^ではなく**を使用しているのは残念です。
マーク14年

11

Bash + coreutils、151,888,888,888,888,905(1.5 * 10 ^ 17)

seq 9E15;#\!%*+,-./2346780:=@ABCDFGHIJKLMNOPQRSTUVWXYZ]^_abcdfghijklmnoprtuvwxyz~"'$&()?<>`{}|[

1〜9x10 15の整数を1 行に1つずつ出力します。長い時間がかかります。

なんで9E15?GNU seqは内部で64ビットの浮動小数点数(double)を使用しているようです。この型で表現できる最大の整数は、精度が不足して1ずつ増加する前に2 53または9007199254740992です。指数表記でこれに最も近いのは9E15または9000000000000000です。

スコアを計算するには、各数字の間に改行があるため、指定された桁数のすべての数字を加算し、9E15を追加しています。

8000000000000001*16 + 900000000000000*15 + 90000000000000*14 + 9000000000000*13 + 900000000000*12 + 90000000000*11 + 9000000000*10 + 900000000*9 + 90000000*8 + 9000000*7 + 900000*6 + 90000*5 + 9000*4 + 900*3 + 90*2 + 9 + 9000000000000000

この出力をod桁違いにパイプ処理することもできますが、スコアの計算がはるかに難しくなります。


ルール変更前の回答:

Bash + coreutils、18、926、221、380

seq 1592346780;#\!%*+,-./:=@ABCDEFGHIJKLMNOPQRSTUVWXYZ]^_abcdfghijklmnoprtuvwxyz~"'$&()?<>`{}|[

出力1〜1592346780。2012年中頃のMacbook(リンクされたベンチマークからそれほど遠くない)では、これには約9分45秒かかります。

おそらく意味がなくても、もう少し最適化することに抵抗することはできませんでした。

出力:

$ time ./pangram.sh | wc
 1592346780 1592346780 18926221380

real    9m46.564s
user    11m7.419s
sys 0m10.974s
$ 

なんでやらないのseq 9876543210;
durron597

@ durron597それには時間がかかりすぎるので、おそらく約1時間です。10分以内に完了する必要があります。
デジタル外傷

しかし、確かにこのプログラムの唯一の制限要因はI / Oです。他の言語の他のプログラムは、実際にこれに勝るものはありません。
durron597 14年

@ durron597はい、そうだと思います。このコミュニティの誰かが...賢い方法を見つけた場合、私は驚かないだろうけど
デジタルトラウマを

1
@DigitalTrauma実際に時間制限を削除して、これが最後から2番目の回答ではないことを確認しています(違反はありませんので、すぐにコンテストを終了したくないので:P)9876543210。新しい最後のルールを読むことができます。
カルビンの趣味14年

6

GolfScript、≈3 * 10 ^(2 * 10 ^ 7)すなわち≈3x10 20000000

 87 9654321?,`0${;.p}/#!"%&'()*+-9:<=>@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_abcdefghijklmnoqrstuvwxyz|~

使い方

87 9654321?                "Pushes 87^9654321 to stack";
           ,               "Pushes an array [0, 1, 2 ... (87^9654321) - 1] to stack";
            `              "Creates a string representation of the array like "[0 1 2...]";
             0$            "Copies the string";
               {;.p}/      "Print the string wrapped in quotes X times";
                     #...  "This is all comment";

ここではX、配列の文字列表現の文字数(長さ)である[0, 1, 2..,(87^9654321) - 1]ようになります[0 1 2 3 4 ... (87^9654321) - 1]

私はX自分のスコアを見つけるためにここで計算しようとしています。 (87^9654321) - 1おおよそである10^(10^7.272415829713899)18724742小数点以下の桁。

Xおおよそです3*10^(2*10^7)ので、X*X唯一のも同じです。演算制限によるこれらの値は非常に下側にあることに注意してください(偶数)wolframa、私は計算することができなかったsum (floor(log10(x)) + 1) for x = 1 to (87^9654321 - 1)の真値でありますX


理論的には、これをさらに小さくする方法はいくつかありますが、悲しいことにRubyのBigNumには制限があり、87 9654321?まさにそうInfinityです。
デニス14年

ああ!?最大値を知っていますか?;)
オプティマイザー14年

ではない正確に。整数はRAMに収まらなければならないため、マシンに依存しているようです。無制限のメモリでは、どこに制限があるのか​​わかりません。おそらく2**(2**64)-164ビットRuby向けです。
デニス14年

RAMの量に制限はありません
オプティマイザー14年

はい、それが私が明らかにした理由です。CJamには固定の制限があり、メモリを使い果たすとインタープリターがクラッシュするだけです。Rubyは異なるようです。
デニス14年

4

MATLAB、95

コード

char(37-5:126)% !"#$&'*+,./0489;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`bdefgijklmnopqstuvwxyz{|}~

出力

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~

出力には、指定されたすべてのASCII文字が、それぞれ1回ずつ順番に含まれます。


1
視聴者への注意:この回答は、仕様が固有の文字を最大化するように要求したときに送信されました。これはもはや目標ではありませんが、この答えが有効であるため、この答えが残っていれば問題ありません。
カルビンの趣味14年

2

ルビー、89

p %q{!"#$&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnorstuvwxyz|~}

出力:

"!\"\#$&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnorstuvwxyz|~"

すべてのASCII文字は、除いて含まれp%q{、と}


1
視聴者への注意:この回答は、仕様が固有の文字を最大化するように要求したときに送信されました。これはもはや目標ではありませんが、この答えが有効であるため、この答えが残っていれば問題ありません。
カルビンの趣味14年

2

GolfScript、93

{ !#$%&()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz|~}

出力:

{ !#$%&()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz|~}
}

"とを除くすべてのASCII文字が含まれています'


6
プログラムは完璧なパングラムではありませんが、そうですか?含まれていないようです"'のどちらか。
マーティンエンダー14年

視聴者への注意:この回答は、仕様が固有の文字を最大化するように要求したときに送信されました。これはもはや目標ではありませんが、有効になった場合にこの回答が残っていれば問題ありません。
カルビンの趣味14年

1
これを新しいルールの下で有効にするのは十分簡単です。単に#現在の位置から削除#"'して最後に追加するだけです。ただし、スコアは1つ下がります。
イルマリカロネン14年

2

Golfscript-27 * 2 6543 9870

これが私の最初のGolfscript提出です!:)

12,`{.+}6543 9870?*#!"$%&'()-/:;<=>@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_abcdefghijklmnopqrstuvwxyz|~

説明:

12,                     - Creates an array of ascending numbers from 0 to 11
   `                    - Converts the array to a string
    {.+}                - Duplicates the string on the stack and concatenates the two
        6543 9870?      - Calculates 6543^9870 and pushes it to the stack
                  *     - Repeat the block 6543^9870 times
                   #... - The rest is a comment

出力は、数のリストのロードです。次のコードを検討してください。

12,`{.+}1*

これにより12,、次の配列が生成されます。

[0 1 2 3 4 5 6 7 8 9 10 11]

バックティックはそれを文字列に変換し、ブロックに渡します{.+}。これにより、文字列が複製され、2つが連結されて、以下が生成されます。

[0 1 2 3 4 5 6 7 8 9 10 11][0 1 2 3 4 5 6 7 8 9 10 11]

1*前のブロックの1時間(2実行するインタプリタ指示1 = 2)。

したがって、それに基づいて:

 12,`{.+}n*

12,`2 n回の出力を出力します。

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