Hôm nay trời mưa


42

Bối cảnh

Đó là ngày lễ tình nhân. Người duy nhất bạn từng yêu đã rời bỏ bạn ngày hôm qua vì anh chàng này, cô luôn thấy "ngu ngốc và không thú vị" . Trên đường về nhà, bạn đã bị kẹt xe, nghe những bài hát cũ trên radio, cơn mưa đập vào kính chắn gió đang làm bạn rung chuyển. Sau một thời gian ngồi trong xe, bạn thấy mình cô đơn trong căn hộ nhỏ của mình không thể nghĩ ra điều gì khác ngoài cô ấy. Không có ánh sáng và bạn nhìn chằm chằm vào cửa sổ, để bóng tối bao quanh bạn. Không có ai để nói chuyện, bạn bè của bạn đã biến mất từ ​​lâu sau khi cảnh báo bạn về cô gái mới này ám ảnh tâm trí bạn. Bạn khởi động máy tính của mình, vì đó là điều duy nhất bạn có thể làm, mở trình duyệt của bạn và đăng một câu đố lập trình mới lên stackexchange, trong nỗ lực thay đổi suy nghĩ của bạn.

Thử thách

Viết chương trình bằng ngôn ngữ bạn chọn mô phỏng cơn mưa rơi trên mặt đất. Đầu ra có thể bao gồm các ký tự ASCII hoặc kết xuất 2D / 3D. Camera được cố định: bạn ở trên nhìn thẳng xuống đất. Chương trình của bạn phải bao gồm một số loại hoạt hình như làm mới bảng điều khiển hoặc trang mỗi khi bạn tạo một "khung" mới. Nó phải thực tế, tôi biết đó là một chút chủ quan nhưng giả sử bạn không thể lấp đầy tất cả chỉ trong một giọt lớn.

Đầu ra không phải là một hình ảnh nhưng nếu bạn đang sử dụng ngôn ngữ khó hiểu thì tốt hơn là cung cấp một .gif để minh họa cách nó hoạt động (nhưng tất nhiên, nó sẽ không ảnh hưởng đến điểm số của bạn nếu bạn không).

Quy tắc

  • Điểm của bạn là tổng số byte được sử dụng
  • -20 điểm nếu bạn sử dụng màu sắc
  • -50 nếu bạn đạt được một số loại gió
  • Điểm số thấp nhất sẽ thắng

Thí dụ

Một ví dụ rất cơ bản về những gì sẽ được kết xuất:

Tôi hy vọng bạn sẽ làm tốt hơn và tận hưởng thử thách này.

Xin lỗi vì tiếng Anh của tôi, vui lòng chỉnh sửa bài viết của tôi nếu bạn muốn sửa một số lỗi

Ban lãnh đạo

Nếu tên của bạn không được liệt kê thì đó là do nỗ lực của bạn đã bị coi là không phù hợp với quy tắc.

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

Xin chúc mừng Tobia!


51
Tôi chân thành hy vọng đoạn đầu tiên không phải là một câu chuyện có thật.
Kendall Frey

1
@DavidCarraher vâng, giống như bạn đang ở trên bầu trời nhìn xuống sàn nhà.

8
Tôi không nghĩ rằng đây nên là môn đánh gôn vì có quá nhiều sự khoan dung đối với các đầu ra tiềm năng
Cruncher

4
Đoạn đầu tiên cùng với vị trí camera cho kết xuất này khá rùng rợn.
Tobia

Câu trả lời:


26

APL, 105 ký tự / byte * - 20 - 50 = 35 điểm

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

*: Hầu hết các triển khai APL đều hỗ trợ một số dạng bộ ký tự byte đơn (cũ), ánh xạ các ký hiệu APL thành các giá trị 128 byte trên. Do đó, với mục đích chơi gôn, một chương trình chỉ sử dụng các ký tự ASCII và các ký hiệu APL có thể được ghi là chars = byte.

Tôi đã thử nghiệm nó trên apl.js mới nhất của Nick trên Node.js trong thiết bị đầu cuối OS X. Nhưng tôi chưa sử dụng bất cứ thứ gì cụ thể cho phương ngữ của anh ấy, vì vậy nó nên hoạt động trên bất kỳ APL hiện đại nào có thể chạy trên thiết bị đầu cuối ANSI và hỗ trợ các trò vui {...}, gán chuỗi (a b)←...và đi lại , như Dyalog cho Linux hoặc cho Raspberry PI ( với ⎕IO←0)

