เม็ดฝนกำลังตกลงมาบน ... แว่นของฉัน


23

ฉันอาศัยอยู่ในสหราชอาณาจักรที่ซึ่งฝนตก มาก. ฉันยังมีความจำเป็นโชคร้ายที่ต้องสวมแว่นตาเพื่อดูซึ่งหมายความว่าเมื่อฝนตก (ตามที่เป็นอยู่ในปัจจุบัน) ฉันแทบจะไม่สามารถมองเห็นพวกเขาได้ ความท้าทายนี้คือเพื่อให้คุณทุกคนได้สัมผัสเหมือนกัน!

งาน

เอาท์พุทแว่นตา ASCII ศิลป์พร้อมหยดน้ำที่เพิ่มในแต่ละวินาที

อินพุต

ไม่มี

เอาท์พุต

คู่ของแว่นตากับหยดน้ำบนพวกเขา

แว่นตา

 ________________________
|          /__\          |
|         /    \         |
|        /      \        |
\_______/        \_______/

เม็ดฝน

.น้ำฝนจะแสดงโดย หยดน้ำฝนจะถูกวางแบบสุ่มบนเลนส์ของแว่นตา ดังนั้นเมื่อวางสายฝนแว่นตาอาจมีลักษณะเช่นนี้

 ________________________
|          /__\          |
|    .    /    \         |
|        /      \        |
\_______/        \_______/

หากวางไว้ในพื้นที่ว่าง ( ) .จะถูกวางไว้บนภาพ หากวางไว้บนสี่เหลี่ยมที่มีหยดน้ำฝนอยู่

ขั้นตอนในการหยดคือ

  • ไม่มีหยดวาง:
  • วาง 1: .
  • 2 หยดวาง: o
  • 3 หยดวาง: O
  • วาง 4+ หยด: @

กฎระเบียบ

  • รูปภาพควรมีลักษณะเหมือนอยู่ในสถานที่ ซึ่งหมายความว่าคุณสามารถล้างหน้าจอหรือพิมพ์บรรทัดใหม่เพื่อ "ล้าง" หน้าจอได้ คุณไม่สามารถส่งคืนรายการขั้นตอนได้ ขออภัยเกี่ยวกับเรื่องนี้ แต่คุณควรจะสามารถแก้ไขได้
  • เมื่อแสดงบรรทัดใหม่เพื่อ "ล้าง" หน้าจอคุณต้องมีบรรทัดใหม่อย่างน้อย 3 บรรทัดระหว่างแว่นตา
  • โค้ดจะทำงานจนกว่าแว่นตาจะเต็มไปด้วยหยดที่จบการศึกษาอย่างเต็มที่เช่นจนกว่าผลลัพธ์จะเป็นดังนี้:
     ________________________
    | @@@@@@@@@@ / __ \ @@@@@@@@@@ |
    | @@@@@@@@@ / \ @@@@@@@@@ | |
    | @@@@@@@@ / \ @@@@@@@@ | |
    \ _______ / \ _______ /
  • รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ

" รหัสทำงานจนกว่าแว่นตาจะเต็มไปด้วยหยดที่จบการศึกษาอย่างเต็มที่ " บางทีอาจระบุเวลาพัก / รอโดยประมาณ? เช่น 150 หรือ 250 ms
Kevin Cruijssen

2
รหัสต้องหยุดเมื่อแว่นตาดูเหมือนผลลัพธ์สุดท้ายหรือสามารถทำงานต่อไปได้ แต่จะไม่มีผลอะไรเลยหรือ
TheLethalCoder

@TheLethalCoder ฉันจะจินตนาการจนกว่าแว่นตาจะเต็มตามที่เขียนไว้ในข้อมูลจำเพาะ: v
Jenkar

การตกแบบสุ่มของ Droplet จะต้องลดลงแบบสุ่มบนเลนส์แม้ในส่วนของบิตของเลนส์ที่@ใช่ไหม?
Jenkar

@TheLethalCoder มันควรจะจบลงหลังจากที่ทุกคนจบการศึกษาแล้ว
caird coinheringaahing

คำตอบ:


11

JavaScript (ES6), 269 267 265 ไบต์

document.write('<pre id=o>')
a=[...` _8_8_8
| 9 /__\\  9|
| 9/ 4\\ 9|
| 8/ 6\\ 8|
\\_7/ 8\\_7/`.replace(/.\d/g,s=>s[0].repeat(s[1]))]
s=" .oO@@"
g=_=>o.innerHTML=a.join``
f=(i=s.indexOf(a[j=Math.random()*a.length|0])+1)=>i?g(a[j]=s[i]):f()
g()
setInterval(f,1e3)

