ランダムウォーカープリンター


24

歩行者の位置にSTDOUT nドットを含む文字列を1回ずつ(1ステップずつ)書き込むプログラムまたは関数を描画します.。また、プログラムは1 s秒ごとに行を書き込む必要があります(またはs各行の後に数秒待機します)。

ランダムウォークは、一連のランダムステップ(wiki)で構成されるパスの数学的な形式化であり、すべての新しいステップが最後のステップと新しい値になるため、tステップ値はすべてのランダム値の合計になりますir +初期値の前。

プログラムは2つの入力を取る必要があり、出力ではスペース" "とドットのみを使用"."します。ウォーカーの開始値は、20出力が19スペースの後にドットになるようになります。

                  . #19 spaces then a dot

新しいステップごとに、値は歩行者の最後の値にこれらの1つを加えたものになります[-2-1,0,1,2](それぞれ20%の確率)。新しい位置が印刷された後、プログラムはs数秒待ってから次のステップに進みます。ステップが歩行者を範囲外に連れて行く場合、1 to 40それは無視されるべきであり、歩行者の位置は同じままである。スペースの数は常に0〜39の数になります。

#input
Mywalk(s = 0.1, n = 30)

#output
                     .
                    .
                      .
                        .
                          .
                           .
                            .
                          .
                         .
                          .
                           .
                            .
                           .
                          .
                           .
                           .
                         .
                         .
                          .
                            .
                           .
                          .
                           .
                           .
                           .
                         .
                          .
                         .
                          .
                          .

考慮事項

  • あなたは、合理的な形式として入力を取ることができます

  • 最短のコードが勝ちます

  • あなたのプログラムが秒を整数としてのみ受け入れるなら大丈夫です


2
nはステップの数だと思いますか?
ASCIIThenANSI

ええ、ありがとうございます。
ムタドール

1 to 40スペースの数は常にであるので、範囲はそうだと言うべきだと思うposition-1
geokavel

@geokavelは改善されたようです!
ムタドール

10
プログラムを描く ??? ;-)
デジタル外傷

回答:


6

Pyth、39

J19VEK+.d0QW<.d0K)+*d=JhtS[Z39-+O5J2)\.

かかるs入力の最初の行として、およびn第二のように。コマンドラインで機能しますが、オンラインインタープリターでは機能しません。初めてのPythプログラム!ゴルフのヒントは大歓迎です。


Pythへようこそ!私が見ることができる唯一のゴルフのヒントは、入力を改行で区切る場合、fo との代わりにQand Eを2つの入力に使用できることです。hQeQ
isaacg

13

Matlab、112

核となる考え方は、可能な次の位置のリストを生成し、それらの1つを均一に描画することです。たとえば、$ l = 1 $の位置にいる場合、可能なステップは[-1,0,1,2,3]もちろん、それを選択-1した場合は無効になり、同じ位置に留まる必要があります。そのため、無効な位置を現在の位置に置き換え、[1,0,1,2,3]この更新されたリストから要素をランダムに選択しました。

OPがプログラムを作成するように要求したので、ここに行きます。

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

転写:

function c(n,s);
l=19;                             %initialize position
for k=1:n;                          
    disp([ones(1,l)*32,'.']);     %print the line
    z=(-2:2)+l;                   %get vector of possible next steps (for l=1 we get [-1,0,1,2,3])
    z(z<0)=l;                     %prune invalids: here we just replace the the invalid positions with the current position
    z(z>39)=l;                    %   this ensures the same behaivour as staying in the same spot when going outside of the range
    l=z(randi(5));                %draw random sample of those
    pause(s);
end

1
-1は、MathJax以外の環境でMathJaxを使用します;)
コナーオブライエン

2
おっと、ラテックスで書かれていない方程式は、それほど信頼できるものではなく、真実ではないかもしれません!安全を確保してください。
flawr

3
描かれたプログラムは...むしろバイトよりも、インクの体積で測定されなければならない
ダレル・ホフマン

8

Perl、136 128 116 106 101 90 86

