Erstellen einer Fallkugelkarte

16

Einführung

Für diejenigen, die noch nie von diesem Spiel gehört haben. Sie spielen einen Ball, der so lange wie möglich überleben muss. Dies geschieht, indem Sie sich nach links oder rechts bewegen und zu den Löchern gehen. Da sich die Karte nach oben bewegt, müssen Sie nach unten gehen, um länger zu überleben. Wenn Sie nach Bildern suchen , wissen Sie wahrscheinlich, welches Spiel ich meine.

Die Aufgabe

Bei einer positiven ganzen Zahl n wird eine fallende Kugelkarte aus n Schichten ausgegeben . Zwischen den Ebenen befinden sich 4 Zeilenumbrüche. Die Breite der Ebene besteht aus 25 Unterstrichen mit einem Loch der Länge 5. Dies bedeutet, dass die Gesamtbreite 30 entspricht. Diese wird nach jeder Ebene zufällig verschoben. Ein Beispiel für eine gültige Ebene ist:

_______________     __________

Das Loch kann sich auch an den Rändern befinden, als ob die Schicht wie ein Zylinder wäre:

  _________________________   

Beachten Sie, dass es 2 führende und 3 nachfolgende Leerzeichen gibt. Ein einzelnes Loch mit einer Breite von 5 machen.

Testfälle

Für n = 4 ist dies eine gültige Ausgabe:

_______________     __________





______     ___________________





_______________________     __





  _________________________

Hinweis: Die Löcher müssen gleichmäßig verteilt sein. Es sind abschließende und / oder führende Zeilenumbrüche zulässig.

Das ist , also gewinnt die Einsendung mit der geringsten Anzahl von Bytes!

Adnan
quelle
1
@DonMuesli Haha, das kann jedem passieren: p
Adnan

Antworten:

7

Pyth, 19 Bytes

VQ.>+*\_25*d5O30*b4

Probieren Sie es hier aus!

Erläuterung

VQ.> + * \ _ 25 * d5O30 * b4 # Q = Eingang

VQ # Q-mal wiederholen
     * \ _ 25 # 25 Unterstriche
          * d5 # 5 Leerzeichen
    + # Unterstriche und Leerzeichen zusammenfassen
  .> O25 # Drehe diese Saite 0-29 mal
                * b4 # druckt die getrennten Zeilenumbrüche
Denker
quelle
4

Ruby, 74, 71, 59

Vielen Dank an Alex A., der mich daran erinnert hat, dass ich das Stabby-Lambda verwenden kann, wenn ich nur eine Zeile habe