แก้ไข: บันทึกแล้ว2 4 ไบต์ขอบคุณ @Shaggy


3
มีบางอย่างผิดพลาดที่มุมบนซ้าย
J42161217

-1 เพราะถูกบั๊ก (ดูความคิดเห็นของเจนนี่)
เลมอนที่ถูกทำลายได้

1
@DestructibleLemon ขออภัยด้วยฉันถูกกัดด้วย "ฟีเจอร์" ของคลิปบอร์ดของ Firefox ... น่าจะโอเคเลย
Neil

บันทึกคู่ของไบต์ที่มีinnerTextแทนtextContentและแทนsearch indexOfและอีกสองสามเพียงแค่ใช้<pre id=oเป็น HTML แทนที่จะใช้document.writeมัน
Shaggy

1
@Shaggy พบที่ดีขอบคุณ!
Neil

5

Java 8, 449 421 ไบต์

v->{String q="########",g=" ________________________\n|##"+q+"/__\\##"+q+"|\n|#"+q+"/    \\#"+q+"|\n|"+q+"/      \\"+q+"|\n\\_______/        \\_______/\n\n\n";for(int t=0,n,x;g.matches("(?s).*[#\\.oO].*");Thread.sleep(150)){for(;(x=g.charAt(n=(int)(Math.random()*g.length())))!=35&x!=46&x!=111&x!=79;);if(t++>0)g=g.substring(0,n)+(x<36?".":x<47?"o":x<80?"@":"O")+g.substring(n+1);System.out.println(g.replace('#',' '));}}

คำอธิบาย:

ลองที่นี่ ( Thread.sleepถูกลบเพื่อให้คุณเห็นผลทันที)

v->(){                      // Method without empty unused parameter and no return-type
  String q="########",g=" ________________________\n|##"+q+"/__\\##"+q+"|\n|#"+q+"/    \\#"+q+"|\n|"+q+"/      \\"+q+"|\n\\_______/        \\_______/\n\n\n";
                            //  The glasses (with inner spaces replaced by '#')
  for(int t=0,n,x;          //  Index integers
      g.matches("(?s).*[#\\.oO].*");
                            //   Loop (1) as long as the glasses still contain "#.oO"
      Thread.sleep(150)){   //   And sleep 150ms after each iteration to give the animation
    for(;                   //   Inner loop (2)
         (x=g.charAt(n=(int)(Math.random()*g.length())))!=35&x!=46&x!=111&x!=79;
                            //    To find the next '#', '.', 'o' or 'O' randomly
    );                      //   End of inner loop (2)
    if(t++>0)               //   Flag so it prints the initial glasses without a raindrop
      g=g.substring(0,n)+(x<36?".":x<47?"o":x<80?"@":"O")+g.substring(n+1);
                            //    Add a raindrop on this random position
    System.out.println(g    //   And print the glasses
        .replace('#',' ')); //   After we've replaced '#' with spaces
  }                         //  End of loop (1)
}                           // End of method

เอาท์พุท:

หมายเหตุ: จุดต่างๆนั้นค่อนข้างแปลกใน gif แต่นั่นเป็นปัญหาใน ScreenToGif.exe ของฉัน ..
enter image description here


