Краплі дощу падають на мої… окуляри?


23

Я живу у Великобританії, де йде дощ. Багато. У мене також є нещасна необхідність носити окуляри, щоб побачити, це означає, що коли йде дощ (як зараз), я ледве бачу з них. Ця проблема полягає в тому, що ви можете пережити все те саме!

Завдання

Виведіть арт-окуляри ASCII з краплею води, що додаються щосекунди.

Вхідні дані

Немає

Вихід

Пара склянок з краплями води на них.

Окуляри

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

Краплі дощу

Крапля дощу позначається символом a .. Краплі дощу випадково розміщуються на лінзах окулярів. Тож, коли краплина крапельки поміщається, окуляри можуть виглядати приблизно так

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

Якщо він розміщений на порожньому просторі ( ), на .зображенні розміщується ан . Якщо його розмістити на площі, де вже є крапля дощу, крапля закінчується.

Сходи на краплях є

  • не поміщені краплі:
  • 1 крапля поміщена: .
  • По 2 краплі: o
  • По 3 краплі: O
  • Покладено 4+ крапель: @

Правила

  • Зображення має виглядати так, ніби воно стоїть на місці. Це означає, що ви можете очистити екран або надрукувати достатньо нових рядків, щоб "очистити" екран. Ви не можете повернути список кроків. Вибачте з цього приводу, але ви повинні мати змогу обійти це.
  • Виводячи нові рядки для "очищення" екрана, у вас повинно бути не менше 3 нових рядків між окулярами.
  • Код працює до тих пір, поки келихи не будуть заповнені повністю градуйованими краплями, тобто поки вихід не виглядає так:
     ________________________
    | @@@@@@@@@ / __ \ @@@@@@@@@@ | |
    | @@@@@@@@ / / @ @@@@@@@@@ |
    | @@@@@@@@ / \ @@@@@@@@ |
    \ _______ / \ _______ /
  • Виграє найкоротший код у байтах .

" Код працює до тих пір, поки окуляри не будуть заповнені повністю закінченими краплями " Можливо, вкажіть приблизний час сну / очікування? Як 150 або 250 мс?
Кевін Крейссен

2
Чи повинен код припинятися, коли окуляри виглядають як кінцевий вихід або він може продовжувати працювати, але просто нічого не впливає?
TheLethalCoder

@TheLethalCoder Я б уявив, поки окуляри не заповняться, як написано у специфікації: v
Jenkar

Випадкове падіння краплі має випадково потрапляти на лінзи навіть на частину бітів лінзи @, так?
Дженкар

@TheLethalCoder він повинен припинитись після закінчення навчання
caird coinheringaahing

Відповіді:


11

JavaScript (ES6), 269 267 265 байт

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)

Редагувати: збережено 2 4 байти завдяки @Shaggy.


3
щось піде не так у верхньому лівому куті
J42161217

-1 тому, що це помилка (див. Коментар Дженні)
Руйнуючий лимон

1
@DestructibleLemon Вибачте з цього приводу, що мене покусала "особливість" буфера обміну Firefox ... має бути в порядку зараз.
Ніл

Зберегти пару байтів з innerTextзамість textContentі searchзамість indexOf. І ще кілька, просто використовуючи <pre id=oяк HTML, а не використовуючи document.writeйого.
Кудлатий

1
@Shaggy Чудова знахідка, дякую!
Ніл

5

Java 8, 449 421 байт

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

Пояснення:

Спробуйте тут. ( Thread.sleepвидаляється, щоб ви миттєво бачили результат.)

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

Вихід:

ПРИМІТКА. Точки трохи дивні в GIF, але це проблема в моєму ScreenToGif.exe ..
enter image description here


1
Ви знаєте, що мене засліплює, ці дивні точки (те саме стосується і зменшених "
розмірів

1
Це не враховує можливості падіння краплі на a @: v
Jenkar

@Jenkar, це вже вдруге ви сказали це на відповіді. Поясніть, будь ласка, що ви маєте на увазі.
caird coinheringaahing

@RandomUser В основному, поточний код у цій відповіді шукає місце, яке ще не належить @, а не потрапляє на лінзи випадковим чином, навіть якщо це ат. Вимоги "4+" вказують на те, що це не так, але натомість слід потрапляти на об'єктив випадковим чином, включаючи @. Це не правильне тлумачення?
Дженкар

@Jenkar Не має значення, як це робиться, лише те, що він робить це, не порушуючи жодних правил чи стандартних лазівки. Я ніколи не сказав у запитанні "Це повинен бути рівномірний випадковий розподіл", тому ця відповідь чудова.
caird coinheringaahing

3

F #, нерекурсивна 379 414 404 байт

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

Спробуйте в Інтернеті!

  • -7 байт завдяки @vzwick
    • шляхом псевдоніму String.replicate
    • відкриваючи Систему, а не посилаючись на неї кожен раз
  • -3 байти за рахунок зменшення циклу while на один рядок

Я люблю передумови цього виклику :)

