Hạt mưa đang rơi trên kính của tôi?


23

Tôi sống ở Anh, nơi trời mưa. Rất nhiều. Tôi cũng có nhu cầu đáng tiếc là phải đeo kính để nhìn, điều đó có nghĩa là khi trời mưa (như bây giờ), tôi hầu như không thể nhìn thấy chúng. Thử thách này là để tất cả các bạn có thể trải nghiệm như nhau!

Bài tập

Đầu ra kính nghệ thuật ASCII với một giọt nước được thêm vào mỗi giây.

Đầu vào

không ai

Đầu ra

Một cặp kính với những giọt nước trên chúng.

Kính

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

Hạt mưa

Một hạt mưa được ký hiệu là a .. Một hạt mưa được đặt ngẫu nhiên trên ống kính của kính. Vì vậy, khi một hạt mưa được đặt, kính có thể trông như thế này

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

Nếu nó được đặt trên một khoảng trắng ( ), một .được đặt trên hình ảnh. Nếu nó được đặt trên một hình vuông đã có hạt mưa, sinh viên tốt nghiệp thả.

Các bước trên giọt là

  • không có giọt nào được đặt:
  • 1 giọt được đặt: .
  • Đặt 2 giọt: o
  • 3 giọt đặt: O
  • Hơn 4 giọt được đặt: @

Quy tắc

  • Hình ảnh sẽ trông như thể nó ở đúng vị trí. Điều này có nghĩa là bạn có thể xóa màn hình hoặc in đủ dòng mới để "xóa" màn hình. Bạn không thể trả về một danh sách các bước. Xin lỗi về điều này, nhưng bạn sẽ có thể làm việc xung quanh đó.
  • Khi xuất dòng mới để "xóa" màn hình, bạn phải có ít nhất 3 dòng mới giữa các kính.
  • Mã chạy cho đến khi kính đầy giọt tốt nghiệp, tức là cho đến khi đầu ra trông như thế này:
     Ngày mai
    | @@@@@@@@@@ / __ \ @@@@@@@@@@ | |
    | @@@@@@@@@ / \ @@@@@@@@@ | |
    | @@@@@@@@ / \ @@@@@@@@ | |
    \ ___ / \ ___ /
  • Mã ngắn nhất trong byte thắng.

" Mã chạy cho đến khi kính đầy giọt tốt nghiệp " Có lẽ chỉ định thời gian ngủ / chờ xấp xỉ? Thích 150 hay 250 ms?
Kevin Cruijssen

2
Liệu mã phải dừng lại khi kính trông giống như đầu ra cuối cùng hoặc nó có thể tiếp tục chạy nhưng chỉ không ảnh hưởng gì?
TheLethalCoder

@TheLethalCoder Tôi sẽ tưởng tượng cho đến khi kính đầy, như được viết trong thông số: v
Jenkar

Sự rơi ngẫu nhiên của giọt nước phải rơi ngẫu nhiên trên các ống kính ngay cả trên một phần của các ống kính @, phải không?
Jenkar

@TheLethalCoder nên chấm dứt sau khi tất cả đã tốt nghiệp
caird coinheringaahing

Câu trả lời:


11

JavaScript (ES6), 269 267 265 byte

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)

Chỉnh sửa: Đã lưu 2 4 byte nhờ @Shaggy.


3
có gì đó không ổn ở góc trên bên trái
J42161217

-1 vì nó đã bị lỗi (xem bình luận của Jenny)
Lemon phá hủy

1
@DeststallibleLemon Xin lỗi về điều đó, tôi đã bị cắn bởi một "tính năng" trong bảng tạm của Firefox ... bây giờ sẽ ổn thôi.
Neil

Lưu một vài byte với innerTextthay vì textContentsearchthay vì indexOf. Và một vài thứ nữa chỉ bằng cách sử dụng <pre id=onhư HTML, thay vì sử dụng document.writenó.
Xù xì

1
@Shaggy Tuyệt vời tìm, cảm ơn!
Neil

5

Java 8, 449 421 byte

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('#',' '));}}

Giải trình:

Hãy thử nó ở đây. ( Thread.sleepđược xóa để bạn thấy ngay kết quả.)

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

Đầu ra:

LƯU Ý: Các dấu chấm hơi lạ trong gif, nhưng đó là một vấn đề trong ScreenToGif.exe của tôi ..
nhập mô tả hình ảnh ở đây


1
Bạn biết điều gì làm tôi "
choáng váng

1
Điều này không giải thích cho khả năng rơi vào ngày @: v
Jenkar

@Jenkar đó là lần thứ hai bạn nói điều đó trên câu trả lời. Hãy giải thích những gì bạn có ý nghĩa.
caird coinheringaahing

@RandomUser Về cơ bản, mã hiện tại trong câu trả lời này tìm kiếm một điểm chưa phải là @ để rơi, thay vì rơi vào ống kính một cách ngẫu nhiên, ngay cả khi đó là tại. "4+" trong các yêu cầu dường như chỉ ra rằng đây không phải là trường hợp cần thiết, nhưng thay vào đó, người ta sẽ rơi ngẫu nhiên vào ống kính, bao gồm cả @. Đây không phải là giải thích chính xác?
Jenkar

@Jenkar Không quan trọng bằng cách nào nó làm điều đó, chỉ là nó làm điều đó mà không vi phạm bất kỳ quy tắc hoặc sơ hở tiêu chuẩn nào. Tôi chưa bao giờ nói "Nó phải có phân phối ngẫu nhiên thống nhất" trong câu hỏi vì vậy câu trả lời này là tốt.
caird coinheringaahing

