Ini hari hujan

42

Konteks

Ini Hari Kasih Sayang. Satu-satunya yang kau cintai meninggalkanmu kemarin untuk pria yang selalu dia temukan "bodoh dan tidak menarik" . Dalam perjalanan pulang, Anda terjebak kemacetan, mendengarkan lagu-lagu lama di radio, hujan yang menerpa kaca depan mengguncang Anda. Setelah beberapa saat di mobil Anda, Anda menemukan diri Anda sendirian di apartemen kecil Anda karena tidak dapat memikirkan hal lain selain dia. Tidak ada cahaya dan Anda menatap melalui jendela, membiarkan kegelapan menyelimuti Anda. Tidak ada orang untuk diajak bicara, teman-teman Anda sudah lama pergi setelah memperingatkan Anda tentang gadis baru ini menghantui pikiran Anda. Anda menyalakan komputer Anda, karena itu satu-satunya hal yang dapat Anda lakukan, buka browser Anda dan posting teka-teki pemrograman baru ke stackexchange, dalam upaya untuk mengubah pikiran Anda.

Tantangan

Tulis sebuah program dalam bahasa pilihan Anda yang mensimulasikan hujan yang jatuh di tanah. Output dapat terdiri dari karakter ASCII atau 2D / 3D yang diberikan. Kamera sudah diperbaiki: Anda berada di atas dengan pandangan lurus ke tanah. Program Anda harus menyertakan beberapa jenis animasi seperti menyegarkan konsol atau halaman setiap kali Anda menghasilkan "bingkai" baru. Itu harus realistis, saya tahu ini agak subyektif tetapi katakanlah Anda tidak bisa hanya mengisi semua tanah hanya dengan satu tetes besar.

Outputnya tidak harus berupa gambar tetapi jika Anda menggunakan bahasa samar lebih baik untuk memberikan .gif untuk menggambarkan bagaimana itu terlihat dalam tindakan (tapi tentu saja, itu tidak akan mempengaruhi skor Anda jika Anda tidak).

Aturan

  • Skor Anda adalah total byte yang digunakan
  • -20 poin jika Anda menggunakan warna
  • -50 jika kamu berhasil membuat semacam angin
  • Skor terendah menang

Contoh

Contoh yang sangat mendasar tentang apa yang harus dirender:

Saya harap Anda akan melakukan yang lebih baik dan menikmati tantangan ini.

Maaf untuk bahasa Inggris saya, silakan edit posting saya jika Anda ingin memperbaiki beberapa kesalahan

Papan pemimpin

Jika nama Anda tidak tercantum, itu karena upaya Anda dianggap tidak sesuai dengan aturan.

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

Selamat untuk Tobia!


sumber
51
Saya sangat berharap paragraf pertama bukan kisah nyata.
Kendall Frey
1
@ DavidCarraher ya, seperti Anda berada di langit memandang lantai.
8
Saya tidak berpikir ini harus kode-golf karena ada terlalu banyak keringanan pada output potensial
Cruncher
4
Paragraf pertama bersama dengan posisi kamera untuk rendering ini cukup mengerikan.
Tobia
3
"bodoh dan tidak menarik"
Profesor Allman

Jawaban:

26

APL, 105 karakter / byte * - 20 - 50 = 35 skor

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

*: Sebagian besar implementasi APL mendukung beberapa bentuk (byte) charset byte tunggal, yang memetakan simbol APL ke nilai 128 byte atas. Oleh karena itu, untuk tujuan bermain golf, program yang hanya menggunakan karakter ASCII dan simbol APL dapat dinilai sebagai karakter = byte.

Saya mengujinya pada apl.js terbaru Nick di Node.js di terminal OS X. Tapi saya belum menggunakan sesuatu yang spesifik untuk dialeknya, jadi itu harus bekerja pada APL modern yang dapat dijalankan pada terminal ANSI dan mendukung d-funs {...}, penugasan untai (a b)←..., dan perjalanan , seperti Dyalog untuk Linux atau untuk Raspberry PI ( dengan ⎕IO←0)

