Считать овец, чтобы заснуть


11

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

Вот овца ASCII, стоящая справа и ожидающая подсчета:

'00^>
 ||

Вот овца ASCII, перепрыгивающая через забор:

'00^>
 /\
 ++

Вот тот, который стоит слева, уже посчитав:

<^00'
  ||

Соревнование

Учитывая два входных целых числа, nи m, n > 2описывая общее количество овец и m > 0говоря, сколько овец уже подсчитано, выведите художественное представление ASCII подсчета количества овец, чтобы заснуть.

Теперь для поворота:

  • Из-за размера загонов, в которых находятся овцы, верхний ряд может содержать только максимум 10овец, не считая прыгающих в данный момент овец, которые также всегда должны быть в верхнем ряду.
  • Последующие ряды не могут иметь овец за пределами их соответствующих загонов (во втором ряду не может быть больше овец, чем в первом ряду, и то же самое для правого).
  • Если 11овец много или больше, в верхнем ряду должен быть 10плюс прыгающий баран.
  • Ведущие / конечные пробелы и пробелы между овцами не имеют значения, если:
    1. Между овцами должен быть как минимум один пробельный символ
    2. Все персонажи выстроены в линию соответственно.

Пока эти правила соблюдаются, фактическое расположение овец зависит от вашей реализации.

Примеры

Например, вот n=3и m=1самый простой случай.

         '00^>
'00^>     /\      <^00'
 ||       ++        ||

Вот n=11и m=6большинство овец, которые могут уместиться на одной горизонтальной линии.

                        '00^>
'00^> '00^> '00^> '00^>  /\   <^00' <^00' <^00' <^00' <^00' <^00'
 ||    ||    ||    ||    ++     ||    ||    ||    ||    ||    ||

Вот другой пример того, с n=11иm=1

                                                      '00^>
'00^> '00^> '00^> '00^> '00^> '00^> '00^> '00^> '00^>  /\   <^00'
 ||    ||    ||    ||    ||    ||    ||    ||    ||    ++     || 

Большой пример с n=30иm=12

                                                '00^>
'00^> '00^> '00^> '00^> '00^> '00^> '00^> '00^>  /\   <^00' <^00'
 ||    ||    ||    ||    ||    ||    ||    ||    ++     ||    || 

'00^> '00^> '00^> '00^> '00^> '00^> '00^> '00^>       <^00' <^00'
 ||    ||    ||    ||    ||    ||    ||    ||           ||    || 

'00^>                                                 <^00' <^00'
 ||                                                     ||    || 

                                                      <^00' <^00'
                                                        ||    || 

                                                      <^00' <^00'
                                                        ||    || 

                                                      <^00' <^00'
                                                        ||    || 

Вот пример с n=17иm=2

                                                '00^>
'00^> '00^> '00^> '00^> '00^> '00^> '00^> '00^>  /\   <^00' <^00'
 ||    ||    ||    ||    ||    ||    ||    ||    ++     ||    ||

'00^> '00^> '00^> '00^> '00^> '00^>
 ||    ||    ||    ||    ||    ||  

Вот пример с n=19иm=3

                                          '00^>
'00^> '00^> '00^> '00^> '00^> '00^> '00^>  /\   <^00' <^00' <^00'
 ||    ||    ||    ||    ||    ||    ||    ++     ||    ||    || 

'00^> '00^> '00^> '00^> '00^> '00^> '00^>
 ||    ||    ||    ||    ||    ||    ||  

'00^>
 ||  

Обратите внимание, что все это примеры . В последнем случае вы можете создать вертикальный массив овец с правой стороны, который позволит левой стороне поместиться на два ряда. Или, может быть, квадрат 2х2 овец с правой стороны, который также поместил бы овец левой стороны на два ряда. И т.п.

I / O и правила

  • Входные данные могут быть приняты в любом разумном формате и любым удобным способом .
  • Лидирующие / завершающие символы новой строки или другие пробелы являются необязательными, при условии, что символы располагаются соответствующим образом.
  • Либо полная программа или функция приемлемы. Если функция, вы можете вернуть вывод, а не распечатать его.
  • Вывод может быть на консоль, возвращен в виде списка строк, возвращен в виде одной строки и т. Д.
  • Стандартные лазейки запрещены.
  • Это поэтому применяются все обычные правила игры в гольф, и выигрывает самый короткий код (в байтах).

2
@Rod Я добавил более крупный пример, но учтите, что это всего лишь пример, и ваш вывод может отличаться.
AdmBorkBork


