Printer Acak Walker


24

Gambarlah program atau fungsi yang akan menulis ke STDOUT nwaktu (masing-masing untuk satu langkah) string yang berisi titik .di lokasi walker. Program juga perlu menulis satu baris setiap sdetik (atau menunggu beberapa sdetik setelah setiap baris).

Jalan acak adalah formalisasi matematis dari lintasan yang terdiri dari suksesi langkah acak ( wiki ), sehingga setiap langkah baru akan menjadi langkah terakhir ditambah nilai baru, jadi tnilai langkah apa pun hanyalah jumlah dari semua nilai acak sebelum ir ditambah nilai awal.

Program harus mengambil 2 input dan hanya akan menggunakan spasi " "dan titik "."pada output. Nilai awal walker akan 20sedemikian rupa sehingga output harus berupa titik setelah 19 spasi.

                  . #19 spaces then a dot

Setiap langkah baru nilainya akan menjadi nilai terakhir dari walker plus salah satunya [-2-1,0,1,2](masing-masing 20%). Setelah posisi baru dicetak, program harus menunggu beberapa sdetik dan melanjutkan ke langkah berikutnya. Jika langkah tersebut membawa walker ke luar jangkauan, langkah 1 to 40itu harus diabaikan dan posisi walker tetap sama. Jumlah spasi akan selalu berupa angka dari 0 hingga 39.

Contoh

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

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

Pertimbangan

  • Anda dapat mengambil input sebagai format apa pun yang masuk akal

  • Kode terpendek menang

  • Tidak apa-apa jika program Anda hanya menerima detik sebagai bilangan bulat


2
Saya berasumsi njumlah langkahnya?
ASCIIThenANSI

Ya, saya sudah mengklarifikasi itu, terima kasih.
Mutador

Saya pikir Anda harus mengatakan bahwa jangkauannya adalah 1 to 40, karena jumlah ruang selalu position-1.
geokavel

@geokavel yang tampaknya lebih baik, sudah diperbaiki!
Mutador

10
Buat sebuah program ??? ;-)
Trauma Digital

Jawaban:


6

Pyth, 39

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

Dibawa ssebagai input baris pertama dan nsebagai input kedua. Bekerja pada baris perintah tetapi tidak dengan penerjemah online. Program Pyth pertama saya! Tips golf sangat dihargai.


Selamat datang di Pyth! Satu-satunya tip golf yang dapat saya lihat adalah bahwa Anda dapat menggunakan Qdan Euntuk dua input sebagai gantinya hQdan eQ, jika Anda baris baru memisahkan input.
isaacg

13

Matlab, 112

Gagasan intinya adalah membuat daftar kemungkinan posisi selanjutnya dan kemudian secara seragam menggambar salah satunya. Jika kita mis di posisi $ l = 1 $ langkah yang mungkin adalah [-1,0,1,2,3]Tentu saja jika kita memilih -1yang tidak valid dan kita harus tetap di posisi yang sama. Itulah sebabnya kami mengganti posisi yang tidak valid dengan posisi saat ini [1,0,1,2,3],, dan kemudian secara acak memilih elemen dari daftar yang diperbarui ini.

OP meminta kami menggambar program, jadi begini saja:

masukkan deskripsi gambar di sini

Transkripsi:

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 menggunakan MathJax di lingkungan non-MathJax;)
Conor O'Brien

2
Oo Anda tahu, persamaan yang tidak ditulis dalam lateks tidak cukup bisa dipercaya, bahkan mungkin tidak benar! Lebih baik berada di sisi yang aman.
flawr

3
Program yang digambar harus diukur dalam volume tinta, bukan byte ...
Darrel Hoffman

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]

Membutuhkan detik untuk menjadi bilangan bulat.

Jalankan dengan perl <filename> <second delay> <number of steps>.

Mungkin ada lebih banyak potensi bermain golf di sini, meskipun jujur, saya terkejut itu sampai sejauh ini. (Ayo, hanya 6 byte lagi untuk mengalahkan jawaban bash ...)