1
คุณรู้ว่าสิ่งที่ทำให้ฉันประหลาดใจจุดแปลก ๆ เหล่านั้น (เช่นเดียวกับการลดขนาดลง") ดูเหมือนจริง ๆ มีหยดน้ำที่ด้านบนของหน้าจอของฉัน
Khaled.K

1
สิ่งนี้ไม่ได้พิจารณาถึงความเป็นไปได้ที่จะมีการตกลงบน @: v
Jenkar

@Jenkar นั่นเป็นครั้งที่สองที่คุณพูดถึงคำตอบ โปรดอธิบายสิ่งที่คุณหมายถึง
caird coinheringaahing

@RandomUser โดยพื้นฐานแล้วรหัสปัจจุบันในคำตอบนี้จะมองหาจุดที่ยังไม่เป็น @ ที่จะตกลงไปแทนที่จะตกบนเลนส์แบบสุ่มแม้ว่าจะเป็นที่ ข้อกำหนดในข้อกำหนด "4+" ดูเหมือนว่าบ่งบอกว่านี่ไม่ใช่กรณีที่ต้องไป แต่ควรใช้เลนส์แบบสุ่มแทนซึ่งรวมถึง @ นี่ไม่ใช่การตีความที่ถูกต้องหรือไม่
Jenkar

@Jenkar มันไม่สำคัญว่ามันจะทำอย่างไรเพียงแค่ทำโดยไม่ละเมิดกฎหรือช่องโหว่มาตรฐาน ฉันไม่เคยพูดว่า "ต้องมีการแจกแจงแบบสุ่มสม่ำเสมอ" ในคำถามดังนั้นคำตอบนี้ใช้ได้
caird coinheringaahing

3

F # ไม่ใช่แบบเรียกซ้ำ 379 414 404 ไบต์

open System
let z=String.replicate
let mutable s,d=z 54" ",new Random()
while Seq.exists((<>)'@')s do printfn" %s\n|%s/__\\%s|\n|%s/    \\%s|\n|%s/%7s%s|\n\\_______/%9s_______/\n\n"(z 24"_")(s.[..9])(s.[10..19])(s.[20..28])(s.[29..37])(s.[38..45])"\\"(s.[46..53])"\\";Threading.Thread.Sleep(1000);d.Next54|>fun i->s<-(s.[i]|>function|' '->"."|'.'->"o"|'o'->"O"|_->"@")|>(fun c->s.Remove(i,1).Insert(i,c))

ลองออนไลน์!

  • -7 ไบต์ขอบคุณ @vzwick
    • โดย aliasing String.replicate
    • โดยเปิดระบบแทนการอ้างอิงทุกครั้ง
  • -3 ไบต์โดยการลดขณะที่วนเป็นหนึ่งบรรทัด

ฉันรักหลักฐานของความท้าทายนี้ :)

และขอขอบคุณสำหรับไส้เดือน

F #, 406 441 438 437 423 ไบต์

open System
let z=String.replicate
let s,d=z 54" ",new Random()
let rec(!)s=s="";printfn" %s\n|%s/__\\%s|\n|%s/    \\%s|\n|%s/%7s%s|\n\\_______/%9s_______/\n\n"(z 24"_")(s.[..9])(s.[10..19])(s.[20..28])(s.[29..37])(s.[38..45])"\\"(s.[46..53])"\\";Threading.Thread.Sleep(1000);if Seq.exists((<>)'@')s then d.Next 54|>fun i-> !((s.[i]|>function|' '->"."|'.'->"o"|'o'->"O"|_->"@")|>(fun c->s.Remove(i,1).Insert(i,c)))else()
!s

ลองออนไลน์!

  • -3 ไบต์โดยการ จำกัด s กับสตริงโดยเปรียบเทียบกับสตริง
  • -1 ไบต์ชื่อฟังก์ชั่นตอนนี้ "!" ประหยัดพื้นที่เดียวเมื่อโทรมัน
  • -7 ไบต์ขอบคุณ @vzwick
    • โดย aliasing String.replicate
    • โดยเปิดระบบแทนการอ้างอิงทุกครั้ง
  • -1 ไบต์ไม่ต้องใช้วงเล็บในการโทร d.Next
  • -6 ไบต์ตอนนี้ฟังก์ชั่นหนึ่งบรรทัด

คำอธิบาย

open System
let z = String.replicate    // define alias
let s, d = z 54 " ", new Random() // s holds a flat representation of the glasses.. glasses
let rec(!) s =
    s=""; // type s to string
    printfn" %s\n|%s/__\\%s|\n|%s/    \\%s|\n|%s/%7s%s|\n\\_______/%9s_______/\n\n"
        (z 24 "_")     // top of the glasses
        (s.[..9])      // slice
        (s.[10..19])   // and
        (s.[20..28])   // dice
        (s.[29..37])   // the
        (s.[38..45])   // glasses
        "\\"           // \ gets prepended with 6 spaces thanks to %7s
        (s.[46..53])
        "\\";          // same deal, just 8 spaces this time
    Threading.Thread.Sleep(1000);
    if Seq.exists((<>)'@') s then // if not everything's totally covered
        d.Next 54                 // get new random int < 54 (string has indices 0-53)
        |> fun i->                // passing is shorter than a let binding, saves two spaces and a new line
            !(                    // call the function again with new drop on glasses
              (s.[i]              // get part of the glasses drop fell on
              |>function
              |' '->"."           // promote drop
              |'.'->"o"
              |'o'->"O"
              |_->"@")
              |>(fun c-> s.Remove(i,1).Insert(i,c))) // and insert this in the string
    else ()
!s

