10 PRINT CHR $(205.5 + RND(1)); :PHPのGOTO 10(またはそのほか)


23

次のBASICステートメントの簡潔さについて同僚と「元気な」会話をしました。

10 PRINT CHR$(205.5+RND(1)); : GOTO 10

これはこの本のタイトルであり、2つの文字をランダムに交互に並べ/\文字列を印刷するだけで、次のようなパターンになります。

ここに画像の説明を入力してください

http://www.flickr.com/photos/rndmcnlly/5058442151/sizes/o/in/photostream/から借りた画像)

PHPの傾向があるため、PHPで同じことを書く最もコンパクトな方法は何だろうと考えて、これを思いつきました。

while(1) { echo chr(47 + 45 * rand(0,1)); }

chr(47)/文字であり、chr(92)は\です。そのため、このステートメントecho chr(47 + 45 * rand(0,1));は、2つのアドネウザムをランダムに代替します。

選択した言語で、文字\/文字の無限のランダムシーケンスを出力する最短のプログラムまたは関数を記述します。各文字は選択される確率が等しくなります。


1
{}中かっこを失う可能性がありますが、それはできる限り簡潔です。
マイケル

これはカッコいい。類似の画像を取得するにはどのフォントを使用できますか?
daniero

1
これ(写真)は、私が今まで手動:)ああ幸せな日の私のコモドール64まっすぐ上に書いた最初の「プログラム」を思い出させる
デール

@daniero実際の書体はターミナルと呼ばれますが、オンラインで「Windowsコマンドプロンプト」codepen.io/nickforddesign/pen/WMqQdM?editors=0110
nickford

GithubのこのCode Golfリポジトリがまったく同じ課題を抱えていることはなんと奇妙な偶然です... github.com/noops-challenge/golfbot
Geza Kerecsenyi

回答:


9

gotoあなたはBASICと同じように、あなたが同じ方法を使用できるように、オペレータは、バージョン5.3.0からPHPに追加されました。

a: echo chr(47 + 45 * rand(0,1)); goto a;

18

これはcodegolfに移行されて以来...

PHP 30バイト

<?for(;;)echo rand(0,1)?~Ð:~£;

Ð文字208で、£文字163です。

使用例(Windowsボックスで):

color 18 & php maze.php

次のようなものを生成します。

正確に正方形の等幅フォントで最適に機能します(ここでは標準のシステムフォント8x8を選択しました)。デフォルトの色に戻すには、colorパラメータなしでもう一度入力します。


余分なバイトを保存することができますrand()%2(擬似乱数の必要性については誰も言及ていません)-Unicode端末(OSXなど)でも動作しません
リー

@Leighその実装によりrand()%2、0と1の間で交互になります。mt_rand()%2ただし、動作します。
primo

15

Mathematica 157バイト

PETSCIIがないため、私は自分の「\」と「/」を転がしました。

簡潔にするための葉巻はありません。

Graphics[{Thickness[.005],RGBColor[0.73,0.55,1.],Line/@Flatten[Table[RandomChoice[{{{x,y},{x+1,y+1}},{{x+1,y},{x,y+1}}}],{x,40},{y,25}],1]},Background->Blue]

青い迷路


この画像は灰色のドットの錯視をしています!!
魔法のタコ

8

ブレインファック-534

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

ここから)私のprng は大きく、非常に遅いです。おそらく、より単純なLFSRまたは同様のもので十分ですが、これは機能します。

ここに画像の説明を入力してください


これはランダムではないと思いますが、これはブレインファックだからです。
エリックアウトゴルファー16年

これらのほとんどは、組み込みのprngに依存しています。ええ、これは毎回同じを出力します。キーボードから追加の文字を2つ追加することでキーボードからシードできるようにすることはできますが、それはここでのポイントではありません。
captncraig

5

C、39文字(MSVCでは38)

main(){while(putchar(rand()%2?47:92));}

ここに画像の説明を入力してください 実行してください。

MSVCでは、我々は交換することができputchar()_putch()、バイトを保存ますが、IDEOneでは機能しません。