Các phù hợp 1 là một ký tự thoát theo nghĩa đen (đó là 1 byte). Bạn có thể nhập nó bằng Ctrl-V Escthiết bị đầu cuối Linux hoặc trong Vim hoặc được cho là giống như Alt-027trong Windows. Ngoài ra, tôi không thể tìm thấy một cách đáng tin cậy để khám phá kích thước thiết bị đầu cuối, vì vậy bạn có thể muốn chỉnh sửa số lượng hàng và cột ở cuối dòng cuối cùng.

Tôi bảo vệ phần thưởng 50 bởi thực tế là mỗi hạt mưa trải qua các hình dạng sau: ⍟∘.mang lại ấn tượng về một cơn gió nhẹ, cho rằng cảnh tượng đang được nhìn từ trên cao. Trong thực tế, nhìn vào gif bên dưới, bạn sẽ có ấn tượng rằng mỗi giọt đang nhẹ nhàng di chuyển xuống dưới và sang trái, trước khi biến mất trên mặt đất.

Phiên bản bị đánh cắp:

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

Đầu ra:

nhập mô tả hình ảnh ở đây


APL, phong cách khác nhau

Hết cạnh tranh.

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

Ở đây, mục đích của tôi là tạo ra ấn tượng về những hạt mưa rơi với độ nghiêng và tích tụ trên mặt đất, trong khi cố gắng giữ cho số lượng giọt có thể nhìn thấy (có thể rơi hoặc bắn tung tóe) không đổi. Bí quyết là tạo ra một số giọt rơi mới /trong mỗi chu kỳ và để những giọt rơi đó "quét sạch" bất kỳ vật rơi vãi nào chúng đi qua.

Kết quả là gợi nhớ một cách kỳ lạ mã Matrix.

Đầu ra
(giật mỗi 5s là vòng lặp gif)

nhập mô tả hình ảnh ở đây


Điều này thật tuyệt, nhưng tôi không nghĩ rằng ký tự ESC đang được in đúng. i.stack.imgur.com/vLERQ.png Tôi cũng đã thử dán mã bằng gedit, không hoạt động.
Đạp xe

Bạn đã ghi điểm sai. Câu hỏi cho biết "byte", không phải "chars".
jazzpi

1
@Riking Tôi đã chỉnh sửa phần đó. Nếu bạn thử lại, nó sẽ hoạt động.
Tobia

@Tobia Cho tôi xem ảnh bạn đang ngồi ở IBM 5100 và tôi sẽ mua đối số chars = byte.
primo


42

Bash: 111 byte - 20 = 91 điểm!

Một cơn mưa phùn chiêm nghiệm trong thiết bị đầu cuối của bạn. Điều chỉnh các số 819 và 41 cho chiều cao và chiều rộng khác nhau tương ứng.

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

Ảnh chụp màn hình

Một phần thưởng thú vị là cách con trỏ vỗ nhẹ qua khu vực mưa.

Chỉnh sửa: rút ngắn từ 140 byte xuống 129 byte nhờ các đề xuất của @ manatwork. Chỉnh sửa lần 2: rút ngắn từ 129 byte xuống 111 byte nhờ các đề xuất của @ manatwork và @ Tobia, cộng với nguồn cảm hứng bổ sung - xem bình luận.

(Lưu ý: ảnh chụp màn hình hiển thị phiên bản mã ít được đánh gôn trước đó, giống hệt về chức năng)


1
Bạn có thể dự phòng: 2 ký tự bằng cách tham gia echocác tùy chọn; 2 ký tự bằng cách sử dụng \ethay vì \033; 3 ký tự bằng cách sử dụng :thay vì true; 5 ký tự bằng cách sử dụng đánh giá số học ( ((…))) : 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
Bạn không cần sigil bên trong đánh giá số học. Và phải có một dòng mới ở cuối mã của bạn. Chỉ nên có 127 ký tự.
manatwork

1
Tôi tin rằng @manatwork có nghĩa là bạn không cần sử dụng ký hiệu đô la bên trong dấu ngoặc kép: ((RANDOM<9))hoạt động tốt như vậy. Ngoài ra, bạn có thể thử thu nhỏ mã của mình bằng cách kết hợp cả hai cho {0..19}{0..40}thành một {0..819}, sử dụng một cái gì đó giống như $((i%41))bên trong nó.
Tobia