3

F #, không đệ quy 379 414 404 byte

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

Hãy thử trực tuyến!

  • -7 byte nhờ @vzwick
    • bằng cách đặt bí danh String.replicate
    • bằng cách mở Hệ thống thay vì tham chiếu nó mỗi lần
  • -3 byte bằng cách giảm vòng lặp while thành một dòng

Tôi thích tiền đề của thử thách này :)

Và cảm ơn cho con ráy tai.

F #, 406 441 438 437 423 byte

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

Hãy thử trực tuyến!

  • -3 byte bằng cách ràng buộc s với chuỗi bằng cách so sánh nó với chuỗi
  • -1 byte, tên hàm bây giờ là "!" tiết kiệm một không gian duy nhất khi gọi nó
  • -7 byte nhờ @vzwick
    • bằng cách đặt bí danh String.replicate
    • bằng cách mở Hệ thống thay vì tham chiếu nó mỗi lần
  • -1 byte, không cần dấu ngoặc khi gọi d. Tiếp theo
  • -6 byte, hàm bây giờ là một dòng

Giải trình

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

Bạn có thể lưu 1 char bằng cách open Systemvà xóa Systemkhỏi Random()Threading.Thread.Sleep()gọi;)
vzwick

Một vài nhân vật nữa bị cạo râu: tio.run/##TZDfa4NADMff/ Kẻ
vzwick

@vzwick cảm ơn :) đã tìm thấy một vài byte khi tôi đang chỉnh sửa
Brunner

2

Python 2, 365 328 byte

Điều đó tốt hơn một chút ...

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)

Dùng thử trực tuyến

Liên kết trên sử dụng 30 dòng thay vì 3, nhưng bạn có thể thấy nó với 3 dòng nếu bạn thay đổi kích thước cửa sổ trình duyệt của mình đủ nhỏ theo chiều dọc. Thay đổi time.sleep(1)thành time.sleep(.1)tốc độ gấp 10 lần.


2

C, 313 309 305 304 byte

Cần phải chơi golf xuống một chút;

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

Tôi chạy nó với các bài kiểm tra sau

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

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


2

Ruby , 237 224 228 218 206 198 197 byte

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}

Hãy thử trực tuyến!

Câu trả lời trước đó là sai, nó đã không tính đến một hạt mưa rơi vào @.Rõ ràng không phải là một yêu cầu. Một số byte được lưu.

Điều này chấm dứt với một lỗi ném, nhưng điều này chắc chắn chấm dứt ngay khi kính đầy đủ được in.

  • Đã lưu 13 byte bằng cách đặt in vào lambda và thay đổi gán để sử dụng tr (duh)
  • Mất 8 byte với yêu cầu 1 giây.
  • Tăng 10 byte bằng cách sử dụng thủ thuật gsub thay vì nội suy (được xem & điều chỉnh từ câu trả lời Python của mbomb007 ).
  • Tăng 12 byte bằng cách loại bỏ in lambda ngay bây giờ khi bản in chỉ được viết một lần>.>
  • Tăng 1 byte bằng cách thực hiện tất cả các \\be a, sau đó thay đổi trở lại bên trong tr
  • Tăng 7 byte bằng cách đặt thay đổi khoảng trắng trên dòng cuối cùng bằng dòng khác x(duh). Trong trường hợp một số bạn đang tự hỏi tại sao điều này không ảnh hưởng đến vòng lặp chính: vòng lặp chính không xem xét dòng cuối cùng để xác định nó x.
  • Tăng 1 byte bằng cách loại bỏ phần cuối của đỉnh kính

Yay <200 byte: D

Gif:

Gif


3
Để tham khảo trong tương lai, bạn có thể chỉnh sửa câu trả lời trước đó của mình thành câu trả lời thay vì xóa nó và thêm câu trả lời mới.
TheLethalCoder

Bạn có thể thêm vào một gif của chạy này?
caird coinheringaahing

@RandomUser Xong.
Jenkar

1

Bash, 576 510 429 416 byte

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

Wow, chơi golf rất nhiều. Nếu bất cứ ai có ý tưởng cho việc chơi gôn hơn nữa, tôi sẵn sàng đề xuất

Hãy tự thử! Nó có giấc ngủ được bình luận vì giới hạn 60 giây

Đây là gif:

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


1

Perl, 167 byte

Lưu ý rằng đó \x1blà một nhân vật thoát theo nghĩa đen.

$_="\x1bc 24_
|10X/__\\10X|
|9X/4 \\9X|
|8X/6 \\8X|
\\7_/8 \\7_/
";s/\d+(.)/$1x$&/ge;do{$a[rand 54]++,sleep print s/X/($",".",o,O)[$a[$-++%54]]||"@"/ger}while grep$_<4,@a

Xem nó trực tuyến!


0

Toán học, 438 byte

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]

đây là một kết quả tốc độ gấp 10 lần

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


Không bao giờ sử dụng Mathicala nhưng bạn có thể gán cho Table, 9532?
caird coinheringaahing

Như trong t=Table x = 32y = 95?
caird coinheringaahing

Phải, tất nhiên. Tôi đã chơi nó rất nhiều kể từ hôm qua
J42161217

Bạn có thể xóa 6 byte bằng cách thay thế cuối cùng Flattenbằng f?
caird coinheringaahing

0

PHP, 262 254 byte

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;

Chạy với -nRhoặc thử trực tuyến .

phá vỡ

# 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+=)
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.