Der Random Walker-Drucker


24

Zeichnen Sie ein Programm oder eine Funktion, die STDOUT n(jeweils für einen Schritt) eine Zeichenfolge mit einem Punkt .an der Position des Gehers in die Zeiten schreibt . Das Programm muss außerdem alle sSekunden eine Zeile schreiben (oder sSekunden nach jeder Zeile warten ).

Ein Zufallsrundgang ist eine mathematische Formalisierung eines Pfades, der aus einer Folge von Zufallsschritten ( Wiki ) besteht, sodass jeder neue Schritt der letzte Schritt plus ein neuer Wert ist. Jeder tSchrittwert ist also nur die Summe aller Zufallswerte vor ir plus dem Anfangswert.

Das Programm sollte 2 Eingaben annehmen und verwendet nur Leerzeichen " "und Punkte "."auf der Ausgabe. Der Startwert des Walkers ist 20so, dass die Ausgabe nach 19 Stellen ein Punkt sein sollte.

                  . #19 spaces then a dot

Bei jedem neuen Schritt ist der Wert der letzte Wert des Läufers plus einer davon [-2-1,0,1,2](jeweils 20% Chance). Nachdem die neue Position gedruckt wurde, sollte das Programm sSekunden warten und mit dem nächsten Schritt fortfahren. Wenn der Schritt den Geher außerhalb der Reichweite bringt 1 to 40, sollte er einfach ignoriert werden und die Geherposition bleibt gleich. Die Anzahl der Leerzeichen ist immer eine Zahl von 0 bis 39.

Beispiel

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

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

Überlegungen

  • Sie können die Eingabe als ein beliebiges vernünftiges Format annehmen

  • Der kürzeste Code gewinnt

  • Es ist in Ordnung, wenn Ihr Programm nur die Sekunden als Ganzzahlen akzeptiert


2
Ich nehme an, nist die Anzahl der Schritte?
ASCIIThenANSI

Ja, das habe ich klargestellt, danke.
Mutador

Ich denke man sollte sagen, dass die Reichweite ist 1 to 40, weil die Anzahl der Leerzeichen immer ist position-1.
Geokavel

@geokavel das scheint besser, behoben!
Mutador

10
Zeichne ein Programm ??? ;-)
Digitales Trauma

Antworten:


6

Pyth, 39

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

Wird sals erste und nals zweite Eingabezeile verwendet . Funktioniert auf der Kommandozeile aber nicht mit dem Online-Interpreter. Mein erstes Pyth-Programm überhaupt! Golftipps sind willkommen.


Willkommen bei Pyth! Der einzige Golftipp, den ich sehen kann, ist, dass Sie Qund Efür die beiden Eingänge stattdessen für hQund verwenden können eQ, wenn Sie die Eingänge neu einteilen.
Isaacg

13

Matlab, 112

Die Kernidee besteht darin, eine Liste möglicher nächster Positionen zu erstellen und dann eine davon einheitlich zu zeichnen. Wenn wir uns zB an der Position $ l = 1 $ befinden, wären die möglichen Schritte [-1,0,1,2,3]natürlich, wenn wir wählen -1würden, dass dies ungültig wäre und wir an der gleichen Position bleiben müssten. Deshalb ersetzen wir die ungültigen Positionen durch die aktuelle Position [1,0,1,2,3]und wählen dann zufällig ein Element aus dieser aktualisierten Liste aus.

Das OP hat uns gebeten, das Programm zu zeichnen.

Bildbeschreibung hier eingeben

Die Transkription:

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 verwendet MathJax in einer Nicht-MathJax-Umgebung;)
Conor O'Brien

2
Oo Weißt du, Gleichungen, die nicht in Latex geschrieben sind, sind einfach nicht so vertrauenswürdig, sie könnten sogar nicht wahr sein! Besser auf der sicheren Seite sein.
Fehler

3
Gezeichnete Programme sollten nicht in Bytes, sondern in Tintenvolumen gemessen werden ...
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]

Erfordert, dass die Sekunden eine Ganzzahl sind.

Laufen Sie mit perl <filename> <second delay> <number of steps>.

Möglicherweise gibt es hier mehr Golfpotential, obwohl ich ehrlich gesagt überrascht bin, dass es so weit gekommen ist. (Komm schon, nur noch 6 Bytes, um die Bash-Antwort zu übertreffen ...)

