Drukarka Random Walker

24

Narysuj program lub funkcję, która zapisze STDOUT nczasy (każdy dla jednego kroku) ciąg znaków zawierający kropkę .w miejscu chodzika. Program musi także zapisywać linię co ssekundę (lub odczekać ssekundy po każdej linii).

Losowy spacer jest matematyczną formalizacją ścieżki, która składa się z szeregu losowych kroków ( wiki ), tak że każdy nowy krok będzie ostatnim krokiem plus nową wartość, więc każda twartość kroku jest tylko sumą wszystkich losowych wartości przed ir plus wartość początkowa.

Program powinien przyjmować 2 dane wejściowe i będzie używać tylko spacji " "i kropek "."na wyjściu. Wartość początkowa Walkera będzie 20taka, że ​​wynik powinien być kropką po 19 spacjach.

                  . #19 spaces then a dot

Przy każdym kolejnym kroku wartość będzie ostatnią wartością chodzika plus jeden z nich [-2-1,0,1,2](każda szansa 20%). Po wydrukowaniu nowej pozycji program powinien poczekać skilka sekund i przejść do następnego kroku. Jeśli krok zabierze spacerowicza poza zasięg 1 to 40, należy go po prostu zignorować, a pozycja spacerowicza pozostanie taka sama. Liczba spacji będzie zawsze liczbą od 0 do 39.

Przykład

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

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

Uwagi

  • Możesz wziąć dane wejściowe jako dowolny rozsądny format

  • Najkrótszy kod wygrywa

  • W porządku, jeśli twój program akceptuje tylko sekundy jako liczby całkowite

Mutador
źródło
2
Zakładam, nże liczba kroków?
ASCIIThenANSI,
Tak, wyjaśniłem to, dzięki.
Mutador,
Myślę, że powinieneś powiedzieć, że zasięg jest 1 to 40, ponieważ liczba spacji jest zawsze position-1.
geokavel
@geokavel, który wydaje się lepszy, naprawiony!
Mutador,
10
Narysuj program ??? ;-)
Cyfrowy uraz

Odpowiedzi:

6

Pyth, 39 lat

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

Pobiera sjako pierwszy wiersz danych wejściowych i njako drugi. Działa w wierszu poleceń, ale nie z tłumaczem online. Mój pierwszy program w Pythonie! Wskazówki dotyczące gry w golfa są mile widziane.

Luke
źródło
Witamy w Pyth! Jedyną wskazówką golfową, jaką widzę, jest to, że możesz użyć Qi Edla dwóch wejść zamiast fo hQi eQ, jeśli nowa linia oddzielisz wejścia.
isaacg
13

Matlab, 112

Podstawową ideą jest wygenerowanie listy możliwych następnych pozycji, a następnie równomierne narysowanie jednej z nich. Jeśli jesteśmy np. W pozycji $ l = 1 $, możliwe kroki to [-1,0,1,2,3]oczywiście, jeśli byśmy wybrali-1 że byłoby to nieprawidłowe i musielibyśmy pozostać na tej samej pozycji. Właśnie dlatego zastępujemy nieprawidłowe pozycje bieżącą pozycją [1,0,1,2,3], a następnie losowo wybieramy element z tej zaktualizowanej listy.

OP poprosił nas o losowanie programu, więc zaczynamy:

wprowadź opis zdjęcia tutaj

Transkrypcja:

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
wada
źródło
1
-1 używa MathJax w środowisku innym niż MathJax;)
Conor O'Brien
2
Oo Wiesz, równania, które nie są napisane w lateksie, nie są tak wiarygodne, mogą nawet nie być prawdziwe! Lepiej być po bezpiecznej stronie.
flawr
3
Rysowane programy powinny być mierzone ilością atramentu, a nie bajtami ...
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]

Wymaga, aby sekundy były liczbą całkowitą.

Biegnij z perl <filename> <second delay> <number of steps> .

Tutaj może być więcej możliwości gry w golfa, chociaż szczerze mówiąc, jestem zaskoczony, że zaszło tak daleko. (Daj spokój, tylko 6 bajtów więcej, aby pokonać odpowiedź bash ...)

Zmiany

  • Zaoszczędzono 8 bajtów, usuwając niepotrzebne nawiasy i zapisując ARGV (w rzeczywistości jest to w ten sposób krótsze)
  • Zaoszczędziłem jeszcze 12 bajtów, usuwając $si $nużywając zwykłego $ARGV[0]i$ARGV[1]
  • Zapisałem kolejne 10 bajtów, kiedy zdałem sobie sprawę, że mogę użyć $"i nie musiałem specjalnie definiować $ujako $undef.
  • Zaoszczędzono jeszcze 5 bajtów, zmieniając układ trójskładnikowy i sposób $xjego użycia oraz za pomocą mapzamiast for.
  • Zapisano 11 bajtów, nie akceptując sekund jako miejsc dziesiętnych (specyfikacja wyzwania mówi, że jest OK).
  • Zapisano kolejne 5 bajtów, używając sayzamiast print.
