มันเป็นวันที่ฝนตก


42

บริบท

มันเป็นวันวาเลนไทน์ เพียงคนเดียวที่คุณเคยรักซ้ายคุณเมื่อวานนี้สำหรับผู้ชายคนนี้เธอมักจะพบว่า"โง่และไม่น่าทึ่ง" ระหว่างทางกลับบ้านคุณติดอยู่กับการจราจรฟังเพลงเก่า ๆ ทางวิทยุฝนที่ตกกระทบกระจกหน้ารถก็กำลังสั่นไหวอยู่ หลังจากอยู่ครู่หนึ่งในรถของคุณคุณพบว่าตัวเองอยู่คนเดียวในอพาร์ทเมนต์ขนาดเล็กของคุณไม่สามารถคิดอะไรอื่นนอกจากเธอ ไม่มีแสงสว่างและคุณจ้องมองรางหน้าต่างเพื่อให้ความมืดล้อมรอบคุณ ไม่มีใครพูดคุยกับเพื่อนของคุณตอนนี้หายไปนานแล้วหลังจากเตือนคุณเกี่ยวกับผู้หญิงคนใหม่นี้หลอกหลอนจิตใจของคุณ คุณเปิดคอมพิวเตอร์ของคุณเพราะมันเป็นเพียงสิ่งเดียวที่คุณทำได้เปิดเบราว์เซอร์ของคุณและโพสต์ปริศนาการเขียนโปรแกรมใหม่ไปที่ stackexchange เพื่อพยายามเปลี่ยนใจ

ท้าทาย

เขียนโปรแกรมในภาษาที่คุณเลือกจำลองสายฝนที่ตกลงบนพื้น เอาต์พุตสามารถประกอบด้วยอักขระ ASCII หรือเรนเดอร์ 2D / 3D กล้องได้รับการแก้ไข: คุณกำลังมองตรงไปที่พื้น โปรแกรมของคุณจะต้องมีภาพเคลื่อนไหวบางประเภทเช่นการรีเฟรชคอนโซลหรือหน้าเว็บทุกครั้งที่คุณสร้าง "เฟรม" ใหม่ มันต้องเป็นจริงฉันรู้ว่ามันเป็นอัตวิสัยเล็กน้อย แต่สมมุติว่าคุณไม่สามารถเติมเต็มพื้นด้วยการหยดครั้งใหญ่เพียงครั้งเดียว

ผลลัพธ์ไม่จำเป็นต้องเป็นภาพ แต่ถ้าคุณใช้ภาษาที่มีความลับจะเป็นการดีกว่าที่จะให้. gif เพื่อแสดงให้เห็นว่ามันทำงานอย่างไร (แต่แน่นอนว่ามันจะไม่ส่งผลกระทบต่อคะแนนของคุณหากคุณไม่ทำ)

กฎระเบียบ

  • คะแนนของคุณคือจำนวนไบต์ที่ใช้ทั้งหมด
  • -20 คะแนนถ้าคุณใช้สี
  • -50 ถ้าคุณประสบความสำเร็จในการแสดงลมบางอย่าง
  • คะแนนต่ำสุดชนะ

ตัวอย่าง

ตัวอย่างพื้นฐานของสิ่งที่ควรแสดงผล:

ฉันหวังว่าคุณจะทำได้ดีขึ้นและสนุกไปกับความท้าทายนี้

ขออภัยในภาษาอังกฤษของฉันอย่าลังเลที่จะแก้ไขโพสต์ของฉันหากคุณต้องการแก้ไขข้อผิดพลาด

กระดานผู้นำ

หากชื่อของคุณไม่อยู่ในรายการนั่นเป็นเพราะความพยายามของคุณได้รับการพิจารณาว่าไม่เหมาะสมกับกฎ

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

ขอแสดงความยินดีกับโทเบีย!


51
ฉันหวังเป็นอย่างยิ่งว่าย่อหน้าแรกไม่ใช่เรื่องจริง
Kendall Frey

1
@ DavidCarraher ใช่เหมือนคุณอยู่บนท้องฟ้ามองไปที่พื้น

8
ฉันไม่คิดว่านี้ควรจะเป็นรหัสกอล์ฟเป็นมีความเอื้อเฟื้อเผื่อแผ่มากเกินไปในการแสดงผลที่อาจเกิดขึ้น
Cruncher

4
ย่อหน้าแรกพร้อมกับตำแหน่งกล้องสำหรับการแสดงผลนี้ค่อนข้างน่ากลัว
เบีย