The sejalan 1 adalah karakter escape literal (yang 1 byte). Anda dapat memasukkannya menggunakan Ctrl-V Escterminal Linux atau Vim, atau sesuatu seperti Alt-027di Windows. Juga, saya tidak dapat menemukan cara yang andal untuk menemukan ukuran terminal, jadi Anda mungkin ingin mengedit jumlah baris dan kolom di akhir baris terakhir.

Saya mempertahankan bonus 50 dengan fakta bahwa setiap tetes hujan melewati bentuk-bentuk berikut: ⍟∘.yang memberi kesan angin sedikit turun, mengingat bahwa pemandangan sedang dilihat dari atas. Bahkan, melihat gif di bawah ini, Anda harus mendapatkan kesan bahwa setiap tetes bergerak dengan lembut ke bawah dan ke kiri, sebelum menghilang di tanah.

Versi tidak disatukan:

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

Keluaran:

masukkan deskripsi gambar di sini


APL, gaya yang berbeda

Keluar dari kompetisi.

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

Di sini tujuan saya adalah untuk memberi kesan air hujan jatuh dengan miring dan terakumulasi di tanah, sambil berusaha menjaga agar jumlah tetesan yang terlihat (jatuh atau berceceran) tetap konstan. Caranya adalah dengan membuat sejumlah tetes jatuh baru /di setiap siklus dan membuat tetes jatuh "menghapus" semua yang jatuh di mana-mana mereka bepergian.

Hasilnya anehnya mengingatkan pada kode Matrix.

Output
(brengsek setiap 5 adalah gif looping)

masukkan deskripsi gambar di sini

Tobia
sumber
Ini bagus, tapi saya rasa karakter ESC tidak dicetak dengan benar. i.stack.imgur.com/vLERQ.png Saya mencoba menempelkan kode dengan gedit juga, tidak berhasil.
Bersepeda
Skor Anda salah. Pertanyaannya mengatakan "byte", bukan "karakter".
jazzpi
1
@Riking Saya mengedit bagian itu. Jika Anda mencoba lagi itu harus bekerja.
Tobia
@Tobia Tunjukkan pada saya foto Anda duduk di IBM 5100 Anda, dan saya akan membeli argumen chars = bytes.
primo
42

Bash: 111 byte - 20 = 91 poin!

Gerimis lembut kontemplatif di terminal Anda. Sesuaikan angka 819 dan 41 masing-masing untuk tinggi dan lebar yang berbeda.

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

Tangkapan layar

Bonus yang menyenangkan adalah cara kursor berayun-ayun melintasi area hujan.

Sunting: dipersingkat dari 140 byte menjadi 129 byte berkat saran @ manatwork. Sunting 2: memendek dari 129 byte menjadi 111 byte berkat saran @ manatwork dan @ Tobia, plus inspirasi tambahan - lihat komentar.

(Catatan: tangkapan layar menunjukkan versi kode sebelumnya yang kurang golf, yang secara fungsional identik)

