Thủy cung một dòng


31

Bố mẹ chồng tôi có một ao cá trong sân của họ, đầy cá koi. Nó không thực sự xuất hiện trong đầu tôi cho đến khi tôi nhận thấy đoạn trích sau từ mã của mình.

',') & '_'

... Tôi có khuôn mặt cá nhìn lại tôi từ màn hình của tôi ...

Điều đó đã cho tôi một ý tưởng tuyệt vời ...

Nhiệm vụ của tôi dành cho bạn, những người chơi golf thân yêu của tôi là tạo ra một bể cá ASCII một dòng, với các quy tắc sau:

  • Kích thước của bể cá từ bên này sang bên kia của bể phải không nhỏ hơn 60 ký tự và không lớn hơn 80 ký tự. Các mặt của bể cần được chỉ định bằng |ký tự pipe / bar ( ).
  • Cá phải có khả năng "bơi" từ trái sang phải giữa các cạnh của bể. Vì chúng sẽ quay, nên cần có chế độ xem trước để chuyển từ hướng này sang hướng khác.
  • Cá phải trông như sau:

    • }}< }} ',') Cá bơi ngay
    • (',' {{ >{{ Cá bơi trái
    • }}('_'){{ Cá hướng về phía trước
  • Khi một con cá quay sang đổi hướng (30% cơ hội), nó phải bắt đầu từ một hướng, quay mặt về phía trước, rồi quay mặt sang hướng khác ... Hãy chắc chắn rằng có nhiều chỗ để cá quay, tức là cần sáu khoảng trống trước cạnh của bể tối thiểu ...

  • Trừ khi một con cá đang thổi bong bóng hoặc đổi hướng, nó sẽ tiếp tục theo hướng nó đang đối mặt, nếu nó ở trong sáu không gian bên cạnh bể, nó sẽ đổi hướng.
  • Cá (quay mặt sang trái hoặc phải) đôi khi (10% cơ hội) dừng lại để thổi bong bóng liên tiếp ( .oO*), vì vậy cá bắt buộc phải có một khoảng trống bên cạnh chúng để bong bóng tồn tại, vì vậy một con cá có thể Chỉ bơi càng gần hai bên, tiết kiệm một khoảng trống. Bong bóng phải biến mất trước khi cá có thể di chuyển ...

Một loạt các dòng ví dụ về hành vi của cá, với các -ký tự chỉ ra khoảng trắng, vì tính năng hiển thị mã ở đây hơi nghiêm ngặt ... Tôi sẽ hy vọng các dấu gạch ngang này sẽ được thay thế bằng khoảng trắng khi bạn mã hóa ...

Mỗi dòng ở đây có thể được coi là một khung trong thời gian trôi đi.

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

vv Ví dụ trên là, như tôi đã nói, nhỏ, nhưng bạn có ý tưởng chung ...

Mã ngắn nhất sẽ thắng ...

Tôi hy vọng đầu ra trên cùng một dòng (nếu có thể), nếu không, hiển thị khung hình sau khung hình liên tiếp là tốt ... Cho dù bạn đi một dòng hay nhiều dòng là tùy thuộc vào bạn. Nếu bạn đang thực hiện nhiều dòng, chúng phải được phân tách bằng một dòng mới.

Ngoài ra một bộ đếm thời gian được áp đặt giữa các khung, 2000ms. Điều này là bắt buộc .

Hãy xem những gì bạn đã có!


Nếu con cá quá gần mép hồ cá, có cần phải quay lại không, hay nó có thể lệch khỏi màn hình? Phải có khả năng cá thổi bong bóng trong tình huống này? Ngoài ra, phải có khả năng (hoặc bị cấm, hoặc được phép nhưng không bắt buộc) để cá thổi bong bóng hai lần liên tiếp?
John Dvorak

1
Đợi đã, không, đừng làm những thay đổi như thế này! Tôi đã bắt đầu viết mã! Bạn có phiền lăn lại không?
John Dvorak

5
Vui lòng sử dụng hộp cát vào lần tiếp theo.
John Dvorak

1
Nó không được nêu rõ ràng, nhưng tôi đoán phải có chính xác một con cá trong bể cá?
John Dvorak

1
yêu cầu rằng cá có thể bong bóng hai lần liên tiếp, hoặc chúng ta được phép để nó xảy ra? Nó làm cho một sự khác biệt ba nhân vật cho tôi.
John Dvorak

Câu trả lời:


11

Con trăn 3 (278)

Trước đây: 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)

Chơi golf trong Python luôn khó khăn do yêu cầu thụt lề của các câu lệnh, nhưng mặc dù vậy, điều này đã diễn ra vô cùng tốt!

Cảm ơn rất nhiều đến Biến động và DSM vì đã giúp tôi chơi golf nhiều hơn nữa.

Phiên bản sạch

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

Hồng ngọc 29 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]}

Con cá dài mười một ký tự, làm cho bể cá rộng 6 * 9 + 11 + 2 = 67 ký tự, vừa vặn trong dung sai yêu cầu.

Hàm flambda thực hiện tất cả các công việc nặng nhọc: nó chấp nhận thay thế như một cặp đối số, sau đó cố gắng áp dụng thay thế trên bể cá. Nếu thành công, nó vẽ một khung hình của hình ảnh động. Sau đó, nó báo cáo giá trị thành công là 2(độ trễ thực hiện) hoặc nil(độ trễ không được thực hiện).

Cá sẽ không thổi bong bóng hai lần liên tiếp. (Khắc phục: ...while rand>0.1- 4 characers)

Cá có thể thổi bong bóng ngay cả trước khi rẽ. (Khắc phục: sắp xếp lại cấu trúc rẽ nhánh)

Có một khung mà bong bóng đã biến mất hoàn toàn (bao gồm cả *) nhưng cá đã không di chuyển vào khoảng trống kết quả. Điều này theo sau bức thư, nhưng không phải là ví dụ. (Khắc phục: thay thế f[?*,w]bằng q[?*]=w- miễn phí)

Không xóa giao diện điều khiển. Khắc phục: thêm `clear`(Unix) hoặc system 'cls'(bảng điều khiển Windows) trước puts qđể sửa ( Tham khảo ) hoặc sử dụng printthay vì putsvà trả trước \rcho hồ cá (được đề xuất bởi @manatwork ).

Phiên bản dễ đọc:

# 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

Tôi sẽ thêm \rvào đầu q : q="\r|#{r+s*9}|". Sau đó sử dụng $><<qthay thế puts q. Là 1 ký tự dài hơn, nhưng trông tốt hơn mà không cần sử dụng các lệnh bên ngoài.
thao tác

\rXóa màn hình? Nó không trong trường hợp của tôi. Hoặc, tại sao bạn không thích puts?
John Dvorak

1
Không, \rlà vận chuyển trở lại. Bằng cách sử dụng $><<qcho đầu ra, con trỏ sẽ ở cùng một dòng ( putsbuộc a \nsau đầu ra), do đó, bắt đầu đầu ra tiếp theo \rsẽ nhảy trở lại đầu dòng hiện tại và bắt đầu xuất từ ​​đó. Do đó, ghi đè lên hình ảnh trước đây của dòng cá cảnh.
thao tác

@manatwork thật không may, điều này hoàn toàn làm rối tung cửa sổ tương tác jRuby, mà bỏ qua \r.
John Dvorak

Oh. Rất tiếc khi biết điều đó. Và cảm ơn bạn đã thông tin. Đáng buồn thay, đây là sự thật đầu tiên tôi tìm hiểu về jRuby. :(
manatwork

3

R, 451 ký tự

Lần thử đầu tiên:

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

Thụt lề:

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
}

Nó in hồ cá dưới dạng stdout trên một dòng duy nhất (sau đó 2 giây nghỉ và vận chuyển trở lại trước khi hồ cá ở t + 1 được in).


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}

hoặc rõ ràng hơn

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

Cá quay chính xác. Bong bóng thổi.

285 - nếu bạn thích cảm giác hồ cá thực sự chứ không phải phiên bản cuộn:

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

Bạn làm ở đâu? Tôi không thể thấy bạn thiết lập $d=0trong trường hợp "quay cần thiết".
John Dvorak

1
sleep2(không có không gian) không hoạt động đối với tôi; Ngoài ra khi bạn quay, bạn không giữ cho mặt cá thẳng hàng. Và các bong bóng dường như không bao giờ xuất hiện.
chọc

"Ngoài ra một bộ đếm thời gian được áp đặt giữa các khung, 2000ms. Đây là điều bắt buộc." - điều này hoàn toàn không xảy ra với tôi. Ngoài ra, bong bóng không xuất hiện, cá chỉ ngồi tại chỗ. Ngoài ra, đầu phải giữ nguyên vị trí trong khi cá đang quay chứ không phải trung tâm cơ thể (ít nhất đó là những gì ví dụ cho thấy)
John Dvorak

Thôi! Chơi golf quá khó. Cần một không gian thêm với giấc ngủ! Cá cũng sủi bọt độc đáo! chờ đợi ...
KevinColyer

Rất tiếc - quên đầu ở giữa khi xoay ở các cạnh - cần làm lại ...
KevinColyer

2

C, 400 394 373 ký tự

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

Với khoảng trắng:

#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)thể rút ngắn lại c=i==l?r:l?
John Dvorak

Hình như nó có thể. Cảm ơn!
Josh

Bạn có thể lưu một vài ký tự bằng cách#define p printf(
pastebin.com chém 0mr8spkT

@Ace gcc không thích nó khi tôi làm điều đó.
Josh

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.