main(){while(_putch(rand()%2?47:92));}


3

printの戻り値は1なので、これを使用する場合は、式全体を次のようにラップできますwhile

while(print chr(47 + 45 * rand(0,1));

あなたもおそらくそれをさらにゴルフすることができます。


3

ルビー、27 23文字

loop{$><<"/\\"[rand 2]}

$><< 「標準出力に印刷」です。


2
あなたは置き換えることができるはず"/\\"'\/'。Ruby 1.8では[rand(2),1]、asciiコードの代わりに文字を生成する必要があります。
プリモ

3

C ++、45文字

int main(){for(;;)cout<<(rand()%2?"/":"\\");}

短編賞を受賞するつもりはありませんが、言及された本について聞いたときにすでに書いていたので、ゴルフをしました。

putcharトリックはC ++でも機能し、43になりますが、mainで戻り値の型を宣言することは避けられません。


3

私はCSSスタイルを使用して作成してみてください、それは仕事です

<style>
  body {
    font-family: monospace;
    line-height:75%;
    letter-spacing:-3px;
  }
</style>

このphpコード:

<?php
  $i=10000;
  while($i) {
    if($i%200 == 0) echo '<br/>';
    echo chr(47 + 45 * rand(0,1));
    $i--;
  }
?>

代替スタイルを提案したいと思います。文字間隔にfont-family: courier; line-height: 0.75em; letter-spacing: -0.25em;使用-0.25emする-3pxと、変換の不正確ptさに起因するアーティファクトがあるよりも一致するようpxです。
プリモ

3

Common Lisp-68

(defun s(l)(elt l(random(length l))))(loop do(format t"~a"(s"/\\")))

ループでは、複雑な構文と単純な構文の両方を使用できます。単純な構文はprognに似ていますが、永遠にループします。をドロップできますdo
コアダンプ


3

Befunge-98(PyFunge)、7バイト

? '/,\'

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

?IPは、左または右、そのいずれかのいずれかで送信し/たり\して印刷する前にプッシュされます,。印刷後に'/または\'を間違った順序で実行すると、スタックに対して処理(分割またはスワップ)が行われ、繰り返しの前に無関係な文字がプッシュされます。


Jo Kingの答えで、別の7バイトのBefunge-98ソリューションを提案していました。しかし、このアプローチはすてきに見えます。
ジェームズホルダーネス

3

Befunge、12 9 8 7バイト

編集:ジェームスホルダーネスは、代わりに3つの引用符を使用する非常識なソリューションを見つけました。

?\","/"

各シンボルの多くの余分な文字でスタックがオーバーフローしますが、その1バイトをいつゴルフできるか誰が気にしますか?

古いバージョン

"/\"?>,#

(末尾のスペースに注意してください)末尾のスペースは明らかに不要です(Mistah Figginsに感謝)

オンラインで試す

"/\" Adds both / and \ to the stack
    ? Chooses a random direction to go in. Both up and down loop back around to the ? so it's 50% chance to go in either direction.
Going left
"/\"  >,#  Adds \ and / to the stack but only print the second, the / before heading back
Going right
      >,# Prints the top of the stack, the \ before heading back

これにより、スタックがいっぱいになり、印刷されるシンボルごとに1つの追加シンボルが追加されます。


1
#は行末にあるため、余分なスペースを取り除くことができるようです。一貫した動作ではありませんが、使用しているインタープリターは許可しています:tio.run
##

また"、1つしか使用できないのではないかと思いますが、私の試みは無益です。の/片側にが必要なので、"半分の時間を分割する必要があります。
MildlyMilquetoast

@MistahFigginsスペースは、標準のBefunge-93実装には絶対に必要ではありません。コードは、仕様がより曖昧であるいくつかのFunge-98通訳、中に失敗することがありますが、いずれにせよ、これらの例では、ヘルプのスペースを追加しないだろう-あなたが必要があると思い<後に#それを動作させるために。
ジェームズホルダーネス

@MistahFiggins引用符の1つを削除することに関しては、'代わりにBefunge-98を使用することでそれを行うことができます。オンラインでお試しください!
ジェームズホルダーネス

2
@JoKingは、3つの引用符で実際にもっとうまくやれることに気づきました!?\","/"それだけの欠点は、スタックをより速くオーバーフローさせると思います。
ジェームズホルダーネス

2

それほど良くない。配列の逆参照機能にはphp 5.5以降が必要です。

while(1) { echo ['/', '\\'][rand(0, 1)]; }

考えたことすらありません、ありがとう!
ジュディ

1
実際、PHPは文字列の添え字をサポートしていますwhile(1)echo'/\\'[rand(0,1)];
マナトワーク

2

Python、68

「私の言語はこれが嫌い」というカテゴリーには、Pythonがあります!

import random,sys
while 1:sys.stdout.write(random.choice('/\\'))

輸入品と輸入品のいくつかのキャラクターのIvoに感謝choice


「from sys import *」では何も保存していません。代わりに「import sys、random」と記述してsys.stdoutとrandom.randomを使用すると、5バイト節約できます。
イヴォ

python3:インポートランダムながら1:プリント(random.choice( '/ \\')、末端= '')
イボ

@Ivo、ありがとう、選択を忘れてしまいました!ただし、py3は保持できます。;)
ブースビー

