Rintik hujan jatuh di ... kacamata saya?

23

Saya tinggal di Inggris, di mana hujan turun. Banyak. Saya juga memiliki keperluan yang disayangkan harus memakai kacamata untuk melihat, yang berarti bahwa ketika hujan (seperti sekarang), saya hampir tidak bisa melihat keluar dari mereka. Tantangan ini adalah agar Anda semua dapat mengalami hal yang sama!

Tugas

Keluarkan gelas seni ASCII dengan setetes air yang ditambahkan setiap detik.

Memasukkan

Tidak ada

Keluaran

Sepasang gelas dengan tetesan air di atasnya.

Kacamata

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

Rintik hujan

Tetesan hujan dilambangkan dengan a .. Tetesan hujan ditempatkan secara acak di lensa kacamata. Jadi ketika tetesan hujan diletakkan, kacamata mungkin terlihat seperti ini

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

Jika ditempatkan pada ruang kosong ( ), sebuah .ditempatkan pada gambar. Jika ditempatkan pada kotak yang sudah memiliki tetesan air hujan, drop lulusannya.

Langkah-langkah pada tetes adalah

  • tidak ada tetes ditempatkan:
  • 1 tetes ditempatkan: .
  • 2 tetes ditempatkan: o
  • 3 tetes ditempatkan: O
  • 4+ tetes ditempatkan: @

Aturan

  • Gambar harus terlihat seolah tetap di tempatnya. Ini berarti Anda dapat menghapus layar atau mencetak cukup baris baru untuk "menghapus" layar. Anda tidak dapat mengembalikan daftar langkah. Maaf tentang ini, tetapi Anda harus bisa mengatasinya.
  • Saat mengeluarkan baris baru untuk "menghapus" layar, Anda harus memiliki setidaknya 3 baris baru di antara kacamata.
  • Kode berjalan sampai kacamata penuh dengan tetes lulus penuh yaitu sampai hasilnya terlihat seperti ini:
     ________________________
    | @@@@@@@@@ / __ \ @@@@@@@@@@ | |
    | @@@@@@@@ / \ @@@@@@@@@ | |
    | @@@@@@@@ / \ @@@@@@@ | |
    \ _______ / \ _______ /
  • Kode terpendek dalam byte menang.
caird coinheringaahing
sumber
" Kode berjalan hingga kacamata penuh dengan tetes yang lulus penuh " Mungkin tentukan perkiraan waktu tidur / tunggu? Suka 150 atau 250 ms?
Kevin Cruijssen
2
Apakah kode harus berhenti ketika kacamata terlihat seperti hasil akhir atau dapatkah ia tetap berjalan tetapi tidak memengaruhi apa pun?
TheLethalCoder
@TheLethalCoder Saya akan membayangkan sampai kacamata penuh, seperti yang tertulis dalam spesifikasi: v
Jenkar
Penurunan acak Tetesan memang harus jatuh secara acak pada lensa bahkan pada bagian dari bit lensa yang @, kan?
Jenkar
@TheLethalCoder harus diakhiri setelah semuanya lulus
caird coinheringaahing

Jawaban:

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)

Sunting: Disimpan 2 4 byte berkat @Shaggy.

Neil
sumber
3
ada yang tidak beres di sudut kiri atas
J42161217
-1 karena disadap (lihat komentar Jenny)
Destructible Lemon
1
@DestructibleLemon Maaf tentang itu, saya digigit oleh "fitur" dari clipboard Firefox ... harusnya OK sekarang.
Neil
Simpan beberapa byte dengan innerTextbukan textContentdan searchbukannya indexOf. Dan beberapa lagi hanya dengan menggunakan <pre id=oHTML, daripada document.writemenggunakannya.
Shaggy
1
@Shaggy Great find, terima kasih!
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('#',' '));}}

Penjelasan:

Coba di sini. ( Thread.sleepdihapus sehingga Anda langsung melihat hasilnya.)

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

Keluaran:

CATATAN: Titik-titiknya agak aneh di gif, tapi itu masalah di ScreenToGif.exe saya ..
masukkan deskripsi gambar di sini

Kevin Cruijssen
sumber
1
Anda tahu apa yang mempesona saya tentang, titik-titik aneh (yang sama berlaku untuk diperkecil ") benar-benar terlihat seperti ada setetes air nyata di atas layar saya
Khaled.K
1
Ini tidak menjelaskan kemungkinan jatuh pada @: v
Jenkar
@ Jenkar itu adalah kedua kalinya Anda mengatakan itu pada jawaban. Tolong jelaskan apa yang Anda maksud.
caird coinheringaahing
@RandomUser Pada dasarnya, kode saat ini dalam jawaban ini mencari tempat yang belum @ jatuh, daripada jatuh pada lensa secara acak, bahkan jika itu adalah pada. "4+" dalam persyaratan tampaknya menunjukkan bahwa ini bukan masalahnya, tetapi seseorang harus jatuh pada lensa secara acak, termasuk @. Apakah ini bukan interpretasi yang benar?
Jenkar
@ Jenkar Tidak masalah bagaimana melakukannya, hanya saja ia melakukannya tanpa melanggar aturan atau celah standar. Saya tidak pernah mengatakan "Itu harus memiliki distribusi acak yang seragam" dalam pertanyaan sehingga jawaban ini baik-baik saja.
caird coinheringaahing
3

F #, non-rekursif 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))

Cobalah online!

  • -7 byte terima kasih kepada @vzwick
    • dengan aliasing String.replicate
    • dengan membuka Sistem alih-alih merujuknya setiap waktu
  • -3 byte dengan mengurangi loop sementara ke satu baris

Saya suka premis dari tantangan ini :)

