Krople deszczu spadają na moje… okulary?

23

Mieszkam w Wielkiej Brytanii, gdzie pada deszcz. Dużo. Mam również niefortunną konieczność noszenia okularów, aby zobaczyć, co oznacza, że ​​gdy pada deszcz (tak jak teraz), ledwo mogę je zobaczyć. To wyzwanie pozwala wszystkim doświadczyć tego samego!

Zadanie

Wyjmij szklanki artystyczne ASCII z kroplą wody dodawaną co sekundę.

Wkład

Żaden

Wydajność

Para szklanek z kroplami wody na nich.

Okulary

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

krople deszczu

Kropla deszczu jest oznaczona przez .. Kropla deszczu jest losowo umieszczana na soczewkach okularów. Tak więc po umieszczeniu kropli deszczu okulary mogą wyglądać tak

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

Jeśli zostanie umieszczony na pustym miejscu ( ), .na obrazie zostanie umieszczony znak „ an” . Jeśli zostanie umieszczony na kwadracie, który już ma kroplę deszczu, kropla kończy się.

Kroki na kroplach są

  • żadnych kropel umieszczonych:
  • 1 kropla umieszczona: .
  • 2 krople umieszczone: o
  • 3 krople umieszczone: O
  • Ponad 4 umieszczone krople: @

Zasady

  • Obraz powinien wyglądać, jakby pozostał na miejscu. Oznacza to, że możesz wyczyścić ekran lub wydrukować wystarczającą liczbę wierszy, aby „wyczyścić” ekran. Nie można zwrócić listy kroków. Przepraszam za to, ale powinieneś być w stanie to obejść.
  • Podczas wysyłania znaku nowej linii w celu „wyczyszczenia” ekranu, pomiędzy okularami muszą znajdować się co najmniej 3 znaki nowej linii.
  • Kod działa, dopóki szklanki nie zostaną wypełnione w pełni stopniowanymi kroplami, tj. Dopóki dane wyjściowe nie będą wyglądały tak:
     ________________________
    | @@@@@@@@@@ / __ \ @@@@@@@@@@ |
    | @@@@@@@@@ / \ @@@@@@@@@ |
    | @@@@@@@@ / \ @@@@@@@@ |
    \ _______ / \ _______ /
  • Najkrótszy kod w bajtach wygrywa.
Cairney Coheringaahing
źródło
Kod działa, dopóki szklanki nie będą pełne w pełni wyskalowanych kropli ”. Może podać przybliżony czas uśpienia / oczekiwania? Jak 150 lub 250 ms?
Kevin Cruijssen
2
Czy kod musi się zatrzymać, gdy okulary wyglądają jak ostateczne wyjście, czy może nadal działać, ale po prostu nie wpływa na nic?
TheLethalCoder
@TheLethalCoder Wyobrażam sobie, dopóki szklanki nie będą pełne, jak napisano w specyfikacji: v
Jenkar
Losowy spadek Droplety musi przypadkowo spadać na soczewki, nawet na części kawałków soczewki @, prawda?
Jenkar
@TheLethalCoder powinien zakończyć się po ukończeniu wszystkich
Cairney Coherheringaahing

Odpowiedzi:

11

JavaScript (ES6), 269 267 265 bajtów

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)

Edycja: Zapisano 2 4 bajty dzięki @Shaggy.

Neil
źródło
3
coś poszło nie tak w lewym górnym rogu
J42161217
-1, ponieważ jest zepsuty (patrz komentarz Jenny)
Destructible Lemon
1
@DestructibleLemon Przepraszam za to, że ugryzła mnie „funkcja” schowka Firefoksa ... teraz powinno być OK.
Neil
Zaoszczędź kilka bajtów za pomocą innerTextzamiast textContenti searchzamiast indexOf. I kilka innych po prostu <pre id=ojako HTML, a nie document.writego.
Kudłaty
1
@Shaggy Świetne znalezisko, dzięki!
Neil
5

Java 8, 449 421 bajtów

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

Wyjaśnienie:

Wypróbuj tutaj. ( Thread.sleepjest usuwany, więc natychmiast widzisz wynik).

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

Wydajność:

UWAGA: Kropki są trochę dziwne w gifie, ale to problem w moim ScreenToGif.exe ..
enter image description here

Kevin Cruijssen
źródło
1
Wiesz, co mnie olśniewa, te dziwne kropki (to samo dotyczy pomniejszonej skali ") naprawdę wyglądają, jakby na moim ekranie
znajdowała
1
Nie tłumaczy to możliwości spadku na @: v
Jenkar
@Jenkar po raz drugi powiedziałeś to w odpowiedziach. Wyjaśnij, co masz na myśli.
caird coinheringaahing
@RandomUser Zasadniczo aktualny kod w tej odpowiedzi szuka miejsca, które nie jest jeszcze @, na które można spaść, zamiast przypadkowo spadać na soczewki, nawet jeśli jest to. „4+” w wymaganiach wydaje się wskazywać, że tak nie jest, ale zamiast tego należy przypadkowo upaść na obiektyw, w tym @. Czy to nie jest poprawna interpretacja?
Jenkar
@Jenkar Nie ma znaczenia, jak to robi, tylko że robi to bez naruszania jakichkolwiek zasad lub standardowych luk. Nigdy nie powiedziałem „To musi mieć jednolity losowy rozkład” w pytaniu, więc ta odpowiedź jest w porządku.
caird coinheringaahing
3

F #, nierekurencyjne 379 414 404 bajtów

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

Wypróbuj online!

  • -7 bajtów dzięki @vzwick
    • przez aliasing String.replicate
    • otwierając System zamiast odwoływać się do niego za każdym razem
  • -3 bajty poprzez zmniejszenie pętli while do jednej linii

Uwielbiam przesłankę tego wyzwania :)