Рекомендуемый контрольный пример: n=11аm=9
Adám

@ Адам Там может быть 10 тестовых примеров для n=11таких , что 0<m<=10. Это заставляет вас иметь всех овец в верхнем ряду и динамическое количество овец слева ( n-1-m) и справа ( m) от забора и не может использовать фиксированные размеры пера.
MT0

@ MT0 Правда, но одного или двух тестовых случаев должно быть достаточно, чтобы показать, что решение работает.
Адам

Ответы:


9

APL (Dyalog Unicode) , 118 байтов SBCS

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

{(r⍴(×/rd,⍨⌈w÷d10-⍵⌊⊢/r)↑w⍴(w←⍺-⍵+1)⍴⊂s@2S)(↑(s'>',⍨¯1b)' /\' ' ++')(r⍴(×/r←9,⍨⌈⍵÷9)↑⍵⍴⊂S←⌽↑''(b←'''00^<')' ||')}

Попробуйте онлайн!

{... } анонимная лямбда; левый аргумент, правый аргумент

Эта функция состоит из трех частей: Ожидание , Прыжки и Счет . Каждый из них заключен в скобки, в результате получается список из трех элементов.

счетный (r⍴(×/r←9,⍨∘⌈⍵÷9)↑⍵⍴⊂S←⌽↑''(b←'''00^<')' ||')

''(... )' ||' три линии зеркальной счетной овцы, средняя из которых:

b←'''00^<' тело и назначен b

 смешать список строк в матрицу символов (заполнение пробелами)

 отразить это

S← назначить S(большой S heep)

 заключить его, чтобы мы могли иметь дело с ним как единое целое

⍵⍴ использовать количество пересчитанных овец, чтобы циклически изменить

()↑ Взять из этого следующее количество элементов (заполнение прототипами, то есть тот же массив, но со всеми символами, замененными пробелами)

⍵÷9 девятое число численных овец

 округлять

9,⍨ добавить 9 к этому

r← назначить r(то , что мы будем г eshape с, строк и столбцов)

×/ продукт этого списка (это сколько элементов нам нужно, включая заливки)

r⍴ изменить это в массив с длинами измерений r

Прыжки (↑(s←'>',⍨¯1↓b)' /\' ' ++')

(... )' /\' ' ++' три линии прыгающей овцы, первая из которых:

¯1↓b удалить последний символ из b

'>',⍨ добавить правую голову

s← хранить в s(малый с Heep)

 смешать список строк в матрицу символов (заполнение пробелами)

Ожидание (r⍴(×/r←d,⍨⌈w÷d←10-⍵⌊⊢/r)↑w⍴(w←⍺-⍵+1)⍴⊂s@2⌽S)

⌽S зеркало S

s@2 поставить s в строке 2 этого (замена текущих данных там)

 заключить его, чтобы мы могли иметь дело с ним как единое целое

(... )⍴ циклически изменить это до следующего размера:

⍵+1 количество пересчитанных овец плюс один

⍺- вычесть это из общего

w← назначить w( ш aiting)

()↑ Взять из этого следующее количество элементов (заполнение прототипами)

⊢/r самый правый элемент r(т.е. количество используемых столбцов для подсчитанных овец)

⍵⌊ минимум всего и что

10- вычесть это из десяти

d← назначить d( d ifference; пропущенные столбцы)

 разделить wна это

 округлить (дает количество нужных строк)

d,⍨ Append d

r← назначить r(то , что мы будем г eshape с, строк и столбцов)

×/ продукт этого списка (это сколько элементов нам нужно, включая заливки)

r⍴ изменить это в массив с длинами измерений r


1
@ WeijunZhou Вы правы, исправим.
Адам

1
Мне было интересно, как, черт возьми, я бы ответил на этот вызов. Я думаю, вот как: р
Ж. Салле

1
@ WeejunZhou Исправлено.
Адам

«Всегда резервирует девять столбцов для ожидающих овец и один столбец для подсчитанных овец». Работает ли это для n=11,m=9правила «в верхнем ряду должно быть 10 плюс прыгающая овца»?
MT0

3

Javascript, 281 , 293 , 288 байт

a="      ";c=((n,m)=>{b="";for(i=0;i<(q=m>(o=(l=(t=n-m-1)?t:0)/9)?m:o);++i){for(j=0;j<3;++j){b+=[a,"'00^> "," ||   "][j].repeat(r=l>i*9?(z=o-i)>1?9:Math.ceil(z*9):0)+a.repeat((l>9?9:l)-r)+(i?"     ":["'00^>"," /\\  "," ++  "][j])+[a," <^00'","   || "][j].repeat(m>i?1:0)+"\n"}}return b});

Будьте осторожны при использовании приведенного ниже фрагмента, есть большой риск внезапной нарколепсии.

  <form id="form">
    <input type="text" name="n" placeholder="n (sheep total)">
    <input type="text" name="m" placeholder="m (sheep in right hand field)">
    <button type="submit">Let's Go!</button>    
  </form>

  <pre id="output">
  </pre>

  <script>
    a="      ";c=((n,m)=>{b="";for(i=0;i<(q=m>(o=(l=(t=n-m-1)?t:0)/9)?m:o);++i){for(j=0;j<3;++j){b+=[a,"'00^> "," ||   "][j].repeat(r=l>i*9?(z=o-i)>1?9:Math.ceil(z*9):0)+a.repeat((l>9?9:l)-r)+(i?"     ":["'00^>"," /\\  "," ++  "][j])+[a," <^00'","   || "][j].repeat(m>i?1:0)+"\n"}}return b});
      form.addEventListener("submit", function(e){
        e.preventDefault();
  
        var n = parseInt(form.n.value);
        var m = parseInt(form.m.value);
  
        if(n != NaN && m != NaN){
          if(m > n){
            output.innerText = "C'mon man, how can you have more sheep in the right hand field than there are sheep in general?";
          }
          else{
            output.innerText = c(n, m);
          }
        }
        else{
          output.innerText = "Numbers only please.";
        }
      });
    </script>


2
Это показывает 4 подсчитанных овец для n = 50, m = 3, а также имеет неправильно выровненных овец для n = 20, m = 3. Также n = 20, m = 1 показывает 2 подсчитанных овец.
ale10ander

2
Исправлены эти ошибки. Также обнаружено, что некоторые овцы убегают из-за ошибок округления.
Jhal

Если m = nвы получили ошибку.
aimorris

Это сценарий, который я предположил, может быть проигнорировано. То, как был написан вопрос, гласило, что: m = количество овец с правой стороны n = общее количество овец. И что есть овца, которая тоже прыгает через забор. Следовательно, n не может быть равно m, поэтому я не учел это.
Jhal

2

C 392 байта

Спасибо @Jonathan Frech за сохранение байта!

#define F;for(
x,y,k;p(L,a,b,t)char L[][78];{F k=5;k--;)L[x=a*4+(t<2)][y=b*6+k]=t?"'00^>"[k]:"<^00'"[k];L[++x][y-=~!t]=47;L[x][++y]=92;L[x][--y]=L[x+=(t>1)][y]=t<2?'|':43;}i,l;f(n,m){char L[i=n*4][78]F;i--;){F L[i][l=77]=0;l--;)L[i][l]=32;}F l=n+~m;++i<l&&i<9+!m;)p(L,0,i,1);l-=i;p(L,0,i++,2)F;i<11&&m--;)p(L,0,i++,0)F i=0;l--;)p(L,++i,0,1)F i=1;m-->0;)p(L,i++,10,0)F l=0;l<i*4;)puts(L+l++);}

