Rastgele Walker Yazıcı


24

Yürüteç konumunda STDOUT nnokta içeren bir dize, zamanlara (her bir adım için) yazacak bir program veya işlev çizin .. Programın ayrıca her ssaniye bir satır yazması gerekir (veya sher satırdan birkaç saniye sonra bekleyin ).

Rastgele bir yürüyüş, her adımın son adım artı yeni bir değer olacağı şekilde, art arda rastgele adımlardan ( wiki ) oluşan bir yolun matematiksel bir formalizasyonudur.t adım değeri, tüm rastgele değerlerin toplamıdır. ir öncesi artı ilk değer.

Program 2 girdi almalıdır ve çıktıda yalnızca boşluk " "ve nokta kullanacaktır ".". Yürütücünün başlangıç ​​değeri 20, çıkışın 19 boşluktan sonra bir nokta olacak şekilde olacaktır .

                  . #19 spaces then a dot

Her yeni adımda değer, walker'ın son değeri artı bunlardan biri olacaktır [-2-1,0,1,2](her biri% 20 şans). Yeni pozisyon yazdırıldıktan sonra program ssaniyeler beklemeli ve bir sonraki adıma geçmelidir . Adım, walker'ı saha dışına çıkarırsa1 to 40 göz ardı edilmeli ve yürüteç pozisyonu aynı kalmalıdır. Boşlukların sayısı her zaman 0 ila 39 arasında bir sayı olacaktır.

Örnek

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

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

hususlar

  • Girişi herhangi bir makul format olarak kabul edebilirsiniz.

  • En kısa kod kazanır

  • Programınız yalnızca saniyeleri tam sayı olarak kabul ederse sorun olmaz


2
Sanırım nadımların sayısı?
ASCIIThenANSI

Evet, bunu netleştirdim, teşekkürler.
Mutador

Aralık olduğunu söylemelisin 1 to 40, çünkü boşluk sayısı her zaman position-1.
geokavel

@geokavel daha iyi görünüyor, sabit!
Mutador

10
Bir program çizin ??? ;-)
Dijital Travma

Yanıtlar:


6

Pyth, 39

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

Alır sgiriş birinci hattı olarak ve nikinci olarak. Komut satırında çalışır ancak çevrimiçi tercümanla değil. Şimdiye kadarki ilk Pyth programım! Golf önerileri takdir edilmektedir.


Pyth'a Hoşgeldiniz! Görebildiğim tek golf ipucu kullanabilirsiniz olmasıdır Qve Ebunun yerine fo iki girişler için hQve eQsiz girişler ayırmak yeni satır eğer.
isaacg

13

Matlab, 112

Temel fikir, olası bir sonraki pozisyonların bir listesini oluşturmak ve ardından bir tanesini düzgün bir şekilde çizmek. Örneğin, $ l = 1 $ pozisyonundaysak olası adımlar geçersiz sayılırsa ve aynı pozisyonda [-1,0,1,2,3]kalmamız gerekiyorsa Elbette olur -1. Bu nedenle geçersiz konumları geçerli konumla değiştiririz [1,0,1,2,3]ve ardından bu güncellenen listeden bir öğeyi rasgele seçtik.

OP tho istedi çizmek yüzden işte başlıyoruz, programı:

enter image description here

Transkripsiyon:

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 olmayan bir ortamda kullanır;)
Conor O'Brien

2
Oo Sen edilmektedir denklemleri biliyor değil sadece oldukça güvenilir olarak, onlar bile doğru değil olabilir değil lateks yazılmış! Güvenli tarafta olsan iyi olur.
kusur

3
Çizilmiş programlar bayt yerine mürekkep hacmiyle ölçülmelidir ...
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]

Bir tamsayı olmak için saniye gerektirir.

İle koş perl <filename> <second delay> <number of steps>.

Burada daha fazla golf oynama potansiyeli olabilir, dürüst olmakla birlikte, bu kadar ilerlemesine şaşırdım. (Hadi, bash cevabını yenmek için sadece 6 bayt ...)