คำตอบ:


26

APL, 105 ตัวอักษร / ไบต์ * - 20 - 50 = 35 คะแนน

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

*: การใช้งาน APL ส่วนใหญ่สนับสนุนรูปแบบของชุดอักขระไบต์เดียว (ดั้งเดิม) ที่จับคู่สัญลักษณ์ APL กับค่า 128 ไบต์บน ดังนั้นเพื่อจุดประสงค์ในการเล่นกอล์ฟโปรแกรมที่ใช้อักขระ ASCII และสัญลักษณ์ APLเท่านั้นจึงจะได้คะแนนเป็น chars = bytes

ฉันทดสอบกับapl.js ล่าสุดของ Nickบน Node.js ในเทอร์มินัล OS X แต่ฉันไม่ได้ใช้อะไรเฉพาะกับภาษาถิ่นของเขาดังนั้นควรทำงานกับ APL ที่ทันสมัยใด ๆ ที่สามารถเรียกใช้บนเทอร์มินัล ANSI และสนับสนุน d-funs {...}, การกำหนดสาระ(a b)←...และการเดินทางเช่น Dyalog สำหรับ Linux หรือ Raspberry PI ( ด้วย⎕IO←0)

ในบรรทัดที่ 1 เป็นตัวหนีตัวอักษร (ซึ่งเป็น 1 ไบต์) คุณสามารถป้อนข้อมูลโดยใช้Ctrl-V Escในเทอร์มินัล Linux หรือ Vim หรือสิ่งที่ควรจะเป็นAlt-027ใน Windows นอกจากนี้ฉันไม่พบวิธีที่เชื่อถือได้ในการค้นหาขนาดเทอร์มินัลดังนั้นคุณอาจต้องการแก้ไขจำนวนแถวและคอลัมน์ที่ส่วนท้ายของบรรทัดสุดท้าย

ฉันปกป้องโบนัส 50 อันจากข้อเท็จจริงที่ว่าน้ำฝนแต่ละหยดผ่านรูปร่างต่อไปนี้: ⍟∘.ซึ่งให้ความรู้สึกถึงสายลมที่พัดลงมาเล็กน้อยเนื่องจากฉากนั้นกำลังถูกมองจากด้านบน ในความเป็นจริงเมื่อดูที่ gif ด้านล่างคุณควรได้รับความประทับใจว่าการตกแต่ละครั้งจะค่อยๆเคลื่อนลงและไปทางซ้ายก่อนที่จะหายไปบนพื้น

เวอร์ชันที่ไม่ถูกปรับแต่ง:

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

เอาท์พุท:

ป้อนคำอธิบายรูปภาพที่นี่


APL สไตล์ที่แตกต่าง

ออกจากการแข่งขัน

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

ที่นี่เป้าหมายของฉันคือการให้ความประทับใจกับเม็ดฝนที่ตกลงมาด้วยความลาดเอียงและสะสมบนพื้นดินในขณะที่พยายามรักษาจำนวนหยดที่มองเห็นได้โดยเฉลี่ย เคล็ดลับคือการสร้างจำนวนหยด/ที่ตกลงมาใหม่ในทุก ๆ รอบและมีการตกลงมา "ลบ" ใด ๆ ที่พวกเขาเดินทางข้าม

ผลที่ได้คือเตือนความทรงจำที่แปลกประหลาดของรหัสเมทริกซ์

เอาท์พุท
(กระตุกทุก 5 วินาทีคือการวนลูป gif)

ป้อนคำอธิบายรูปภาพที่นี่


นี่เป็นสิ่งที่ดี แต่ฉันไม่คิดว่าตัวละคร ESC กำลังถูกพิมพ์อยู่ i.stack.imgur.com/vLERQ.pngฉันลองวางรหัสด้วย gedit ด้วยไม่ได้ผล
Riking

คุณทำผิดคะแนน คำถามบอกว่า "bytes" ไม่ใช่ "chars"
jazzpi

1
@Riking ฉันแก้ไขส่วนนั้น หากคุณลองอีกครั้งมันควรจะทำงาน
Tobia

@Tobia แสดงภาพของคุณนั่งที่ IBM 5100 ของคุณและฉันจะซื้ออาร์กิวเมนต์ chars = bytes
primo


42

Bash: 111 ไบต์ - 20 = 91 คะแนน!

