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.

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.


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


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

Można zapisać 1 char przez open Systemi usunięcie Systemz Random()i Threading.Thread.Sleep()połączeń;)
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ść.


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


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


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


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!


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


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+=)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.