değişiklikler

  • Gereksiz parantezleri kaldırarak ve ARGV'yi heceleyerek 8 bayt kurtardı (aslında bu şekilde daha kısa)
  • Kaldırarak 12 daha bayt Kaydedilen $sve $nsadece sade kullanarak$ARGV[0] ve$ARGV[1]
  • Kullanabileceğimi $"ve özel olarak tanımlamak zorunda olmadığımı fark ettiğimde 10 bayt $udaha kaydetti $undef.
  • Üçlü yeniden düzenleyerek ve nasıl $xkullanıldığını ve mapyerine kullanarak 5 bayt daha kurtardı for.
  • Artık 11 bayt kurtarıldı, artık saniye cinsinden ondalık sayıları kabul etmiyor (meydan okuma özelliği tamam olduğunu söylüyor.)
  • Kullanarak başka 5 bayt Kaydedilen sayyerine print.

6

Python 2, 124 119 bayt

@janrn ve @Steve Eckert: Cevabınızı yorumlamak için yeterli itibarım yok ama temelde sürümünüz kısalıyor. Görev bir program veya işlev çizmektir , bu yüzden kullanarak f(s,x)çok fazla bit kaydedebilir, ayrıca max(0,min(x,39))fazladan bir ifcümle kurmamak için kullanabilirsiniz. İndirdim:

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
}

Düzenleme: Basamak yürüteç 1 ila 40 aralığının dışına çıkarsa, sadece göz ardı edilmesi gerekir ve yürüteç konumu aynı şekilde doğru şekilde kalır .

Komut satırı seçeneklerinden giriş yapın. Örneğin:

$ ./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)

Komut dosyasını çağırırken, python script.pyilk girdi adımların miktarı, ikincisi ise adımlar arasındaki süreyi girer (float veya int'yi kabul eder). Geliştirilmesi için herhangi bir öneriniz var mı?

Düzenlemeler

  • print ' '*p+'.'@corsiKlause Ho Ho Ho sayesinde şu anda kullanım nedeniyle 36 byte kurtarıldı
  • sekme girintilerini kaldırarak başka bir 19 bayt aşağı kaydırın, bunları bir boşlukla veya ;mümkün olan yerlerde
  • 10 azıyla @Bruce_Forte fikrine sayesinde bayt p=max(1,min(p+r.randint(-2,2),40))(; tamamen kopyalamak istemiyorum ben de Cevabınız yorum yapamam, ancak sayesinde)

Python'da ' '*pdizgiyi tekrar etmeye devam edemez misin ?
corsiKa

Aslında evet, bunu bilmiyordum. Şimdi düzenleme, teşekkürler
Ocak

4

İşleme, 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);}}

Kullanımı:

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

Not: tür sebepleriyle 1000değiştirilemez 1e3.


3

Lua, 140 Bayt

Not: Bu program LuaSocket paketini gerektirir.

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 bayt

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
}

Kullanımı:

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

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

açıklama

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

Ölçek


3

k4, 61 karakter

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

örnek çalışma:

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

3

Mathematica, 122 117 bayt

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

Özyinelemeli anonim işlev, belirtilen sırada girdi alır. Muhtemelen daha da golf oynayabilirdi.


2

Python 3, 154 bayt

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)

İstenilen maksimum uzunluktan daha büyük bir boşluk dizisi oluşturun, ardından bu diziyi SADECE 'g' dizinindeki karaktere kadar yazdırın, sonra bir '.' Yazın. G'yi [-2: 2] aralığında rastgele bir değer artırarak bitirin ve tekrarlayın.

Biri bu korkunç giriş bloğunda golf oynamama yardım edebilirse minnettar olurum.


Girişi golf oynamak için neden kullanmıyorsun sys.argv?
ASCIIThenANSI

1
Ayrıca, while z:neden kullanmıyorsunuz for i in range(1,z)?
ASCIIThenANSI

Merak ediyorum, bunun 154 bayt olduğunu nasıl anladınız? bytesizematters.com farklı bir sayım verir (boşlukları saymayı devre dışı
bıraksanız

@ASCIIThenANSI: Hmm ... ilk çağrıyı sys.argvve içe aktarmayı eklediğimde, bunu yaparak herhangi bir baytı nasıl kaydedebileceğimi göremiyorum. Ve hatta ilan etmek için ek satırlarla bile cazalırc ve zsaymak , bu şekilde yapmak hala daha ucuzdur.
Steve Eckert

@ p1xel: Çizginin içindeki boşlukları saydım, boşlukları takip etmedim ya da takip etmedim. Farkında olmadığım farklı bir puanlama standardı var mı?
Steve Eckert

1

C işlevi, 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);}

Hemen hemen bash cevabımın doğrudan çevirisi .

Tam test programı:

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;
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.