Однолінійний акваріум


31

У моїх свекрух є рибник на своєму подвір’ї, заповнений коєм. Мені це не прийшло в голову, поки я не помітив наступного витягу з мого коду.

',') & '_'

... У мене риб'ячі обличчя дивилися на мене з мого екрану ...

Що дало мені чудову ідею ...

Моє прагнення до вас, мої шановні гольфісти, - створити однолінійний акваріум ASCII з такими правилами:

  • Розмір акваріума від сторони танка до іншої сторони резервуара повинен бути не менше 60 символів і не більше 80 символів. Сторони бака повинні бути зазначені за допомогою |символу труба / бар ( ).
  • Риба повинна вміти «плавати» зліва направо між сторонами резервуара. По мірі їх повороту потрібен вид спереду для переходу з одного напрямку в інший.
  • Риба повинна виглядати наступним чином:

    • }}< }} ',') Риба плаває правильно
    • (',' {{ >{{ Риба плаває зліва
    • }}('_'){{ Риба звернена спереду
  • Коли риба обертається, щоб змінити напрямок (шанс 30%), вона повинна починати з одного напрямку, лицьовою стороною, а потім другою стороною ... Переконайтеся, що для повороту риби є достатньо місця, тобто потрібно шість пробілів перед край танка мінімум ...

  • Якщо риба не пустить міхур або не змінить напрямок, вона продовжить у напрямку, до якого вона стикається, якщо потрапить в межах шести просторів збоку танка, вона змінить напрямок.
  • Риба (звернена ліворуч або праворуч) може при нагоді (10% шансу) припиняти пускати бульбашки поспіль ( .oO*), тому рибі потрібно мати біля них простір, щоб міхур існував, щоб риба могла пливіть якомога ближче до боків, економте один простір. Міхур повинен зникнути, перш ніж риба може рухатися далі ...

Серія прикладних рядків поведінки риб із -символами, що вказують пробіли, оскільки тут відображається функція коду, є дещо суворою ... Я очікую, що ці тире будуть замінені пробілами, коли ви кодуєте це ...

Кожен рядок тут може вважатися кадром у проміжок часу.

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

тощо. Наведений приклад, як я вже сказав, невеликий, але ви отримуєте загальне уявлення ...

Найкоротший код виграє ...

Я очікую, що вихід на тій же лінії (якщо можливо), якщо ні, відображення кадру за кадром поспіль нормально ... Незалежно від того, чи ви переходите по одній або декількох рядках. Якщо ви робите кілька рядків, їх потрібно розділити новим рядком.

Також таймер накладається між кадрами, 2000 мс. Це обов’язково .

Подивимося, що у вас є!


Якщо рибка стає занадто близько до краю акваріума, її потрібно повернути, або вона може вийти з екрана? Чи може бути, що в цій ситуації риба видуває бульбашки? Також, чи має бути можливість (або заборонено, або це дозволено, але не потрібно) рибам двічі поспіль видувати бульбашки?
Джон Дворак

1
Зачекайте, ні, не робіть таких змін! Я вже почав кодувати! Ви б не проти відкотитися?
Іван Дворак

5
Будь ласка, використовуйте пісочницю наступного разу.
Джон Дворак

1
Це прямо не зазначено, але я думаю, що в акваріумі має бути рівно одна риба?
Джон Дворак

1
Чи потрібно, щоб риба двічі поспіль пузирила, чи нам дозволено це дозволити? Це робить для мене тризначну різницю.
Джон Дворак

Відповіді:


11

Пітон 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 завжди важкий через вимоги до відступів заяв, але, незважаючи на це, це пройшло неймовірно добре!

Велика подяка за волатильність та 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]}

Рибка довжиною одинадцять символів, що робить акваріум шириною 6 * 9 + 11 + 2 = 67 символів, що акуратно вписується в необхідну толерантність.

Функція fлямбда робить все важке підняття: вона приймає заміну як пару аргументів, потім намагається застосувати заміну в акваріумі. Якщо це вдасться, він малює один кадр анімації. Потім він повідомляє про значення успіху як (затримка, що виконується) 2або nil(затримка не виконується).

Риба не буде дути бульбашки двічі поспіль. (Виправлення: ...while rand>0.1- 4 characers)

Риба може видувати бульбашки навіть до вимушеного повороту. (Виправлення: переставити структуру розгалуження)

Існує кадр, де міхур повністю зник (включаючи *), але риба не перемістилася в порожню порожнину. З цього випливає лист, але не приклад. (Виправлення: замінити f[?*,w]на q[?*]=w- безкоштовно)

Не очищає консоль. Виправлення: додати `clear`(Unix) або system 'cls'(консоль Windows), перш ніж puts qвиправити ( Ref. ) Або використовувати 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 символ довше, але виглядає краще без використання зовнішніх команд.
манантська робота

\rочищає екран? У моєму випадку це не так. Або чому ти не любиш puts?
Джон Дворак

1
Ні, \rповернення вагона. Використовуючи $><<qдля виведення, курсор залишатиметься в тій же лінії ( putsзмушує a \nпісля виходу), тому, починаючи наступний висновок \r, відскакує назад до початку поточного рядка і почне виводити звідти. Таким чином, перезаписується попереднє "зображення" акваріумної лінії.
манантська робота

@manatwork, на жаль, це повністю заплутує інтерактивне вікно jRuby, яке ігнорує \r.
Джон Дворак

Ой. Прикро це чути. І дякую за інформацію. На жаль, це перший факт, який я дізнаюся про jRuby. :(
манатурка

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
}

Він друкує акваріум як stdout на одному рядку (тоді 2-х перерва та повернення каретки до того, як акваріум надрукується на t + 1).


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 мс. Це обов'язково." - у мене це зовсім не відбувається. Також бульбашки не з’являються, риба просто сидить на місці. Також голова повинна залишатися на місці, поки риба повертається, а не центр тіла (принаймні, так показує приклад)
Джон Дворак

Драт! Гольф занадто важко. Потрібен додатковий простір зі сном! Риба теж гарненько булькала!
зачекайте

На жаль, забув голову посередині при повороті по краях - потрібно трохи переробити ...
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?
Джон Дворак

Схоже, це може бути. Спасибі!
Джош

Ви можете зберегти кілька символів до#define p printf(
user12205

@Ace gcc не сподобається, коли я це роблю.
Джош

це працює для мене. oi41.tinypic.com/15fqbvb.jpg
користувач12205
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.