Yağmur damlaları… gözlüklerimin üzerine mi düşüyor?


23

Yağmur yağdığı İngiltere'de yaşıyorum. Çok. Ayrıca, görmek için gözlük takmaya ihtiyaç duyma şanssızlığına da ihtiyacım var. Bu zorluk, hepiniz aynı şeyi deneyimlemeniz için!

Görev

Her saniye eklenen bir damla su ile ASCII sanat gözlük çıktı.

Giriş

Yok

Çıktı

Üzerlerine su damlası olan bir çift gözlük.

Gözlük

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

Yağmur damlaları

Bir yağmur damlası a ile belirtilir .. Gözlük camlarının üzerine rastgele bir yağmur damlası yerleştirilir. Bir yağmur damlası yerleştirildiğinde, gözlükler bu şekilde görünebilir.

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

Boş bir alana ( ) .yerleştirilirse, resmin üzerine bir yerleştirilir. Yağmur damlası olan bir kareye yerleştirilirse, damla mezun olur.

Damlalar üzerindeki adımlar

  • damla yerleştirilmemiş:
  • 1 damla yerleştirildi: .
  • 2 damla yerleştirildi: o
  • 3 damla yerleştirildi: O
  • 4+ damla yerleştirildi: @

kurallar

  • Görüntü yerinde duruyormuş gibi görünmelidir . Bu, ekranı temizleyebileceğiniz veya ekranı "temizlemek" için yeterli sayıda yeni satır yazdırabileceğiniz anlamına gelir. Bir adım listesi döndüremezsiniz. Bunun için üzgünüm, ama bunun üzerinde çalışabilmelisin.
  • Ekranı "temizlemek" için yeni satırlar çıkarırken, gözlükler arasında en az 3 satır olmalı.
  • Kod, gözlükler tamamen dereceli damlalarla doluncaya kadar, yani çıktı şöyle görünene kadar çalışır:
     ________________________
    | @@@@@@@@@@ / __ \ @@@@@@@@@@ |
    | @@@@@@@@@ / \ @@@@@@@@@
    | @@@@@@@@ / \ @@@@@@@@ | |
    \ _______ / \ _______ /
  • Bayt cinsinden en kısa kod kazanır.

" Gözlükler tamamen dereceli damlalarla doluncaya kadar kod çalışıyor " Belki de yaklaşık uyku / bekleme süresi belirtin? 150 veya 250 ms gibi mi?
Kevin Cruijssen

2
Gözlükler son çıkışa benziyorsa kod durmalı mı, yoksa çalışmaya devam edebilir mi, ancak hiçbir şeyi etkilemiyor mu?
TheLethalCoder

@ TheLethalCoder Gözlükler doluncaya kadar, belirtildiği gibi yazılanları hayal ediyorum: v
Jenkar

Damlacığın rastgele düşüşü lenslerin bit kısımlarında bile lenslerin üzerine rasgele düşmek zorunda @değil mi?
Jenkar

@ TheLethalCoder herkes mezun olduktan sonra sonlandırılmalıdır
caird coinheringaahing '

Yanıtlar:


11

JavaScript (ES6), 269 267 265 bayt

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)

Düzenleme: @ Shaggy sayesinde 2 4 bayt kaydedildi.


3
sol üst köşede bir şeyler ters gidiyor
J42161217

-1 çünkü tıkalı (Jenny'nin yorumuna bakın)
Yok

1
@DestructibleLemon Bunun için üzgünüm, Firefox’un panosunun bir "özelliği" tarafından ısırıldım ... şimdi iyi olmalı.
Neil

İle bayt bir çift kaydetme innerTextyerine textContentve searchyerine indexOf. Ve birkaçını da kullanmak <pre id=oyerine, sadece HTML olarak kullanarak document.write.
Shaggy

1
@Shaggy Harika bul, teşekkürler!
Neil

5

Java 8, 449 421 bayt

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

Açıklama:

Burada dene. ( Thread.sleepkaldırılır, böylece sonucu anında görürsünüz.)

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

Çıktı:

NOT: Noktalar gifte biraz garip, ancak bu benim ScreenToGif.exe dosyamda bir sorun.
görüntü tanımını buraya girin


1
Beni neyin göz kamaştırdığını biliyorsunuz, bu tuhaf noktalar (aynı küçültülmüş durum için geçerli ") gerçekten
ekranımın

1
Bu, @: v
Jenkar

@Jenkar, cevaplarda bunu ikinci kez söyledin. Lütfen ne demek istediğini açıkla.
caird coinheringaahing

@RandomUser Temel olarak, bu cevaptaki mevcut kod, bir objede olsa bile, objektiflere rastgele düşmek yerine, henüz @ @ düşmeyen bir nokta arar. Gereksinimlerdeki "4+" durumun böyle olmadığını gösteriyor, bunun yerine birinin bir @ de dahil olmak üzere rastgele lens üzerine düşmesi gerektiğini gösteriyor. Bu doğru yorum değil mi?
Jenkar

Fark etmez @Jenkar nasıl o herhangi bir kural veya standart boşluklar ihlal etmeden yapar sadece, bunu yapar. Asla soruda "Düzgün bir rastgele dağılıma sahip olmalı" demedim, bu yüzden bu cevap iyi.
Caird coinheringaahing

3

F #, özyinelemeli olmayan 379 414 404 bayt

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

Çevrimiçi deneyin!

  • @Vzwick sayesinde -7 bayt
    • tarafından aliasing String.replicate
    • her zaman referans vermek yerine Sistem'i açarak
  • While döngüsünü bir satıra indirgeyerek -3 bayt

Bu zorluğun öncülünü seviyorum :)

Ve solucan kurdu için teşekkürler.

F #, 406 441 438 437 423 bayt

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

Çevrimiçi deneyin!

  • S ile dizeyi sınırlayarak s ile sınırlayarak -3 bayt
  • -1 bayt, işlev adı şimdi "!" çağırırken tek bir yerden tasarruf etmek
  • @Vzwick sayesinde -7 bayt
    • tarafından aliasing String.replicate
    • her zaman referans vermek yerine Sistem'i açarak
  • -1 bayt, d.Next çağrısında parantez gerekmez
  • -6 bayt, fonksiyon şimdi bir satır

açıklama

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

Sen 1 kömürü kaydedebilir open Systemve kaldırma Systemgelen Random()ve Threading.Thread.Sleep()aramalar;)
vzwick


