To jest deszczowy dzień

42

Kontekst

To Walentynki. Jedyny, którego kiedykolwiek kochałeś, zostawił cię wczoraj dla tego faceta, którego zawsze uważała za „głupiego i nieciekawego” . W drodze do domu utknąłeś w korku, słuchasz starych piosenek w radiu, kołysze cię deszcz padający na przednią szybę. Po chwili w samochodzie czujesz się samotnie w swoim małym mieszkaniu i nie możesz myśleć o czymś innym niż ona. Nie ma światła, a ty patrzysz przez okno, pozwalając, by otaczała cię ciemność. Nie ma z kim porozmawiać, twoi przyjaciele odeszli dawno temu po ostrzeżeniu o tej nowej dziewczynie prześladującej twój umysł. Uruchamiasz komputer, ponieważ to jedyne, co możesz zrobić, otwórz przeglądarkę i umieść nową łamigłówkę programową w stosie wymiany, aby zmienić zdanie.

Wyzwanie

Napisz program w wybranym języku, symulując deszcz, który spadnie na ziemię. Dane wyjściowe mogą składać się ze znaków ASCII lub renderowane 2D / 3D. Kamera jest nieruchoma: patrzysz prosto na ziemię. Twój program musi zawierać animację, taką jak odświeżanie konsoli lub strony za każdym razem, gdy generujesz nową „ramkę”. To musi być realistyczne, wiem, że to trochę subiektywne, ale powiedzmy, że nie można wypełnić całej ziemi tylko jednym dużym spadkiem.

Wynik nie musi być obrazem, ale jeśli używasz tajemniczego języka, lepiej jest podać .gif, aby zilustrować, jak to wygląda w akcji (ale oczywiście nie wpłynie to na twój wynik, jeśli tego nie zrobisz).

Zasady

  • Twój wynik to suma użytych bajtów
  • -20 punktów, jeśli używasz kolorów
  • -50, jeśli uda ci się wytworzyć wiatr
  • Najniższy wynik wygrywa

Przykład

Bardzo prosty przykład tego, co należy renderować:

Mam nadzieję, że poradzisz sobie lepiej i spodoba ci się to wyzwanie.

Przepraszamy za mój angielski. Jeśli chcesz poprawić niektóre błędy, edytuj mój post

Tablica wyników

Jeśli Twojego nazwiska nie ma na liście, to dlatego, że próbę uznano za niezgodną z zasadami.

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

Gratulacje dla Tobii!


źródło
51
Mam szczerą nadzieję, że pierwszy akapit nie jest prawdziwą historią.
Kendall Frey
1
@DavidCarraher tak, jakbyś był w niebie i patrzył na podłogę.
8
Nie sądzę, że powinien to być kod-golf, ponieważ potencjalne wyniki są zbyt łagodne
Cruncher
4
Pierwszy akapit wraz z pozycją kamery dla tego renderowania jest dość makabryczny.
Tobia
3
„głupie i nieciekawe”
profesor Allman

Odpowiedzi:

26

APL, 105 znaków / bajtów * - 20-50 = 35 punktów

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

*: Większość implementacji APL obsługuje pewną formę (starszego) jednobajtowego zestawu znaków, który mapuje symbole APL na górne 128 bajtów. Dlatego do celów gry w golfa program, który używa tylko znaków ASCII i symboli APL, może być oceniany jako znaki = bajty.

Przetestowałem to na najnowszej apl.js Nicka na Node.js w terminalu OS X. Ale nie użyłem niczego specyficznego dla jego dialektu, więc powinien działać na każdej nowoczesnej APL, która może być uruchomiona na terminalu ANSI i obsługuje d-funs {...}, przypisanie nici (a b)←...i dojazdy , takie jak Dyalog dla Linuxa lub Raspberry PI ( z ⎕IO←0)