I dzięki za robaka usznego.

F #, 406 441 438 437 423 bajtów

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

Wypróbuj online!

  • -3 bajty, ograniczając s do łańcucha, porównując go z łańcuchem
  • -1 bajt, nazwa funkcji to teraz „!” oszczędzając jedno miejsce podczas dzwonienia
  • -7 bajtów dzięki @vzwick
    • przez aliasing String.replicate
    • otwierając System zamiast odwoływać się do niego za każdym razem
  • -1 bajt, nie trzeba nawiasów podczas wywoływania d.Next
  • -6 bajtów, funkcja jest teraz jedną linią

Wyjaśnienie

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
źródło
Można zapisać 1 char przez open Systemi usunięcie Systemz Random()i Threading.Thread.Sleep()połączeń;)
vzwick
Ogolono
vzwick
@vzwick dzięki :) znalazłem kolejne kilka bajtów podczas edytowania
Brunner
2

Python 2, 365 328 bajtów

To trochę lepiej ...

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)

Wypróbuj online

Powyższy link używa 30 linii zamiast 3, ale możesz zobaczyć go za pomocą 3, jeśli zmienisz rozmiar okna przeglądarki, aby było wystarczająco małe w pionie. Zmień time.sleep(1)na time.sleep(.1)na 10x prędkość.

mbomb007
źródło
2

C, 313 309 305 304 bajtów

Trzeba trochę pograć w golfa;

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

Uruchamiam go za pomocą następującego kodu testowego

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

enter image description here

cleblanc
źródło
2

Rubinowy , 237 224 228 218 206 198 197 bajtów

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}

Wypróbuj online!

Poprzednia odpowiedź była błędna, nie uwzględniała kropli deszczu spadających na @. Najwyraźniej nie jest to wymóg. Niektóre bajty zapisane.

To kończy się z wygenerowanym błędem, ale z pewnością kończy się, gdy tylko zostaną wydrukowane pełne szkła.

  • Zaoszczędź 13 bajtów, umieszczając wydruk w lambda i zmieniając przypisanie, aby użyć tr (duh)
  • Utrata 8 bajtów z wymogiem 1 sekundy.
  • 10 bajtów zysku dzięki zastosowaniu sztuczki gsub zamiast interpolacji (widziane i dostosowane z odpowiedzi Python mbomb007 ).
  • 12 bajtów zysku przez usunięcie drukowania lambda teraz, gdy wydruk jest zapisany tylko raz>.>
  • 1 bajt zysku przez zrobienie całego \\be a, a następnie powrót do wewnątrz tr
  • 7 bajtów zysku poprzez umieszczenie zmiany spacji w ostatnim wierszu na innym x(duh). W przypadku, gdy niektórzy z was zastanawiają się, dlaczego nie wpływa to na główną pętlę: główna pętla nie bierze pod uwagę ostatniej linii do jej określenia x.
  • 1 bajtowy zysk po zdjęciu na końcu górnej części szklanek

Tak <200 bajtów: D

Gif:

Gif

Jenkar
źródło
3
W celu przyszłego wykorzystania możesz edytować swoją poprzednią odpowiedź na taką, która działa zamiast ją usuwać i dodawać nową.
TheLethalCoder
Czy możesz dodać gif tego biegania?
caird coinheringaahing
@RandomUser Gotowe.
Jenkar
1

Bash, 576 510 429 416 bajtów

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, dużo grałem w golfa. Jeśli ktoś ma jakiś pomysł na dalszą grę w golfa, jestem otwarty na sugestie

Spróbuj sam! Komentowany jest sen ze względu na limit 60 sekund

Oto gif:

wprowadź opis zdjęcia tutaj

DrnglVrgs
źródło
1

Perl, 167 bajtów

Zauważ, że \x1bjest to dosłowna postać ucieczki.

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

Zobacz online!

Dom Hastings
źródło
0

Mathematica, 438 bajtów

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]

oto gif z 10-krotną szybkością

wprowadź opis zdjęcia tutaj

J42161217
źródło
Nigdy nie używałeś Mathematiki, ale czy mógłbyś przypisać do Table, 95i 32?
caird coinheringaahing
Jak w t=Table x = 32i y = 95?
caird coinheringaahing
tak oczywiście. Grałem dużo w golfa od wczoraj
J42161217
Możesz być w stanie usunąć 6 bajtów zastępując ostatnią Flattenz f?
caird coinheringaahing 24.07.17
0

PHP, 262 254 bajtów

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;

Uruchom -nRlub wypróbuj online .

awaria

# 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+=)
Tytus
źródło