Підрахунок овець до засинання


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 Щоправда, але одного або двох тестових випадків повинно бути достатньо, щоб показати, що рішення працює.
Adám

Відповіді:


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(маленький s heep)

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

Очікування (r⍴(×/r←d,⍨⌈w÷d←10-⍵⌊⊢/r)↑w⍴(w←⍺-⍵+1)⍴⊂s@2⌽S)

⌽S дзеркало S

s@2 помістити s в рядок 2 цього (замінивши поточні дані там)

 додайте його, щоб ми могли мати справу з ним як одиницею

()⍴ Циклічно змінити розмір на наступний розмір:

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

⍺- відняти це від загального

w← призначити w( w aiting)

()↑ Візьміть із цього кількість елементів (набивання прототиповими предметами)

⊢/r найправіший елемент r(тобто кількість використаних стовпців для перерахованих овець)

⍵⌊ мінімум загального і того

10- відняти це від десяти

d← призначити d( d ifference; відсутні стовпці)

 розділити wтим

 заокруглення (дає кількість необхідних рядків)

d,⍨ додавати d

r← призначити r(то , що ми будемо г eshape с, рядків і стовпців)

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

r⍴ змінити форму до масиву з розмірами довжини r


1
@WeijunZhou Ви маєте рацію, виправте.
Адам

1
Мені було цікаво, начебто я відповім на цей виклик. Я здогадуюсь, що так: p
J. Sallé

1
@WeijunZhou Виправлено.
Adám

"Завжди резервує дев'ять стовпців для очікуваних овець і одну колонку для відлічених овець." Чи працює це 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
Виправлені ці помилки. Також виявлено, що деякі вівці втекли через помилки округлення.
Джал

Якщо m = nви отримаєте помилку
aimorris

Це сценарій, який я припускав, що його можна ігнорувати. Спосіб написання запитання стверджував, що: m = кількість овець з правого боку n = кількість овець загалом І що овець також стрибає через паркан. Тому n не може бути рівним m, тому я його не враховував.
Джал

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 .
Adám

Я не отримую 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.