雨滴落在我的……眼镜上?


23

我住在英国,那里下雨。很多。不幸的是,我也有必要戴眼镜看,这意味着当下雨时(现在),我几乎看不到它们。这项挑战使您所有人都可以体验到相同!

任务

输出ASCII艺术眼镜,每秒加一滴水。

输入项

没有

输出量

一副眼镜与水滴的在他们的。

眼镜

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

雨滴

雨滴用表示.。眼镜的镜片上随机放置一个雨滴。因此,当放置雨滴时,眼镜可能看起来像这样

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

如果将其放在空白处(),则会.在图像上放置一个。如果将其放置在已经有雨滴的正方形上,则该水滴会逐渐消失。

滴的步骤是

  • 没有放置水滴:
  • 1滴放置: .
  • 放置2滴: o
  • 放置3滴: O
  • 放置了4滴以上: @

规则

  • 图像应该看起来像在原地。这意味着您可以清除屏幕或打印足够的换行符以“清除”屏幕。您无法返回步骤列表。抱歉,但是您应该可以解决此问题。
  • 输出换行符以“清除”屏幕时,两个眼镜之间必须至少有3条换行符。
  • 该代码将一直运行到玻璃杯充满完全渐变的液滴为止,即直到输出如下所示:
     ________________________
    | @@@@@@@@@@@ / __ \ @@@@@@@@@@ ||
    | @@@@@@@@@@ / \ @@@@@@@@@@ |
    | @@@@@@@@@ / \ @@@@@@@@@ |
    \ _______ / \ _______ /
  • 字节为单位的最短代码获胜。

代码将一直运行到眼镜完全充满水滴为止 ”或指定大概的睡眠/等待时间?像150或250毫秒?
凯文·克鲁伊森

2
当眼镜看起来像最终输出时,代码是否必须停止?它是否可以继续运行但不影响任何操作?
TheLethalCoder

@TheLethalCoder我会想象直到眼镜装满为止,如规范中所写:v
Jenkar,

液滴的随机掉落确实必须随机掉落在镜片上,即使在镜片的部分位上@,对吗?
Jenkar '17

@TheLethalCoder它应该在所有毕业后终止
caird coinheringaahing

Answers:


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)

编辑:由于@Shaggy,节省了2 4个字节。


3
左上角
出了点问题

-1,因为它被窃听了(请参阅珍妮的评论)
破坏的柠檬

1
@DestructibleLemon抱歉,我被Firefox剪贴板的“功能”所咬住了……应该可以了。
尼尔

innerText代替textContentsearch代替保存几个字节indexOf。还有一些,仅用<pre id=o作HTML而不是使用document.write它。
毛茸茸的

1
@Shaggy很好,谢谢!
尼尔,2017年

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
您知道让我眼花"
what乱的

1
这不考虑掉落在@:v上的可能性
Jenkar '17

@Jenkar,这是您第二次在答案中这样说。请解释你的意思。
caird coinheringaahing

@RandomUser基本上,此答案中的当前代码寻找一个尚未落在@上的点,而不是随机落在镜头上,即使它是at。要求中的“ 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
    • 通过打开系统而不是每次都引用它
  • 通过将while循环减少到一行来减少-3字节

我喜欢这个挑战的前提:)

并感谢您的worm虫。

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

在线尝试!

  • 通过将s与字符串进行比较来将s约束为字符串,从而获得-3个字节
  • -1字节,函数名称现在为“!” 调用时节省单个空间
  • -7个字节,感谢@vzwick
    • 通过别名String.replicate
    • 通过打开系统而不是每次都引用它
  • -1字节,调用d时不需要括号
  • -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

您可以通过从和调用中open System删除来保存1个字符;)SystemRandom()Threading.Thread.Sleep()
vzwick

还刮了几个字符:tio.run
##

@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();
}

在此处输入图片说明


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}

在线尝试!

先前的答案是错误的,它没有考虑@上的雨滴。显然不是必需的。保存一些字节。

这会终止并抛出错误,但是肯定会在打印完整个眼镜后立即终止。

  • 通过将打印结果放入lambda并更改分配以使用tr(duh)节省了13个字节
  • 8字节丢失,要求1秒。
  • 通过使用gsub技巧而不是插值获得10个字节(已从mbomb007的Python答案中看到并改编了)。
  • 现在,仅打印一次,即可删除lambda打印,从而获得12个字节的收益。
  • 通过使所有\\be变为1字节增益a,然后在tr内部变回
  • 通过将更改的最后一行与另一行x(duh)放在7字节的增益。如果你们中的一些人想知道这为什么不影响主循环:主循环不会考虑最后一行来确定它x
  • 移开眼镜顶部的末端可增加1个字节

Yay <200字节:D

Gif:

Gif


3
为了将来参考,您可以将先前的答案编辑为可行的答案,而不必删除并添加新的答案。
TheLethalCoder

您可以添加此运行的gif吗?
caird coinheringaahing

@RandomUser完成。
Jenkar '17

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秒的限制,因此对睡眠进行了注释

这是gif:

在此处输入图片说明


1

Perl,167个字节

请注意,这\x1b是一个文字转义字符。

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

在此处输入图片说明


从来没有使用过数学,但可以分配给Table9532
caird coinheringaahing

t=Table x = 32y = 95
caird coinheringaahing

当然是。从昨天开始我就打了很多
高尔夫球

您可能能够通过更换最后删除6个字节Flattenf
caird coinheringaahing

0

PHP,262254字节

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+=)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.