f=->n{n.times{puts (('_'*25+' '*5)*2)[rand(30),30]+"\n"*5}}
Wert Tinte
quelle
putsFügt am Ende eine neue Zeile hinzu (Ruby's printnicht), wurde also auf 5neue Zeilen aktualisiert .
Wert Tinte
Alle begrüßen die timesFunktion zum Speichern von 3 Bytes in der forSchleife: D
Value Ink
1
57 Bytes: ->n{n.times{puts (('_'*25+' '*5)*2)[rand(30),30]+"\n"*5}} Versuchen Sie es hier
Alex A.
Sie müssen das Lambda nicht als Teil der Einreichung zuweisen, da wir nicht benötigen, dass Funktionen benannt werden.
Alex A.
1
Sie können dies tun (->n{n.times{puts (('_'*25+' '*5)*2)[rand(30),30]+"\n"*5}})[input]oder nur angeben, dass Sie es zuweisen müssen, um es aufzurufen. Dies ist auf der Website durchaus üblich.
Alex A.
3

Julia, 72 Bytes

n->join([join(circshift(["_"^25*" "^5...],rand(1:30)))"\n"^5 for i=1:n])

Dies ist eine anonyme Funktion, die eine Ganzzahl akzeptiert und eine Zeichenfolge zurückgibt. Um es aufzurufen, weisen Sie es einer Variablen zu.

Wir konstruieren eine Folge von 25 Unterstrichen, gefolgt von 5 Leerzeichen, und teilen diese dann in ein Array von Zeichen auf. Wir verschieben es in zufälliger Reihenfolge (zwischen 1 und 30), fügen es wieder zu einer Zeichenfolge zusammen und heften 5 Zeilen um. Dieser Vorgang wird n- mal wiederholt , wobei n die Eingabe ist. Das resultierende Array wird verbunden und zurückgegeben.

Probieren Sie es hier aus

Alex A.
quelle
3

PowerShell 65 Bytes

0..$args[0]|%{-join("_"*25+" "*5)[($r=Random 25)..($r-29)];,""*5}

Führen Sie eine Schleife für n Iterationen aus. Holen Sie sich eine Zufallszahl und machen Sie einen Unterstrich mit 5 Leerzeichen am Ende. Indizieren Sie die Zeichenfolge als Array, um sie von einer zufälligen Position aus abzurufen. Negative Indizierung wird vom Ende umbrochen. Verbinden Sie das wieder und fügen Sie 5 neue Zeilen hinzu.

Edit: Ich weiß nicht, warum ich dachte, ich brauche den Parameter dafür, -Maximumda er positionell ist. Dank TimmyD habe ich ein paar Bytes rasiert und vergessen, Eingaben zu bekommen, so dass ich wieder auf 65 zurückfuhr .

Matt
quelle
@TimmyD Ich wäre überrascht, wenn noch jemand 1.0 hätte. Es war nur als Download verfügbar und wurde nicht mit einem Betriebssystem ausgeliefert. 2.0 sollte als Norm angesehen werden.
Matt
@TimmyD Ich stimme diesem Punkt nur nicht zu, wenn es um PowerShell 1.0 geht. Wenn jemand auf dieser Seite das benutzt, würde mich das überraschen. Wenn ich ein 3.0 oder höheres Feature verwenden würde, würde ich das mit Sicherheit hervorheben.
Matt
3

Pyth, 19 Bytes

VQ.>r"5 25_"9O30*4b

Probieren Sie es hier aus

Vielen Dank an FryAmTheEggman für den Fehler.

Mike Bufardeci
quelle
@AandN FryAmTheEggman hat recht, ich habe es so geändert, dass es zufällig um 0-29 Zeichen anstelle von 0-25 verschoben wird.
Mike Bufardeci
2

SpecBAS - 93 Bytes

1 a$="_"*25+" "*5: INPUT n: FOR i=1 TO n: r=1+INT(RND*30): ?a$(r TO)+a$( TO r-1)''''': NEXT i

Erstellt eine Zeichenfolge mit 25 Unterstrichen und 5 Leerzeichen, wählt einen zufälligen Startpunkt aus, spleißt die Zeichenfolge an dieser Position und heftet den Anfang der Zeichenfolge an das Ende.

Der Apostroph erzwingt eine neue Zeile, also 1 am Ende der Zeichenkette und 4 leere Zeilen.

Brian
quelle
2

MATL , 23 Bytes

:"95l25X"5Z"h30YrYS10ct

Probieren Sie es online!

Erläuterung

:"           % take input n implicitly. Repeat loop n times
  95l25X"    %   row vector with number 95 ('_') repeated 25 times
  5Z"        %   row vector of 5 blank spaces
  h          %   concatenate vertically
  30Yr       %   random number uniformly distributed on [1,2,...,30]
  YS         %   circularly shift
  10c        %   newline character. Includes another newline when printed
  t          %   duplicate
             % implicitly end loop and display stack contents
Luis Mendo
quelle
2

Java, 177 140 Bytes

-1 Byte nach Blau verschieben das i ++

-2 Bytes für mich, wobei im Original bedeutungslose Leerzeichen verbleiben

-34 Bytes an Blue, um zu erkennen, dass ich das Zeichen [] überhaupt nicht brauchte

Weil, weißt du, Java.

n->{String s="";for(;n-->0;){int r=(int)(Math.random()*30);for(int i=0;i<30;){s+=i>r&i<r+6|r>24&i++<=r%25?" ":"_";}s+="\n\n\n\n";}return s;}

Leicht ungolfed:

Function<Integer, String> fallingBall = n -> {
    String s = "";
    for (;n-->0;) {
        int r = (int)(Math.random()*30);
        for (int i=0; i<30; i++) {
            s += i>r&i<r+6|r>24&i<=r%25?" ":"_";
        }
        s += "\n\n\n\n";
    }
    return s;
}

Da Java keinen String "drehen" hat, musste ich einen anderen Ansatz wählen. Ich habe einen zufälligen Int 0-29 generiert, der den Startindex des Lochs darstellt (OBO, weil >kürzer als >=). Jedes einzelne Zeichen wird dann von der Logik entschieden

l[index] = (index>random && index<random+6) || (random>24 && index<=random%25) ? ' ' : '_';

Dies behandelt die "Umhüllung" des Ganzen.

CAD97
quelle
Indem Sie das i ++ an die letzte Stelle setzen, an der ich verwendet werde, können Sie ein Byte speichern.
Blue
Clever. Hacky, aber schlau. Klüger noch ist, dass ich am Anfang meines Snippets ein bedeutungsloses Leerzeichen hinterlasse ( s = ""). Beide sind jetzt behoben.
CAD97
Sie können auch eine Menge mehr sparen, indem Sie das char-Array entfernen, die char-Literale in String-Literale ändern und in der inside for-Schleife s + = verwenden. Ich habe es gerade getestet
Blue
Übrigens tolle Antwort
Blue
Das ist es, was ich bekomme, um mich auf einen Weg zu konzentrieren. -34 (!) Bytes.
CAD97
1

Python 3.5 - 109 113 Bytes (+4 zum Ausdrucken von 4 neuen Zeilen zwischen jedem Ergebnis):

def g(a,j='_'*25+' '*5):
 for l in range(a):import random;n=random.randrange(len(j)+1);print(j[-n:]+j[:-n]+'\r'*4)

Ungolfed Form:

# j is the starting string with the 25 underscores and then 5 spaces at the end
def g(a,j='_'*25+' '*5):
    import random #Import the random module
    for l in range(a): # Do the following as many times as provided by the user
        n=random.randrange(len(j)+1) Get a random number in the range 0-29
        print(j[-n:]+j[:-n]+'\r'*4) #Shift the string characters right "n" times and print out the results with 4 new lines in between

Grundsätzlich ist es so, dass der Funktion "g" ein String "j" als Argument übergeben wird, der aus 25 Unterstrichen gefolgt von 5 Leerzeichen besteht. Dann wird das Zufallsmodul importiert, und so oft wie vom Benutzer angegeben, wird eine Zufallszahl im Bereich ausgewählt 0 => 29, und die Zeichenfolge "j" wird so oft nach rechts verschoben. Das Ergebnis wird dann nach jeder Iteration mit 4 neuen Zeilen zwischen jedem Ergebnis ausgedruckt.

R. Kap
quelle
Druckt dies auch die Zeilenumbrüche dazwischen?
Adnan
@AandN Jetzt schon. :)
R. Kap
Sie müssen tatsächlich 4 Zeilenumbrüche drucken: p. Der Wechsel '\r'zu '\r'*4sollte also wahrscheinlich funktionieren. Auch ich denke , man kann ändern range(a+1)zu range(a).
Adnan
@AandN Wenn Sie range(a)tatsächlich die a-1Anzahl der Zeilen range(a+1)ausdrucken, ist dies der beste Weg, um die genaue Anzahl der vom Benutzer angegebenen Zeilen auszudrucken. Außerdem werden jetzt 4 neue Zeilen zwischen den einzelnen Ergebnissen gedruckt.
R. Kap
Hmmm, das ist komisch, weil ich das mit getestet habe g(5)und es 6 Zeichenketten statt fünf ausgibt, also würde ein Wechsel a+1zu awahrscheinlich das Problem beheben.
Adnan
1

Python, 119 103 Bytes

import random
s='_'*20+' '*5
def f(n,a=random.randint(0,25)):[print(s[a:]+s[:a]+3*'\n')for _ in' '*n]
DaveBensonPhillips
quelle
Ihre letzte Update funktioniert nicht , weil Sie die zufällig in einem Standardargument gesetzt haben, so dass die Funktion wird immer ausgegeben , um die gleiche Zeile nmal
SP3000