ละอองฝนที่อ่อนโยนครุ่นคิดในเครื่องของคุณ ปรับตัวเลข 819 และ 41 สำหรับความสูงและความกว้างที่แตกต่างกันตามลำดับ

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

ภาพหน้าจอ

โบนัสที่น่าพึงพอใจคือวิธีที่เคอร์เซอร์เคลื่อนตัวไปตามพื้นที่ฝน

แก้ไข: ย่อจาก 140 ไบต์เป็น 129 ไบต์ด้วยคำแนะนำของ @ manatwork การแก้ไขที่สอง: การย่อจาก 129 ไบต์เป็น 111 ไบต์ขอบคุณคำแนะนำของ @ manatwork และ @ Tobia รวมถึงแรงบันดาลใจเพิ่มเติม - ดูความคิดเห็น

(หมายเหตุ: สกรีนชอตแสดงรหัสเวอร์ชันที่ไม่ตีกอล์ฟก่อนหน้านี้ซึ่งเหมือนกันกับการใช้งาน)


1
คุณสามารถสำรอง: 2 ตัวอักษรโดยเข้าร่วมechoตัวเลือกของ; 2 ตัวอักษรโดยใช้\eแทน\033; 3 ตัวอักษรโดยใช้:แทนtrue; 5 ตัวอักษรโดยใช้การประเมินผลทางคณิตศาสตร์ ( ):((…)) 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
จัดการ

1
คุณไม่จำเป็นต้องใช้เครื่องหมายภายในการประเมินผลทางคณิตศาสตร์ และจะต้องมีการขึ้นบรรทัดใหม่ที่ท้ายรหัสของคุณ ควรมีเพียง 127 ตัวอักษร
จัดการ

1
ฉันเชื่อว่า @manatwork หมายถึงว่าคุณไม่จำเป็นต้องใช้เครื่องหมายดอลลาร์ในวงเล็บคู่: ((RANDOM<9))ทำงานได้ดี นอกจากนี้คุณสามารถลองลดขนาดโค้ดของคุณโดยรวมทั้งสองเข้าด้วยกัน{0..19}และรวม{0..40}เข้าด้วย{0..819}กันโดยใช้บางอย่างที่$((i%41))อยู่ภายใน
เบีย

1
มีคนหยุดฉัน !! e='printf \e'2 ถ่านสั้นกว่าe='echo -ne \e'!
เบีย

1
และตัดแต่งอีกอักขระโดยใช้$e[C
เบีย

39

Python 312 ไบต์ - 50 (ลม) = 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

ตัวอย่างเอาต์พุต (ลูป 50 เฟรม):

playpack ที่เกิดขึ้นจริงนั้นเร็วกว่า gif ที่อนุญาตอย่างมาก


3
@ CristianCareaga ฉันทำได้ แต่ฉันคิดว่าสีขาวดูดีขึ้น
Primo

8
ปัญหาเดียวในสายตาของฉัน: คุณกำลังดูสายฝนจากด้านข้างในขณะที่กฎระบุกล้องคงที่มองลงมา
Johannes H.

7
@JohannesH หรือเป็นวันที่ลมแรงมาก
primo

20
ฉันชอบแสงฟ้าผ่าเป็นครั้งคราว! : P
The Guy with The Hat

3
อักขระหนึ่งตัวถูกบันทึกโดยใช้R=__import__("random").randintแทนfrom random...บรรทัด
SimonT

35

HTML / JS, 170 ตัวอักษร - 20 = 150 คะแนน

<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: แข็งแรงเล่นกอล์ฟต่อไปโดยผ่านสตริงsetInterval, withชื่อตัวแปรอัตโนมัติ ID ... มันให้ความรู้สึกที่ไม่ถูกต้องดังนั้น! สั่น )

มันแค่ลากสี่เหลี่ยมสีน้ำเงินสุ่ม

HTML / JS, 309 ตัวอักษร - 20 - 50 = 239 คะแนน

ตอนนี้มีลม!

<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 ไบต์: <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! ฉันใช้with! ฉันรู้สึกสกปรกกว่าส่งเชือกไปที่setInterval: p
Niet the Dark Absolute

@NiettheDarkAbsol ขอบคุณ;) ดูเหมือนว่า (บน Chrome อย่างน้อย) canvasไม่สามารถปิดอัตโนมัติได้ (นอกจากนี้การใช้ชื่อตัวแปร ID อัตโนมัติก็รู้สึกสกปรกเช่นกัน: D)
Doorknob