Kerusuhan
sumber
1
Anda dapat menyimpan: 2 karakter dengan bergabung dengan echoopsi; 2 karakter dengan menggunakan \ealih-alih \033; 3 karakter dengan menggunakan :alih-alih true; 5 karakter dengan menggunakan evaluasi aritmatika ( ((…))): 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
Anda tidak perlu sigil di dalam evaluasi aritmatika. Dan harus ada baris tambahan di akhir kode Anda. Seharusnya hanya 127 karakter.
manatwork
1
Saya percaya apa artinya @ manatwork adalah Anda tidak perlu menggunakan tanda dolar di dalam tanda kurung ganda: ((RANDOM<9))berfungsi juga. Juga, Anda bisa mencoba menyusutkan kode Anda dengan menggabungkan keduanya untuk {0..19}dan {0..40}menjadi satu untuk {0..819}, menggunakan sesuatu seperti $((i%41))di dalamnya.
Tobia
1
Seseorang hentikan aku !! e='printf \e'2 char lebih pendek dari e='echo -ne \e'!
Tobia
1
Dan potong char lain dengan menggunakan$e[C
Tobia
39

Python, 312 byte - 50 (angin) = 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

Output sampel (loop 50 bingkai):

Playpack yang sebenarnya secara signifikan lebih cepat dari yang diperbolehkan gifs.

primo
sumber
3
@ChristianCareaga saya bisa, tapi saya pikir putih terlihat lebih baik.
Primo
8
Satu-satunya masalah di mata saya: Anda melihat hujan dari samping, sementara aturan menyatakan kamera tetap tampak lurus ke bawah.
Johannes H.
7
@JohannesH. Atau, ini adalah hari yang sangat, sangat berangin.
Primo
20
Saya suka kilatan sesekali! : P
The Guy with The Hat
3
Satu karakter disimpan dengan menggunakan R=__import__("random").randintalih-alih from random...garis.
SimonT
35

HTML / JS, 170 karakter - 20 = 150 poin

<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: bermain golf lebih jauh dengan mengirimkan string ke setInterval,, withnama variabel ID otomatis ... rasanya sangat salah! bergetar )

Itu hanya menggambar persegi panjang biru acak.

HTML / JS, 309 karakter - 20 - 50 = 239 poin

Sekarang dengan angin!

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

Gagang pintu
sumber
163 byte: <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! Saya menggunakan with! Saya merasa lebih kotor daripada memberikan string ke setInterval: p
Niet the Dark Absol
@NiettheDarkAbsol Terima kasih;) Tampaknya (setidaknya di Chrome) canvastidak dapat menutup secara otomatis, tetapi selain itu berfungsi dengan baik! (Juga, menggunakan nama variabel ID otomatis terasa sangat kotor juga: D)
Gagang Pintu
Beberapa peramban tampaknya lebih lunak di area itu ... Tetapi ia tidak harus digunakan onload. Saya harus mengatakan saya suka cara @ Florent menghindari duplikatMath.random()
Niet the Dark Absol
@Doorknob canvasautoclose di Chrome! Jawaban saya dikembangkan / diuji di browser ini.
Florent
1
Suara positif untuk yang kedua, dengan tetesan yang meresap ke tanah / genangan air.
GreenAsJade
34

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

Salin / Rekatkan baris itu di konsol browser (umumnya tekan tombol 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)

Animasi hati merah hujan untuk hari Valentine!

masukkan deskripsi gambar di sini

Michael M.
sumber
1
yah, itu tidak realistis. Hati datang dari bagian atas layar dan menempel pada posisi acak halaman. Itu tidak benar-benar cocok dengan kondisi sudut pandang.
10
AUGGGGHH! Bagaimana saya menghentikannya ?!
The Guy with The Hat
1
@ user2509848 Tapi apakah ada cara lain?
The Guy with The Hat
3
@TheGuywithTheHat, muat ulang halaman
Michael M.
19
Cemerlang! Saya pikir ini menangkap inti pertanyaan.
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

Bentuk tetesan hujan dibuat melalui plot revolusi di sekitar sumbu z.

Awalnya, hujan dihasilkan untuk wilayah yang memanjang jauh di atas wilayah tampilan. Munculnya hujan turun dicapai dengan menggeser Sudut Pandang ke atas sepanjang sumbu z. (Ini lebih efisien daripada menghitung ulang posisi setiap tetes hujan.)

hujan

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]

Dengan Angin

Ada banyak overhead untuk membuat hujan turun dengan angin. Tapi bagaimanapun saya termasuk di sini.

Lantai biru cukup banyak membuat {x, y} melihat wilayah terbatas pada bidang yang diminati. Ada beberapa gangguan, tapi, oh well,

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]

dengan angin


Dari Langsung Di Atas

Tetesan hujan terdekat terpotong tapi saya akan mengabaikan itu.

