Капли дождя падают на мои ... очки?

23

Я живу в Великобритании, где идет дождь. Много. У меня также есть печальная необходимость носить очки, чтобы видеть, а это означает, что когда идет дождь (как сейчас), я едва могу видеть из них. Эта задача такова, что вы все можете испытать то же самое!

задача

Выходные очки ASCII art с каплей воды добавляются каждую секунду.

вход

Никто

Выход

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

Очки

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

Капли дождя

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

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

Если он находится на пустом месте ( ),. изображение помещается . Если он размещен на квадрате, в котором уже есть капля дождя, капля завершается.

Шаги по каплям

  • капли не размещены:
  • 1 капля помещена: .
  • 2 капли размещены: o
  • 3 капли размещены: O
  • 4+ капли размещены: @

правила

  • Изображение должно выглядеть как будто оно остается на месте. Это означает, что вы можете либо очистить экран, либо напечатать достаточно новых строк, чтобы «очистить» экран. Вы не можете вернуть список шагов. Извините за это, но вы должны быть в состоянии обойти это.
  • При выводе новых строк, чтобы «очистить» экран, между очками должно быть не менее 3 новых строк.
  • Код выполняется до тех пор, пока очки не заполнятся полностью градуированными каплями, то есть пока результат не будет выглядеть следующим образом:
     ________________________
    | @@@@@@@@@@ / __ \ @@@@@@@@@@ |
    | @@@@@@@@@ / \ @@@@@@@@@ |
    | @@@@@@@@ / \ @@@@@@@@ |
    \ _______ / \ _______ /
  • Самый короткий код в байтах побеждает.
Caird Coneheringaahing
источник
« Код работает до тех пор, пока очки не заполнятся полностью градуированными каплями ». Возможно, укажите приблизительное время сна / ожидания? Как 150 или 250 мс?
Кевин Круйссен
2
Должен ли код останавливаться, когда очки выглядят как конечный результат, или он может продолжать работать, но никак не влияет?
TheLethalCoder
@TheLethalCoder Я бы вообразил, пока очки не заполнятся, как написано в спецификации: v
Jenkar
Случайное падение Droplet должно случайно падать на линзы даже на части битов линзы, которые не так @ли?
Дженкар
@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 ..
введите описание изображения здесь

Кевин Круйссен
источник
1
Вы знаете, что меня ослепляет, эти странные точки (то же самое относится и к уменьшенному ") действительно выглядят так, будто на моем экране действительно капля воды
Khaled.K
1
Это не учитывает возможность падения капли на @: v
Jenkar
@ Дженкар, это второй раз, когда ты говорил это в ответах. Пожалуйста, объясните, что вы имеете в виду.
caird coinheringaahing
@RandomUser В основном, текущий код в этом ответе ищет точку, на которую еще не стоит @, вместо случайного падения на линзы, даже если это at. «4+» в требованиях, по-видимому, указывает на то, что дело не в этом, но вместо этого нужно случайно упасть на объектив, включая @. Разве это не правильная интерпретация?
Дженкар
@Jenkar Не имеет значения, как он это делает, просто он делает это без нарушения каких-либо правил или стандартных лазеек. Я никогда не говорил «в этом вопросе должно быть равномерное случайное распределение», так что этот ответ в порядке.
Caird Coneheringaahing
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
Brunner
источник
Вы можете сохранить 1 полукокс путем open Systemи удаление Systemиз Random()и Threading.Thread.Sleep()вызовов;)
vzwick
Еще несколько символов выбриты: tio.run/##TZDfa4NADMff/...
vzwick
@vzwick спасибо :) нашел еще несколько байтов, как я редактировал
Бруннер
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 - кратного.

mbomb007
источник
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

cleblanc
источник
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 вместо интерполяции (видно и адаптировано из ответа Python от mbomb007 ).
  • 12-байтовый выигрыш при удалении лямбда-печати теперь, когда печать записывается только один раз>.>
  • 1 байтовое усиление, сделав все \\be a, а затем вернувшись обратно в tr
  • 7-байтовое усиление, помещая замену пробелов в последнюю строку с другой x (дух). В случае, если некоторые из вас, ребята, задаются вопросом, почему это не влияет на основной цикл: основной цикл не учитывает последнюю строку, чтобы определить ее x.
  • 1 байт усиления, удалив в конце верхней части очков

Yay <200 байтов: D

Gif:

Gif

Jenkar
источник
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

DrnglVrgs
источник
1

Perl, 167 байт

Обратите внимание, что \x1bэто буквальный escape-символ.

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

Смотрите это онлайн!

Дом Гастингс
источник
0

Mathematica, 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-кратный результат GIF

enter image description here

J42161217
источник
Никогда не использовал Mathematica, но не могли бы вы назначить Table, 95а 32?
caird coinheringaahing
Как в t=Table x = 32а y = 95?
Caird Coneheringaahing
Да, конечно. Я много играл в гольф со вчерашнего дня
J42161217
Возможно, вы сможете удалить 6 байтов, заменив последний Flattenна f?
Caird Coneheringaahing
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+=)
Titus
источник