1
Ai đó ngăn tôi lại !! e='printf \e'ngắn hơn 2 char e='echo -ne \e'!
Tobia

1
Và cắt một char khác bằng cách sử dụng$e[C
Tobia

39

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

Đầu ra mẫu (vòng lặp 50 khung hình):

Playpack thực tế là nhanh hơn đáng kể so với gifs cho phép.


3
@ChristianCareaga Tôi có thể, nhưng tôi nghĩ màu trắng trông đẹp hơn.
primo

8
Vấn đề duy nhất trong mắt tôi: Bạn đang nhìn mưa từ bên cạnh, trong khi các quy tắc nêu rõ một camera cố định nhìn thẳng xuống.
Julian H.

7
@JohannesH. Hoặc, đó là một ngày rất, rất gió.
primo

20
Tôi thích những tia chớp thỉnh thoảng! : P
Chàng trai với chiếc mũ

3
Một nhân vật được lưu bằng cách sử dụng R=__import__("random").randintthay vì from random...dòng.
SimonT

35

HTML / JS, 170 ký tự - 20 = 150 điểm

<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: đánh gôn xa hơn bằng cách chuyển một chuỗi tới setInterval, withtên biến ID tự động ... cảm thấy rất sai! rùng mình )

Nó chỉ vẽ hình chữ nhật màu xanh ngẫu nhiên.

HTML / JS, 309 ký tự - 20 - 50 = 239 điểm

Bây giờ có gió!

<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 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! Tôi đã sử dụng with! Tôi cảm thấy bẩn hơn là chuyển một chuỗi đến setInterval: p
Niet the Dark Tuyệt đối

@NiettheDarkAbsol Cảm ơn;) Dường như (ít nhất là trên Chrome) canvaskhông thể tự động đóng, nhưng khác với điều đó hoạt động hoàn hảo! (Ngoài ra, sử dụng tên biến ID tự động cũng cảm thấy rất bẩn: D)
Doorknob

Một số trình duyệt có vẻ khoan dung hơn trong khu vực đó ... Nhưng nó tránh được việc phải sử dụng onload. Tôi phải nói rằng tôi thích cách tránh trùng lặp của @ FlorentMath.random()
Niet the Dark Tuyệt đối

@Doorknob canvastự động đóng trong Chrome! Câu trả lời của tôi đã được phát triển / thử nghiệm trong trình duyệt này.
Florent

1
Upvote cho cái thứ hai, với những giọt nước chìm xuống mặt đất / vũng nước.
GreenAsJade

34

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

Sao chép / Dán dòng đó trong bảng điều khiển trình duyệt (thường nhấn phím 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)

Hoạt hình trái tim đỏ mưa cho ngày Valentine!

nhập mô tả hình ảnh ở đây


1
tốt, nó không thực tế Trái tim đang đến từ trên cùng của màn hình và dính vào các vị trí ngẫu nhiên của trang. Điều đó không thực sự phù hợp với quan điểm của điều kiện xem.

10
THÁNG 8! Làm thế nào để tôi ngăn chặn nó?!
Chàng trai với chiếc mũ

1
@ user2509848 Nhưng có cách nào khác không?
Chàng trai với chiếc mũ

3
@TheGuywithTheHat, tải lại trang
Michael M.

19
Xuất sắc! Tôi nghĩ rằng điều này nắm bắt trung tâm của câu hỏi.
andrewb

26

Toán học

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

Hình dạng hạt mưa được thực hiện thông qua một âm mưu cách mạng quanh trục z.

Ban đầu, mưa được tạo ra cho một khu vực mở rộng hơn khu vực hiển thị. Sự xuất hiện của mưa rơi đạt được bằng cách dịch chuyển Điểm nhìn lên trên dọc theo trục z. (Nó hiệu quả hơn so với tính toán lại vị trí của mỗi hạt mưa.)

mưa

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]

Với gió

Có chi phí đáng kể để làm cho mưa rơi với gió. Nhưng dù sao tôi cũng bao gồm ở đây.

Tầng màu xanh khá nhiều giữ cho khu vực xem {x, y} bị giới hạn trong khu vực quan tâm. Có một số trục trặc, nhưng, oh tốt,

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]

