Kontext
Es ist Valentinstag. Die einzige, die du jemals geliebt hast, hat dich gestern für diesen Kerl verlassen, den sie immer "dumm und uninteressant" fand . Auf dem Heimweg steckst du im Stau, hörst alte Lieder im Radio, der Regen auf der Windschutzscheibe rockt dich. Nach einer Weile in Ihrem Auto befinden Sie sich alleine in Ihrer kleinen Wohnung und können sich nichts anderes vorstellen als sie. Es gibt kein Licht und Sie starren durch das Fenster und lassen sich von Dunkelheit umgeben. Es gibt niemanden, mit dem man reden kann. Ihre Freunde sind schon lange weg, nachdem sie Sie vor diesem neuen Mädchen gewarnt haben, das Sie beschäftigt. Sie starten Ihren Computer, da dies das einzige ist, was Sie tun können. Öffnen Sie Ihren Browser und veröffentlichen Sie ein neues Programmierpuzzle für StackExchange, um Ihre Meinung zu ändern.
Herausforderung
Schreiben Sie ein Programm in der Sprache Ihrer Wahl, das den auf den Boden fallenden Regen simuliert. Die Ausgabe kann aus ASCII-Zeichen bestehen oder in 2D / 3D gerendert werden. Die Kamera ist fixiert: Sie blicken von oben direkt auf den Boden. Ihr Programm muss eine Art Animation enthalten, z. B. das Aktualisieren der Konsole oder der Seite jedes Mal, wenn Sie einen neuen "Frame" generieren. Es muss realistisch sein, ich weiß, dass es ein bisschen subjektiv ist, aber nehmen wir an, Sie können nicht den ganzen Boden in nur einem großen Tropfen füllen.
Die Ausgabe muss kein Bild sein. Wenn Sie jedoch eine kryptische Sprache verwenden, ist es besser, ein GIF bereitzustellen, um zu veranschaulichen, wie sie in Aktion aussieht.
Regeln
- Ihre Punktzahl ist die Gesamtzahl der verwendeten Bytes
- -20 Punkte, wenn Sie Farben verwenden
- -50 wenn du es schaffst Wind zu rendern
- Die niedrigste Punktzahl gewinnt
Beispiel
Ein sehr einfaches Beispiel dafür, was gerendert werden sollte:
Ich hoffe, Sie werden es besser machen und diese Herausforderung genießen.
Entschuldigung für mein Englisch, zögern Sie nicht, meinen Beitrag zu bearbeiten, wenn Sie einige Fehler korrigieren möchten
Bestenliste
Wenn Ihr Name nicht aufgeführt ist, liegt dies daran, dass Ihr Versuch als nicht den Regeln entsprechend eingestuft wurde.
Tobia - APL - 35
j6m8 - Processing.js - 38
The Guy with The Hat - Processing - 42
ace - Processing - 74
kelunik - JS/CSS - 89
Riot - Bash - 91
Michael - JS/jQuery - 105
Florent - HTML/JS - 123
David Carraher - Mathematica - 134
Doorknob - HTML/JS - 150
undergroundmonorail - Python - 175
Glückwunsch an Tobia!
Antworten:
APL, 105 Zeichen / Byte * - 20 - 50 = 35 Punkte
*: Die meisten APL-Implementierungen unterstützen eine Form von (Legacy-) Einzelbyte-Zeichensatz, der APL-Symbole den oberen 128-Byte-Werten zuordnet. Aus diesem Grund kann ein Programm , das nur ASCII-Zeichen und APL-Symbole verwendet , zum Golfen als Zeichen = Byte gewertet werden.
Ich habe es auf Nicks neuesten apl.js auf Node.js in einem OS X-Terminal getestet . Aber ich habe nichts spezielles für seinen Dialekt verwendet, daher sollte es auf jeder modernen APL funktionieren, die auf einem ANSI-Terminal ausgeführt werden kann und d-funs
{...}
, Strangzuweisung(a b)←...
und Pendeln unterstützt⍨
, wie Dyalog für Linux oder für Raspberry PI ( mit⎕IO←0
)Die
␛
Zeile 1 ist ein Escape-Zeichen (1 Byte). Sie können es Ctrl-V Escin einem Linux-Terminal oder in Vim oder angeblich Alt-027in Windows eingeben. Außerdem konnte ich keine zuverlässige Methode zum Ermitteln der Terminalgröße finden. Daher möchten Sie möglicherweise die Anzahl der Zeilen und Spalten am Ende der letzten Zeile bearbeiten.Ich verteidige den 50-Bonus dadurch, dass jeder Regentropfen die folgenden Formen durchläuft: Sie
⍟∘.
erwecken den Eindruck eines leichten Abwärtswinds, wenn die Szene von oben betrachtet wird. Wenn Sie sich das GIF unten ansehen, sollten Sie den Eindruck haben, dass sich jeder Tropfen sanft nach unten und links bewegt, bevor er auf dem Boden verschwindet.Ungolfed-Version:
Ausgabe:
APL, anderer Stil
Außer Konkurrenz.
Hier war es mein Ziel, den Eindruck zu erwecken, dass Regentropfen schräg auf den Boden fallen und sich dort ansammeln, während ich versuchte, die Anzahl der sichtbaren (fallenden oder verspritzten) Tropfen im Durchschnitt konstant zu halten. Der Trick bestand darin,
/
bei jedem Zyklus eine Reihe neuer fallender Tropfen zu erzeugen und die fallenden Tropfen alle bespritzten Tropfen, die sie überqueren, "auszulöschen".Das Ergebnis erinnert seltsamerweise an den Matrix-Code.
Ausgabe
(der Ruck alle 5s ist die GIF-Schleife)
quelle
Bash: 111 Bytes - 20 = 91 Punkte!
Ein nachdenklicher leichter Nieselregen in Ihrem Terminal. Stellen Sie die Zahlen 819 und 41 für unterschiedliche Höhe und Breite ein.
Ein angenehmer Bonus ist die Art und Weise, wie der Mauszeiger über den Regenbereich flattert.
Edit: Verkürzung von 140 Bytes auf 129 Bytes dank @ manatworks Vorschlägen. 2. Änderung: Kürzung von 129 Bytes auf 111 Bytes dank @ manatworks und @ Tobias Vorschlägen sowie zusätzlicher Inspiration - siehe Kommentare.
(Hinweis: Der Screenshot zeigt eine frühere Version des Codes mit weniger Golfspielen, die funktional identisch ist.)
quelle
echo
, indem Sie sich den Optionen anschließen. 2 Zeichen mit\e
anstelle von\033
; 3 Zeichen mit:
anstelle vontrue
; 5 die Zeichen mit dem arithmetischen Auswertung (((…))
):e='echo -ne \e';while :;do for i in {0..19};do for i in {0..40};do ((RANDOM<9))&&$e"[1;36m".||$e[1C;done;$e' ';done;$e[20A;done
.((RANDOM<9))
genauso gut. Sie können auch versuchen, den Code zu verkleinern, indem Sie die beiden for-{0..19}
und for- Werte{0..40}
in einem einzigen for- Wert kombinieren und so{0..819}
etwas wie den$((i%41))
darin enthaltenen verwenden.e='printf \e'
ist 2 Zeichen kürzer alse='echo -ne \e'
!$e[C
Python, 312 Bytes - 50 (Wind) = 262
Beispielausgabe (eine 50-Frame-Schleife):
Das aktuelle Playpack ist bedeutend schneller als es GIFs erlauben.
quelle
R=__import__("random").randint
anstelle derfrom random...
Zeile gespeichert .HTML / JS, 170 Zeichen - 20 = 150 Punkte
(Nebenbei bemerkt: golfed weiter durch einen String vorbei
setInterval
,with
automatische Identifikation Variablennamen ... es fühlt sich so falsch! schaudert )Es werden nur zufällige blaue Rechtecke gezeichnet.
HTML / JS, 309 Zeichen - 20 - 50 = 239 Punkte
Jetzt mit Wind!
quelle
<canvas id=c /><script>d=400;with(c)width=height=d,t=getContext('2d');t.fillStyle='blue';setInterval("t.fillRect(Math.random()*d,Math.random()*d,5,5)",50)</script>
AAAHHH! Ich habe benutztwith
! Ich fühle mich dreckiger, alssetInterval
canvas
nicht automatisch geschlossen werden kann, aber ansonsten funktioniert das perfekt! (Auch die Verwendung von automatischen ID-Variablennamen fühlt sich so schmutzig an: D)onload
. Ich muss sagen, ich mag @Math.random()
canvas
autoclose in Chrome! Meine Antwort wurde in diesem Browser entwickelt / getestet.JS + jQuery (172-20-50 = 102)
Kopieren Sie diese Zeile in die Browserkonsole und fügen Sie sie ein (drücken Sie im Allgemeinen die Taste F12):
Animierte rote Herzen regnen zum Valentinstag!
quelle
Mathematica
134 - 20 = 114
2D
3D
Die Regentropfenform wird über ein Umdrehungsdiagramm um die z-Achse erstellt.
Anfänglich wird Regen für eine Region erzeugt, die sich weit über die Anzeigeregion hinaus erstreckt. Das Auftreten von fallendem Regen wird erreicht, indem der Ansichtspunkt entlang der z-Achse nach oben verschoben wird. (Es ist effizienter, als die Position jedes Regentropfens neu zu berechnen.)
Mit dem Wind
Es ist ein erheblicher Aufwand, den Regen mit dem Wind fallen zu lassen. Aber ich schließe hier trotzdem ein.
Der blaue Boden beschränkt den {x, y} -Ansichtsbereich so gut wie auf den interessierenden Bereich. Es gibt einige Störungen, aber na ja,
Direkt von oben
Die nächsten Regentropfen sind abgeschnitten, aber ich werde das übersehen.
quelle
HTML / JavaScript,
156123 (143 - 20)Kommentierte Version:
quelle
Smalltalk (Smalltalk / X)
mit zufälligem Wind ;-)
Ausgabe in Sicht:
quelle
Verarbeitung, 94-20 = 74
(Neue Zeile zur besseren Lesbarkeit hinzugefügt.)
Klicken Sie hier für eine Online-Demo.
quelle
Bash
Ich bin mir nicht sicher, ob dies ein Codegolf sein sollte, da es keine strengen Anforderungen gibt, wie der "Regen" aussehen muss.
BEARBEITEN: Wenn Sie möchten, dass es so aussieht, als würde die Kamera gerade nach unten zeigen, gehen Sie wie folgt vor:
quelle
while echo \ / / / / /;do echo / / / / /;done
(oder ein paar mehr mit einer rekursiven Funktion, die den Stapel jedoch schnell in die Luft jagt). @undergroundmonorail Starker Wind, diagonal zur Kamera.while echo -e '\e[0;34m / / / / /';do echo / / / / /;done
es mit Boni auf -13 bringen :)Python 2.7: 195-20 = 175
Ich bin mir sicher, dass hier noch mehr getan werden kann, aber das ist, was ich jetzt habe:
Ich werde ein GIF der Ausgabe posten, wenn ich weiß, wie das geht.
Dies funktioniert unter Linux. Das Ersetzen
'clear'
mit'cls'
funktioniert unter Windows, aber dann funktionieren ANSI-Farben nicht und ich verliere den Bonus.Ich habe ein 2D-Array von Ein-Zeichen-Zeichenfolgen, initialisiert auf
. Alle 0,05 Sekunden wird eine davon zufällig ausgewählt
.
und der Bildschirm wird neu gezeichnet.from random import*
Speichert zwei Zeichenimport os,time,random
und verwendet sierandom.randint()
zweimal, obwohl ich nicht überzeugt bin, dass dies sowieso der beste Weg ist, eine Zelle auszuwählen. Ich wollte verwendenrandom.choice()
, konnte mir aber keinen Weg um unveränderliche Zeichenfolgen denken, der nicht mehr Zeichen verschwendet, als gespeichert wurden.quelle
l=[i[:]for i in[[' ']*100]*50]
gemäß stackoverflow.com/a/6688361/1114687 . 198 - 20 = 178l=[[' ']*100]*50
, aber dadurch werden nur 50 Verweise auf dieselbe 100-Elemente-Liste erstellt. Daher habe ich nach dem kürzestmöglichen Weg gesucht, um dies zu umgehen, und die oben verlinkte Stapelüberlauf-Antwort gefunden.132 + 27 - 20 - 50 = 89
Javascript (132)
CSS (27)
Demo: http://jsfiddle.net/kelunik/5WC87/4/embedded/result/
quelle
Verarbeitung, 62 - 20 = 42
Erzeugt blaue Pixel auf weißem Hintergrund. Demonstration in einer sehr ähnlichen Sprache hier: https://www.khanacademy.org/cs/rain2/6172053633761280
quelle
Processing.js, 86 - 20 = 66
... aber es verblasst auch langsam (der Boden nimmt den Regen natürlich auf). Punkte dafür?
Die Bonusfunktionen variieren zwischen grünlich und bläulich (es ist eindeutig schmutziger Stadtregen).
Ich war auch sehr erfreut, dass ich hier einen JavaScript-Hack verwenden durfte. Beachten Sie, dass dies gerade verarbeitet wird. js , Sie können Dinge wie die typenlose Deklaration von g = 99 oder den Alias von
r
forrandom
(sprachübergreifender Alias!) einfügen .Irgendwelche anderen Ideen zu minimieren?
Lesbare Version:
Das Ganze kann hier eingesehen werden .
... plus eine weitere Version ohne Fade: 58 - 20 = 38
Wenn Sie nicht gerne verblassen und grauen Schmutz nicht stören:
quelle
Tcl / Tk, 139-20 = 119
Wiederverwenden meiner eigenen Antwort http://codegolf.stackexchange.com/a/143018/29325
Muss in der interaktiven Shell ausgeführt werden
Leider hat das Skript beim Konvertieren
expr int(rand()*
in einproc
Byte mehr!Um anzuhalten, muss man nur auf das unbeschreibliche "X" klicken.
quelle