Akuarium Satu Jalur

31

Mertua saya memiliki kolam ikan di halaman mereka, penuh dengan koi. Itu tidak benar-benar terlintas di benak saya sampai saya perhatikan ekstrak berikut dari kode saya.

',') & '_'

... Aku punya wajah ikan yang menatapku dari layar ...

Yang telah memberi saya ide bagus ...

Pencarian saya untuk Anda, pegolf tersayang saya adalah membuat akuarium ASCII satu baris, dengan aturan berikut:

  • Ukuran akuarium dari sisi tangki ke sisi lain tangki tidak boleh lebih kecil dari 60 karakter dan tidak lebih besar dari 80 karakter. Sisi tangki perlu diindikasikan menggunakan karakter pipa / bar ( |).
  • Ikan harus bisa "berenang" dari kiri ke kanan di antara sisi-sisi tangki. Saat mereka berputar, tampilan depan diperlukan untuk transisi dari satu arah ke arah lainnya.
  • Ikan harus terlihat seperti berikut:

    • }}< }} ',') Ikan berenang dengan benar
    • (',' {{ >{{ Ikan berenang ke kiri
    • }}('_'){{ Ikan menghadap ke depan
  • Ketika seekor ikan berubah untuk mengubah arah (peluang 30%), ia harus mulai dari satu arah, menghadap ke depan, lalu menghadap ke arah yang lain ... Pastikan ada ruang yang cukup untuk ikan berbalik, yaitu membutuhkan enam ruang sebelum tepi minimum tangki ...

  • Kecuali jika seekor ikan meniupkan gelembung atau mengubah arah, ia akan melanjutkan ke arah yang dihadapinya, jika ia berada dalam enam ruang di sisi tangki, ia akan mengubah arah.
  • Ikan (menghadap ke kiri atau kanan) kadang-kadang (10% kemungkinan) berhenti untuk meniup gelembung berturut-turut ( .oO*), sehingga ikan harus memiliki ruang yang tersedia di sebelahnya agar gelembung ada, sehingga ikan dapat hanya berenang sedekat mungkin dengan sisi, menghemat satu ruang. Gelembung harus menghilang sebelum ikan dapat bergerak ...

Serangkaian contoh garis perilaku ikan, dengan -karakter yang menunjukkan spasi, karena fitur tampilan kode di sini sedikit ketat ... Saya akan berharap tanda hubung ini diganti dengan spasi ketika Anda mengkodekan ini ...

Setiap baris di sini dapat dianggap sebagai kerangka waktu.

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

dll. Contoh di atas adalah, seperti yang saya katakan, kecil, tetapi Anda mendapatkan ide umum ...

Kode terpendek menang ...

Saya mengharapkan output pada baris yang sama (jika mungkin), jika tidak, menampilkan bingkai demi bingkai berturut-turut adalah baik-baik saja ... Apakah Anda pergi satu baris atau beberapa baris terserah Anda. Jika Anda melakukan banyak baris, mereka harus dipisahkan oleh baris baru.

Juga timer dikenakan antara frame, 2000 ms. Ini wajib .

Ayo lihat apa yang kamu punya!

WallyWest
sumber
Jika ikan terlalu dekat ke tepi akuarium, apakah diharuskan untuk memutar, atau mungkin fase keluar dari layar? Mungkinkah ikan itu meniupkan gelembung dalam situasi ini? Juga, haruskah mungkin (atau apakah itu dilarang, atau diizinkan tetapi tidak diharuskan) bagi ikan untuk meledakkan gelembung dua kali berturut-turut?
John Dvorak
1
Tunggu, tidak, jangan lakukan perubahan seperti ini! Saya sudah mulai coding! Maukah Anda memutar kembali?
John Dvorak
5
Silakan gunakan kotak pasir di waktu berikutnya.
John Dvorak
1
Tidak secara eksplisit dinyatakan, tapi saya kira pasti ada satu ikan di akuarium?
John Dvorak
1
Apakah diperlukan bahwa ikan Mei gelembung dua kali berturut-turut, atau kita diperbolehkan untuk membiarkan hal itu terjadi? Itu membuat perbedaan tiga karakter bagi saya.
John Dvorak

Jawaban:

11

Python 3 (278)

Sebelumnya: 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)

Golf di Python selalu sulit karena persyaratan lekukan pernyataan, tetapi meskipun begitu, ini berjalan sangat baik!

Terima kasih banyak kepada Volatility dan DSM karena telah membantu saya bermain golf lebih jauh.

Versi bersih

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)
menyodok
sumber
7

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

Panjang ikan itu sebelas karakter, membuat akuarium 6 * 9 + 11 + 2 = 67 karakter lebar, yang cocok dengan toleransi yang diperlukan.

Fungsi flambda melakukan semua pengangkatan berat: ia menerima substitusi sebagai sepasang argumen, kemudian mencoba menerapkan substitusi pada akuarium. Jika berhasil, itu melukis satu bingkai animasi. Ini kemudian melaporkan nilai keberhasilan sebagai 2(penundaan diambil) atau nil(penundaan tidak dilakukan).

Ikan tidak akan meniup gelembung dua kali berturut-turut. (Perbaiki: ...while rand>0.1- 4 karakter)

Ikan bisa meniupkan gelembung bahkan sebelum belok paksa. (Perbaiki: atur ulang struktur percabangan)

Ada bingkai di mana gelembung benar-benar hilang (termasuk *) tetapi ikan belum pindah ke dalam kekosongan yang dihasilkan. Ini mengikuti surat, tetapi bukan contohnya. (Perbaiki: ganti f[?*,w]dengan q[?*]=w- gratis)

Tidak menghapus konsol. Perbaiki: tambahkan `clear`(Unix) atau system 'cls'(konsol Windows) sebelum puts qmemperbaiki ( Ref. ) Atau gunakan printsebagai ganti putsdan tambahkan \rke akuarium ( disarankan oleh @manatwork ).

Versi yang dapat dibaca:

# 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
John Dvorak
sumber
Saya akan menambahkan \rke awal q: q="\r|#{r+s*9}|". Kemudian gunakan $><<qsebagai ganti puts q. Lebih panjang 1 karakter, tetapi terlihat lebih baik tanpa menggunakan perintah eksternal.
manatwork
\rmembersihkan layar? Tidak dalam kasus saya. Atau, mengapa kamu tidak suka puts?
John Dvorak
1
Tidak, \rapakah carriage return. Dengan menggunakan $><<quntuk output, kursor akan tetap berada di baris yang sama ( putsmemaksa \nsetelah output) sehingga memulai output berikutnya dengan \rakan melompat kembali ke awal baris saat ini dan mulai untuk output dari sana. Dengan demikian menimpa "gambar" sebelumnya garis akuarium.
manatwork
@manatwork sayangnya, ini benar-benar mengacaukan jendela interaktif jRuby, yang mengabaikan \r.
John Dvorak
Oh Turut sedih. Dan terima kasih atas informasinya. Sayangnya ini adalah fakta pertama yang saya pelajari tentang jRuby. :(
manatwork
3

R, 451 karakter

Upaya pertama:

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

Bertakuk:

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
}

Ini mencetak akuarium sebagai stdout pada satu baris (kemudian 2s istirahat dan carriage kembali sebelum akuarium pada t +1 dicetak).

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

atau lebih jelas

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

Ikan berputar dengan benar. Gelembung bertiup.

285 - jika Anda menyukai nuansa akuarium asli dan bukan versi gulir:

$|=@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}
KevinColyer
sumber
Di mana Anda berbalik? Saya tidak dapat melihat Anda mengatur $d=0dalam kasing "diperlukan".
John Dvorak
1
sleep2(tanpa ruang) tidak berfungsi untuk saya; juga saat Anda berputar, Anda tidak menjaga wajah ikan tetap rata. Dan gelembung-gelembung itu tampaknya tidak pernah muncul.
colek
"Juga penghitung waktu dikenakan antara frame, 2000 ms. Ini wajib." - ini tidak terjadi sama sekali bagi saya. Juga, gelembung tidak muncul, ikan hanya duduk di tempatnya. Juga, kepala harus tetap di tempat saat ikan berputar, bukan pusat tubuh (setidaknya itulah yang ditunjukkan contoh)
John Dvorak
Drat! Golf terlalu keras. Butuh ruang ekstra dengan tidur! Ikan juga menggelegak dengan baik! tunggu ...
KevinColyer
Ups - lupa kepala di tengah saat berbelok di tepi - butuh pengerjaan ulang ...
KevinColyer
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();} 

Dengan spasi putih:

#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();
}
Josh
sumber
1
Dapat i==l?(c=r):(c=l)disingkat menjadi c=i==l?r:l?
John Dvorak
Sepertinya bisa. Terima kasih!
Josh
Anda dapat menyimpan beberapa karakter dengan#define p printf(
user12205
@ Ace gcc tidak suka ketika saya melakukan itu.
Josh
ini bekerja untuk saya. oi41.tinypic.com/15fqbvb.jpg
user12205