Так говорит Пастырь


23

Я устал, но не могу заснуть. Помоги мне считать овец.

Учитывая ввод N (положительное целое число), заставьте N овец перепрыгнуть через забор ascii, как в примере ниже. Только один кадр должен отображаться одновременно:

o |-|
──|-|──  0

 o|-|
──|-|──  0

   o
  |-|
──|-|──  0

  |-|o
──|-|──  0

  |-| o
──|-|──  0

o |-|
──|-|──  1

 o|-|
──|-|──  1

   o
  |-|
──|-|──  1

Счет следует хранить в нижней правой части «основания». Трейлинг и пробелы и переводы строки разрешены. Если выбранный вами язык затрудняет очистку экрана для каждого кадра, вы можете добавить достаточное количество новых строк, чтобы очистить экран - укажите, сколько строк вы добавили для этого в своем ответе. Программа должна завершиться, когда N-я овца окажется на пятом этаже.

Завтра мне нужно рано вставать, поэтому выигрывает самый короткий код в байтах. Пожалуйста, отправьте функцию или завершите программу. Применяются стандартные лазейки.


6
1. Пожалуйста, мне больно, когда люди используют оправдания для короткого кода («Мне нужно завтра рано вставать») 2. Сколько пробелов мы помещаем между кадрами? Это выглядит как 1 новая строка, но вы можете четко заявить об этом.
Rɪᴋᴇʀ

12
1) принимать аспирин 2) на экране может быть только 1 кадр. Эти кадры здесь должны демонстрировать каждое состояние индивидуально и НЕ должны быть видны на 1 экране одновременно.
Steenbergh

3
Многие языки не имеют возможности очистить отображение, в каких случаях они должны выводить данные?
Джонатан Аллан

6
msgstr "добавить достаточное количество новых строк, чтобы очистить экран". Разве это не зависит от размера окна вывода и разрешения экрана?
Эминья

3
Согласно вашему примеру, для N=3последнего кадра будет содержаться овца на правом конце и счетчик все равно скажет 2. Это верно?
Луис Мендо

Ответы:


15

MATL , 60 56 53 байта

:"@qXJx[HKCbO]"7Z"'  |-|  'v'o'@('--|-|--  '  JVhXxXD

Анимация с приведенным выше кодом работает очень быстро. Следующая версия включает паузу, чтобы сделать анимацию более медленной и, следовательно, более легкой для просмотра (не требуется для задачи), за счет еще 4 байтов:

:"@qXJx[HKCbO]"7Z"'  |-|  'v'o'@('--|-|--  '  JVhXxXD.2Y.

Попробуйте это в MATL Online! Интерпретатор является бета-версией; обновите страницу, если она не работает.

Или посмотрите запись из автономного компилятора:

введите описание изображения здесь

объяснение