@vzwick thanks :) editig olduğum için başka bir kaç bayt daha buldu
Brunner

2

Python 2, 365 328 bayt

Bu biraz daha iyi ...

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)

Çevrimiçi deneyin

Yukarıdaki bağlantı 3 yerine 30 satır kullanır, ancak tarayıcı pencerenizi dikey olarak yeterince küçük olacak şekilde 3 ile görebilirsiniz. Değişim time.sleep(1)için time.sleep(.1)10x hız için.


2

C, 313 309 305 304 bayt

Biraz golf oynamak gerekiyor;

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

Aşağıdaki test saplama ile çalıştırıyorum

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

görüntü tanımını buraya girin


2

Ruby , 237 224 228 218 206 198 197 bayt

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}

Çevrimiçi deneyin!

Önceki cevap yanlıştı, @ üzerinde düşen bir yağmur damlasını hesaba katmadı. Görünüşe göre bir gereklilik değil. Bazı baytlar kaydedildi.

Bu bir hata atılarak sona erer, ancak bu kesinlikle tam gözlük yazdırılır basılmaz sona erer.

  • Baskıyı bir lambda koyarak ve tr (duh) 'yi kullanma görevini değiştirerek 13 bayt kurtardı
  • 1 saniye gereksinimiyle 8 bayt kaybı.
  • Enterpolasyon yerine gsub numarasını kullanarak 10 bayt kazanır ( mbomb007'nin Python cevabından görüldü ve uyarlandı ).
  • Baskı sadece bir kez yazıldığı için lambda baskısını kaldırarak 12 bayt kazanır.
  • Tüm yaparak 1 bayt kazanç \\be aiçinde tr ardından değişen arkasını
  • Son satırdaki boşlukları değiştirerek başka bir x(duh) koyarak 7 baytlık kazanç . Bazılarınız bunun neden ana döngüyü etkilemediğini merak ediyorlarsa: ana döngü bunu belirlemek için son satırı dikkate almaz x.
  • Gözlüklerin üst kısmının ucunu kaldırarak 1 bayt kazanç

Yay <200 bayt: D

Gif:

gif


3
Gelecekte başvurmak için önceki cevabınızı silmek ve yenisini eklemek yerine çalışan bir cevaba göre düzenleyebilirsiniz.
TheLethalCoder

Bu koşu bir gif ekler misiniz?
Caird coinheringaahing

@RandomUser Yapıldı.
Jenkar

1

Bash, 576 510 429 416 Bayt

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

Vay, çok golf oynadım. Golf oynamak için bir fikri olan varsa önerilere açığım.

Kendin dene! Uyku 60 saniye sınırı nedeniyle yorum yaptı

İşte gif:

görüntü tanımını buraya girin


1

Perl, 167 bayt

Bunun \x1bgerçek bir kaçış karakteri olduğunu unutmayın .

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

Çevrimiçi görün!


0

Mathematica, 438 bayt

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]

işte 10x hız sonucu gif

görüntü tanımını buraya girin


Asla Mathematica'yı kullanmadıysanız Table, 95ve 32?
Caird coinheringaahing

Gibi t=Table x = 32ve y = 95?
Caird coinheringaahing

Evet tabi ki. Dünden beri çok
golf oynadım

Geçen değiştirerek 6 bayt kaldırmak mümkün olabilir Flattenile f?
caird coinheringaahing

0

PHP, 262 254 bayt

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;

Çevrimiçi olarak çalıştırın -nRveya deneyin .

Yıkmak

# 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+=)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.