คุณสามารถบันทึก 1 ถ่านโดยopen SystemและลบSystemจากRandom()และThreading.Thread.Sleep()โทร;)
vzwick

ตัวละครอีกสองสามตัวถูกโกน: tio.run/##TZDfa4NADMff/ …
vzwick

@vzwick ขอบคุณ :) พบอีกไม่กี่ไบต์ในขณะที่ฉันกำลังแก้ไข
Brunner

2

Python 2, 365 328 ไบต์

มันค่อนข้างดีกว่า ...

import time,random
g=' '+'_'*24+r"""
|xxX/__\Xxx|
|xX/    \Xx|
|X/      \X|
\_______/        \_______/""".replace('X','x'*8)
while 1:
 print'\n'*3+g.replace('x',' ')
 s='x.oO@@'
 if all(c not in g for c in s[:-2]):exit()
 i,c=random.choice([(i,s[s.index(j)+1])for i,j in enumerate(g)if j in s])
 g=g[:i]+c+g[i+1:]
 time.sleep(1)

ลองออนไลน์

ลิงค์ด้านบนใช้ 30 บรรทัดแทน 3 แต่คุณสามารถดูได้ด้วย 3 หากคุณปรับขนาดหน้าต่างเบราว์เซอร์ให้มีขนาดเล็กในแนวตั้ง เปลี่ยนtime.sleep(1)เป็นtime.sleep(.1)ความเร็ว 10x


2

C, 313 309 305 304 ไบต์

จำเป็นต้องเล่นกอล์ฟสักหน่อย

c;f(r,q){for(char*m=" ________________________\n|**********/__\\**********|\n|*********/    \\*********|\n|********/      \\********|\n\\_______/        \\_______/\n";c<216;r=rand()%144,m-=135)for(system("clear");*m++;putchar(*m^42?*m:32))q=--r?*m:*m^42?*m^46?*m^111?*m^79?*m:64:79:111:46,c+=q!=*m,*m=q;}

ฉันรันด้วย stub ทดสอบต่อไปนี้

main()
{
    srand(time(0));    
    f();
}

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


2

Ruby , 237 224 228 218 206 198 197 ไบต์

g=" #{?_*24}
|x##/__ax##|
|x#/    ax#|
|x/      ax|
a#{u=?_*7}/xa#{u}/


".gsub ?x,?#*8;217.times{|t|puts g.tr('#a',' \\');()while t<216&&g[x=rand*106]!~/[#.oO]/;g[x]=g[x].tr '#.oO','.oO@';sleep 1}

ลองออนไลน์!

คำตอบก่อนหน้านี้ผิดมันไม่ได้คำนึงถึงน้ำฝนที่ตกลงบน @เห็นได้ชัดว่าไม่ใช่ข้อกำหนด บันทึกบางไบต์

สิ่งนี้สิ้นสุดลงโดยมีข้อผิดพลาดเกิดขึ้น แต่สิ่งนี้จะสิ้นสุดลงทันทีที่พิมพ์แว่นตาเต็ม

  • บันทึก 13 ไบต์ด้วยการพิมพ์ลงในแลมบ์ดาและเปลี่ยนการมอบหมายให้ใช้ tr (duh)
  • การสูญเสีย 8 ไบต์ด้วยความต้องการ 1 วินาที
  • รับ 10 ไบต์โดยใช้เคล็ดลับ gsub แทนการแก้ไข (เห็น & ดัดแปลงจากคำตอบ Python ของ mbomb007 )
  • 12 ไบต์ได้รับจากการลบการพิมพ์แลมบ์ดาตอนนี้ซึ่งการพิมพ์จะถูกเขียนเพียงครั้งเดียว>.>
  • รับ 1 ไบต์โดยทำทุกอย่างให้\\ถูกaแล้วเปลี่ยนกลับเข้าไปในทีอาร์
  • ได้รับ 7 ไบต์โดยใส่การเปลี่ยนแปลงช่องว่างในบรรทัดสุดท้ายกับอีกx(duh) ในกรณีที่บางส่วนของพวกคุณสงสัยว่าทำไมนี้ไม่ได้ส่งผลกระทบต่อวงหลัก: xวงหลักไม่ได้พิจารณาบรรทัดสุดท้ายในการกำหนดของมัน
  • กำไร 1 ไบต์โดยการลบที่ส่วนท้ายของส่วนบนของแว่นตา

Yay <200 ไบต์: D

Gif:

Gif