:"              % Input N implicitly. Repeat N times
  @q            %   Push iteration index minus 1, that is, from 0 to N-1. This
                %   are the numbers of sheep
  XJx           %   Copy into clipboard J and delete
  [HKCbO]       %   Push array [2 4 7 -2 0]
  "             %   For each value in that array. This loops generates the 5
                %   frames for each number of sheep
    7Z"         %     Push string of 7 spaces
    '  |-|  '   %     Push this string
    v           %     Concatenate vertically. This gives a 2x7 char array
                %     with the upper part of the frame, except the 'o',
                %     which will be now placed in a varying position 
    'o'         %     Push string 'o'
    @           %     Push loop variable, that is, 2, 4, 7, -2 or 0
    (           %     Write 'o' into that position of the 2x7 char array.
                %     The position is interpreated linearly, that is, a single
                %     number is used as index into the 2D array in column-major
                %     order (down, then across). So index 2 is lower-left corner,
                %     index 4 is to the right of that etc. Indexing is
                %     semi-modular (modular for non-positive values). So 0 is
                %     the lower-right corner, and -2 is to the left of that
    '--|-|--  ' %     Push this string
    JV          %     Push current number of sheep converted to string
    h           %     Concatenate horizontally
    Xx          %     Clear screen
    XD          %     Display all stack contents
    .2Y.        %     Pause for 0.2 seconds (optional)
                %   End implicitly
                % End implicitly

6

JavaScript (ES6), 120 124 байта

f=(n,m=`   2
43|-|10
──|-|── `,s=0)=>n?alert(m.replace(s%5,'o').replace(/\d/g,' ')+' '+(n-1),(++s%5?f(n,m,s):f(n-1,m,0))):''

Последний вычисленный кадр показывает первым. Благодаря этому номер прыжка n-1
В alert, у персонажей разная ширина, поэтому похоже, что он сломан.


Предыдущий ответ:

120 байтов, номер перехода неверен, потому что он начинается с 1 вместо 0

f=(n,m=`   2
43|-|10
──|-|── `,s=0)=>n?alert(m.replace(s%5,'o').replace(/\d/g,' ')+' '+n,(++s%5?f(n,m,s):f(n-1,m,0))):''

@ LuisMendo Я обновил счетчик, чтобы начать с 0. Для баров это благодаря шрифту, используемому alert. У меня тот же результат, что и у Chrome с краем, и хуже с Firefox.
Хеди

6

JavaScript (ES6), 144 142 байта

Очищает вывод и ждет 300 мс между каждым кадром:

n=>(F=j=>((c=console).clear(),c.log(`   2
01|-|34
──|-|── `.replace(/\d/g,i=>(j-i)%5?' ':'o')+(j/5|0)),++j<n*5&&setTimeout(`F(${j})`,300)))(0)

Вы можете проверить это здесь (обязательно откройте консоль).


Кажется, это не увеличивает счетчик (от 4до 5) после того, как последняя овца прыгнула через забор ...
ʰᵈˑ

@ ʰᵈˑ - Я думаю, это ожидаемое поведение. (См. Вопрос Луиса Мендо в комментариях к вызову.)
Арно


4

Рубин, 83 байта

->n{(n*5).times{|i|$><<"   c
  |-|  
ab|-|de  #{i/5}
".tr('abcde',' '*(i%5)+'o ')}}

Печать на стандартный вывод. Вывод разделен переводом строки. Уменьшение высоты экрана до 3 позволяет одновременно видеть только одно изображение.


4

C #, 234 байта

using C=System.Console;class P{static void Main(string[]a){for(int n=0;n-1+""!=a[0];++n){foreach(int p in new[]{5,6,3,10,11}){C.Clear();C.Write("    \n  |-|  \n──|-|── ".Remove(p,1).Insert(p,"o")+n);for(var w=3e7;w>0;--w);}}}}

На первый взгляд, есть несколько пробелов, лежащих вокруг string[] argsи на for (int. Int32.Parseможет быть int.Parse.
Yytsi

1
Вы можете изменить имя класса с Programпросто Pили что-то
другое Матиас Цицерон

1
stringможет быть var. Целое число в цикле for может быть инициализировано одновременно с анализом args[0]целого числа.
Yytsi

Я вижу, вы редактируете счетчик байтов каждый раз, когда он уменьшается. Тем не менее, я рекомендую следить за старым количеством байтов (пересеченным линией), чтобы отслеживать прогресс :)
Yytsi

Вам нужна только функция, которая компилируется в an, Action<string[]>и вы можете удалить скобки вокруг внешнего цикла for, поэтому я считаю, что я получаю 200 байтов:using C=System.Console;a=>{for(int n=0;n-1+""!=a[0];++n)foreach(int p in new[]{5,6,3,10,11}){C.Clear();C.Write(" \n |-| \n──|-|── ".Remove(p,1).Insert(p,"o")+n);for(var w=3e7;w>0;--w);}};
TheLethalCoder

3

PHP + JavaScript, 168 байт

<?extract($_GET);$s="     ";$s[$f=++$f%5]=o;echo strtr("<pre>   C
AB|─|DE
──|─|── $c",EABCD,$s),($c+=!$f)<$n?"<script>location.href='s.php?n=$n&c=$c&f=$f'</script>":"";

Сохраните в файл s.php, позвоните в браузере с помощью s.php?n=<n>.

Вызывает себя с новыми параметрами для каждого кадра, без задержки.


Я мог бы сэкономить еще 5 с index.php; но я не хочу заходить так далеко.


Я пытался запустить это на PHP 5 и 7, но все, что Chrome дает мне это C AB|─|DE ──|─|── $c",EABCD,$s),($c+=!$f)<$n?".
Steenbergh

@steenbergh Вы short_open_tagотключили. Включить его (по умолчанию) или добавить php+ пробел после <?.
Тит

Да, это так. Работает сейчас.
Стинберг

3

Tcl, 168 байт

Версия с использованием экрана высотой 10 строк. (Замените 7ниже высоту экрана в столбцах минус четыре.)

set s {0 1 2 3 4 }
for {set n 0} {$n<$argv} {incr n} {foreach x $s {
puts [string repe \n 6][string map [split $s {}] [string map "$x o" {   2
01|-|34
--|-|--  }]]$n}}

Это работает очень быстро, поэтому вы можете добавить паузу во второй строке:

Tcl, 177 байт

set s {0 1 2 3 4 }
for {set n 0} {$n<$argv} {incr n} {foreach x $s {after 250
puts [string repe \n 6][string map [split $s {}] [string map "$x o" {   2
01|-|34
--|-|--  }]]$n}}

Это работает путем повторного использования строки в верхней части для двух разных вещей:

  • в качестве списка для внутреннего цикла (для отображения каждой версии овец + забор)
  • как отображение цифры → пробел для удаления цифр из шаблона изображения овца + забор

Сам шаблон представляет собой строковое изображение для отображения. Сначала мы отображаем (строка заменяет) цифру текущей позиции овцы (внутренний цикл) на 'o'. Затем мы сопоставляем оставшиеся цифры с пробелами. Затем мы печатаем полученную строку.

(Сама строка начинается после последней {в третьей строке и заканчивается самой левой} в последней строке.)


3

QBasic, 110 байт

INPUT n
FOR i=0TO 5*n-1
CLS
?
?"  |-|"
?"--|-|-- ";i\5
x=i MOD 5
LOCATE(x=2)+2,1+x-(x>1)+x\3
?"o"
SLEEP 1
NEXT

Зацикливается на 5*nклещей. При каждом тике очищает экран, печатает счетчик чисел и овец, а затем использует LOCATEдля печати oв соответствующем месте. С xкодом положения от 0 до 4:

  • Ряд: (x=2)+2
    • Если x=2это правда, -1+2=1
    • Если x=2ложно, 0+2=2
  • Колонка: 1+x-(x>1)+x\3
    • Если xэто 0или 1, x>1ложь и x\3является 0: 1+x-0+0= 1или2
    • Если xесть 2, x>1верно и x\3есть 0: 1+x-(-1)+0=4
    • Если xесть 3или 4, x>1верно и x\3есть 1: 1+x-(-1)+1= 6или7

Наконец, SLEEPна 1 секунду и цикл. Если вы не возражаете, нажимая ввод в каждом кадре, я могу сбрить два байта, удалив аргумент to SLEEP.


3

PHP, 132 131 байт

Редактирует после комментариев (спасибо!):

<?php for(;$i<$argv[1]*5;sleep(1),system(clear),$c="    
  |-|  
──|-|──  ".floor($i/5),$c[[5,6,3,10,11][$i++%5]]=o)echo$c;

Который негольфирован

<?php

ini_set('error_reporting', '0');        # golfing precondition

for(; $i<$argv[1]*5;                    # repeat N times
  sleep(1),                             # sleep after iteration
  system(clear),                        # clear screen (linux only)
  $c = "    
  |-|  
──|-|──  " . floor($i / 5),             # define template
  $c[[5, 6, 3, 10, 11][$i++ % 5]] = o)  # replace with sheep (and finish "for" statement)
  echo $c;                              # output result

Оригинальный пост

<?php $i=0;for(;;){system("clear");$c="  \n  |-|  \n──|-|──  ";$c[[3,4,1,8,9][$i%5]]='o';echo"  $c".floor($i++/5);sleep(1);}

Проверено на Ubuntu (не знаю, system("clear")работает ли на Windows)

Ungolfed:

<?php
$i = 0;
for(;;) {
  system("clear");
  $content = "  \n  |-|  \n──|-|──  ";
  $content[[3,4,1,8,9][$i%5]] = 'o';
  echo "  $content " . floor($i++/5);
  sleep(1);
}

1
Я тоже о Windows, но я уверен, что clearкавычки не нужны.
Тит

1
Думая о Windows ... это было clsв DOS.
Тит

1
Удалите $i=0;, предупреждения, как правило, не отображаются в коде гольфа (-5 байт). По той же причине вам не нужны кавычки clearи o(-4 байта). Замените \ns реальными символами новой строки (-2 байта). Поскольку у вас есть только выражения, а не операторы, вы можете поместить в forцикл все, кроме последнего , что позволяет убрать скобки ( for(;;system(clear),$c=…)sleep(1);) (-2 байта). И, наконец, вы забыли добавить условие $i<$argv[0](+ 11 байт).
Blackhole

Спасибо! Я не получил эхо в петле. Но размещенное решение делает это.
user470370

3

node.js + sleep , 169 байт

c='   2\n01|-|34\n──|-|──  '
for(i=0;i<process.argv[2]*5;require('sleep').sleep(1))console.log('\033[2J'+c.replace(i%5,'o').replace(/\d/g,' ')+Math.floor(i++/5))

Оригинальное решение

node.js, 146 142 185 байт

Протестировано только с терминалом Ubuntu (и теперь с n овцами):

i=0
c='   2\n01|-|34\n──|-|──  '
setInterval(function(){console.log('\033[2J'+c.replace(i%5,'o').replace(/\d/g,' ')+Math.floor(i++/5))
if(process.argv[2]*5==i)process.exit()},9)

Ну, это кадр каждые 9 мс. Более спокойная версия (кадр каждые 1 с):

i=0;setInterval(function(){console.log('\033[2J'+'   2\n01|-|34\n──|-|──  '.replace(i%5,'o').replace(/\d/g,' ')+Math.floor(i++/5))},1000)

И безглым

var i = 0;
setInterval(function(){
  console.log('\033[2J' + '   2\n01|-|34\n──|-|──  '.replace(i%5, 'o').replace(/\d/g, ' ') + Math.floor(i++/5));
}, 1000)

В моем первом решении я забыл параметр для N овец
user470370

2

05AB1E , 66 60 59 байт

FNU5Fð4×N<i¨'oJ},N<iðë'o}ðNÉis}"|-|  "JN1›iR},…──|Â'-sððXJ,

Использует кодировку CP-1252 .

Explanantion

Итерация относится к внутренней итерации (0 -> 4) пути овец.

Основные петли

F      # For N in range [0 .. input)
 NU    # Save N in variable X
 5F    # For N in range [0 .. 5)

Создать верхний ряд

ð4×         # push 4 spaces
N<i    }    # if we're on the 2nd iteration
   ¨'oJ     # replace the last space with an "o"
,           # print row

Генерация среднего ряда

N<iðë'o}     # push a space if we're on the 2nd iteration, else push "o"
ð            # push a space
NÉis}        # if we're on an odd numbered iteration, swap the stacks top 2 chars
"|-|  "      # push this string
J            # join the stack to one string
N1›iR}       # if we're on the any of the last 3 iterations, reverse the string
,            # print row

