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


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

Большое спасибо 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]}

Длина рыбы составляет одиннадцать символов, что делает аквариум шириной 6 * 9 + 11 + 2 = 67 символов, что точно соответствует требуемому допуску.

fЛямбда - функция делает всю тяжелую работу: он принимает замену в виде пары аргументов, то попытки применить замену на аквариум. Если это удается, он рисует один кадр анимации. Затем он сообщает значение успеха как 2(принятая задержка) или nil(задержка не выполнена).

Рыба не будет пускать мыльные пузыри дважды. (Исправлено: ...while rand>0.1- 4 персонажа)

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

Есть рамка, где пузырь полностью исчез (включая *), но рыба не переместилась в образовавшуюся пустоту. Это следует за буквой, но не примером. (Исправить: заменить 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="\r|#{r+s*9}|". Тогда используйте $><<qвместо puts q. На 1 символ длиннее, но выглядит лучше без использования внешних команд.
manatwork

\rочищает экран? Это не в моем случае. Или почему тебе не нравится puts?
Джон Дворак

1
Нет, \rэто возврат каретки. При использовании $><<qдля вывода курсор останется в той же строке ( putsфорсирует a \nпосле вывода), поэтому запуск следующего вывода с помощью \rпереключится обратно в начало текущей строки и начнет выводить оттуда. Таким образом перезаписывает предыдущее «изображение» аквариумной линии.
manatwork

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

Ой. Жаль это слышать. И спасибо за информацию. К сожалению, это первый факт, который я узнаю о jRuby. :(
manatwork

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 на одной строке (затем 2s break и возврат каретки до того, как будет напечатан аквариум в t + 1).


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в «повороте».
Джон Дворак

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
user12205
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.