W wierszu 1 znajduje się dosłowny znak zmiany znaczenia (1 bajt). Możesz wprowadzić go za Ctrl-V Escpomocą terminalu Linux lub Vima, lub podobno Alt-027w Windowsie. Ponadto nie mogłem znaleźć wiarygodnego sposobu na wykrycie rozmiaru terminala, więc możesz chcieć edytować liczbę wierszy i kolumn na końcu ostatniego wiersza.

Bronię premii 50 przez to, że każda kropla deszczu przechodzi przez następujące kształty: ⍟∘.które sprawiają wrażenie lekkiego wiatru w dół, biorąc pod uwagę, że scena jest oglądana z góry. W rzeczywistości, patrząc na gif poniżej, powinieneś odnieść wrażenie, że każda kropla delikatnie przesuwa się w dół i w lewo, zanim zniknie na ziemi.

Wersja bez golfa:

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

Wynik:

wprowadź opis zdjęcia tutaj


APL, inny styl

Poza konkurencją.

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

Tutaj moim celem było sprawić wrażenie kropli deszczu opadających ukośnie i gromadzących się na ziemi, jednocześnie starając się utrzymać stałą liczbę widocznych kropli (spadających lub rozpryskanych) na stałym poziomie. Sztuką było stworzenie wielu nowych spadających kropli /w każdym cyklu i sprawienie, by spadające krople „zmiotły” wszelkie poplamione krople, przez które podróżują.

Wynik dziwnie przypomina kod Matrix.

Wyjście
(szarpnięcie co 5s to zapętlenie gif)

wprowadź opis zdjęcia tutaj

Tobia
źródło
To miłe, ale nie sądzę, żeby postać ESC była drukowana poprawnie. i.stack.imgur.com/vLERQ.png Próbowałem też wkleić kod za pomocą gedit, ale nie działało.
Riking
Źle oceniłeś wynik. Pytanie brzmi „bajty”, a nie „znaki”.
jazzpi
1
@Riking Zredagowałem tę część. Jeśli spróbujesz ponownie, powinno działać.
Tobia,
@Tobia Pokaż mi swoje zdjęcie z IBM 5100, a kupię argument chars = bytes.
primo
42

Bash: 111 bajtów - 20 = 91 punktów!

Kontemplacyjna delikatna mżawka w twoim terminalu. Ustaw cyfry 819 i 41 odpowiednio dla różnych wysokości i szerokości.

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

Zrzut ekranu

Przyjemnym bonusem jest sposób, w jaki kursor porusza się po obszarze deszczowym.

Edycja: skrócenie ze 140 bajtów do 129 bajtów dzięki sugestiom @ manatwork. Druga edycja: skrócenie ze 129 bajtów do 111 bajtów dzięki sugestiom @ manatwork i @ Tobia oraz dodatkowej inspiracji - patrz komentarze.

(Uwaga: zrzut ekranu pokazuje poprzednią, mniej golfową wersję kodu, która jest funkcjonalnie identyczna)

