Luftpolsterfolien sind Unterhaltung auf höchstem Niveau. Dem kann jeder zustimmen.
Jetzt lassen Sie sogar Computer Luftpolsterfolien genießen.
Technische Daten
Sie erhalten zwei Ganzzahlen, w und h (jeweils Breite und Höhe).
Ihr Programm sollte alle w * h Phasen ausgeben, die jeweils 1 Sekunde warten und enden.
Jede Luftpolsterfolie beginnt, wenn alle Zellen voll sind.
Zum Beispiel beginnt eine 4 * 6-Luftpolsterfolie wie folgt:
O_O_
_O_O
O_O_
_O_O
O_O_
_O_O
Und in jeder Phase wird eine zufällige nicht-gepoppte Zelle gepoppt.
O_O_
_O_O
O_X_
_O_O
O_O_
_O_O
Das Programm sollte beendet werden, wenn alle Zellen aufgetaucht sind. aka.
X_X_
_X_X
X_X_
_X_X
X_X_
_X_X
Beispiele
(4,6)
(5,5)
(6,2)
(10,10)
(7,9)
1
und0
anstelle vonO
und verwendenX
?(1,1)
, dass a keine Blasen enthält (z. B. ist die "Zelle" oben links immer ein Unterstrich)?Antworten:
C (Windows)
260248 Bytesquelle
system("cls")
ist auch Windows-spezifisch, sodass der Code mit der Thread-Bibliothek auch nicht portabler wäre. Und mit C ++ müsste ich auchiostream
oder aufnehmencstdio
.Python 3 ,
222-220BytesDies ist meine erste Antwort. Seien Sie also bitte vorsichtig (und weisen Sie auf Fehler hin, die ich gemacht habe).
Probieren Sie es online!
Wie es funktioniert:
r*c+r%2*c%2
:r*c
Das Muster enthält Blasen, es sei denn, r und c sind beide ungerade, in diesem Fallr*c+1
.quelle
f(c,r)
und alles wird gut).MATL , 37 Bytes
Die obere linke Ecke ist immer ein Unterstrich (erlaubt durch die Herausforderung).
Der Bildschirm wird zwischen den Phasen gelöscht. Ich könnte ein Byte sparen, indem ich den Bildschirm nicht lösche, aber so sieht es besser aus.
Das Programm wird mit einem Fehler ( standardmäßig zulässig ) beendet, nachdem alle Phasen angezeigt wurden .
Probieren Sie es bei MATL Online! (Wenn es nach ein paar Sekunden nicht funktioniert, aktualisieren Sie die Seite und versuchen Sie es erneut.)
quelle
Mathematica (145 Bytes)
Anonyme Funktion, verwendet Höhe und Breite als Eingabe (in dieser Reihenfolge - wenn dies ein Problem ist, ersetzen Sie
{##}
durch{#2,#}
in der Mitte des Codes für zusätzliche 2 Bytes).Code:
Erläuterung:
""<>Riffle[Array["_"["O"][[Mod[#+#2,2]]]&,{##}],"\n"]
Erstellt die erste, nicht platzierte Luftpolsterfolie, indem ein Array aus "_" und "O" erstellt und zwischen den Zeilenumbrüchen ein String eingefügt wird.NestList[RandomChoice@StringReplaceList[#,"O"->"X"]&,..., Floor[##/2]]
wählt wiederholt eines der "O" aus, um es durch ein "X" zu ersetzen, so oft es "O" gibt (das ist Floor [width * height / 2] - danke an @JonathanAllan für die Idee, "_" zu setzen "anstelle von" O "in der oberen linken Ecke, sonst wäre diesCeiling
stattdessen und damit 2 Bytes mehr).Monitor[Do[Pause@1,{i,...}],i]
Lässti
die Werte in der soeben berechneten Liste für jeweils 1 Sekunde übernehmen und dynamisch druckeni
.Beispielausgabe:
quelle
Gelee ,
3029 BytesRuft den Link als Dyade mit den Programmargumenten auf und beendet ihn dann mit einer Meldung (der Code, für den gilt
çṛ“\'=ṙMḋḌẓ(ėo»
).Nuance: die untere rechte „Zelle“ wird immer eine Blase sein (statt oben links wie das Beispiel in der Frage), dies, um sicherzustellen ist , wenn alle Blasen , die zufällige Wahl kehrt geknallt werden 0 die das sein wird ,
"X"
bei der Ende der Liste - Ersetzen, ändert den Wert nicht und unterbricht die Schleife.Hinweis: Der Bildschirm wird nicht gelöscht (wurde nicht angegeben, und ich bin nicht sicher, wie ich das tun soll).
Wie?
quelle
Scala , 764 Bytes
Wie es funktioniert
Der Algorithmus füllt zuerst eine 2D-Sequenz mit falschen Werten. Anhand der eingegebenen Befehlszeilenargumente wird festgelegt, wie viele Iterationen (offene Kästchen) vorhanden sind. Es wird eine Falte mit diesem Wert als Obergrenze erstellt. Der ganzzahlige Wert der Falte wird nur implizit verwendet, um zu zählen, für wie viele Iterationen der Algorithmus ausgeführt werden soll. Die zuvor erstellte gefüllte Sequenz ist die Startsequenz für die Falte. Dies wird verwendet, um eine neue 2D-Sequenz falscher Werte mit ihren entsprechenden Abhängigkeiten zu generieren.
Beispielsweise,
Wird verwandelt in
Beachten Sie, dass alle Listen, die vollständig wahr sind (eine Länge von 0 haben), in der Ergebnisliste weggelassen werden. Der Algorithmus nimmt dann diese Liste und wählt eine zufällige Liste in der äußersten Liste aus. Die Zufallsliste wird als die zufällige Zeile ausgewählt, die wir auswählen. Aus dieser Zufallszeile finden wir wiederum eine Zufallszahl, einen Spaltenindex. Sobald wir diese beiden Zufallsindizes gefunden haben, schlafen wir den Thread, auf dem wir uns befinden, für 1000 Millisekunden.
Nachdem wir schlafen gegangen sind, löschen wir den Bildschirm und erstellen ein neues Board mit einem
true
Wert, der in den von uns erstellten Zufallsindizes aktualisiert wurde.Um dies richtig auszudrucken, verwenden wir es
map
und komprimieren es mit dem Index der Karte, damit wir das in unserem Kontext haben. Wir verwenden den Wahrheitswert der Sequenz, um festzustellen, ob wir einX
oder einesO
oder drucken sollen_
. Für letztere verwenden wir den Indexwert als Richtwert.Interessante Dinge zu beachten
Um herauszufinden, ob ein
O
oder ein ausgegeben werden soll_
, wird die Bedingung((r._2 % 2) + c._2) % 2 == 0
verwendet.r._2
verweist auf den aktuellen Zeilenindex, währendc._2
auf die aktuelle Spalte verwiesen wird. Befindet man sich in einer ungeraden Zeile,r._2 % 2
so ist dies 1 und wird daherc._2
in der Bedingung um eins versetzt. Dies stellt sicher, dass in ungeraden Zeilen die Spalten wie vorgesehen um 1 verschoben werden.Das
"\033[H\033[2J\n"
Ausdrucken der Zeichenfolge löscht den Bildschirm gemäß einer von mir gelesenen Stackoverflow-Antwort. Es schreibt Bytes an das Terminal und erledigt ein paar unkonventionelle Dinge, die ich nicht wirklich verstehe. Aber ich habe festgestellt, dass es der einfachste Weg ist, dies zu tun. Auf dem Konsolenemulator von Intellij IDEA funktioniert dies jedoch nicht. Sie müssen es mit einem normalen Terminal ausführen.Eine andere Gleichung, die man beim ersten Blick auf diesen Code als seltsam empfinden könnte, ist
(l * k) / 2 - (l * k + 1) % 2
. Lassen Sie uns zuerst die Variablennamen entmystifizieren.l
verweist auf die ersten Argumente, die an das Programm übergeben werden, währendk
auf das zweite Argument verwiesen wird . Übersetzen sie,(first * second) / 2 - (first * second + 1) % 2
. Das Ziel dieser Gleichung ist es, die genaue Anzahl der Iterationen zu ermitteln, die erforderlich sind, um eine Folge aller X zu erhalten. Das erste Mal, als ich das tat, tat ich einfach so,(first * second) / 2
wie es Sinn machte. Für jedesn
Element in jeder Unterliste gibt esn / 2
Blasen, die wir platzen lassen können. Dies bricht jedoch beim Umgang mit Eingaben wie(11 13)
. Wir müssen das Produkt der beiden Zahlen berechnen, es ungerade machen, wenn es gerade ist und gerade, wenn es ungerade ist, und dann die Modifikation um 2 nehmen. Dies funktioniert, weil Zeilen und Spalten, die ungerade sind, eine Iteration weniger erfordern um zum Endergebnis zu gelangen.map
wird anstelle von a verwendet,forEach
da es weniger Zeichen enthält.Dinge, die wahrscheinlich verbessert werden können
Eine Sache, die mich an dieser Lösung wirklich stört, ist die häufige Verwendung von
zipWithIndex
. Es nimmt so viele Charaktere auf. Ich habe versucht, es so zu gestalten, dass ich meine eigene Ein-Zeichen-Funktion definieren kann, die nurzipWithIndex
mit dem übergebenen Wert ausgeführt wird. Es stellt sich jedoch heraus, dass Scala einer anonymen Funktion keine Typparameter erlaubt. Es gibt wahrscheinlich einen anderen Weg, um das zu tun, was ich mache, ohne es zu benutzen,zipWithIndex
aber ich habe nicht zu viel über einen klugen Weg nachgedacht, es zu tun.Derzeit wird der Code in zwei Durchgängen ausgeführt. Der erste generiert eine neue Karte, während der zweite Durchgang sie druckt. Ich denke, dass, wenn man diese zwei Durchläufe in einem Durchlauf kombinieren würde, das ein paar Bytes sparen würde.
Dies ist das erste Codegolf, das ich gemacht habe, daher bin ich mir sicher, dass es viel Raum für Verbesserungen gibt. Wenn Sie den Code sehen möchten, bevor ich ihn so weit wie möglich auf Bytes optimiert habe, finden Sie ihn hier.
quelle
JavaScript (ES6),
246229 Bytequelle
`${`_O`.repeat(w).slice(w)} ${`O_`.repeat(w).slice(w)}
nicht irgendwie kombiniert werden? Vielleicht eine Boolesche Flagge, um erst_O
oder zu bestimmenO_
, und dann das zu tun.repeat(w).slice(w)
?Python - 290 Bytes
Ich habe noch nie zuvor eine davon gemacht - für konstruktive Kritik wäre ich also dankbar :)
Haupttrick dabei ist nur das nervig verschachtelte Listenverständnis. Ich könnte ein paar Zeichen einsparen, indem ich zwischen den Pops kein Zeilenumbruch mache, aber das sieht einfach hässlich aus.
quelle
w
undh
als Eingabe zu verwenden (über STDIN, als Funktionseingabe oder ähnliches), anstatt eine feste Codierung zu habenH=4 W=6
. Auch, obwohl ich nie in Python programmiert habe, denke ich, dass Sie einige Leerzeichen in Ihrem aktuellen Code spielen können. Tipps für das Golfen in Python könnten auch interessant sein, um Ihnen Anregungen zum weiteren Golfen zu geben. Genieße deinen Aufenthalt! :)Kohle ,
494639 Bytes (nicht konkurrierend)Ausführlich
quelle
APL (Dyalog) ,
6159 Bytes⎕←
Ausgabem←
m , wo m ist'O_'[
...]
Diese Zeichen indiziert durch ...2|
die Teilung-Rest-when-geteilt-durch-zwei von-/¨
der Differenz zwischen jedem von⍳
allen der Koordinaten (Indizes) in einer Anordnung von Form⎕
numerischen Eingang (die Anzahl der Zeilen und Spalten , )(
...)[
... mit]←'X'
dem Zeichen X zu einer der ... zuweisenb/
filterten by- b (zu definieren),m
Elemente von M raveled, insbesondere ...?
ein Zufallselement (Lit. Zahl) im Bereich einer zu+/
der Summe ausb←
b , wobei b ist'O'=
Boolesche denn wo der Buchstabe gleich,m
m ist, hat sich gerastert⎕DL 1
D e l ay eine Sekunde→2
Gehen Sie zu Zeile 2,/⍨
wenn (lit. gefiltert nach),'O'∊
ob der Buchstabe ein Mitglied des⎕←m
ausgegebenen Werts ist, wobei der ausgegebene Wert m istProbieren Sie es online!
Ab Version 16.0 wird es kürzer sein:
{0::→⋄'X'@(⊂(?∘≢⊃⊢)⍸'O'=⍵⊣⎕DL 1)⊢⎕←⍵}⍣≡'O_'[2|-/¨⍳⎕]
quelle
Python 3,
195188 BytesDie Verwendung von
bytearray
unddecode
scheint kürzer zu sein als das Schneiden und Zusammensetzen einer Saite a laa[:i]+'X'+a[i+1:]
.quelle
Java 7, 317 Bytes
Erläuterung:
Testgif (4,6)
quelle
Perl, 148 Bytes
146 Byte Code +
-pl
Flags.Um es auszuführen:
quelle
MATLAB (R2016b), 172 Bytes
Code:
Empfehlungen sind immer willkommen! Probieren Sie es online!
Programmausgabe:
Erläuterung:
quelle