เบราว์เซอร์บางคนดูเหมือนผ่อนปรนมากขึ้นในพื้นที่นั้น ... onloadแต่มันหลีกเลี่ยงไม่ต้องใช้ ฉันต้องบอกว่าฉันชอบวิธีของ @ Florent ในการหลีกเลี่ยงการซ้ำซ้อนMath.random()
Niet the Dark Absolut

@Doorknob canvasปิดอัตโนมัติใน Chrome! คำตอบของฉันถูกพัฒนา / ทดสอบในเบราว์เซอร์นี้
Florent

1
โหวตขึ้นอันดับสองด้วยการหยดลงสู่พื้น / แอ่งน้ำ
GreenAsJade

34

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

คัดลอก / วางบรรทัดนั้นในคอนโซลของเบราว์เซอร์ (โดยทั่วไปกดแป้น 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)

หัวใจสีแดงที่มีชีวิตชีวาทำให้ฝนตกในวันวาเลนไทน์!

ป้อนคำอธิบายรูปภาพที่นี่


1
มันไม่เหมือนจริง หัวใจมาจากด้านบนของหน้าจอและติดตำแหน่งสุ่มของหน้า ที่ไม่ตรงกับเงื่อนไขของมุมมองจริงๆ

10
AUGGGGHH! ฉันจะหยุดมันได้อย่างไร!
The Guy with The Hat

1
@ user2509848 แต่มีวิธีอื่นอีกไหม?
The Guy with The Hat

3
@TheGuywithTheHat โหลดหน้าซ้ำ
Michael M.

19
ยอดเยี่ยม! ฉันคิดว่านี่เป็นหัวใจของคำถาม
andrewb

26

มาติกา

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

รูปทรงน้ำฝนทำผ่านโครงร่างการปฏิวัติรอบแกน z

ในขั้นต้นฝนจะถูกสร้างขึ้นสำหรับภูมิภาคท ลักษณะของฝนที่ตกลงมาสามารถทำได้โดยเลื่อนจุดชมวิวขึ้นไปตามแกน z (มีประสิทธิภาพมากกว่าการคำนวณตำแหน่งของน้ำฝนแต่ละครั้ง)

ฝน

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]

กับลม

มีค่าใช้จ่ายจำนวนมากในการทำให้ฝนตกด้วยลม แต่ฉันรวมที่นี่ต่อไป

พื้นสีน้ำเงินค่อนข้างมากทำให้มุมมอง {x, y} กักตัวอยู่ในพื้นที่ที่น่าสนใจ มีข้อบกพร่องอยู่บ้าง แต่ก็ดี

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]

กับลม


จากด้านบนโดยตรง

เม็ดฝนที่ใกล้ที่สุดนั้นถูกตัด แต่ฉันจะมองข้ามสิ่งนั้น

จากด้านบน 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]]

เลื่อนไปด้านข้างด้วยอักขระต่ำกว่า 50 ตัวและลดคะแนนของคุณ :)
Ali Caglayan

1
ฉันรักสิ่งนี้

+1 สำหรับมุมมองสุดท้ายด้วยมุมกล้องที่ถูกต้อง แต่คุณลืมว่ากล้องปิดกั้นฝนบางครั้ง .... ;)
GreenAsJade

@GreenAsJade มุมมองการคลิปสำหรับ 3D (จากด้านบน) ได้รับการแก้ไขแล้ว
DavidC

น่ารัก แต่ฉันก็ไร้สาระกว่าที่คุณคิด ฉันหมายถึงว่ามีกล้องทางกายภาพมองลงไปที่นี้ดังนั้นมันควรจะปิดกั้นเม็ดฝนบางส่วน:%)
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>

รุ่นข้อเขียน:

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

ด้วยลมแบบสุ่ม ;-)

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

เอาท์พุทในมุมมอง: ป้อนคำอธิบายรูปภาพที่นี่


6
มันไม่ผ่านเกณฑ์เนื่องจากเป็นภาพด้านข้างของฝนที่ตกลงมาและไม่ใช่ฝนที่กระทบพื้น ยังคงเป็นเอฟเฟกต์ลมที่ดี

6

กำลังดำเนินการ, 94 - 20 = 74

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

(เพิ่มบรรทัดใหม่เพื่อให้สามารถอ่านได้)

คลิกที่นี่สำหรับตัวอย่างออนไลน์


1
การประมวลผลดีมากสำหรับปัญหาเช่นนี้
cjfaure