Zamieszki
źródło
1
Możesz oszczędzić: 2 znaki, łącząc echoopcje; 2 znaki przy użyciu \ezamiast \033; 3 znaki przy użyciu :zamiast true; 5 znaków przy użyciu arytmetyczną oceny ( ((…))) 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
Sigil nie jest potrzebny do oceny arytmetycznej. Na końcu kodu musi znajdować się nowa linia. Powinien mieć tylko 127 znaków.
manatwork
1
Uważam, że @manatwork oznacza, że ​​nie musisz używać znaku dolara w podwójnych nawiasach: ((RANDOM<9))działa równie dobrze. Możesz także spróbować zmniejszyć kod, łącząc dwa for {0..19}i {0..40}w jeden for {0..819}, używając czegoś takiego jak $((i%41))wewnątrz.
Tobia
1
Niech ktoś mnie powstrzyma !! e='printf \e'jest o 2 znaki krótszy niż e='echo -ne \e'!
Tobia
1
I przycinaj kolejnego char za pomocą$e[C
Tobia
39

Python, 312 bajtów - 50 (wiatr) = 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

Przykładowe dane wyjściowe (pętla 50 klatek):

Rzeczywisty pakiet zabaw jest znacznie szybszy, niż pozwalają na to gify.

primo
źródło
3
@ChristianCareaga Mógłbym, ale myślę, że biel wygląda lepiej.
primo
8
Jedyny problem w moich oczach: patrzysz na deszcz z boku, podczas gdy zasady mówią o nieruchomej kamerze skierowanej prosto w dół.
Johannes H.
7
@JohannesH. Lub, to bardzo, bardzo wietrzny dzień.
primo
20
Lubię od czasu do czasu błyskawice! : P
Facet z kapeluszem
3
Jeden znak zostaje zapisany przy użyciu R=__import__("random").randintzamiast from random...wiersza.
SimonT
35

HTML / JS, 170 znaków - 20 = 150 punktów

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

(sidenote: grałem dalej, przekazując ciąg setInterval, withnazwy zmiennych automatyczny ID ... czuje się tak źle! dreszcze )

Po prostu rysuje losowe niebieskie prostokąty.

HTML / JS, 309 znaków - 20-50 = 239 punktów

Teraz z wiatrem!

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

Klamka
źródło
163 bajty: <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! Użyłem with! Czuję się brudniejszy niż przekazywanie struny do setInterval: p
Niet the Dark Absol
@NiettheDarkAbsol Dzięki;) Wygląda na to, że (przynajmniej w Chrome) canvasnie może się automatycznie zamknąć, ale poza tym działa idealnie! (Również używanie automatycznych nazw zmiennych ID również wydaje się takie brudne: D)
Klamka
Niektóre przeglądarki wydają się bardziej łagodne w tym obszarze ... Ale unika się konieczności używania onload. Muszę powiedzieć, że podoba mi się sposób @ Florenta na unikanie duplikatuMath.random()
Niet the Dark Absol
@Doorknob automatycznie zamyka się canvasw Chrome! Moja odpowiedź została opracowana / przetestowana w tej przeglądarce.
Florent
1
Głosuj za drugim, z kroplami tonącymi w ziemi / kałuży.
GreenAsJade
34

JS + jQuery (172-20-50 = 102)

Skopiuj / Wklej ten wiersz w konsoli przeglądarki (zazwyczaj naciśnij klawisz 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)

Animowane deszcz czerwonych serc na Walentynki!

wprowadź opis zdjęcia tutaj

Michael M.
źródło
1
cóż, to nie jest realistyczne. Serca wychodzą z góry ekranu i trzymają się losowych pozycji strony. To tak naprawdę nie pasuje do punktu widzenia.
10
AUGGGGHH! Jak mogę to zatrzymać ?!
Facet z
1
@ user2509848 Ale czy jest jakiś inny sposób?
Facet z kapeluszem
3
@TheGuywithTheHat, przeładuj stronę
Michael M.
19
Znakomity! Myślę, że to oddaje sedno pytania.
andrewb
26

Matematyka

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

Kształt kropli deszczu jest tworzony za pomocą wykresu obrotu wokół osi Z.

Początkowo generowany jest deszcz dla regionu, który rozciąga się znacznie powyżej obszaru wyświetlania. Pojawienie się padającego deszczu uzyskuje się poprzez przesunięcie punktu widzenia w górę wzdłuż osi Z. (Jest to bardziej wydajne niż ponowne obliczanie pozycji każdej kropli deszczu).

deszcz

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]

Z wiatrem

Zrzuty deszczu powodują wiatr. Ale i tak tu jestem.

Niebieska podłoga właściwie ogranicza obszar widoku {x, y} do interesującego nas obszaru. Są pewne usterki, ale, no cóż,

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]

z wiatrem


Z góry

Najbliższe krople deszczu są przycięte, ale przeoczę to.

