Bir hat akvaryum


31

Kayınpederimin bahçesinde koy ile dolu bir balık havuzu var. Kodumdan aşağıdaki alıntıyı fark edene kadar aklımdan geçmedi.

',') & '_'

... balık suratlarım ekranımdan bana bakıyordu ...

Bu da bana harika bir fikir verdi.

Sizin için olan arayışım, sevgili golfçülerim, aşağıdaki kuralları içeren tek satırlık bir ASCII akvaryumu oluşturmak:

  • Akvaryumun tankın yanından tankın diğer tarafına kadar olan boyutu 60 karakterden küçük olmamalıdır ve 80 karakterden büyük olmamalıdır. Boru / çubuk ( |) karakteri kullanılarak tankın yanlarının belirtilmesi gerekir .
  • Balık, tankın kenarları arasında soldan sağa "yüzebiliyor" olmalıdır. Dönecekleri için, bir yönden diğerine geçiş için önden görünüm gerekir.
  • Balık aşağıdaki gibi görünmelidir:

    • }}< }} ',') Doğru balık yüzme
    • (',' {{ >{{ Sol balık yüzme
    • }}('_'){{ Öne bakan balık
  • Bir balık yönünü değiştirdiğinde (% 30 şans), bir yönden başlamalı, ön tarafa bakmalı, sonra diğer yöne bakmalıdır ... Balığın dönmesi için yeterli alan olduğundan emin olun, yani balıkların altı tane boşluk bırakması gerekir. tankın kenarı minimum ...

  • Bir balık bir balon şişirmediği veya yön değiştirmediği sürece, karşı tarafına doğru devam eder, tankın kenarının altı boşluğuna girerse yön değiştirir.
  • Balıklar (sola veya sağa doğru) zaman zaman (% 10 şans) art arda kabarcıkları üflemeyi durdurabilir ( .oO*), bu yüzden balık, kabarcığın var olması için yanlarında bir boşluk olması gerekir; sadece kenarlara yakın yüzün, bir yerden tasarruf edin. Balık hareket etmeden önce balonun kaybolması gerekir ...

Balığın davranışının bir dizi çizgi örneği, -karakterleri boşlukları belirten karakterlerle birlikte , burada kod gösterme özelliği biraz katı ... Bu kodları koyduğunuzda bu çizgilerin boşluklarla değiştirilmesini bekleyeceğim ...

Buradaki her satır, hızlandırılmış bir çerçeve olarak kabul edilebilir.

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

vb. Yukarıdaki örnek, söylediğim gibi, küçüktür, ancak genel fikri anladınız ...

En kısa kod kazanır ...

Çıktıyı aynı satırda (eğer mümkünse) bekliyorum, değilse, kareden sonra art arda kareyi göstermek iyi olur ... Bir satır mı yoksa birden çok satır mı seçtiğiniz size kalmış. Birden fazla satır yapıyorsanız, satırları yeni satırlarla ayrılmalıdır.

Ayrıca çerçeveler arasında 2000ms olarak bir zamanlayıcı da yüklenir. Bu zorunludur .

Bakalım neyin var?


Balık akvaryumun kenarına çok yaklaşırsa, dönmesi gerekli midir, yoksa ekranın dışına çıkabilir mi? Bu durumda balığın kabarcıkları patlatması mümkün olmalı mı? Ayrıca, balığın art arda iki kez kabarcıkları uçurması mümkün mü (veya yasak mı yoksa izin veriliyor ancak zorunlu değil mi)?
John Dvorak

1
Bekle, hayır, böyle değişiklikler yapmayın! Kodlamaya çoktan başladım! Geri çekilir misin?
John Dvorak

5
Lütfen bir dahaki sefere sanal alanı kullanın .
John Dvorak

1
Açıkça ifade edilmedi, ancak akvaryumda tam olarak bir balık olması gerektiğini düşünüyorum.
John Dvorak

1
O mi gerekli balık mayıs kabarcık iki kez arka arkaya, ya da biz olduğunu izin bunun olmasına izin? Bu benim için üç karakterli bir fark yaratıyor.
John Dvorak

Yanıtlar:


11

Piton 3 (278)

Daha önce: 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'da golf oynamak, açıklamaların girintili olması nedeniyle her zaman zordur, ancak buna rağmen, bu inanılmaz derecede iyi geçti!

Volatility ve DSM'ye bu çok daha fazla golf atmama yardım ettiği için teşekkür ederim.

Temiz versiyon

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

Yakut, 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]}

Balıklar on bir karakter uzunluğundadır ve akvaryumu 6 * 9 + 11 + 2 = 67 karakter genişliğinde yapar ve bu da gerekli toleranslara tam olarak uyar.

fLambda fonksiyonu ağır işleri yapar: argümanlar bir çift, akvaryum üzerine ikame uygulamak için daha sonra girişimleri gibi bir ikame kabul eder. Başarılı olursa, animasyonun bir karesini boyar. Daha sonra başarı değerini 2(alınan gecikme) veya nil(gecikmenin yürütülmediğini) bildirir .

Balık, art arda iki kez kabarcıklar üflemeyecek. (Düzeltme: ...while rand>0.1- 4 karakter)

Balık zorla açılmadan önce bile baloncukları patlatabilir. (Düzeltme: dallanma yapısını yeniden düzenleme)

Kabarcık tamamen gittiği bir çerçeve var (dahil *) ancak balık ortaya çıkan boşluğa hareket etmedi. Bu mektubu izler, ancak örneği takip etmez. (Fix: yerine f[?*,w]ile q[?*]=w- serbest)

Konsolu temizlemez. Düzeltme: düzeltmeden önce ( Ref. ) Ekleyin`clear` veya (Unix) veya system 'cls'(Windows konsolu) ekleyin veya akvaryum yerine kullanın ( @manatwork tarafından önerilen ).puts qprintputs\r

Okunabilir sürüm:

# 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

Ben eklersiniz \rq başlangıcına: q="\r|#{r+s*9}|". Sonra $><<qyerine kullanın puts q. 1 karakter daha uzun, ancak harici komut kullanmadan daha iyi görünüyor.
Manatwork

\rekranı temizler mi? Benim durumumda değil. Ya da neden sevmiyorsun puts?
John Dvorak

1
Hayır, \rsatır başı. Kullanarak $><<qçıkışı için imleci aynı satırda kalır ( putskuvvetler \nçıkış sonrası) ile bir sonraki çıkışını başlayan yüzden \rşimdiki satırın başına kadar geri atlamak ve oradan çıkışa başlayacaktır. Böylece akvaryum hattının önceki “imajı” üzerine yazar.
Manatwork

@ manatwork ne yazık ki, bu tamamen görmezden gelen jRuby interaktif penceresini bozuyor \r.
John Dvorak

Ah. Bunu duyduğuma üzüldüm. Bilgi için teşekkürler. Ne yazık ki bu, jRuby hakkında öğrendiğim ilk gerçek. :(
manatwork

3

R, 451 karakter

İlk girişim:

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

Girintili'ye:

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
}

Akvaryumu tek bir hat üzerinde stdout olarak basar (2 + 'de akvaryum basılmadan önce 2s kopar ve araba geri döner).


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}

veya daha açık bir şekilde

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

Doğru balık dönüyor. Baloncuklar üfleme

285 - Gerçek akvaryumu seviyorsanız, kaydırma versiyonunu değil hissedin:

$|=@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}

Nereye dönüyorsun? $d=0"Gerekli dönüm" durumunda ayar yaparken sizi göremiyorum .
John Dvorak

1
sleep2(boşluksuz) benim için çalışmıyor; Ayrıca döndüğünüzde, balık yüzünü hizalı tutmazsınız. Ve baloncuklar asla görünmüyor.
dürtmek

"Ayrıca, çerçeveler arasına 2000ms yüklenir. Bu zorunludur." - bu benim için hiç olmaz. Ayrıca, kabarcıklar görünmüyor, balık sadece yerine oturur. Ayrıca, balık dönerken kafa yerinde durmalıdır, vücut merkezi değil (en azından örneğin gösterdiği gibi)
John Dvorak

Lanet olsun! Çok sert golf oynadım. Uyku ile ekstra bir alana ihtiyacınız var! Balık da güzel köpürüyordu! dayan ...
KevinColyer

Oops - kenarlarından dönerken ortadaki başı unuttum - biraz
düzeltmeye

2

C, 400 394 373 karakter

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

Boşluk ile:

#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
Can i==l?(c=r):(c=l)için kısaltılabilir c=i==l?r:l?
John Dvorak

Olabilir gibi görünüyor. Teşekkürler!
Josh

Birkaç karakter #define p printf(
kaydederek

@ Ace Gcc bunu yaptığımda sevmiyor.
Josh

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.