ASCIIThenANSI
źródło
6

Python 2, 124 119 bajtów

@janrn i @ Steve Eckert: Nie mam wystarczającej reputacji, aby skomentować twoją odpowiedź, ale zasadniczo twoja wersja została skrócona. Zadaniem jest narysowanie programu lub funkcji , więc używając f(s,x)możesz zaoszczędzić sporo bitów, a także możesz użyć, max(0,min(x,39))aby uniknąć dodatkowej ifklauzuli. Sprowadziłem się do:

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
ბიმო
źródło
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
}

Edycja: Jeśli krok zabierze piechura poza zakres od 1 do 40, należy go po prostu zignorować, a pozycja spacerowicza pozostanie niezmieniona .

Dane wejściowe z opcji wiersza polecenia. Na przykład:

$ ./randwalk.sh 5 0.5
                    .
                     .
                    .
                  .
                 .
$ 
Cyfrowa trauma
źródło
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
gryzelda
źródło
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)

Podczas wywoływania skryptu za python script.pypomocą pierwszego wejścia podawana jest liczba kroków, a drugie wprowadzania czasu między krokami (przyjmuje zmienną lub int). Wszelkie sugestie dotyczące ulepszenia?

Edycje

  • zaoszczędzono 36 bajtów dzięki obecnie print ' '*p+'.'używanemu dzięki @corsiKlause Ho Ho Ho
  • w dół o kolejne 19 bajtów, usuwając wcięcia tabulatorów, zastępując je spacją lub w ;miarę możliwości
  • 10 bajtów mniej dzięki pomysłowi @Bruce_Forte z p=max(1,min(p+r.randint(-2,2),40))(nie mogę również skomentować twojej odpowiedzi, ale dziękuję; nie chcę jej całkowicie kopiować)
janrn
źródło
Czy w Pythonie nie możesz po prostu ' '*ppowtórzyć łańcucha?
corsiKa
Właściwie tak, nie wiedziałem o tym. Edytujesz teraz, dzięki
Jan
4

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

Stosowanie:

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

Uwaga: 1000nie można zmienić na 1e3ze względu na typ.

geokavel
źródło
3

Lua, 140 bajtów

Uwaga: ten program wymaga pakietu 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
Nikolai97
źródło
3

Perl 6 , 92 bajtów

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
}

Stosowanie:

$ perl6 -e 'my (\n,\s)=@*ARGS;$/=19;for (-2..2).roll(n) {put " "x($/+=(40>$/+$_>=0??$_!!0)),".",;sleep s}' 10 0.001
                  .
                .
               .
              .
               .
                .
               .
                .
                  .
                 .
Brad Gilbert b2gills
źródło
3

JavaScript (ES6), 125 bajtów

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

Wyjaśnienie

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

Test

użytkownik 81655
źródło
3

k4, 61 znaków

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

przykładowy przebieg:

  f[.1]30
                      .
                    .
                    .
                   .
                   .
                  .
                  .
                   .
                   .
                     .
                    .
                  .
                  .
                    .
                   .
                   .
                 .
                .
               .
               .
              .
            .
          .
         .
         .
          .
            .
              .
              .
                .
Aaron Davies
źródło
3

Mathematica, 122 117 bajtów

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

Rekurencyjna funkcja anonimowa, pobiera dane wejściowe w określonej kolejności. Prawdopodobnie można by dalej grać w golfa.

LegionMammal978
źródło
2

Python 3, 154 bajtów

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)

Wygeneruj ciąg spacji większy niż maksymalna wymagana długość, następnie wydrukuj TYLKO ciąg znaków do znaku o indeksie „g”, a następnie wydrukuj „.”. Zakończ, zwiększając g o losową wartość z zakresu [-2: 2], i powtórz.

Byłbym wdzięczny, gdyby ktokolwiek mógł mi pomóc w grze w ten przerażający blok wejściowy.

Steve Eckert
źródło
Aby zagrać w golfa, dlaczego nie użyć sys.argv?
ASCIIThenANSI,
1
Zamiast tego while z:, dlaczego nie użyć for i in range(1,z)?
ASCIIThenANSI,
Ciekawe, skąd masz te 154 bajty? bytesizematters.com podaje inną liczbę (nawet jeśli wyłączysz liczenie białych znaków)
p1xel
@ASCIIThenANSI: Hmm ... do czasu dodania pierwszego wywołania sys.argvi importu nie widzę, jak mogę zaoszczędzić na tym bajty. I nawet z dodatkowymi wierszami do zadeklarowania, ca następnie zmniejszenia, ci znadal jest to tańsze, według mojego obliczenia.
Steve Eckert
@ p1xel: Zliczyłem białe spacje wewnątrz linii, po prostu nie wiodące ani końcowe białe spacje. Czy istnieje inny standard punktacji, o którym nie wiem?
Steve Eckert,
1

Funkcja 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);}

Prawie bezpośrednie tłumaczenie mojej odpowiedzi na bash .

Pełny program testowy:

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;
}
Cyfrowa trauma
źródło