文字列を逆にすると、バックスラッシュをエスケープする必要がなくなり、バイトを節約できます。
ジョナサンフレッチ

2

> <>、14バイト

私はそれを3 * 3の正方形に制限できると思っていましたが、成功しませんでした。

"/\
~x/
o</
 !

ここで試してみることができます


2

Cubix、12バイト

D<^<!"/\"B!o

オンライン通訳で見る!

これは、次のキューブネットにマッピングされます。

    D <
    ^ <
! " / \ " B ! o
. . . . . . . .
    . .
    . .

説明

セットアップ:

IPは最初に東に向かい始めます!。これは「真実ならばスキップ」コマンドであり、スタックに何もない場合はFalseであるため、コマンドはスキップされません。"/\"stringmodeに入り、これら2つの文字コードをスタックに追加します。B!oここでは主にノーオペレーションで、スタックを反転するだけです。

IPは最初のループに戻ります!。ただし、スタックには正の整数があるため、最初の整数"はスキップされます。これ/は、もはやキャラクターではなくミラーであり、IPをメインループの北に送信することを意味します。

メインループ:

このDコマンドは、Cubixのランダム性の唯一のソースです。IPをランダムな方向に送信します。南と東を矢印でブロックすることにより、IPが北に向かう確率が50%、西に向かう確率が50%になるようにします。

西に向かう場合、スタックは逆になります。北に向かう場合、先頭の文字が印刷されます。

これにより、必要に応じて、ランダムな一連のスラッシュが作成されます。


2

PHP、26 31バイト

8 3は、(空白や括弧なし)あなたより短いバイト
2がより短いバイトprimo'sソリューション(タグなし)

PHP 5.4.9は1012年12月の現在のバージョンであったため、...

for($s="\/";;)echo$s[rand()%2];

リテラル文字列のインデックス作成にはPHP 5.5以降が必要です。

で実行する-r、オンラインで試してください


挑戦の投稿の時点ではPHP 5.5は存在しませんでしたが、とにかく+1があります。また、rand()&1Windows用のPHPビルドを試してください。びっくりするかもしれません。
プリモ


2

2

Java 8、60 59 54 53バイト

v->{for(;;)System.out.write(Math.random()<.5?47:92);}

-1バイトを@BenjaminUrquhartに置き換えることprintによりwrite、に置き換える'/'ことができます47

説明:

オンラインで試す(60秒後にタイムアウト)。

v->{                     // Method with empty unused parameter and no return-type
  for(;;)                //  Loop indefinitely
    System.out.write(    //   Print:
      Math.random()<.5?  //    If the random decimal value in range [0,1) is below 0.5:
       47                //     Print forward slash
      :                  //    Else:
       92);}             //     Print backward slash

