一线水族馆


31

我的岳父母在院子里有一个装满锦鲤的鱼塘。直到我注意到代码中的以下摘录,它才真正引起我的注意。

',') & '_'

...我的鱼脸从屏幕上回望我...

这给了我一个好主意...

我想要的,我的亲爱的高尔夫球手,是创建一个单行ASCII水族馆,并遵循以下规则:

  • 从水箱一侧到水箱另一侧的水族馆的大小应不小于60个字符且不大于80个字符。储罐的侧面需要使用管道/条(|)字符指示。
  • 鱼必须能够在水箱两侧之间从左向右“游动”。随着它们的转动,从一个方向到另一个方向的过渡需要正视图。
  • 鱼必须如下所示:

    • }}< }} ',') 鱼游正确
    • (',' {{ >{{ 鱼向左​​游
    • }}('_'){{ 鱼面朝前
  • 当鱼转向时(机会发生30%),它必须从一个方向开始,面向前方,然后面向另一方向...确保鱼有足够的转向空间,即在转向之前需要六个空间。坦克的边缘最小...

  • 除非鱼在吹泡泡或改变方向,否则它将继续朝其面对的方向前进,如果它进入水箱侧面的六个空间之内,它将改变方向。
  • 鱼(向左或向右)有时可能会(10%的机会)停下来连续吹泡泡(.oO*),因此要求鱼旁边有一个可用空间以使气泡存在,因此,鱼可以只在两侧游泳,节省一个空间。气泡必须消失,鱼才能继续前进。

鱼的行为的一系列示例行,用-字符表示空格,因为此处的代码显示功能有些严格...我希望当您对此进行编码时,这些破折号会被空格代替...

此处的每一行都可以视为延时中的一帧。

|-}}< }} ',')----------|
|--}}< }} ',')---------|
|---}}< }} ',')--------|
|----}}< }} ',')-------|
|-----}}< }} ',')------|
|-----}}< }} ',').-----|
|-----}}< }} ',')o-----|
|-----}}< }} ',')O-----|
|-----}}< }} ',')*-----|
|---------}}('_'){{----|
|-----------(',' {{ >{{|
|----------(',' {{ >{{-|
|---------(',' {{ >{{--|
|--------.(',' {{ >{{--|
|--------o(',' {{ >{{--|
|--------O(',' {{ >{{--|
|--------*(',' {{ >{{--|
|--------(',' {{ >{{---|
|-------(',' {{ >{{----|
|------(',' {{ >{{-----|

等等,就像我说的,上面的例子很小,但是您可以理解...

最短的代码胜出...

我希望输出在同一行上(如果可能),如果没有,则连续显示一帧又一帧是好的...您是走一行还是多行都可以。如果要执行多行,则必须用换行符将其分隔。

在帧之间也施加一个计时器,即2000ms。这是强制性的

让我们看看你有什么!


如果鱼离水族箱的边缘太近,是否需要转弯,否则可能会退出屏幕?鱼在这种情况下是否有可能吹泡泡?另外,鱼是否有可能(或者被禁止,或者被允许但不是必需)连续两次吹泡泡?
约翰·德沃夏克

1
等等,不,不要做这样的改变!我已经开始编码!您介意回滚吗?
约翰·德沃夏克

5
请下次使用沙盒
约翰·德沃夏克

1
它没有明确说明,但我猜水族馆里肯定只有一条鱼吗?
John Dvorak 2014年

1
难道需要的鱼可能泡沫连续两次,还是我们允许让它发生呢?这对我来说是三个字符的区别。
John Dvorak 2014年

Answers:


11

Python 3(278)

以前:334、332、325、302、300、299、291、286、284、281

import random,time
r=random.random
F="}}('_'){{%s","}}< }} ',')%s","%s(',' {{ >{{"
p,d=9,1
c=b=0
while 1:
 if c:p-=c+c*3*(2*d+c==1);d=c-c*d*d;c-=d
 elif b%5:b+=1
 elif.3>r()or{p*d}<{-5,53}:c=-d
 elif.1>r():b=1
 else:p+=d
 print('|%-70s|'%(' '*p+F[d])%' .oO*'[b%5]);time.sleep(2)

由于语句的缩进要求,在Python中打高尔夫球总是很困难,但是尽管如此,这样做还是非常好!

非常感谢Volatility和DSM为我提供了更多帮助。

干净版

from random import random as r
from time import sleep as s
F = { 1: "}}< }} ',')%s", 0: "}}('_'){{%s", -1: "%s(',' {{ >{{" }

# p: position (from left)
# d: direction (-1: left, +1: right)
# c: changing direction (0: not changing, +1: to right, -1: to left)
# b: bubble (0)
p, d, c, b = 9, 1, 0, 0

while 1:
    if c:
        p -= c*[1,4][2*d+c==1]
        if d:
            d = 0
        else:
            d, c = c, 0
    elif b % 5:
        b += 1
    else:
        # change direction
        if r() < .3 or p * d in (-5,53):
            c = -d
        # start bubbling
        elif r() < .1:
            b = 1
        # move forward
        else:
            p += d

    # print fish and sleep
    print('|{:<70}|'.format(' '*p+(F[d]%' .oO*'[b%5])))
    s(2)

7

红宝石, 291 289

l="(',' {{ >{{";m="    }}('_'){{    ";r="}}< }} ',')";w=?\s;s=w*6;q="|#{r+s*9}|"
f=->*s{(puts q;sleep 2)if q.sub! *s}
loop{rand>0.1||(f[") ",")."]||f[" (",".("];f[?.,?o];f[?o,?O];f[?O,?*];f[?*,w])
q[7]==?(||q[-8]==?)||rand<0.3?f[s+l,m]&&f[m,r+s]||f[r+s,m]&&f[m,s+l]:f[w+l,l+w]||f[r+w,w+r]}

鱼长11个字符,使水族馆6 * 9 + 11 + 2 = 67个字符宽,完全符合要求的公差。

所述f的λ函数执行所有繁重:它接受一个替代为一对参数,然后尝试应用在水族箱的取代。如果成功,它将绘制一帧动画。然后,它将成功值报告为2(延迟时间)或nil(未执行延迟)。

鱼不会连续两次吹泡泡。(修复:...while rand>0.1-4个字符)

甚至在强制转弯之前,鱼可能会吹泡泡。(修复:重新排列分支结构)

有一个框架,气泡完全消失了(包括*),但是鱼没有移入所形成的空隙中。这是字母后面的内容,而不是示例。(修复:替换f[?*,w]q[?*]=w-免费)

不清除控制台。修复:ADD `clear`(UNIX)或system 'cls'之前(Windows控制台)puts q来修复参见文献或使用print的,而不是puts和前面加上\r到水族馆(由@manatwork建议)。

可读版本:

# l - left fish; m - middle fish + space; r - right fish
# w - single space character; s - six spaces; q - the aquarium
l="(',' {{ >{{"; m="    }}('_'){{    "; r="}}< }} ',')";
w=" "; s=w*6; q="|#{r+s*9}|"
f = ->k,v do
  if q.sub! k,v
    puts q
    sleep 2
    return 2
  else
    return nil
  end
end

loop do
  if rand < 0.1
    f[") ",")."] || f[" (",".("]
    f[?.,?o]; f[?o,?O]; f[?O,?*]; f[?*,' ']
  end
  if q[7] == "(" || q[-8] == ")" || rand < 0.3
    (f[s+l,m] && f[m,r+s]) || (f[r+s,m] && f[m,s+l])
  else
    f[w+l,l+w] || f[r+w,w+r]
  end
end

我将添加\r到q:的开头q="\r|#{r+s*9}|"。然后使用$><<q代替puts q。长1个字符,但在不使用外部命令的情况下看起来更好。
manatwork 2014年

\r清除屏幕?在我来说不是。或者,为什么不喜欢puts
John Dvorak 2014年

1
不,\r是回车。通过使用$><<q输出,光标将停留在同一行中(在输出后puts强制a \n),因此从下一个输出开始\r将跳回到当前行的开头并从此处开始输出。因此,将覆盖水族馆线之前的“图像”。
manatwork 2014年

不幸的是,@manatwork完全弄乱了jRuby交互式窗口,该窗口忽略\r
约翰·德沃夏克

哦。很抱歉听到这个消息。并感谢您提供的信息。不幸的是,这是我了解jRuby的第一个事实。:(
manatwork 2014年

3

R,451个字符

第一次尝试:

f=function(j,p){cat("\r|",rep("-",j),p,rep("-",50-j),"|",sep="");Sys.sleep(2)};d=F;j=5;P=c("--}}(\'_\'){{--","-}}< }} \',\')-","-(\',\' {{ >{{-");B=c("-",".","o","O","*","-");g=Vectorize(gsub,v="replacement");b=list(g("-$",B,P[2]),g("^-",B,P[3]));repeat{if(j<5 & d){d=!d;j=j+1;f(j,P[1])};if(j>44 & !d){d=!d;f(j,P[1]);j=j-1};if(runif(1)<.1){for(i in b[[d+1]])f(j,i)}else{f(j,P[d+2])};if(runif(1)<.3){d=!d;f(j,P[1]);f(j,P[d+2])};if(d){j=j-1}else{j=j+1}}

缩进:

f=function(j,p){ #Printing function (depends of buffer and kind of fish)
    cat("\r|",rep("-",j),p,rep("-",50-j),"|",sep="")
    Sys.sleep(2)
}
d=F   #Direction: if FALSE left to right, if TRUE right to left.
j=5   #Buffer from left side of tank
P=c("--}}(\'_\'){{--","-}}< }} \',\')-","-(\',\' {{ >{{-") #The fish
B=c("-",".","o","O","*","-") #The bubble sequence
g=Vectorize(gsub,v="replacement")
b=list(g("-$",B,P[2]),g("^-",B,P[3])) #Fish+bubble
repeat{
    if(j<5 & d){ #What happens if too close from left side
        d=!d
        j=j+1
        f(j,P[1])
        }
    if(j>44 & !d){ #What happens if too close from right side
        d=!d
        f(j,P[1])
        j=j-1}
    if(runif(1)<.1){ #If bubble sequence initiated
        for(i in b[[d+1]])f(j,i)
        }else{f(j,P[d+2])} #Otherwise
    if(runif(1)<.3){ #If fish decide to turn
        d=!d
        f(j,P[1])
        f(j,P[d+2])
    }
    if(d){j=j-1}else{j=j+1} #Increment or decrement j depending on direction
}

它在单行上将水族馆打印为标准输出(然后在打印t + 1的水族馆之前2s中断并返回回车)。


3

佩尔(281)

@f=("s O(',' {{ >{{","s}}('_'){{s","}}< }} ',')O s");$d=1;@o=split//," *Oo. ";{$_="|".$"x$x.$f[$d+1].$"x(44-$x).'|
';s/O/$o[$b]/;s/s/    /g;print;if($b||$t){$b--if$b;if($t){$d+=$t;$t=0if$d}}else{$x+=$d;$t=($x<1)-($x>43);if(!$t){$b=5if.9<rand;if(.7<rand){$t=-$d;$b=0}}}sleep 2;redo}

或更清楚

@f = ( "s O(',' {{ >{{", "s}}('_'){{s", "}}< }} ',')O s" );
$d = 1;
@o = split //, " *Oo. ";
{
    $_ = "|" . $" x $x . $f[ $d + 1 ] . $" x ( 44 - $x ) . '|
';
    s/O/$o[$b]/;
    s/s/    /g;
    print;
    if ( $b || $t ) {
        $b-- if $b;
        if ($t) { $d += $t; $t = 0 if $d }
    }
    else {
        $x += $d;
        $t = ( $x < 1 ) - ( $x > 43 );
        if ( !$t ) {
            $b = 5 if .9 < rand;
            if ( .7 < rand ) { $t = -$d; $b = 0 }
        }
    }
    sleep 2;
    redo
}

鱼正确转动。气泡在吹。

285-如果您喜欢真正的水族馆感觉而不是滚动版本:

$|=@f=("s O(',' {{ >{{","s}}('_'){{s","}}< }} ',')O s");$d=1;@o=split//," *Oo. ";{$_="\r|".$"x$x.$f[$d+1].$"x(44-$x).'|';s/O/$o[$b]/;s/s/    /g;print;if($b||$t){$b--if$b;if($t){$d+=$t;$t=0if$d}}else{$x+=$d;$t=($x<1)-($x>43);if(!$t){$b=5if.9<rand;if(.7<rand){$t=-$d;$b=0}}}sleep 2;redo}

你在哪里转弯?我看不到您$d=0在“必需的转弯”情况下进行设置。
约翰·德沃夏克

1
sleep2(没有空间)对我不起作用;在转弯时,也不要使鱼的脸保持对齐。而且气泡似乎从未出现。

“此外,在帧之间(2000毫秒)设置了一个计时器。这是强制性的。” -这对我完全没有发生。而且,气泡不会出现,鱼只是就位。另外,在鱼转弯时,头部应保持在原位,而不是身体中心(至少这就是示例所显示的)
John Dvorak

德拉特!打高尔夫球太难了。需要额外的睡眠空间!鱼也很好地冒泡!等等...
KevinColyer 2014年

糟糕-在边缘转弯时忘了中间的头-需要一些返工...
KevinColyer 2014年

2

C,400个 394 373字符

#define p printf
#define a(x) l[5]=r[11]=x;d();
char *l="      (',' {{ >{{",*f="    }}('_'){{    ",*r="}}< }} ',')      ",*c,s=7,i,*T;d(){p("|");for(i=0;i<s;i++)p(" ");p(c);for(i=0;i<70-s;i++)p(" ");puts("|");sleep(2);}b(){a(46)a(111)a(79)a(42)a(32)}t(){T=c;c=f;d();c=T==r?l:r;d();}m(){c==l?s--:s++;d();s>69||s<1?t():0;}main(){c=r;for(d();;)i=rand()%10,i?i>6?t():m():b();} 

带空格:

#define p printf
#define a(x) l[5]=r[11]=x;d();
char *l="      (',' {{ >{{",
     *f="    }}('_'){{    ",
     *r="}}< }} ',')      ",
     *c, 
     s=7,
     i,  
    *T; 
d(){
  p("|");
  for(i=0;i<s;i++)
    p(" ");
  p(c);
  for(i=0;i<70-s;i++)
    p(" ");
  puts("|");
  sleep(2);
}
b(){
  a(46)
  a(111)
  a(79)
  a(42)
  a(32)
}
t(){
  T=c;
  c=f;
  d();
  c=T==r?l:r;
  d();
}
m(){
  c==l?s--:s++;
  d();
  s>69||s<1?t():0;
}
main(){
  c=r;
  for(d();;)
    i=rand()%10,
    i?i>6?t():m():b();
}

1
可以i==l?(c=r):(c=l)缩短为c=i==l?r:l
John Dvorak 2014年

看起来可以。谢谢!
2014年

您可以通过保存一些字符#define p printf(
pastebin.com削减0mr8spkT

当我这样做时,@ Ace gcc不喜欢它。
2014年

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.