3
สำหรับการอ้างอิงในอนาคตคุณสามารถแก้ไขคำตอบก่อนหน้าของคุณเป็นคำตอบที่ใช้แทนการลบและเพิ่มคำตอบใหม่ได้
TheLethalCoder

คุณสามารถเพิ่ม gif ของการทำงานนี้หรือไม่?
caird coinheringaahing

@RandomUser เรียบร้อยแล้ว
Jenkar

1

Bash, 576 510 429 416 Bytes

j()(IFS=
printf "$*")
for i in {53..0};{ a[$i]= 
b[$i]=@;}
while(($i == 0));do clear
echo  " ________________________
|`j ${a[@]::10}`/__\\`j ${a[@]:10:10}`|
|`j ${a[@]:20:9}`/    \\`j ${a[@]:29:9}`|
|`j ${a[@]:38:8}`/      \\`j ${a[@]:46}`|
\_______/        \_______/"
[ `j ${a[@]}` = `j ${b[@]}` ]&&{
i=1
}
sleep 1
d=`shuf -i0-53 -n1`
c=${a[$d]}
case $c in  )a[$d]=.;;.)a[$d]=o;;o)a[$d]=0;;0)a[$d]=@;esac
done

ว้าวเล่นกอล์ฟเยอะมาก หากใครมีความคิดในการเล่นกอล์ฟต่อไปฉันเปิดรับข้อเสนอแนะ

ลองด้วยตัวเอง! มันมีความเห็นการนอนหลับเพราะการ จำกัด 60 วินาที

นี่คือ gif:

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



0

Mathematica, 438 ไบต์

f=Flatten;p=Print;z=32;q=95;l=124;t=Table;v=z~t~8;s={f@{z,q~t~24,z},f@{124,z~t~10,47,q,q,92,z~t~10,l},f@{l,z~t~9,47,z~t~4,92,z~t~9,l},f@{l,v,47,z~t~6,92,v,l},f@{92,q~t~7,47,v,92,q~t~7,47}};c=0;Monitor[While[c<54,a=s[[i=RandomInteger@{2,4},j=RandomChoice[Range[2,13-i]~Join~Range[14+i,25]]]];If[a==z,s[[i,j]]=46,If[a==46,s[[i,j]]=111,If[a==111,s[[i,j]]=48,If[a==48,s[[i,j]]=64]]]];c=Count[Flatten@s,64];Pause@1],Column@FromCharacterCode@s]

นี่คือผลความเร็ว 10 เท่า gif

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


ไม่เคยใช้ Mathematica แต่คุณสามารถมอบหมายให้ Table , 95และ32?
caird coinheringaahing

เช่นเดียวกับใน t=Table x = 32และy = 95?
caird coinheringaahing

ใช่แน่นอน ฉันเล่นกอล์ฟมากตั้งแต่เมื่อวาน
J42161217

คุณอาจลบได้ 6 ไบต์โดยแทนที่ครั้งสุดท้ายFlattenด้วยf?
caird coinheringaahing

0

PHP, 262 254 ไบต์

for($t=" 8_8_8_
|Y9Y/__\Y9Y|
|9Y/4 \9Y|
|8Y/6 \8Y|
\\7_/8 \\7_/";$c=$t[$i++];)$s.=$c<1?$c:str_repeat($t[$i++],$c);for(;$c=$s[++$k];)$c!=Y?:$s[$m[]=$k]=" ";for(;$u<216;print str_pad($s,999,"
",sleep(1)))$u+=($c=".oO@"[$a[$p=rand(0,53)]++])&&$s[$m[$p]]=$c;

ทำงานด้วย-nRหรือลองออนไลน์

ทำให้พังถล่ม

# prep 1: generate template from packed string
for($t=" 8_8_8_\n|Y9Y/__\Y9Y|\n|9Y/4 \9Y|\n|8Y/6 \8Y|\n\\7_/8 \\7_/";
    $c=$t[$i++];)$s.=$c<1?$c:str_repeat($t[$i++],$c);
# prep 2: map substituted spaces and replace with real spaces
for(;$c=$s[++$k];)$c!=Y?:$s[$m[]=$k]=" ";
# loop until glasses are fully wet:
for(;$u<216;
    # 4. print glasses prepended with 865 newlines
    print str_pad($s,999,"\n",
    # 3. wait 1 second
        sleep(1)))
    $u+=($c=".oO@"[
        $a[$p=rand(0,53)    # 1. pick random position
        ]++])               # 2. and increment
        &&$s[$m[$p]]=$c         # if not fully wet, graduate drop
    ;                           # and increment drop count ($u+=)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.