ไม่สามารถดูได้ใน Firefox การตั้งค่าความปลอดภัยเริ่มต้นบล็อกแอปเพล็ต Java และไม่ได้บอกวิธีการแทนที่ AFAIK มีพอร์ต Processing.js เป็น JavaScript หากคุณสามารถแปลงเป็น JS และโพสต์ลิงก์ฉันจะขอบคุณ
marczellm

@marczellm ฉันใช้ Firefox 27.0 บน Ubuntu และใช้งานได้ดี คุณแน่ใจหรือไม่ว่ามีข้อความแจ้งให้ถามว่าจะอนุญาตหรือปิดกั้นปลั๊กอินหรือไม่ ฉันจะดูที่เวอร์ชัน JS ด้วย
ace_HongKong การพึ่งพากัน

@ace หลังจากที่ฉันบอกให้ promps ทั้งหมด "อนุญาต" ข้อความความปลอดภัยยังคงบล็อกมัน ขอบคุณสำหรับรุ่น JS
marczellm

1
@marczellm เพิ่มเวอร์ชัน javascript ลงในคำตอบแล้วสนุกไปกับ :) และแค่เดาว่าบางทีปลั๊กอิน Java รุ่นปัจจุบันของคุณอาจจะล้าสมัยและมีปัญหาด้านความปลอดภัยที่รู้จัก
ace_HongKongIndependence

5

ทุบตี

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

ฉันไม่แน่ใจว่านี่ควรเป็นโค้ดกอล์ฟเพราะไม่มีข้อกำหนดที่เข้มงวดเกี่ยวกับสิ่งที่ "ฝน" ต้องดูเหมือน

แก้ไข: หากคุณต้องการให้มันดูเหมือนกล้องกำลังชี้ตรงลงให้ใช้สิ่งนี้:

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

7
"กล้องได้รับการแก้ไข: คุณกำลังมองตรงไปที่พื้น" ดูเหมือนว่าจะดูฝนจากด้านข้างหรือไม่
undergroundmonorail

2
บันทึก 9 ตัวอักษร: while echo \ / / / / /;do echo / / / / /;done(หรือเพิ่มอีกสองสามฟังก์ชั่นแบบเรียกซ้ำ @undergroundmonorail ลมแรง, เส้นทแยงมุมสัมพันธ์กับกล้อง
Gilles 'หยุดชั่วร้าย'

@Gilles ในกรณีนี้เราสามารถทำได้while echo -e '\e[0;34m / / / / /';do echo / / / / /;doneและลงไปที่ -13 พร้อมโบนัส :)
undergroundmonorail

4
นั่นเป็นมลทินไม่เหมือนฝน: D
Kiwy

5
ฉันไม่คิดว่านี่น่าจะถือเป็นคำตอบ ในระยะสั้น: มันไม่สมจริง อาร์กิวเมนต์รายละเอียด: ถ้าฉันตีความคำถามได้อย่างถูกต้องฝนควรตกแบบสุ่ม (หรืออย่างน้อยหลอกแบบสุ่ม) และในระยะเวลานานการกระจายควรจะคล้ายกันต่อหนึ่งหน่วยพื้นที่ (นี่คือวิธีการทำงานของฝนใช่ไหม?) อย่างไรก็ตามในคำตอบนี้รับประกันได้ว่าจะไม่มีฝนตกถัดจากฝนหยดใด ๆ ดังนั้นถ้าเราใช้พื้นที่หน่วยเป็นพื้นที่ของตัวละครตัวหนึ่งเราจะเห็นว่า การกระจายไม่สม่ำเสมอ
ace_HongKong การพึ่งพากัน

3

Python 2.7: 195 - 20 = 175

ฉันแน่ใจว่ามีอีกมากที่สามารถทำได้ที่นี่ แต่นี่คือสิ่งที่ฉันได้รับในตอนนี้:

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)

ฉันจะโพสต์ gif ของผลลัพธ์เมื่อฉันจำได้ว่าต้องทำอย่างไร

ใช้งานได้กับ linux การแทนที่'clear'ด้วย'cls'ทำให้การทำงานบน windows แต่แล้วสี ANSI ไม่ทำงานและฉันสูญเสียโบนัส

ฉันมีอาเรย์สองตัวของสตริงอักขระหนึ่งตัวซึ่งเริ่มต้นได้ ทุก ๆ 0.05 วินาทีหนึ่งในนั้นจะถูกสุ่มเลือก.และหน้าจอจะถูกวาดใหม่