Änderungen

  • 8 Bytes gespart, indem nicht benötigte Klammern entfernt und ARGV geschrieben wurden (auf diese Weise ist es tatsächlich kürzer)
  • 12 weitere Bytes gespart, indem Sie $sund entfernen $nund einfach die Tasten $ARGV[0]und verwenden$ARGV[1]
  • Weitere 10 Bytes wurden gespeichert, als mir klar wurde, dass ich sie verwenden konnte $"und nicht speziell definieren musste $uals $undef.
  • Sparte 5 weitere Bytes, indem du das Ternäre neu anordnest und wie $xes verwendet wird und indem mapdu anstelle von verwendest for.
  • 11 Bytes gespart, indem die Sekunden nicht mehr als Dezimalzahlen akzeptiert werden
  • Weitere 5 Bytes mit sayanstelle von gespeichert print.

6

Python 2, 124 119 Bytes

@janrn und @Steve Eckert: Ich habe nicht genug Ruf, um Ihre Antwort zu kommentieren, aber hier ist im Wesentlichen Ihre Version gekürzt. Die Aufgabe besteht darin, ein Programm oder eine Funktion zu zeichnen , sodass Sie durch die Verwendung von f(s,x)einige Bits sparen und max(0,min(x,39))eine zusätzliche ifKlausel vermeiden können . Ich habe es verstanden:

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
}

Bearbeiten: Wenn der Schritt den Geher aus dem Bereich von 1 bis 40 hinausführt, sollte er einfach ignoriert werden und die Geherposition bleibt die gleiche, die korrekt gehandhabt wird.

Eingabe über Befehlszeilenoptionen. Z.B:

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

4

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

Wenn Sie das Skript mit aufrufen python script.py, ist die erste Eingabe die Anzahl der Schritte, die zweite die Zeit zwischen den Schritten (akzeptiert float oder int). Verbesserungsvorschläge?

Bearbeitungen

  • print ' '*p+'.'Dank @corsiKlause Ho Ho Ho konnten bisher 36 Bytes eingespart werden
  • Reduzieren Sie weitere 19 Byte, indem Sie Tabulatoreinrückungen entfernen, durch ein Leerzeichen ersetzen oder ;wenn möglich
  • 10 Bytes weniger dank @Bruce_Forte-Idee mit p=max(1,min(p+r.randint(-2,2),40))(Ich kann Ihre Antwort auch nicht kommentieren, aber danke; möchte sie nicht vollständig kopieren)

Können Sie in Python nicht einfach ' '*pdie Zeichenfolge wiederholen?
corsiKa

Eigentlich ja, das wusste ich nicht. Bearbeitung jetzt, danke
Jan

4

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

Verwendung:

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

Hinweis: 1000Kann aus Typgründen nicht in geändert 1e3werden.


3

Lua, 140 Bytes

Hinweis: Für dieses Programm ist das LuaSocket-Paket erforderlich.

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 Bytes

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
}

Verwendung:

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

Erläuterung

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

Prüfung


3

k4, 61 Zeichen

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

Probelauf:

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

3

Mathematica, 122 117 Bytes

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

Rekursive anonyme Funktion, nimmt die Eingabe in der angegebenen Reihenfolge. Könnte wahrscheinlich weiter golfen werden.


2

Python 3, 154 Bytes

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)

Generieren Sie eine Zeichenfolge mit Leerzeichen, die größer als die maximal erforderliche Länge ist, und drucken Sie diese Zeichenfolge NUR bis zum Zeichen im Index 'g' und dann ein '.'. Beenden Sie den Vorgang, indem Sie g um einen zufälligen Wert im Bereich [-2: 2] erhöhen, und wiederholen Sie den Vorgang.

Wenn mir jemand helfen könnte, diesen schrecklichen Eingabeblock runterzuspielen, wäre ich dankbar.


Warum nicht den Input nutzen, um Golf zu spielen sys.argv?
ASCIIThenANSI

1
Auch, anstatt while z:, warum nicht verwenden for i in range(1,z)?
ASCIIThenANSI

Ich bin gespannt, wie bist du darauf gekommen, dass das 154 Bytes sind? bytesizematters.com gibt eine andere Anzahl (auch wenn Sie das Zählen von Whitespace deaktivieren)
p1xel

@ASCIIThenANSI: Hmm ... bis ich den ersten Aufruf sys.argvund den Import hinzufüge , kann ich nicht sehen, wie ich Bytes speichern kann, die das tun. Und selbst mit den zusätzlichen Zeilen, die cdekrementiert cund dann dekrementiert werden müssen z, ist es immer noch billiger, dies auf diese Weise zu tun.
Steve Eckert

@ p1xel: Ich habe zeileninterne Leerzeichen gezählt, nur keine führenden oder nachfolgenden Leerzeichen. Gibt es einen anderen Bewertungsstandard, den ich nicht kenne?
Steve Eckert

1

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

So ziemlich eine direkte Übersetzung meiner bash Antwort .

Vollständiges Testprogramm:

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;
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.