Попробуйте онлайн!

раскатали:

#define F;for(

x, y, k;
p(L, a, b, t) char L[][78];
{
    F k=5; k--;)
        L[x=a*4+(t<2)][y=b*6+k] = t ? "'00^>"[k] : "<^00'"[k];

    L[++x][y-=~!t] = 47;
    L[x][++y] = 92;
    L[x][--y] = L[x+=(t>1)][y] = t<2 ? '|' : 43;
}

i, l;
f(n, m)
{
    char L[i=n*4][78]
    F; i--;)
    {
        F L[i][l=77]=0; l--;)
            L[i][l] = 32;
    }

    F l=n+~m; ++i<l&&i<9+!m;)
        p(L,0,i,1);

    l-=i;
    p(L,0,i++,2)

    F; i<11&&m--;)
        p(L,0,i++,0)

    F i=0; l--;)
        p(L,++i,0,1)

    F i=1; m-->0;)
        p(L,i++,10,0)

    F l=0; l<i*4;)
        puts(L+l++);
}

y+=1+!tможет быть y-=~!t.
Джонатан Фрех

@JonathanFrech Да, спасибо!
Steadybox

1

Python 2 , 222 277 байт

n,m=input();n-=m+1
s=" '00^>"
j=1;L='  ||  '
a,b=[[[5,5],[10-m,m]][m<9],[n,10-n]][n<9]
print' '*6*a+s
while n>0 or 0<m:N,M=min(n,a),min(m,b);n-=a;m-=b;print '%-*s'%(6*a,N*s),'%5s'%('/\  '*j)+'%*s'%(6*b,M*" <^00'")+'\n'+'%*s'%(-6*a,N*L),'%5s'%('++  '*j),'%*s'%(6*b,M*L)+'\n';j=0