$p=19;map{say$"x$p.".";sleep $ARGV[0];$x=rand(5)+$p-2;$p=$x>0&&$x<40?$x:$p}1..$ARGV[1]

秒は整数である必要があります。

で実行しperl <filename> <second delay> <number of steps>ます。

ここにはより多くのゴ​​ルフの可能性があるかもしれませんが、正直なところ、私はそれがここまで得られたことに驚いています。(さあ、bashの答えに勝るのにあと6バイトだけです...)

変更点

  • 不要な括弧を削除し、ARGVを綴ることで8バイトを節約しました(実際にはそのように短くなっています)
  • プレーンを削除$s$nて使用することで、さらに12バイトを節約$ARGV[0]しました。$ARGV[1]
  • 私が使用できることに気付いたときにさらに10バイトを保存$"し、特に$uとして定義する必要はありませんでした$undef
  • 3進法$xと使用方法を再配置し、のmap代わりに使用することにより、さらに5バイトを節約しましたfor
  • 秒を小数として受け入れなくなることで11バイトを節約しました(チャレンジ仕様では問題ありません)。
  • say代わりにを使用して、さらに5バイトを保存しましたprint

6

Python 2、124 119バイト

@janrnと@Steve Eckert:あなたの答えをコメントするほどの評判はありませんが、基本的には短縮されたバージョンです。タスクはプログラムまたは関数を描画することであるため、使用f(s,x)することでかなりのビットを節約できmax(0,min(x,39))、余分なif句を避けるためにも使用できます。それに行きました:

import time,random as r
def f(s,x):
 n=19
 while x:print' '*n+'.';time.sleep(s);n=max(0,min(n+r.randint(-2,2),39));x-=1

5

バッシュ、81

for((s=20;i++<$1;t=s,s+=RANDOM%5-2,s=s<0|s>39?t:s)){
printf %${s}s.\\n
sleep $2
}

編集:ステップがウォーカーを1から40の範囲外に持ってきた場合、それは単に無視されるべきであり、ウォーカーの位置は正しく処理されたままです。

コマンドラインオプションからの入力。例えば:

$ ./randwalk.sh 5 0.5
                    .
                     .
                    .
                  .
                 .
$ 

4

ルビー、84

def w(s,n)q=19;n.times{puts ' '*q+'.';sleep s;q+=rand(5)-2;q=[[q,0].max,39].min};end

4

Python 2.7、198 162 143 133

import time,random as r;p=20;s=0;d=input();w=input()
while s<d:
 print' '*p+'.';s+=1;p=max(1,min(p+r.randint(-2,2),40));time.sleep(w)

でスクリプトを呼び出す場合python script.py、最初の入力はステップの量、2番目の入力はステップ間の時間です(floatまたはintを受け入れます)。改善のための提案はありますか?

編集

  • print ' '*p+'.'@corsiKlause Ho Ho Hoのおかげで、現在使用しているため36バイト節約されました
  • タブのインデントを削除して、さらに19バイトを削減し、1つのスペースに置き換えるか;、可能な場合
  • @Bruce_Forteのアイデアのおかげで10バイト少なくなりましたp=max(1,min(p+r.randint(-2,2),40))(あなたの答えにもコメントできませんが、感謝します;完全にコピーしたくないです)

Pythonでは' '*p、文字列を繰り返すだけではいけませんか?
corsiKa

実際、はい、それを知りませんでした。今、感謝の編集
janrn

4

処理中、150 147

void w(int n,int s){int x=20,i,y,c=0;for(;c<n;c++){x+=y=int(random(5)-2);if(x>40||x<0)x-=y;for(i=1;i<x;i++)print(" ");println(".");delay(s*1000);}}

使用法:

void setup() {
    w(10,1);
}

注:タイプ上の理由により、1000に変更することはできません1e3


3

Lua、140バイト

注:このプログラムにはLuaSocketパッケージが必要です。

require"socket"p=19 for i=1,arg[2]+0 do print((" "):rep(p)..".")p=p+math.random(-2,2)p=p<0 and 0 or p>39 and 39 or p socket.sleep(arg[1])end

3

Perl 6、92バイト

my (\n,\s)=@*ARGS;$/=19;for (-2..2).roll(n) {put ' 'x($/+=(40>$/+$_>=0??$_!!0)),'.';sleep s} # 92
my (\n,\s)=@*ARGS;
$/=19;
for (-2..2).roll(n) {
  put ' 'x($/+=(40>$/+$_>=0??$_!!0)),'.';
  sleep s
}

使用法:

$ perl6 -e 'my (\n,\s)=@*ARGS;$/=19;for (-2..2).roll(n) {put " "x($/+=(40>$/+$_>=0??$_!!0)),".",;sleep s}' 10 0.001
                  .
                .
               .
              .
               .
                .
               .
                .
                  .
                 .

3

JavaScript(ES6)、125バイト

(s,n)=>(t=setTimeout)(c=`console.log(" ".repeat(p)+".");p+=m=Math.random()*5|0;p-=p>41|p<2?m:2;--i&&t(c,d)`,d=s*1e3,p=19,i=n)

説明

(s,n)=>
  (t=setTimeout)(                     // set inital timeout
    c=`                               // c = code for timeout to execute
      console.log(" ".repeat(p)+"."); // print the current line
      p+=m=Math.random()*5|0;         // move walker 0 - 4 positions to the right
      p-=p>41|p<2?                    // if walker was moved out of bounds (2 - 41 instead
                                      //     of 0 - 39 because the random move of 0 - 4 to
                                      //     the right has not had the 2 subtracted yet)
        m:                            // undo the move
        2;                            // else subtract 2 to make the move -2 to 2
      --i&&t(c,d)                     // while we have steps remaining schedule next one
    `,
    d=s*1e3,                          // d = milliseconds to wait between steps
    p=19,                             // p = position of walker (0 indexed)
    i=n                               // i = steps remaining (needed to make n global)
  )

テスト


3

k4、61文字

f:{y{-1((y:1|40&y+-2+*1?5)#" "),".";."\\sleep ",$x;y}[x]\20;}

サンプル実行:

  f[.1]30
                      .
                    .
                    .
                   .
                   .
                  .
                  .
                   .
                   .
                     .
                    .
                  .
                  .
                    .
                   .
                   .
                 .
                .
               .
               .
              .
            .
          .
         .
         .
          .
            .
              .
              .
                .

3

Mathematica、122 117バイト

$RecursionLimit=∞;If[#2>0,Print[Indent[a=Min[#3+RandomInteger@{-2,2},39]~Max~0],"."];Pause@#;#0[#,#2-1,a]]&[##,19]&

再帰的な匿名関数。指定された順序で入力を受け取ります。おそらくさらにゴルフすることができます。


2

Python 3、154バイト

import time
from random import*
w=int(input())
z=int(input())
g=19
c=6
s=" "
while c:
    c-=1
    s+=s
while z:
    z-=1
    if -1<g<40:
        print(s[:g]+'.')
    time.sleep(w)
    g+=randint(-2,2)

必要な最大長を超えるスペースの文字列を生成し、インデックス 'g'の文字までのみその文字列を出力してから、 '。'を出力します。[-2:2]の範囲のランダムな値でgをインクリメントして終了し、繰り返します。

誰かがその恐ろしい入力ブロックをゴルフで倒すのを手伝ってくれたら、ありがたいです。


入力をゴルフするために、なぜ使用しないのsys.argvですか?
ASCIIThenANSI

1
また、の代わりにwhile z:、使用しないのはなぜfor i in range(1,z)ですか?
ASCIIThenANSI

私は興味がありますが、これが154バイトだとどうやって知りましたか?bytesizematters.comは異なるカウントを提供します(空白のカウントを無効にしても)
p1xel

@ASCIIThenANSI:うーん...最初の呼び出しsys.argvとインポートを追加するまでに、どのようにしてバイトを保存できるのかわかりません。そして、宣言してcからデクリメントするための余分な行がありますがcz私のカウントでは、この方法でそれを行う方が安価です。
スティーブエッカート

@ p1xel:行の内部の空白をカウントしましたが、先頭または末尾の空白だけではありません。私が知らない別の採点基準はありますか?
スティーブエ

1

C機能、114

s=20,i,t;w(int n,float f){for(;i++<n;t=s,s+=rand()%5-2,s=s<0||s>39?t:s,usleep((int)(f*1e6)))printf("%*c.\n",s,0);}

私のbashの答えのほとんど直訳です。

完全なテストプログラム:

s=20,i,t;w(int n,float f){for(;i++<n;t=s,s+=rand()%5-2,s=s<0||s>39?t:s,usleep((int)(f*1e6)))printf("%*c.\n",s,0);}

int main (int argc, char **argv) {
  w(10, 0.2);
  return 0;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.