dari 3D di atas

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
sumber
Geser ke samping di bawah 50 karakter dan Anda menurunkan skor Anda. :)
Ali Caglayan
1
Saya suka yang ini
+1 untuk yang terakhir, dengan sudut kamera yang benar TETAPI Anda lupa bahwa kamera memblokir sebagian dari hujan ....;)
GreenAsJade
@GreenAsJade, Kliping untuk sudut pandang 3D (dari atas) sekarang sudah diperbaiki.
DavidC
Manis, tapi aku lebih sembrono dari yang kau kira. Saya bermaksud bahwa ada kamera fisik yang melihat ke bawah, jadi ini harus memblokir beberapa hujan:%)
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>

Versi beranotasi:

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

Smalltalk (Smalltalk / X)

dengan angin acak ;-)

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

output dalam tampilan: masukkan deskripsi gambar di sini

blabla999
sumber
6
Itu tidak memenuhi syarat karena itu adalah pandangan sisi dari hujan yang turun, dan bukan hujan yang menghantam tanah. Masih efek angin yang bagus.
6

Memproses, 94 - 20 = 74

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

(Baris baru ditambahkan agar mudah dibaca.)

Klik di sini untuk demo online.

ace_HongKongIndependence
sumber
1
Pemrosesan sangat baik untuk masalah seperti ini.
cjfaure
Tidak dapat melihatnya di Firefox, pengaturan keamanan default memblokir applet Java dan tidak memberi tahu saya cara menimpanya. AFAIK ada port Processing.js ke JavaScript, jika Anda bisa mengubahnya ke JS dan mengirim tautan, saya akan berterima kasih.
marczellm
@marczellm Saya menggunakan Firefox 27.0 di Ubuntu dan berfungsi dengan baik. Apakah Anda yakin tidak ada konfirmasi yang menanyakan apakah Anda mengizinkan atau memblokir plugin? Saya akan melihat versi JS juga.
ace_HongKongIndependence
@ace Setelah saya memberi tahu semua permintaan untuk "mengizinkan", pesan keamanan masih memblokirnya. Terima kasih untuk versi JS.
marczellm
1
@marczellm menambahkan versi javascript ke dalam jawabannya, selamat menikmati :) dan hanya tebakan buta, mungkin versi plugin java Anda saat ini sudah usang dan telah mengetahui masalah keamanan
ace_HongKongIndependence
5

Pesta

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

Saya tidak yakin ini harus menjadi kode golf karena tidak ada persyaratan ketat tentang seperti apa "hujan" itu.

EDIT: Jika Anda ingin terlihat seperti kamera menunjuk lurus ke bawah, gunakan ini:

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

sumber
7
"Kamera sudah diperbaiki: kamu berada di atas dengan pandangan lurus ke tanah." Ini tampaknya melihat hujan dari samping?
undergroundmonorail
2
Simpan 9 karakter: while echo \ / / / / /;do echo / / / / /;done(atau beberapa lagi dengan fungsi rekursif tapi itu akan dengan cepat meledakkan tumpukan). @undergroundmonorail Angin kencang, relatif diagonal ke kamera.
Gilles 'SO- stop being evil'
@Gilles Dalam hal itu, kita bisa melakukan while echo -e '\e[0;34m / / / / /';do echo / / / / /;donedan turun ke -13 dengan bonus :)
undergroundmonorail
4
itu tidak seperti hujan: D
Kiwy
5
Saya tidak berpikir ini harus dianggap sebagai jawaban. Singkatnya: Ini tidak realistis. Argumen terperinci: Jika saya menafsirkan pertanyaan dengan benar, hujan akan turun secara acak (atau setidaknya pseudo-acak) dan, dalam periode waktu yang lama, distribusi harus sama per unit area. (Begini cara hujan, kan?) Namun dalam jawaban ini, dijamin tidak akan ada tetesan hujan di sebelah tetesan hujan, jadi jika kita menganggap unit area menjadi area satu karakter, kita melihat bahwa distribusi tidak merata.
ace_HongKongIndependence
3