Perubahan

  • Disimpan 8 byte dengan menghapus tanda kurung yang tidak dibutuhkan dan mengeja ARGV (sebenarnya lebih pendek seperti itu)
  • Disimpan 12 byte lebih banyak dengan menghapus $sdan $ndan hanya menggunakan dataran $ARGV[0]dan$ARGV[1]
  • Menyimpan 10 byte lagi ketika saya menyadari bahwa saya dapat menggunakan $"dan tidak perlu secara khusus mendefinisikan $usebagai $undef.
  • Disimpan 5 byte lebih banyak dengan mengatur ulang terner dan bagaimana $xdigunakan dan dengan menggunakan mapalih-alih for.
  • Disimpan 11 byte dengan tidak lagi menerima detik sebagai desimal (spec tantangan mengatakan tidak apa-apa.)
  • Menyimpan 5 byte lainnya dengan menggunakan sayalih-alih print.

6

Python 2, 124 119 byte

@janrn dan @Steve Eckert: Saya tidak punya cukup reputasi untuk mengomentari jawaban Anda, tetapi inilah dasarnya versi Anda diperpendek. Tugasnya adalah menggambar program atau fungsi , jadi dengan menggunakan f(s,x)Anda dapat menyimpan beberapa bit, juga dapat Anda gunakan max(0,min(x,39))untuk menghindari ifklausa tambahan . Turun ke:

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

Bash, 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
}

Sunting: Jika langkah membawa walker ke luar rentang 1 sampai 40 itu harus diabaikan dan posisi walker tetap ditangani dengan benar.

Input dari opsi baris perintah. Misalnya:

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

4

Ruby, 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)

Saat memanggil skrip dengan python script.py, input pertama adalah jumlah langkah, kedua input waktu antar langkah (menerima float atau int). Ada saran untuk meningkatkan?

Suntingan

  • disimpan 36 byte karena sekarang menggunakan print ' '*p+'.', terima kasih kepada @corsiKlause Ho Ho Ho
  • turun 19 byte lainnya dengan menghapus indentasi tab, menggantinya dengan satu ruang atau ;jika memungkinkan
  • 10 byte lebih sedikit berkat ide @Bruce_Forte dengan p=max(1,min(p+r.randint(-2,2),40))(saya tidak bisa mengomentari jawaban Anda juga, tapi terima kasih; tidak ingin menyalinnya sepenuhnya)

Dengan Python, tidak bisakah Anda hanya ' '*pmengulangi string?
corsiKa

Sebenarnya ya, tidak tahu itu. Editing sekarang, terima kasih
janrn

4

Memproses, 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);}}

Pemakaian:

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

Catatan: 1000tidak dapat diubah ke 1e3karena alasan jenis.


3

Lua, 140 Bytes

Catatan: Program ini membutuhkan paket 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 byte

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
}

Pemakaian:

$ 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 byte

(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)

Penjelasan

(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)
  )

Uji


3

k4, 61 karakter

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

contoh dijalankan:

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

3

Mathematica, 122 117 byte

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

Fungsi anonim rekursif, mengambil input dalam urutan yang ditentukan. Mungkin bisa bermain golf lebih lanjut.


2

Python 3, 154 byte

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)

Hasilkan string spasi lebih besar dari panjang maksimum yang dibutuhkan, lalu cetak string itu HANYA hingga char pada indeks 'g', lalu cetak a '.'. Akhiri dengan menambah g dengan nilai acak dalam rentang [-2: 2], dan ulangi.

Jika ada yang bisa membantu saya bermain di blok input yang mengerikan, saya akan menghargai itu.


Untuk memasukkan input, mengapa tidak digunakan sys.argv?
ASCIIThenANSI

1
Juga, alih-alih while z:, mengapa tidak digunakan for i in range(1,z)?
ASCIIThenANSI

Saya ingin tahu, bagaimana Anda mendapatkan bahwa ini adalah 154 byte? bytesizematters.com memberikan hitungan yang berbeda (bahkan jika Anda menonaktifkan penghitungan spasi putih)
p1xel

@ ASCIIThenANSI: Hmm ... pada saat saya menambahkan panggilan awal sys.argvdan impor, saya tidak bisa melihat bagaimana saya bisa menyimpan byte yang melakukan hal itu. Dan bahkan dengan garis ekstra untuk menyatakan ckemudian penurunan cdan z, masih lebih murah untuk melakukannya dengan cara ini, menurut perhitungan saya.
Steve Eckert

@ p1xel: Saya menghitung spasi putih internal ke baris, hanya saja tidak memimpin atau mengikuti spasi putih. Apakah ada standar penilaian yang berbeda yang tidak saya sadari?
Steve Eckert

1

C funtion, 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);}

Cukup banyak terjemahan langsung dari jawaban bash saya .

Program uji penuh:

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;
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.