với gió


Từ trực tiếp trên

Những hạt mưa gần nhất được cắt bớt nhưng tôi sẽ bỏ qua điều đó.

từ 3D trên

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

Chuyển nó sang bên dưới 50 ký tự và bạn hạ thấp điểm số của mình. :)
Ali Caglayan

1
Tôi thích cái này

+1 cho lần cuối cùng, với góc máy ảnh chính xác NHƯNG bạn đã quên rằng máy ảnh chặn một số cơn mưa ....;)
GreenAsJade

@GreenAsJade, Việc cắt cho quan điểm 3D (từ phía trên) hiện đã được sửa.
DavidC

Ngọt ngào, nhưng tôi đã trở nên phù phiếm hơn bạn nghĩ. Tôi có nghĩa là có một máy ảnh vật lý nhìn xuống này, vì vậy nó nên chặn một số hạt mưa:%)
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>

Phiên bản chú thích:

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

với gió ngẫu nhiên ;-)

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

đầu ra trong chế độ xem: nhập mô tả hình ảnh ở đây


6
Nó không đủ điều kiện vì nó là một mặt của mưa rơi, và không phải mưa rơi xuống đất. Vẫn là một hiệu ứng gió đẹp.

6

Đang xử lý, 94 - 20 = 74

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

(Dòng mới được thêm vào để dễ đọc.)

Nhấn vào đây để xem demo trực tuyến.


1
Xử lý là thực sự tốt cho các vấn đề như thế này.
cjfaure

Không thể xem nó trong Firefox, các cài đặt bảo mật mặc định chặn applet Java và nó không cho tôi biết cách ghi đè. AFAIK có một cổng Xử lý thành JavaScript, nếu bạn có thể chuyển đổi nó thành JS và đăng một liên kết tôi rất biết ơn.
marczellm

@marczellm Tôi đang sử dụng Firefox 27.0 trên Ubuntu và nó hoạt động tốt. Bạn có chắc chắn không có lời nhắc nào hỏi bạn có nên cho phép hoặc chặn plugin không? Tôi cũng sẽ xem xét một phiên bản JS.
ace_HongKongInependence

@ace Sau khi tôi nói với tất cả các lời nhắc "cho phép", một thông báo bảo mật vẫn chặn nó. Cảm ơn phiên bản JS.
marczellm

1
@marczellm đã thêm phiên bản javascript vào câu trả lời, thưởng thức :) và chỉ là một phỏng đoán mù quáng, có thể phiên bản plugin java hiện tại của bạn đã lỗi thời và đã biết các vấn đề bảo mật
ace_HongKongInependence 14/214

5

Bash

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

Tôi không chắc đây có phải là một môn đánh gôn không vì yêu cầu khắt khe về "cơn mưa" phải như thế nào.

EDIT: Nếu bạn muốn nó trông giống như máy ảnh đang hướng thẳng xuống, hãy sử dụng:

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

7
"Máy ảnh được cố định: bạn ở trên nhìn thẳng xuống đất." Điều này dường như được xem mưa từ phía bên?
undergroundmonorail

2
Lưu 9 ký tự: while echo \ / / / / /;do echo / / / / /;done(hoặc một vài ký tự khác có chức năng đệ quy nhưng điều đó sẽ nhanh chóng làm nổ tung ngăn xếp). @undergroundmonorail Gió mạnh, đường chéo so với camera.
Gilles 'SO- ngừng trở nên xấu xa'

@Gilles Trong trường hợp đó, chúng ta có thể làm while echo -e '\e[0;34m / / / / /';do echo / / / / /;donevà làm cho nó xuống -13 với tiền thưởng :)
undergroundmonorail

4
điều đó chắc chắn không giống như mưa: D
Kiwy

5
Tôi thực sự không nghĩ rằng đây nên được coi là một câu trả lời. Tóm lại: Nó không thực tế. Lập luận chi tiết: Nếu tôi giải thích chính xác câu hỏi, mưa sẽ rơi ngẫu nhiên (hoặc ít nhất là giả ngẫu nhiên) và, trong một khoảng thời gian dài, phân phối phải tương tự trên mỗi đơn vị diện tích. (Đây là cách mưa hoạt động, phải không?) Tuy nhiên, trong câu trả lời này, đảm bảo rằng sẽ không có giọt mưa nào bên cạnh bất kỳ giọt mưa nào, vì vậy nếu chúng ta lấy khu vực đơn vị là khu vực của một nhân vật, chúng ta sẽ thấy rằng phân phối không đồng đều.
ace_HongKongInependence