1
Java。60.バイト。ワオ。
エリックアウトゴルファー16年

@EriktheGolfer Hehe。私は、バイトカウントの平均について気づいていませんでした。通常、Javaは最高のバイトカウントの1つであり、BrainFuckまたはC#とわずかにしか競合できないと想定しています。xD(PS:59:Pまでゴルフした)
ケビンクルーイッセン

あなたは平均的ではなく、バイト数が少なすぎます(Javaを想定しています。小さすぎることは良くありません)。しかし、少なくとも、これではありませんJAVA 8私はそれは長いと思う、...
エリックOutgolfer

@EriktheGolferうーん、Java 8はc->{for(;;)System.out.print(Math.random()<.5?'/':92);}54バイト)短くなっていませんか、それともJava 7はJava 8より長いということですか?その場合、あなたは確かに正しいです。
ケビンCruijssen 16年

1
53バイトへの切り替えSystem.out.writeと置換'/'により47
Benjamin Urquhart

2

JavaScript(Node.js)59 55 54バイト

元の回答

while(1){process.stdout.write(Math.random()>=0.5?"/":"\\")}

マナトワークのおかげで-4バイト

while(1)process.stdout.write(Math.random()<.5?"/":"\\")

コナー・オブライエンのおかげで-1バイト

for(;;)process.stdout.write(Math.random()<.5?"/":"\\")

サイトへようこそ!
coinheringaahing caird

単一の命令ブロックを中括弧で囲む必要はありません。JavaScriptでは、0の整数部分は省略できます。単一文字演算子を使用するには、条件を逆にしますwhile(1)process.stdout.write(Math.random()<.5?"/":"\\")
マナトワーク

@manatworkありがとう!更新しました。
1024x2

for(;;)代わりに書くこともできますwhile(1)
コナーオブライエン

こちらこそ、ありがとう。追加されました。
1024x2

1

再帰を使用できると思います。

function slashes() {echo chr(47 + 45 * rand(0,1)); slashes();}

再帰を使用できると思います。

function slashes() {echo chr(47 + 45 * rand(0,1)); slashes();}

...

スタックスペースは無限ではありません。
codaddict

@codaddictなので、タイムアウトします。
ニール

かなり長いタイムアウトを想定すると、スニペットはOPと同等ではありません。
codaddict

1
@codaddict lol OPもタイムアウトします。それは無限ループです!
ニール

1
タイムアウト前に実行時エラーが発生します。
codaddict

1

1文字を切り落とした:

while(1) { echo chr(2 + 45 * rand(1,2)); }

次に、中括弧を削除します。

while(1) echo chr(2+45*rand(1,2));

同じ長さの別のトリック:

while(1) echo chr(rand()%2*45+47);

1
使用するアルゴリズムによりrand()%20sと1sが交互になります。信じられないほどランダムではありません。rand(0,1)またはmt_rand()%2代わりに使用する必要があります。
プリモ

1

Perl

これは私にとって面白そうです:

perl -pe '$_="~"ge$_?"/":"\\"' </dev/urandom

(ここで対象外になりました。これはPHPではないことを知っています)


1

Powershell、37バイト

for(){Write-Host(Random("\","/"))-N}

残念ながら、すべての文字の後に改行が入らないWrite-Hostの短いエイリアスはないようです。


1

16ビットx86アセンブリコード、10バイト

この本で終わったかどうかは覚えていません。

init:
scasb            ;read from where ES:DI points and compare to AL 
                 ;this sets flags similar to a subtraction 
salc             ;set mask in AL to 00 or FF 
and   al,'\'-'/' ;begin choosing character (AL is 00 or 2D) 
add   al,'/'     ;finish choosing character 
writec:
int   29h        ;write char in AL 
jmp   init       ;loop endlessly


1

Perl 6、23バイト

loop {<\ />.pick.print}
  • loop 永遠にループします。
  • <\ />は文字列\とのリストです/
  • .pick 2つの文字列のいずれかをランダムに選択します。
  • .print そのランダムな文字列を出力します。

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