from random import*บันทึกสองตัวละครimport os,time,randomและใช้random.randint()สองครั้ง แต่ฉันไม่มั่นใจว่าเป็นวิธีที่ดีที่สุดในการเลือกเซลล์ต่อไป ฉันต้องการที่จะใช้random.choice()แต่ฉันไม่สามารถคิดถึงวิธีการเกี่ยวกับสายอักขระที่เปลี่ยนไม่ได้ซึ่งจะไม่ทำให้ตัวละครเสียมากกว่าที่บันทึกไว้


3
l=[i[:]for i in[[' ']*100]*50]เป็นต่อstackoverflow.com/a/6688361/1114687 198 - 20 = 178
n.st

โอ้ว้าวฉันไม่เคยเห็นแบบนั้นมาก่อน ถ้าฉันอ่านมันถูกต้องสัญกรณ์สไลซ์จะไม่ทำอะไรเลยนอกจากให้แน่ใจว่าเป็นรายการที่ไม่ซ้ำใคร มันเจ๋งจริงๆ! ขอขอบคุณ!
undergroundmonorail

ตอนแรกฉันพยายามl=[[' ']*100]*50แล้ว แต่เพิ่งสร้างการอ้างอิง 50 รายการในรายการองค์ประกอบ 100 รายการเดียวกันดังนั้นฉันจึงค้นหาวิธีที่สั้นที่สุดเท่าที่จะทำได้เพื่อหลีกเลี่ยงสิ่งนั้นและพบคำตอบสแต็คโอเวอร์โฟลว์ที่ลิงก์ด้านบน
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

ตัวอย่าง: http://jsfiddle.net/kelunik/5WC87/4/embedded/result/


มันมาจากมุมมองด้านข้างมันไม่ได้มีคุณสมบัติในขณะนี้

@BenH คุณถูกต้องพลาดจุดนั้นรุ่นใหม่อยู่ในคำตอบของฉันตอนนี้
kelunik

ดูเหมือนว่าไม่มีอะไรเกิดขึ้นเมื่อลองใช้รหัสของคุณในคอนโซล Firefox: /

@BenH นั่นคือเหตุผลที่มีการสาธิต jsfiddle
kelunik

ไม่เห็น ขอบคุณ

1

กำลังดำเนินการ 62 - 20 = 42

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

สร้างพิกเซลสีน้ำเงินบนพื้นหลังสีขาว การสาธิตในภาษาที่คล้ายกันมากที่นี่: https://www.khanacademy.org/cs/rain2/6172053633761280


ภาระผูกพัน +1 สำหรับความตึงเครียดที่รุนแรง
โม่

1

กำลังดำเนินการ js, 86 - 20 = 66

... แต่มันก็ค่อยๆจางหายไป (พื้นดูดซับฝนตามธรรมชาติ) คะแนนสำหรับสิ่งนั้น?

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

คุณสมบัติโบนัสรวมถึงความแตกต่างระหว่างสีเขียวและสีน้ำเงิน (มันชัดเจนว่า 'เมือง' ฝนตก)

นอกจากนี้ฉันยังยินดีเป็นอย่างยิ่งที่ฉันต้องใช้แฮ็ค JavaScript ในที่นี้ โปรดทราบว่าเพราะนี่คือการประมวลผล jsคุณสามารถโยนในสิ่งต่าง ๆ เช่นประกาศ g = 99 หรือนามแฝงของrสำหรับrandom(นามแฝงข้ามภาษา!)

ความคิดอื่น ๆ ที่จะลดขนาด?

รุ่นที่อ่านได้:

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
}

สิ่งที่ทั้งสามารถดูได้ที่นี่

... บวกเวอร์ชันอื่นโดยไม่จางหาย: 58 - 20 = 38

หากคุณไม่ชอบสีซีดจางและไม่สนใจสิ่งสกปรกสีเทา:

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

1

Tcl / Tk, 139 - 20 = 119

ใช้คำตอบของฉันเองซ้ำ http://codegolf.stackexchange.com/a/143018/29325

จะต้องทำงานในเชลล์แบบโต้ตอบ

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}

น่าเสียดายที่การแปลงexpr int(rand()*เป็นprocสคริปต์ทำให้มีหนึ่งไบต์เพิ่มขึ้น!

ป้อนคำอธิบายรูปภาพที่นี่

หากต้องการหยุดเพียงแค่คลิกปุ่ม "X" ที่ไม่มีประสิทธิภาพ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.