Python 2.7: 195 - 20 = 175

Saya yakin masih banyak yang bisa dilakukan di sini, tetapi inilah yang saya miliki untuk saat ini:

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)

Saya akan memposting gif dari output ketika saya ingat bagaimana melakukan itu.

Ini berfungsi di linux. Mengganti 'clear'dengan 'cls'membuatnya berfungsi pada windows, tapi kemudian warna ANSI tidak berfungsi dan saya kehilangan bonus.

Saya memiliki array 2D string satu karakter, diinisialisasi ke . Setiap 0,05 detik, salah satunya dipilih secara acak ., dan layar digambar ulang.

from random import*menghemat dua karakter import os,time,randomdan menggunakan random.randint()dua kali, meskipun saya tidak yakin itu cara terbaik untuk memilih sel. Saya ingin menggunakan random.choice()tetapi saya tidak bisa memikirkan cara mengatasi string abadi yang tidak akan menyia-nyiakan lebih banyak karakter daripada menyimpannya.

monmon bawah tanah
sumber
3
l=[i[:]for i in[[' ']*100]*50], sesuai stackoverflow.com/a/6688361/1114687 . 198 - 20 = 178
n.
Oh, wow, aku belum pernah melihat itu sebelumnya. Jika saya membacanya dengan benar, notasi slice tidak melakukan apa-apa kecuali memastikan bahwa itu adalah daftar yang unik dan bukan referensi lain untuk yang sama, benar? Itu keren sekali! Terima kasih!
undergroundmonorail
Saya awalnya mencoba l=[[' ']*100]*50, tetapi itu hanya membuat 50 referensi ke daftar 100-elemen yang sama, jadi saya mencari cara terpendek yang mungkin untuk mengelak dan menemukan jawaban Stack Overflow yang ditautkan di atas.
n.st
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
sumber
Dari sisi tampilan, tidak memenuhi syarat untuk saat ini.
@ Ben Anda benar, ketinggalan titik itu, versi baru ada di jawaban saya sekarang.
kelunik
sepertinya tidak ada yang terjadi ketika mencoba kode Anda di firefox console: /
@ Ben Itu sebabnya ada demo jsfiddle.
kelunik
tidak melihatnya. terima kasih
1

Memproses, 62 - 20 = 42

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

Menghasilkan piksel biru pada latar belakang putih. Peragaan dalam bahasa yang sangat mirip di sini: https://www.khanacademy.org/cs/rain2/6172053633761280

The Guy with The Hat
sumber
+1 wajib untuk kesempitan ekstrem.
Primo
1

Processing.js, 86 - 20 = 66

... tetapi perlahan-lahan menghilang (tanah menyerap hujan, secara alami). Poin untuk itu?

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

Fitur bonus meliputi beragam antara kehijauan dan kebiruan (hujan 'kota' itu jelas kotor).

Juga, saya sangat senang bahwa saya harus menggunakan hack JavaScript di sini; Perhatikan itu, karena ini sedang diproses. js , Anda bisa melempar hal-hal seperti deklarasi tipless dari g = 99, atau alias runtuk random(alias lintas-bahasa!).

Ada ide lain untuk dikecilkan?

Versi yang dapat dibaca:

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
}

Semuanya bisa dilihat di sini .

... ditambah versi lain tanpa pudar: 58 - 20 = 38

Jika Anda tidak suka memudar dan tidak keberatan dengan kotoran abu-abu:

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

Tcl / Tk, 139 - 20 = 119

Menggunakan kembali jawaban saya sendiri http://codegolf.stackexchange.com/a/143018/29325

Harus dijalankan di shell interaktif

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}

Sayangnya, mengubah expr int(rand()*menjadi procmembuat skrip memiliki satu byte lebih banyak!

masukkan deskripsi gambar di sini

Untuk berhenti, seseorang hanya perlu mengklik tombol "X" yang tidak dapat dijelaskan.

sergiol
sumber