Создать нижний ряд

…──|  # push the string "──|"
     # push a reversed copy
'-s   # push "-" between the 2 strings on the stack
ðð    # push 2 spaces
X     # push the N we saved in the main loop (current sheep number)
J,    # join and print row

1

Желе , 55 54 53 байта

ị30214D¤“o    ”ṙ“   “
““|-|““
__|-|__  ”ż
×5Ḷµ:5ż@Ç€Y

TryItOnline

Печатает кадры, разделенные переводом строки.

Как?

ị30214D¤“o    ”ṙ“   “
““|-|““
__|-|__  ”ż           - Link 1, build a frame without counts: frameNumber
       ¤              - nilad and link(s) as a nilad:
 30214                -     literal 30214 (a nilad)
      D               -     to decimal: [3,0,2,1,4]
ị                     - index into (1-based and modular, so frames go 4,3,0,2,1,4,...)
        “o    ”       - string "o    "
               ṙ      - rotated to the left by that number
                “   “ - the rest, except the last character, is:
““|-|““               -     an array of strings ["   ","\n","","|-|","","\n__|-|__  "]
__|-|__  ”            -     i.e. split where a sheep might go

          ż           - zip the sheep (the rotated "o    ") into that

×5Ḷµ:5ż@Ç€Y - Main link: nSheep
×5          - multiply by 5 -> nFrames
  Ḷ         - lowered range: [0,1,2,...nFrames-1]
   µ        - monadic chain separation
    :5      - integer division by 5 (vectorises): [5 zeros, 5 ones, ..., 5 (nSheep-1)s]
      ż@    - zip with reversed arguments
        ǀ  - call last link (1) as a monad for each (zip sheep numbers with frames)
          Y - join with line feeds (TODO: replace with future animate frames atom :p)