І дякую за вухо.

F #, 406 441 438 437 423 байт

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

Спробуйте в Інтернеті!

  • -3 байти, обмежуючи s рядком, порівнюючи його з рядком
  • -1 байт, назва функції зараз "!" економія єдиного простору при його виклику
  • -7 байт завдяки @vzwick
    • шляхом псевдоніму String.replicate
    • відкриваючи Систему, а не посилаючись на неї кожен раз
  • -1 байт, немає необхідності в дужках при виклику d.Next
  • -6 байт, тепер функція - один рядок

Пояснення

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

Ви можете зберегти 1 char, open Systemвидаливши Systemз нього Random()і Threading.Thread.Sleep()дзвінки;)
vzwick

Ще кілька персонажів поголені: tio.run/##TZDfa4NADMff/…
vzwick

@vzwick спасибо :) знайшов ще кілька байтів, коли я працював
Brunner

2

Python 2, 365 328 байт

Це трохи краще ...

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)

Спробуйте в Інтернеті

Наведене вище посилання використовує 30 рядків замість 3, але ви можете бачити його з 3, якщо змінити розмір вікна веб-переглядача, щоб він був достатньо малим по вертикалі. Перехід time.sleep(1)на time.sleep(.1)10-кратну швидкість.


2

C, 313 309 305 304 байт

Потрібно зовсім небагато гольфувати;

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

Я запускаю його за допомогою наступного тестового заглушки

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

enter image description here


2

Рубі , 237 224 228 218 206 198 197 байт

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}

Спробуйте в Інтернеті!

Попередня відповідь була помилковою, вона не враховувала краплі дощу, що падала на @.Мабуть, не вимога. Деякі байти збережено.

Це закінчується помилкою, яку викинули, але це безумовно припиняється, як тільки надрукуються повні окуляри.

  • Збережено 13 байт, помістивши друк в лямбда і змінивши призначення на використання tr (duh)
  • Втрата 8 байт із вимогою 1 секунди.
  • 10 байт набирають, використовуючи трюк gsub замість інтерполяції (видно та адаптовано з відповіді Pybomon mbomb007 ).
  • 12 байт набирають, видаляючи лямбда-друк тепер, коли друк пишеться лише один раз>.>
  • 1 байт посилення шляхом внесення всіх \\Be a, потім змінити назад в тр
  • 7 байт посилення, ставлячи зміни пробілів на останньому рядку з іншим x(duh). Якщо хтось із вас, хлопці, цікавить, чому це не впливає на основний цикл: основний цикл не враховує останній рядок, щоб визначити його x.
  • 1 байт посилення, видаливши в кінці верхньої частини окулярів

Yay <200 байт: D

Gif:

Gif


3
Для подальшої довідки ви можете відредагувати попередню відповідь на ту, яка працює, а не видаляти її та додати нову.
TheLethalCoder

Чи можете ви додати gif цього бігу?
caird coinheringaahing

@RandomUser Готово.
Дженкар

1

Баш, 576 510 429 416 байт

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

Вау, багато гольфу. Якщо у когось є ідея щодо подальшого гольфу, я відкритий для пропозицій

Спробуйте самі! У ньому сон коментується через 60 секунд

Ось подарунок:

enter image description here



0

Математика, 438 байт

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]

ось графік 10-кратного результату

enter image description here


Ніколи не використовував Mathematica, але чи змогли ви призначити його Table, 95і 32?
Каїр coinheringaahing

Як в t=Table x = 32і y = 95?
caird coinheringaahing

так, звісно. Я багато вчора
гольфував

Можливо, ви зможете видалити 6 байт, замінивши останній Flattenна f?
caird coinheringaahing

0

PHP, 262 254 байт

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;

Бігайте з -nR або спробуйте в Інтернеті .

зламатися

# 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+=)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.