Es ist ein regnerischer Tag


42

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!


51
Ich hoffe aufrichtig, dass der erste Absatz keine wahre Geschichte ist.
Kendall Frey

1
@ DavidCarraher ja, als ob du am Himmel bist und auf den Boden schaust.

8
Ich denke nicht, dass dies Code-Golf sein sollte, da es zu viel Nachsicht bei den möglichen Ausgaben gibt
Cruncher

4
Der erste Absatz zusammen mit der Kameraposition für dieses Rendering ist ziemlich makaber.
Tobia

Antworten:


26

APL, 105 Zeichen / Byte * - 20 - 50 = 35 Punkte

e←{⍞←∊'␛['⍵}
e¨'36m' '?25l' '2J'
{⍵←3⌊⍵+3×0=?t⍴50
⍵{(⍵c)←⍕¨⍵+1
e⍵';'c'H',' .∘⍟'[⍺]}¨⍳t
∇0⌈⍵-1}0⍴⍨t←24 80

*: 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:

e←{⍞←∊"␛["⍵}                  # utility to print escape sequence
e¨'36m' '?25l' '2J'            # set cyan, hide the cursor and clear screen
{                              # repeat (⍵=current board of raindrops)
  ⍵←3⌊⍵+3×0=?t⍴50              #   add some new drops (=3) in random places
  ⍵{                           #   print the drops (⍺=drop value, ⍵=coords)
    (r c)←⍕¨⍵+1                #     convert the coordinates to string
    e r';'c'H',' .∘⍟'[⍺]       #     print or clear the drop
  }¨⍳t                         #   ..
  ∇0⌈⍵-1                       #   remove 1 from every drop and repeat
}0⍴⍨t←24 80                    # ..starting with an empty board

Ausgabe:

Bildbeschreibung hier eingeben


APL, anderer Stil

Außer Konkurrenz.

m←×/t←1+(ζη)←2×(βγ)←24 80
e←{⍞←∊(⎕UCS 27)'['⍵}
s←{⍵[β-1-⍳β;1+⍳γ]}
p←{⍺{e'H'⍺,⍨{⍺,';',⍵}/⍕¨⍵}¨(,s⍵)/,1+⍳βγ}
e¨'2J' '36m' '?25l'
{'/'p⍵←(200<m÷?t⍴m)∨0⍪⍵[⍳ζ;1+⍳η],0
' 'p(~⍵)∧0,⍵[1+⍳ζ;⍳η]⍪0
'.∘°'[?(+/,sδ)/3]pδ←⍵∧~d←.2<m÷⍨?t⍴m
∇⍵∧d}t⍴0

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)

Bildbeschreibung hier eingeben


Das ist schön, aber ich denke nicht, dass das ESC-Zeichen richtig gedruckt wird. i.stack.imgur.com/vLERQ.png Ich habe versucht, den Code auch mit gedit einzufügen , aber es hat nicht funktioniert.
Riking

Du hast deine Punktzahl falsch. Die Frage lautet "Bytes", nicht "Zeichen".
Jazzpi

1
@Riking Ich habe diesen Teil bearbeitet. Wenn Sie es erneut versuchen, sollte es funktionieren.
Tobia

@Tobia Zeigen Sie mir ein Bild von Ihnen an Ihrem IBM 5100, und ich werde das Argument chars = bytes kaufen.
Primo


42

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.