3

Con trăn 2.7: 195 - 20 = 175

Tôi chắc chắn có nhiều việc có thể được thực hiện ở đây, nhưng đây là những gì tôi đã có bây giờ:

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)

Tôi sẽ đăng một gif của đầu ra khi tôi nhớ làm thế nào để làm điều đó.

Điều này hoạt động trên linux. Thay thế 'clear'bằng 'cls'làm cho nó hoạt động trên các cửa sổ, nhưng sau đó màu ANSI không hoạt động và tôi mất phần thưởng.

Tôi có một mảng 2D gồm các chuỗi một ký tự, được khởi tạo thành . Cứ sau 0,05 giây, một trong số chúng được chọn ngẫu nhiên .và màn hình được vẽ lại.

from random import*lưu hai ký tự import os,time,randomvà sử dụng random.randint()hai lần, mặc dù tôi không tin đó là cách tốt nhất để chọn một ô. Tôi muốn sử dụng random.choice()nhưng tôi không thể nghĩ ra cách nào xung quanh các chuỗi bất biến sẽ không lãng phí nhiều ký tự hơn mức lưu.


3
l=[i[:]for i in[[' ']*100]*50], theo stackoverflow.com/a/6688361/1114687 . 198-20 = 178
n.st

Ồ, wow, tôi chưa bao giờ thấy điều đó trước đây. Nếu tôi đang đọc chính xác, ký hiệu lát cắt không có gì ngoại trừ đảm bảo rằng đó là một danh sách duy nhất và không phải là một tham chiếu khác cho cùng một danh sách, đúng không? Điều đó thật tuyệt! Cảm ơn bạn!
undergroundmonorail

Ban đầu tôi đã thử l=[[' ']*100]*50, nhưng nó chỉ tạo ra 50 tham chiếu cho cùng một danh sách 100 phần tử, vì vậy tôi đã tìm kiếm cách ngắn nhất có thể để phá vỡ điều đó và tìm thấy câu trả lời Stack Overflow được liên kết ở trên.
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

Bản trình diễn: http://jsfiddle.net/kelunik/5WC87/4/embedded/result/


Đó là từ góc nhìn bên, nó không đủ điều kiện cho thời điểm này.

@BenH Bạn nói đúng, đã bỏ lỡ điểm đó, phiên bản mới hiện đang nằm trong câu trả lời của tôi.
kelunik

có vẻ như không có gì xảy ra khi thử mã của bạn trong bảng điều khiển firefox: /

@BenH Đó là lý do tại sao có bản demo jsfiddle.
kelunik

đã không nhìn thấy nó. cảm ơn


1

Chế biến.js, 86 - 20 = 66

... nhưng nó cũng từ từ mờ dần (mặt đất hấp thụ mưa, một cách tự nhiên). Điểm cho điều đó?

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

Các tính năng thưởng bao gồm khác nhau giữa màu xanh lục và màu xanh lam (rõ ràng là mưa 'thành phố' bẩn).

Ngoài ra, tôi rất hài lòng rằng tôi đã sử dụng hack JavaScript ở đây; Lưu ý rằng, bởi vì đây là xử lý. js , bạn có thể ném vào những thứ như việc kê khai typeless của g = 99, hoặc bí danh của rcho random(bí danh cross-language!).

Bất kỳ ý tưởng khác để giảm thiểu?

Phiên bản dễ đọc:

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
}

Toàn bộ điều có thể được xem ở đây .

... cộng với một phiên bản khác không phai: 58 - 20 = 38

Nếu bạn không thích phai màu và không bận tâm đến bụi bẩn xám:

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

1

Tcl / Tk, 139 - 20 = 119

Sử dụng lại câu trả lời của riêng tôi http://codegolf.stackexchange.com/a/143018/29325

Phải được chạy trong vỏ tương tác

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}

Thật không may, chuyển đổi expr int(rand()*thành một proctập lệnh có thêm một byte!

nhập mô tả hình ảnh ở đây

Để dừng lại, người ta chỉ cần nhấp vào nút "X" không hiệu quả.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.