Dan terima kasih atas earwormnya.

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

Cobalah online!

  • -3 byte dengan membatasi s ke string dengan membandingkannya dengan string
  • -1 byte, nama fungsi sekarang "!" menghemat satu ruang saat memanggilnya
  • -7 byte terima kasih kepada @vzwick
    • dengan aliasing String.replicate
    • dengan membuka Sistem alih-alih merujuknya setiap waktu
  • -1 byte, tidak perlu tanda kurung saat memanggil d.Next
  • -6 byte, fungsi sekarang menjadi satu baris

Penjelasan

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
Brunner
sumber
Anda dapat menyimpan 1 char dengan open Systemdan menghapus Systemdari Random()dan Threading.Thread.Sleep()panggilan;)
vzwick
Beberapa karakter lagi dicukur: tio.run/##TZDfa4NADMff/…
vzwick
@vzwick terima kasih :) menemukan beberapa byte saat saya mengeditig
Brunner
2

Python 2, 365 328 byte

Itu sedikit lebih baik ...

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)

Cobalah online

Tautan di atas menggunakan 30 baris, bukan 3, tetapi Anda dapat melihatnya dengan 3 jika Anda mengubah ukuran jendela browser Anda menjadi cukup kecil secara vertikal. Ubah time.sleep(1)ke time.sleep(.1)untuk kecepatan 10x.

mbomb007
sumber
2

C, 313 309 305 304 byte

Perlu golf sedikit;

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

Saya menjalankannya dengan rintisan tes berikut

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

masukkan deskripsi gambar di sini

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

Cobalah online!

Jawaban sebelumnya salah, tidak memperhitungkan tetesan hujan jatuh pada @.Ternyata bukan keharusan. Beberapa byte disimpan.

Ini berakhir dengan kesalahan yang dilemparkan, tetapi ini pasti berakhir segera setelah kacamata penuh dicetak.

  • Menyimpan 13 byte dengan menempatkan pencetakan ke dalam lambda, dan mengubah tugas untuk menggunakan tr (duh)
  • Kehilangan 8 byte dengan persyaratan 1 detik.
  • 10 byte mendapatkan dengan menggunakan trik gsub bukannya interpolasi (terlihat & diadaptasi dari jawaban Python mbomb007 ).
  • Dapatkan 12 byte dengan menghapus pencetakan lambda sekarang karena cetakan hanya ditulis sekali>
  • 1 byte gain dengan membuat semua \\be a, lalu ubah kembali ke dalam tr
  • Gain 7 byte dengan menempatkan ruang ganti pada baris terakhir dengan yang lain x(duh). Jika beberapa dari kalian bertanya-tanya mengapa ini tidak mempengaruhi loop utama: loop utama tidak mempertimbangkan baris terakhir untuk menentukan itu x.
  • Gain 1 byte dengan melepas ujung kacamata

Yay <200 byte: D

Gif:

Gif

Jenkar
sumber
3
Untuk referensi di masa mendatang, Anda dapat mengedit jawaban Anda sebelumnya untuk jawaban yang berfungsi alih-alih menghapusnya dan menambahkan yang baru.
TheLethalCoder
Bisakah Anda menambahkan gif dari menjalankan ini?
caird coinheringaahing
@RandomUser Selesai.
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

Wow, banyak bermain golf. Jika ada yang punya ide untuk bermain golf lebih lanjut, saya terbuka untuk saran

Cobalah sendiri! Itu memiliki tidur berkomentar karena batas 60 detik

Inilah gif:

masukkan deskripsi gambar di sini

DrnglVrgs
sumber
1

Perl, 167 byte

Perhatikan bahwa \x1bini adalah karakter pelarian literal.

$_="\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

Lihat online!

Dom Hastings
sumber
0

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

di sini adalah hasil kecepatan 10x gif

masukkan deskripsi gambar di sini

J42161217
sumber
Tidak pernah menggunakan Mathematica tetapi bisakah Anda menetapkan Table, 95dan 32?
caird coinheringaahing
Seperti dalam t=Table x = 32dan y = 95?
caird coinheringaahing
ya tentu saja. Saya banyak
bermain golf
Anda mungkin bisa menghapus 6 byte dengan mengganti terakhir Flattendengan 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;

Jalankan dengan -nRatau coba online .

kerusakan

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