Попробуйте онлайн!


Сбой на n=11аm=2 .
Адам

Я не получаю 11 овец в первом ряду, когда я управлял этим.
Роберт Бенсон

1
@RobertBenson Спасибо, исправлено
TFeld

0

AWK , 293 байта

{f=" '00^>"
l="  ||  " 
L="  /\\   "
p="  ++   "
Y=$2
X=$1-Y-1
E="      "
x=$1>11?Y<5?10-Y:X>5?5:X:X
y=$1>11?X<5?10-X:5:Y
printf"%"6*(x+1)"s\n",f
for(;X>0||Y>0;A=B=""){for(i=0;i++<x;B=B (X>=0?l:E))A=A (--X>=0?f:E)
A=A L
B=B p
for(i=0;i++<y&&--Y>=0;B=B l)A=A"<^00' "
print A"\n"B"\n"
L=p=E" "}}

Попробуйте онлайн!

Я пытался использовать подстановки строк, чтобы избежать некоторых циклов, но это заняло намного больше кода.

объяснение

{f=" '00^>"    Let's assign
l="  ||  "     some variables
L="  /\\   "   for the ASCII
p="  ++   "    pieces
Y=$2        The number of sheep that have already jumped
X=$1-Y-1    Sheep patiently waiting to jump
E="      "  A string to keep things spaced properly
x=$1>11?Y<5?10-Y:X>5?5:X:X  If there's enough sheep, let's use 5 per column
y=$1>11?X<5?10-X:5:Y        Otherwise, use enough to get 11 sheep in first row
printf"%"6*(x+1)"s\n",f     Print the top part of the jumping sheep
for(;X>0||Y>0;A=B=""){      Loop until we've printed all the sheep
  for(i=0;i++<x;              Loop over waiting sheep in this row
    B=B (X>=0?l:E))             Build the "legs" string
      A=A (--X>=0?f:E)            Build the "bodies" string
  A=A L                       Add the legs and post 
  B=B p                       for the jumping sheep
  for(i=0;i++<y&&--Y>=0;   Loop over the jumped sheep in this row
    B=B l) A=A"<^00' "     Add to the "legs" and "bodies" string 
  print A"\n"B"\n"         Print what we've got so far
  L=p=E" "                 Prevent the jumping sheep's parts from printing lots of times
}}

Я должен сказать, что овечье искусство довольно мило. :)


0

Древесный уголь , 98 байт

Nθ≔⁻⊖NθηF⟦⟦00¶/\¶++ θ⌊⟦⌈⟦⁵⁻χη⟧θ⟧⟧⟦0^>¶\¶+  η⌊⟦⌈⟦⁵⁻χθ⟧η⟧⟧⟧«J⁰¦⁰‖T§ι⁰↗F§ι¹«<^00'¶  || ↗¿¬﹪⊕κ§ι²”|I4O

Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:

Nθ

Введите количество овец, которые уже были подсчитаны.

≔⁻⊖Nθη

Введите общее количество овец и подсчитайте, сколько еще нужно посчитать.

F⟦⟦00¶/\¶++ θ⌊⟦⌈⟦⁵⁻χη⟧θ⟧⟧⟦0^>¶\¶+  η⌊⟦⌈⟦⁵⁻χθ⟧η⟧⟧⟧«

Создайте массив из двух массивов. Каждый массив имеет следующие элементы:

  • Строка, содержащая половину прыгающих овец
  • Количество овец на той стороне забора
  • Количество овец в одном ряду на той стороне забора, которая либо
    • количество овец на той стороне забора, если меньше 5, или
    • 10 - количество овец на другой стороне забора, если меньше 5, или
    • 5, если с обеих сторон есть как минимум 5 овец
J⁰¦⁰‖T§ι⁰↗

Отразите холст и напечатайте наполовину прыгающих овец.

F§ι¹«

Перебери овец по ту сторону.

<^00'¶  || ↗

Распечатать овцу.

¿¬﹪⊕κ§ι²”|I4O

Если это конец строки, выведите несколько строк и пробелов, чтобы добраться до начала следующей овцы.

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