z góry 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]]
DavidC
źródło
Przesuń go w bok o mniej niż 50 znaków, a obniżysz swój wynik. :)
Ali Caglayan
1
Uwielbiam ten
+1 za ostatni, z prawidłowym kątem kamery, ALE zapomniałeś, że kamera blokuje część deszczu ....;)
GreenAsJade
@GreenAsJade, Obcinanie dla punktu widzenia 3D (z góry) jest teraz naprawione.
DavidC
Fajnie, ale byłem bardziej niepoważny, niż ci się wydawało. Miałem na myśli, że na to patrzy fizyczny aparat, więc powinien on blokować niektóre krople deszczu:%)
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>

Wersja z adnotacjami:

<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>
Florent
źródło
7

Smalltalk (Smalltalk / X)

z losowym wiatrem ;-)

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

wynik w widoku: wprowadź opis zdjęcia tutaj

blabla999
źródło
6
Nie kwalifikuje się, ponieważ jest to widok z boku padającego deszczu, a nie deszczu uderzającego o ziemię. Wciąż fajny efekt wiatru.
6

Przetwarzanie, 94-20 = 74

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

(Dodano nową linię dla czytelności.)

Kliknij tutaj, aby zobaczyć demo online.

ace_HongKongIndependence
źródło
1
Przetwarzanie jest naprawdę dobre dla takich problemów.
cjfaure
Nie można go wyświetlić w przeglądarce Firefox, domyślne ustawienia zabezpieczeń blokują aplet Java i nie mówią mi, jak go zastąpić. AFAIK istnieje port Processing.js na JavaScript, jeśli możesz go przekonwertować na JS i zamieścić link, byłbym wdzięczny.
marczellm
@marczellm Używam Firefox 27.0 na Ubuntu i działa dobrze. Czy na pewno nie ma żadnych monitów z pytaniem, czy zezwolić na wtyczkę, czy ją zablokować? Przyjrzę się również wersji JS.
ace_HongKongIndependence
@ace Po tym, jak powiem wszystkim monitom „zezwól”, komunikat bezpieczeństwa nadal go blokuje. Dzięki za wersję JS.
marczellm
1
@marczellm dodał wersję javascript do odpowiedzi, ciesz się :) i po prostu zgadnij, może twoja obecna wersja wtyczki java jest nieaktualna i ma problemy z bezpieczeństwem
ace_HongKongIndependence
5

Grzmotnąć

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

Nie jestem pewien, czy to powinien być golf golfowy, ponieważ nie ma ścisłych wymagań dotyczących tego, jak powinien wyglądać „deszcz”.

EDYCJA: Jeśli chcesz, aby kamera wyglądała na skierowaną prosto w dół, użyj tego:

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

źródło
7
„Kamera jest nieruchoma: patrzysz prosto w ziemię”. Wygląda na to, że widzisz deszcz z boku?
undergroundmonorail
2
Zapisz 9 znaków: while echo \ / / / / /;do echo / / / / /;done(lub kilka innych z funkcją rekurencyjną, ale to szybko wysadzi stos). @undergroundmonorail Silny wiatr, przekątna w stosunku do kamery.
Gilles „SO- przestań być zły”
@Gilles W takim przypadku możemy zrobić while echo -e '\e[0;34m / / / / /';do echo / / / / /;donei dostać go w dół do -13 z bonusami :)
undergroundmonorail
4
to z pewnością nie wygląda jak deszcz: D
Kiwy
5
Nie sądzę, że należy to uznać za odpowiedź. W skrócie: To nie jest realistyczne. Szczegółowy argument: Jeśli poprawnie zinterpretowałem pytanie, deszcz powinien padać losowo (lub przynajmniej pseudolosowo), a przez długi czas rozkład powinien być podobny na jednostkę powierzchni. (Tak działa deszcz, prawda?) Jednak w tej odpowiedzi jest zagwarantowane, że nie będzie żadnych kropli deszczu przy każdej kropli deszczu, więc jeśli weźmiemy obszar jednostki za obszar jednej postaci, widzimy, że dystrybucja jest nierówna.
ace_HongKongIndependence
3

Python 2.7: 195-20 = 175