e='printf \e';while :;do for i in {0..819};do((RANDOM<9))&&$e[1\;36m.||$e[1C;((i%41<1))&&$e'
';done;$e[20A;done

Bildschirmfoto

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


1
Sie können 2 Zeichen sparen echo, indem Sie sich den Optionen anschließen. 2 Zeichen mit \eanstelle von \033; 3 Zeichen mit :anstelle von true; 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.
Manatwork

1
Sie brauchen das Siegel in der arithmetischen Auswertung nicht. Und am Ende Ihres Codes muss eine nachgestellte Zeile stehen. Sollte nur 127 Zeichen enthalten.
Manatwork

1
Ich glaube, @manatwork bedeutet, dass Sie das Dollarzeichen nicht in doppelten Klammern verwenden müssen: Funktioniert ((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.
Tobia

1
Jemand hält mich auf !! e='printf \e'ist 2 Zeichen kürzer als e='echo -ne \e'!
Tobia

1
Und schneiden Sie einen anderen Saibling mit$e[C
Tobia

39

Python, 312 Bytes - 50 (Wind) = 262

from pygame import*
R=__import__('random').randint
t,u=640,480;init();d=display;s=d.set_mode((t,u))
w=[255]*3;r=range(t)
a=[[R(0,t),R(0,u),R(3,6)]for i in r]
while time.wait(9):
 d.flip();event.get();s.fill(R(0,99)<1and w)
 for i in r:x,y,z=a[i];draw.line(s,w,(x,y),(x+z,y+2*z));a[i][0]=(x+z)%t;a[i][1]=(y+z*2)%u

Beispielausgabe (eine 50-Frame-Schleife):

Das aktuelle Playpack ist bedeutend schneller als es GIFs erlauben.


3
@ChristianCareaga Ich könnte, aber ich denke, Weiß sieht besser aus.
Primo

8
Einziges Problem in meinen Augen: Du siehst den Regen von der Seite, während die Regeln besagen, dass eine feste Kamera gerade nach unten schaut.
Johannes H.

7
@JohannesH. Oder es ist ein sehr, sehr windiger Tag.
Primo

20
Ich mag die gelegentlichen Blitze! : P
Der Kerl mit dem Hut

3
Ein Zeichen wird durch Verwenden von R=__import__("random").randintanstelle der from random...Zeile gespeichert .
SimonT

35

HTML / JS, 170 Zeichen - 20 = 150 Punkte

<canvas id=c></canvas><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>

(Nebenbei bemerkt: golfed weiter durch einen String vorbei setInterval, withautomatische 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!

<canvas id=c></canvas><script>s=400;r=Math.random;with(c)width=height=s,t=getContext('2d');t.fillStyle='blue';o=[];setInterval("t.clearRect(0,0,s,s);for(i=0;++i<o.length;)d=o[i],t.fillRect(d[0],d[1],d[2],d[2]),d[0]+=1,d[1]+=2,d[2]-=1,d[2]<0?o.splice(i,1):0;if(r()<.6)o.push([r()*400,r()*400,20])",50)</script>


163 Bytes: <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 benutzt with! Ich fühle mich dreckiger, als setInterval
wenn

@NiettheDarkAbsol Danke;) Es scheint, dass (zumindest auf Chrome) canvasnicht automatisch geschlossen werden kann, aber ansonsten funktioniert das perfekt! (Auch die Verwendung von automatischen ID-Variablennamen fühlt sich so schmutzig an: D)
Türknauf

Einige Browser scheinen in diesem Bereich nachsichtiger zu sein ... Sie müssen sie jedoch nicht verwenden onload. Ich muss sagen, ich mag @ Math.random()
Florents

@Doorknob canvasautoclose in Chrome! Meine Antwort wurde in diesem Browser entwickelt / getestet.
Florent

1
Stimmen Sie für die zweite ab, wobei die Tropfen in den Boden / die Pfütze sinken.
GreenAsJade

34

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

r=Math.random;w=$(window);setInterval("$('<b>♥</b>').css({color:'red',position:'fixed',top:r()*w.height(),left:r()*w.width()}).appendTo('body').animate({fontSize:0},3e3)",9)

Animierte rote Herzen regnen zum Valentinstag!

Bildbeschreibung hier eingeben


1
Nun, es ist nicht realistisch. Herzen kommen vom oberen Bildschirmrand und bleiben an zufälligen Positionen auf der Seite. Das entspricht nicht wirklich der Sichtbedingung.

10
AUGGGGHH! Wie kann ich damit aufhören ?!
Der Kerl mit dem Hut

1
@ user2509848 Aber geht das auch anders?
Der Kerl mit dem Hut

3
@TheGuywithTheHat, Seite neu laden
Michael M.

19
Brillant! Ich denke, das erfasst den Kern der Frage.
Andrewb

26

Mathematica

134 - 20 = 114

2D

n = 99; m = Array[0 &, {n, n}]; r := RandomInteger[{1, n}, {2}]
Table[ArrayPlot[m = ReplacePart[m, r ->  1], ColorRules -> {1 -> Blue}], {k, 250}];
Export["d.gif", d]

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

Regen

r = RandomInteger; z = Table[{r@30, r@30, r@160}, {100}];
w = RevolutionPlot3D[{.7 Sin[x] Cos[x], 0,   1.4 Sin[x] }, {x, 0, -Pi/2}, 
PerformanceGoal -> "Speed"][[1]];
c = Map[Translate[w, #] &, z]; 
p = Table[Graphics3D[c, PlotRange -> {k, k + 50}], {k, 1, 100}]
Export["p.gif", p]

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,

r = RandomInteger;
z = Table[{r@120, r@30, r@180}, {800}];
w = RevolutionPlot3D[{.7 Sin[x] Cos[x], 0,   1.4 Sin[x] }, {x, 
     0, -Pi/2}, PerformanceGoal -> "Speed"][[1]];
c = Map[Translate[w, #] &, z];
g[k_, z1_, w_, c1_] :=
 Module[{z2},
  z2 = Cases[z, {x_, _, _} /; 0 + k < x < 30 + k];
  c = Map[Translate[w, #] &, z2];
  Graphics3D[{Polygon[{{0 + k, 0, 1 + k}, {30 + k, 0, 1 + k}, {30 + k,
        30, 1 + k}, {0 + k, 30, 1 + k}}], c}, 
   PlotRange -> {k, k + 50}]]

p = Table[g[k, z, w, c], {k, 1, 100, 1}];
Export["p.gif", p]

mit wind


Direkt von oben

Die nächsten Regentropfen sind abgeschnitten, aber ich werde das übersehen.

von oben 3D

m=40;
r=RandomInteger;
positions=Table[{r@m,r@m,r@1000},{800}];
g[lowZ_,pos_]:=
Module[{hiZ=lowZ+103},
Graphics3D[{PointSize[Small],White,Point[{{0,0,lowZ},{0,m,lowZ},{m,0,lowZ},{m,m,lowZ},{0,0,hiZ},{0,m,hiZ},{m,0,hiZ},{m,m,hiZ}}],
ImageSize-> 350,Sphere/@Cases[pos,{_,_,z1_}/;lowZ<z1<hiZ-2]},PlotRange->{lowZ,hiZ}, 
ViewPoint-> {0,0,1},ImagePadding->5]]

Bewegen Sie es in weniger als 50 Zeichen zur Seite und Sie senken Ihre Punktzahl. :)
Ali Caglayan

1
Ich liebe dieses

+1 für die letzte, mit dem richtigen Kamerawinkel, aber Sie haben vergessen, dass die Kamera etwas Regen blockiert ....;)
GreenAsJade

@GreenAsJade, Das Ausschneiden für den 3D-Ansichtspunkt (von oben) wurde behoben.
DavidC

Süß, aber ich war mehr leichtsinnig als du dachtest. Ich meinte, dass es eine physische Kamera gibt, die nach unten schaut, also sollte sie einige der Regentropfen blockieren:%)
GreenAsJade

10

HTML / JavaScript, 156 123 (143 - 20)

<body bgcolor=0 onload="t=c.getContext('2d');t.fillStyle='#07d';setInterval('n=Math.random()*4e4;t.fillRect(n%270,n/150,1,1)',1)"><canvas id=c>

Kommentierte Version:

<body bgcolor="#000">
<canvas id="c"></canvas>
<script>
  onload = function() {
    // Retrieve the rendering context
    t=c.getContext('2d');
    // Set rain color
    t.fillStyle='#07d';
    // Render whenever it is possible
    setInterval(function() {
      // Generate a number between 0 and 40,000
      // 40,000 ~= 270 * 150
      n=Math.random()*4e4;
      // Draw a raindrop.
      // Since x and y are not rounded, the raindrop looks blurry!
      t.fillRect(n%270,n/150,1,1)
    }, 1);
  };
</script>
</body>

7

Smalltalk (Smalltalk / X)

mit zufälligem Wind ;-)

|BG CLR N1 H W v WIND drops gen newDrops draw remove move buffer|


BG := Color black.
CLR := Color blue lightened.
H := 100.
W := 100.
N1 := 10.
WIND := 0.
drops := OrderedCollection new.

gen := [:n | ((1 to:n) collect:[:i | Random nextIntegerBetween:1 and:W] as:Set) collect:[:x | x@0]].
newDrops := [drops addAll:(gen value:N1)].
draw := [buffer fill:BG; paint:CLR. drops do:[:d | buffer displayPoint:d]].
remove := [drops := drops reject:[:d | d y > H]].
move := [:wind | drops := drops collect:[:d| (d x + wind)\\W @ (d y + 1)]].
v := View new openAndWait.
buffer := Form extent:(v extent) depth:24 onDevice:v device.

[
    [v shown] whileTrue:[
        draw value.
        v displayForm:buffer.
        move value:WIND.
        remove value.
        newDrops value.
        WIND := (WIND+(Random nextBetween:-1 and:1)) clampBetween:-5 and:5.
        Delay waitForSeconds:0.1.
    ]
] fork.

Ausgabe in Sicht: Bildbeschreibung hier eingeben


6
Es ist nicht qualifiziert, da es eine Seitenansicht des Regens ist, der auf den Boden fällt, und nicht des Regens, der auf den Boden trifft. Immer noch ein schöner Windeffekt.

6

Verarbeitung, 94-20 = 74

void setup(){background(0);fill(0,0,255);}
void draw(){ellipse(random(0,99),random(0,99),3,3);}

(Neue Zeile zur besseren Lesbarkeit hinzugefügt.)

Klicken Sie hier für eine Online-Demo.


1
Bei solchen Problemen ist die Verarbeitung sehr gut.
cjfaure

Kann nicht in Firefox angezeigt werden. Die Standardsicherheitseinstellungen blockieren das Java-Applet und zeigen nicht an, wie ich es überschreiben soll. AFAIK, es gibt einen Processing.js-Port für JavaScript. Wenn Sie ihn in JS konvertieren und einen Link posten könnten, wäre ich Ihnen dankbar.
Marczellm

@marczellm Ich benutze Firefox 27.0 auf Ubuntu und es funktioniert gut. Sind Sie sicher, dass Sie nicht gefragt werden, ob Sie das Plugin zulassen oder blockieren möchten? Ich werde mir auch eine JS-Version ansehen.
ace_HongKongIndependence

@ace Nachdem ich alle Eingabeaufforderungen angewiesen habe, "zuzulassen", blockiert eine Sicherheitsmeldung sie weiterhin. Danke für die JS-Version.
Marczellm

1
@marczellm fügte die Javascript-Version in die Antwort ein, viel Spaß :) und nur eine blinde Vermutung, vielleicht ist Ihre aktuelle Java-Plugin-Version veraltet und hat bekannte Sicherheitsprobleme
ace_HongKongIndependence

5

Bash

while true;do echo " / / / / /";echo "/ / / / / ";done

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:

while true;do echo " . . . . .";echo ". . . . . ";done

7
"Die Kamera ist fixiert: Sie blicken von oben direkt auf den Boden." Dies scheint den Regen von der Seite zu sehen?
Undergroundmonorail

2
Sparen Sie 9 Zeichen 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.
Gilles 'SO- hör auf böse zu sein'

@ Gilles In diesem Fall können wir while echo -e '\e[0;34m / / / / /';do echo / / / / /;donees mit Boni auf -13 bringen :)
undergroundmonorail

4
das sieht definitiv nicht nach Regen aus: D
Kiwy

5
Ich denke nicht wirklich, dass dies als Antwort betrachtet werden sollte. Kurz gesagt: Es ist nicht realistisch. Detailliertes Argument: Wenn ich die Frage richtig interpretiert habe, sollte der Regen zufällig (oder zumindest pseudozufällig) fallen und über einen langen Zeitraum sollte die Verteilung pro Flächeneinheit ähnlich sein. (So ​​funktioniert Regen, richtig?) In dieser Antwort wird jedoch garantiert, dass es keine Regentropfen neben Regentropfen gibt. Wenn wir also die Einheitsfläche als die Fläche eines Zeichens annehmen, sehen wir, dass die Verteilung ist ungleichmäßig.
ace_HongKongIndependence

3

Python 2.7: 195-20 = 175

Ich bin mir sicher, dass hier noch mehr getan werden kann, aber das ist, was ich jetzt habe:

import os,time
from random import*
l=[i[:]for i in[[' ']*100]*50]
while 1:
 os.system('clear')
 l[randint(0,49)][randint(0,99)]='.'
 print'\033[94m\n'.join(''.join(r)for r in l)
 time.sleep(.05)

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 Zeichen import os,time,randomund verwendet sie random.randint()zweimal, obwohl ich nicht überzeugt bin, dass dies sowieso der beste Weg ist, eine Zelle auszuwählen. Ich wollte verwenden random.choice(), konnte mir aber keinen Weg um unveränderliche Zeichenfolgen denken, der nicht mehr Zeichen verschwendet, als gespeichert wurden.


3
l=[i[:]for i in[[' ']*100]*50]gemäß stackoverflow.com/a/6688361/1114687 . 198 - 20 = 178
14.

Oh, wow, das habe ich noch nie gesehen. Wenn ich es richtig lese, stellt die Slice-Notation nur sicher, dass es sich um eine eindeutige Liste handelt und nicht um einen weiteren Verweis auf dieselbe, richtig? Das ist wirklich cool! Danke!
Undergroundmonorail

Ich habe es ursprünglich versucht l=[[' ']*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.
14.

2

132 + 27 - 20 - 50 = 89

Javascript (132)

r=Math.random;setInterval("$('body').append($('<i>∘</i>').css({left:r()*2e3,top:r()*2e3}).animate({left:'+=70',fontSize:0},500))",1)

CSS (27)

i{color:blue;position:fixed

Demo: http://jsfiddle.net/kelunik/5WC87/4/embedded/result/


Es ist aus der Seitenansicht, es ist nicht für den Moment qualifiziert.

@BenH Du hast Recht, diesen Punkt verpasst, eine neue Version ist in meiner Antwort.
Kelunik

Anscheinend passiert nichts, wenn Sie Ihren Code in der Firefox-Konsole

@BenH Deshalb gibt es eine jsfiddle-Demo.
Kelunik

habe es nicht gesehen. danke


1

Processing.js, 86 - 20 = 66

... aber es verblasst auch langsam (der Boden nimmt den Regen natürlich auf). Punkte dafür?

g=99;r=random;void draw(){fill(0,9);rect(0,0,g,g);fill(0,g,r(g));rect(r(g),r(g),2,2);}

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 rfor random(sprachübergreifender Alias!) einfügen .

Irgendwelche anderen Ideen zu minimieren?

Lesbare Version:

g = 99;
r = random;                  // Javascript trickery
void draw() {
    fill(0, 9);
    rect(0, 0, g, g);        // Fade the background
    fill(0, r(g), r);
    rect(r(g), r(g), 2, 2);  // Add a new drop
}

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:

r=random;void draw(){fill(0,0,255);rect(r(99),r(99),2,2);}

1

Tcl / Tk, 139-20 = 119

Wiederverwenden meiner eigenen Antwort http://codegolf.stackexchange.com/a/143018/29325

Muss in der interaktiven Shell ausgeführt werden

gri [can .c -w 40 -he 40]
set x 0
wh 1 {.c cr o $x [set y [exp int(rand()*40)]] $x [set x $y] -f #[form %06x [exp int(rand()*255**3)]]
upd}

Leider hat das Skript beim Konvertieren expr int(rand()*in ein procByte mehr!

Bildbeschreibung hier eingeben

Um anzuhalten, muss man nur auf das unbeschreibliche "X" klicken.

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.