Так каже Пастир


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
"додати достатню кількість нових рядків для очищення екрана". Чи це не залежить від розміру вихідного вікна, а також роздільної здатності екрана?
Емінья

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
In 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. У мене такий самий результат, ніж хром із краєм, а гірший із 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 ')}}

Друкується до stdout. Виведення розділено новими рядками. Зменшення висоти екрана до 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або щось таке
Matias Cicero

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

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

Вам потрібна лише функція, така яка компілюється, Action<string[]>і ви можете зняти дужки навколо зовнішньої петлі, тому я вважаю, що я отримаю 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пробіл після <?.
Тит

Так, це все. Зараз працює.
steenbergh

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 секунду і петлю. Якщо ви не заперечуєте над натисканням клавіші "введення" в кожен кадр, я можу збрити два байти, видаливши аргумент на 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)

Безголівки:

<?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
Idk або про 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 + сон , 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 (і тепер із п ятьма):

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
sheeps

2

05AB1E , 66 60 59 байт

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

Використовує кодування CP-1252 .

Пояснення

Ітерація стосується внутрішньої ітерації (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)

EDIT

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