Jestem pewien, że można tu zrobić więcej, ale na teraz mam to:

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)

Prześlę gif wyjścia, gdy będę pamiętać, jak to zrobić.

Działa to na systemie Linux. Wymiana 'clear'z 'cls'marek to działa na windows, ale potem ANSI kolory nie działają i tracę premię.

Mam tablicę 2D ciągów jednoznakowych, zainicjowanych do . Co 0,05 sekundy wybierana jest jedna z nich losowo na ., a ekran jest przerysowany.

from random import*oszczędza dwa znaki import os,time,randomi używa random.randint()dwa razy, chociaż nie jestem przekonany, że i tak to najlepszy sposób na wybranie komórki. Chciałem użyć, random.choice()ale nie mogłem wymyślić sposobu na obejście niezmiennych ciągów, które nie zmarnowałyby więcej znaków niż uratował.

podziemny monorail
źródło
3
l=[i[:]for i in[[' ']*100]*50], zgodnie z stackoverflow.com/a/6688361/1114687 .
198-20
Och, wow, nigdy wcześniej tego nie widziałem. Jeśli czytam go poprawnie, notacja plastra nie robi nic poza upewnieniem się, że jest to unikalna lista, a nie kolejne odniesienie do tej samej, prawda? To jest naprawdę fajne! Dziękuję Ci!
undergroundmonorail
Początkowo próbowałem l=[[' ']*100]*50, ale to po prostu tworzy 50 referencji do tej samej 100-elementowej listy, więc szukałem najkrótszego możliwego sposobu obejścia tego i znalazłem odpowiedź Przepełnienie stosu, do której link mam powyżej.
n.
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/

kelunik
źródło
Jest z boku, na razie nie kwalifikuje się.
@BenH Masz rację, przegapiłeś ten punkt, nowa wersja jest teraz w mojej odpowiedzi.
kelunik
wygląda na to, że nic się nie dzieje podczas wypróbowywania kodu w konsoli Firefox: /
@BenH Właśnie dlatego istnieje jsfiddle-demo.
kelunik
nie widziałem tego. dzięki
1

Przetwarzanie, 62-20 = 42

void draw(){stroke(0,0,214);point(random(0,99),random(0,99));}

Generuje niebieskie piksele na białym tle. Demonstracja w bardzo podobnym języku tutaj: https://www.khanacademy.org/cs/rain2/6172053633761280

Facet z kapeluszem
źródło
Obowiązkowe +1 za ekstremalną zwięzłość.
primo
1

Processing.js, 86-20 = 66

... ale także powoli zanika (ziemia naturalnie pochłania deszcz). Punkty za to?

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);}

Funkcje bonusowe obejmują między zielonkawym a niebieskawym (to wyraźnie brudny deszcz „miejski”).

Byłem też bardzo zadowolony, że mogłem tutaj skorzystać z hacka JavaScript; Zauważ, że ponieważ jest to przetwarzanie. js , możesz wrzucić takie rzeczy, jak deklaracja bez typu g = 99 lub alias rfor random(alias międzyjęzykowy!).

Wszelkie inne pomysły do ​​zminimalizowania?

Wersja do odczytu:

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
}

Całość można obejrzeć tutaj .

... plus inna wersja bez przejścia: 58-20 = 38

Jeśli nie lubisz blaknięcia i nie przeszkadza ci szary brud:

r=random;void draw(){fill(0,0,255);rect(r(99),r(99),2,2);}
j6m8
źródło
1

Tcl / Tk, 139-20 = 119

Ponownie wykorzystując własną odpowiedź http://codegolf.stackexchange.com/a/143018/29325

Musi być uruchomiony w interaktywnej powłoce

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}

Niestety konwersja expr int(rand()*na procskrypt powoduje, że skrypt ma jeszcze jeden bajt!

wprowadź opis zdjęcia tutaj

Aby zatrzymać, wystarczy kliknąć niewysłowiony przycisk „X”.

sergiol
źródło