1

Python 2, 171 159 144 байта, 163 151 136 символов

Решение с использованием рекурсивной функции. Звоните как F (Int)

РЕДАКТИРОВАТЬ

-12 после перечитывания комментариев и наблюдения, что счет не должен увеличиваться, когда овца достигает конца поля

-15 путем итерации по списку индексов напрямую и потери переменной

def f(a,x=0):
 if a>0:
  for c in 5,6,3,10,11:
   b=list('    \n  |-|  \n──|-|──  ');b[c]='o';print"\n"*50+"".join(b)+(`x`)
  f(a-1,x+1)

Заметки

Предполагает кодировку UTF-8

Использование - вместо ─ (как в ответе @Luis MATL) уменьшит счетчик байтов на 8, чтобы соответствовать количеству символов, и потеряет зависимость UTF-8

Добавлено 50 новых строк - вывод находится в нижней части консоли (дешевле, чем импорт и использование os.system («очистить») и работает в Windows и Linux)

Версия с задержкой в ​​1 секунду между выходами (170 байт, 162 символа)

import time
def f(a,x=0):
 if a>0:
  for c in 5,6,3,10,11:
   b=list('    \n  |-|  \n──|-|──  ');b[c]='o';print"\n"*50+"".join(b)+(`x`);time.sleep(1)
  f(a-1,x+1)

1

Bash + стандартные утилиты Linux (339 байт)

e(){ echo "$@";}
n(){ e -n "$@";}
r(){ [ $? -eq 0 ]&&s=o||s=" ";[ $1 ]&&n " $s "||n "$s";}
f(){ k=$(($1%5));n "  ";[ $k -eq 2 ];r .;e "  ";for i in 0 1;do [ $k -eq $i ];r;done;n "|-|";for i in 3 4;do [ $k -eq $i ];r;done;e;n "──|-|──";}
for l in `seq 1 $1`;do for z in `seq 0 4`;do clear;f $z;e "  $((l-1))";sleep 1;done;done
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.