ワンライン水族館


31

義理の両親の庭には、pondでいっぱいの養魚池があります。次のコードからの抜粋に気付くまで、それは本当に私の頭をよぎりませんでした。

',') & '_'

...スクリーンから魚の顔を振り返る...

それは私に素晴らしいアイデアを与えました...

あなたのための私の探求、私の愛するゴルファーは、次のルールで、1行のASCIIアクアリウムを作成することです。

  • タンクの側面からタンクの反対側までの水槽のサイズは、60文字以上80文字以下でなければなりません。タンクの側面は、パイプ/バー(|)文字を使用して示す必要があります。
  • 魚は水槽の両側で左から右に「泳ぐ」ことができなければなりません。方向転換するため、一方の方向から他方の方向への移行には正面図が必要です。
  • 魚は次のように見える必要があります。

    • }}< }} ',') 魚が泳ぐ権利
    • (',' {{ >{{ 魚が泳いでいる左
    • }}('_'){{ 正面を向いた魚
  • 魚が方向を変えようとすると(30%の確率)、魚は一方向から始まり、正面を向き、次に反対方向を向く必要があります。魚が向きを変える十分なスペースがあることを確認してください。タンク最小のエッジ...

  • 魚が泡を吹いたり方向を変えたりしない限り、魚が向いている方向に進み、水槽の側面の6つのスペース内に入れば、魚は方向を変えます。
  • 魚(左または右)は​​時々(10%の確率で)泡を止めて連続して泡を吹く.oO*ことができます()サイドの近くで泳ぐだけで、スペースを1つ節約する。魚が進む前に泡が消えなければなりません...

-ここでのコード表示機能は少し厳しいので、スペースを示す文字を含む魚の動作の一連の例の行...これをコーディングすると、これらのダッシュがスペースに置き換えられると予想されます...

ここの各行は、コマ撮りのフレームと考えることができます。

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

上記の例は、私が言ったように小さいですが、一般的なアイデアを得る...

最短のコードが勝つ...

出力が同じ行に(可能な場合)期待されますが、そうでない場合、フレームごとに連続して表示するのは問題ありません。1行にするか複数行にするかはあなた次第です。複数の行を行う場合は、改行で区切る必要があります。

また、フレーム間に2000msのタイマーが課されます。これは必須です。

あなたが持っているものを見てみましょう!


魚が水槽の端に近づきすぎた場合、方向転換する必要がありますか、それとも画面から段階的に消えますか?この状況で魚が泡を吹く可能性はありますか?また、魚が連続して2回泡を吹くことが可能である必要がありますか(または禁止されていますか、許可されていますが、必須ではありません)?
ジョンドヴォルザーク14年

1
待って、いや、このような変更をしないでください!私はすでにコーディングを始めました!ロールバックしますか?
ジョンドヴォルザーク14年

5
次回はサンドボックスを使用してください。
ジョンドヴォルザーク14年

1
それは明示的に述べられていませんが、私は水族館にちょうど1匹の魚がいるに違いないと思いますか?
ジョンドヴォルザーク14年

1
それは必要な 2回連続で魚月泡こと、あるいは我々がされている許可され、それを実現させるために?私にとって3文字の違いがあります。
ジョンドヴォルザーク14年

回答:


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ラムダ関数はすべての面倒な作業を行います:置換を引数のペアとして受け入れてから、置換を水槽に適用しようとします。成功すると、アニメーションの1フレームをペイントします。次に、成功値を2(取得した遅延)またはnil(遅延未実行)として報告します。

魚が連続して2回泡を吹くことはありません。(修正:...while rand>0.1-4文字)

魚は、強制的に回転する前であっても泡を吹くことがあります。(修正:分岐構造の再配置)

バブルが完全になくなったフレーム(を含む*)がありますが、魚は結果として生じる空隙に移動していません。これは文字に続きますが、例には続きません。(修正:置き換えるf[?*,w]q[?*]=w-無料)

コンソールをクリアしません。修正:追加`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

\rq:の先頭に追加しますq="\r|#{r+s*9}|"。次に、の$><<q代わりに使用しますputs q。1文字長くなりますが、外部コマンドを使用しなくても見栄えが良くなります。
マナトワーク14年

\r画面をクリアしますか?私の場合はそうではありません。または、なぜあなたは好きではないのですputsか?
ジョンドヴォルザーク14年

1
いいえ、\rキャリッジリターンです。$><<q出力に使用すると、カーソルは同じ行にとどまり(出力の後にputs強制的に\n)、次の出力を\r開始すると、現在の行の先頭に戻り、そこから出力を開始します。したがって、水族館ラインの以前の「画像」を上書きします。
マナトワーク14年

残念ながら、@ manatworkはjRubyの対話型ウィンドウを完全に台無しにします\r
ジョンドヴォルザーク14年

ああ。ごめんなさい そして情報をありがとう。残念なことに、これがjRubyについて学んだ最初の事実です。:(
マナトワーク14年

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
}

アクアリウムを標準出力として1行に印刷します(t + 1のアクアリウムが印刷される前に、2秒間のブレークとキャリッジリターン)。


3

Perl、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「必要な方向転換」の場合の設定を確認できません。
ジョンドヴォルザーク14年

1
sleep2(スペースなし)は私のために働いていません。また、あなたが回っているとき、あなたは魚の顔を揃えないでください。そして、泡は決して現れないようです。
突く

「また、2000msのフレーム間にタイマーが課されます。これは必須です。」-これは私にはまったく起こりません。また、泡は表示されず、魚は所定の位置に固定されます。魚ではなく、体の中心部を回している間も、ヘッドが所定の位置にとどまるべき(少なくとも、それは何の例の番組)
ジョン・ドヴォルザーク

ドラット!あまりにもハードにゴルフ。睡眠に余裕が必要です!魚もきれいに泡立っていました!ハング上の...
KevinColyer

おっと-エッジで回したときに途中で頭を忘れてしまった-いくつかの手直しが必要...
KevinColyer

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か?
ジョンドヴォルザーク14年

それができるように見えます。ありがとう!
ジョシュ14年

いくつかの文字を保存することができます#define p printf(
user12205 14年

@Ace gccは私がそれをするときそれを好まない。
ジョシュ14年

わたしにはできる。oi41.tinypic.com/15fqbvb.jpg-user12205 14
1
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.