Diese Herausforderung ist von dieser Antwort beim Ask Ubuntu Stack Exchange inspiriert .
Intro
Erinnern Sie sich an den Windows ME-Bildschirmschoner mit den Pipes ? Zeit, die Nostalgie zurückzubringen!
Herausforderung
Sie sollten ein Programm oder eine Funktion schreiben, die eine ASCII-Darstellung des Bildschirmschoners ausgibt. Im Bildschirmschoner sollte sich eine einzelne Pipe befinden, die in zufälligen Richtungen wächst.
Der Rohranfang wird zufällig an einem der Ränder des Bildschirms platziert, und das Rohrstück sollte senkrecht zum Rand stehen (die Ecken der ersten Rohre können entweder horizontal oder vertikal sein). Mit jedem Tick wächst die Pfeife in die Richtung, in die sie weist (horizontal / vertikal), 80%
oder biegt bei Gelegenheit um eine Ecke 20%
.
Rohrdarstellung
Zum Erstellen der Pipe werden 6 Unicode-Zeichen verwendet
─ \u2500 horizontal pipe
│ \u2502 vertical pipe
┌ \u250C upper left corner pipe
┐ \u2510 upper right corner pipe
└ \u2514 lower left corner pipe
┘ \u2518 lower right corner pipe
Eingang
Das Programm / die Funktion nimmt 3 Eingabewerte an, die über Funktionsparameter erfasst oder an den Benutzer weitergeleitet werden können.
- Anzahl der Zecken
- Bildschirmbreite
- Bildschirmhöhe
Anzahl der Zecken
Für jeden Tick wird ein Stück Pfeife zum Bildschirm hinzugefügt. Pipes überschreiben alte Pfeifenteile, wenn sie an derselben Position erscheinen.
Nehmen Sie zum Beispiel einen Bildschirm der Größe 3x3
ticks == 3
─┐
┘
ticks == 4
─┐
└┘
ticks == 5
│┐
└┘
Immer wenn eine Pipe den Bildschirm verlässt, wie im letzten Beispiel mit 5 Ticks, erscheint eine neue Pipe an einer zufälligen Grenze. Beispielsweise:
ticks == 6
│┐
└┘
─
Das neue Rohr sollte eine Chance von 50% haben, horizontal oder vertikal zu sein.
Bildschirmbreite / -höhe
Die Bildschirmbreite und -höhe können zu einem einzigen Wert kombiniert werden, wenn dies in der Sprache Ihrer Wahl bevorzugt wird. Die Breite und Höhe des Bildschirms hat immer einen Mindestwert von 1 und einen Höchstwert von 255. Wenn Ihre Sprache eine Konsole oder einen Ausgabebildschirm unterstützt, der kleiner als ein Zeichenraster von 255 x 255 ist, können Sie davon ausgehen, dass Breite und Höhe dies auch tun Überschreiten Sie niemals die Grenzen Ihrer Konsole. (Beispiel: Windows 80x25 cmd-Fenster)
Ausgabe
Die Ausgabe Ihres Programms / Ihrer Funktion sollte auf dem Bildschirm gedruckt oder von einer Funktion zurückgegeben werden. Für jeden Programmlauf sollte ein anderer Satz von Pipes generiert werden.
Testfälle
Die folgenden Testfälle sind alle zufällige Beispiele für gültige Ausgaben
f(4, 3, 3)
│
─┘
│
f(5, 3, 3)
│
─┘┌
│
f(6, 3, 3)
─│
─┘┌
│
f(7, 3, 3)
──
─┘┌
│
Je mehr Zecken aufgetreten sind, desto schwieriger wird es natürlich, die Gültigkeit Ihres Programms zu beweisen. Aus diesem Grund wird es bevorzugt, ein GIF Ihrer Ausgabe zu veröffentlichen. Wenn dies nicht möglich ist, veröffentlichen Sie bitte eine Version Ihres Codes, die das Drucken der Ausgabe umfasst. Offensichtlich wird dies nicht auf Ihre Punktzahl angerechnet.
Regeln
- Dies ist Code-Golf , die kürzeste Anzahl von Bytes gewinnt
- Es gelten Standardlücken
- Wenn Sie die Unicode-Pipe-Zeichen in Ihrem Quellcode verwenden, können Sie sie als ein einzelnes Byte zählen
Dies ist eine ziemlich schwierige Herausforderung, die möglicherweise auf viele kreative Arten gelöst werden kann. Sie werden aufgefordert, eine Antwort in einer ausführlicheren Sprache zu verfassen, obwohl es bereits Antworten in kurzen Esolangs gibt. Dadurch wird ein Katalog mit kürzesten Antworten pro Sprache erstellt. Bonus Upvotes für ausgefallene farbige Gifs;)
Viel Spaß beim Golfen!
Haftungsausschluss: Ich bin mir bewusst, dass Unicode-Zeichen kein ASCII-Zeichen sind, aber mangels eines besseren Namens nenne ich es einfach ASCII-Kunst. Vorschläge sind willkommen :)
ascii-art
anstattgraphical-output
- ReferenzAntworten:
JavaScript (ES6), 264
266 274 281Zählen der Unicode-Zeichen als jeweils 1 Byte. (Wie vom OP angegeben)
Weniger golfen
Animierter Test
Hinweis: Wenn Sie versuchen, die Animationszeit unter 30 Sekunden zu halten, beschleunigen mehr Stärken die Animation
quelle
Nichts sagt Nostalgie so wie ...
QBasic, 332 Bytes
QBasic ist die richtige Sprache für die Aufgabe, weil:
LOCATE
Mit dieser Option können Sie an eine beliebige Stelle auf dem Bildschirm drucken und die zuvor dort vorhandenen Daten überschreibenBesonderheiten
Dies ist Golf QBasic, geschrieben und getestet auf QB64 mit deaktivierter Autoformatierung. Wenn Sie es in die eigentliche QBasic IDE Typ / einfügen, wird es eine Reihe von Räumen hinzufügen und erweitern
?
inPRINT
, aber es sollte genau gleich laufen.Das Programm gibt drei durch Kommas getrennte Werte ein: Häkchen, Breite und Höhe. Anschließend wird nach einem Zufallszahlen-Startwert gefragt. (Wenn dieses Verhalten nicht akzeptabel ist, ändern Sie die zweite Zeile in
RANDOMIZE TIMER
für +6 Bytes.) Zum Schluss werden die Pipes auf den Bildschirm gezeichnet.Die maximalen Abmessungen, die eingegeben werden können, sind 80 (Breite) mal 25 (Höhe). Bei einer Höhe von 25 wird die untere Reihe abgeschnitten, wenn QBasic sagt "Drücken Sie eine beliebige Taste, um fortzufahren."
Wie?
TL; DR: Viel Mathe.
Die aktuelle Zeile und Spalte sind
r
undc
; Die aktuelle Richtung istd
und die vorherige Richtung istb
. Richtungswerte 0-3 sind unten, rechts, oben, links. Arithmetik übersetzt diese in die richtigen Schrittwerte fürr
undc
sowie die richtigen Kanten-Koordinaten, mit denen begonnen werden soll.Die Zeichen
│┐└─┘┌
in der Box sind die Codepunkte 179, 191, 192, 196, 217 und 218 in QBasic. Diese scheinen ziemlich zufällig zu sein, aber es wurden immer noch weniger Zeichen verwendet, um die Zahlen mit etwas (ziemlich komplizierter, ich bin nicht sicher, ob ich das überhaupt verstehe) Mathematik zu generieren, als um eine Reihe von bedingten Anweisungen auszuführen.Der Code zum Ändern der Richtung generiert eine Zufallszahl zwischen -0,125 und 1,125 und hat das Wort. Dies ergibt
-1
10% der Zeit,0
80% der Zeit und1
10% der Zeit. Wir addieren dies dann zum aktuellen Wert vond
, mod 4. Das Hinzufügen von 0 behält die aktuelle Richtung bei; Addieren von +/- 1 macht eine Wende.Was den Steuerfluss betrifft,
WHILE t ... WEND
ist der die Hauptschleife; Der Abschnitt davor beginnt mit der Zeilennummer1
(1b=INT(RND*4)
) und startet die Pipe an einer zufälligen Kante neu. Wann immerr
undc
sind außerhalb des Fensters, wirGOTO 1
.Zeig mir das GIF!
Bitte schön:
Dies wurde durch eine etwas ungolfederte Version mit Animation, Farbe und einem automatischen Zufallssamen erzeugt:
quelle
Python 2.7,
624616569548552 BytesDer erste Parameter ist ein Startwert. Dieselben Startwerte erzeugen dieselbe Ausgabe und drucken jeden Schritt mit einer Verzögerung von 500 ms.
antworte
Beispiellauf
wird ausgegeben
ausführliche Version
quelle
if x*y<0 or
.0.5
kann auf reduziert werden.5
.import *
könnte seinimport*
.''.join(k) for
hat ein nutzloses Leerzeichen. Sie sollten auch in der Lage sein,dict
eine Variable beizubehalten und sie jedes Mal aufzurufen, wenn Sie sie verwenden. Habe nicht getestet, wie viel das spart, aber durch Speichern desdict(zip(a,b))
in einem Lambda, das die Arbeit für zwei Saiten erledigt (a, b), sollte es einige hacken. +1.C (GCC / Linux),
402353352302300298296288 BytesGutschrift an edc65 für das Speichern der Richtung in einer einzelnen 4-Bit-Zahl.
Liest eine Breite / Höhe auf stdin, bevor der Bildschirmschoner für immer geloopt wird. Z.B:
Oder für einen Vollbild-Bildschirmschoner:
Zur besseren Lesbarkeit habe ich Zeilenumbrüche hinzugefügt. Erfordert einen Linux-Computer mit einem Terminal, das ANSI-Codes berücksichtigt. Hat farben! Wenn Sie die Farbunterstützung entfernen, fallen 17 Byte weniger an.
quelle
Ruby,
413403396 BytesEine Funktion, die eine Anzahl von Ticks und eine Breite als Eingabe annimmt und den endgültigen Bildschirm als Zeichenfolge zurückgibt. Könnte ohne Zweifel mehr golfen werden.
Siehe es auf repl.it: https://repl.it/Db5h/4
Fügen Sie nach der Zeile, die beginnt, Folgendes ein, um sie in Aktion zu sehen
b[n*w+n+m]=
:... ordnen Sie dann das Lambda zB einer Variablen zu
pipes=->...
und nennen Sie es wiepipes[100,20]
(für 100 Ticks und einen 20x20 Bildschirm).Ungolfed & Erklärung
quelle