Симетричні сонечко


22

Вступ:

Коли ми думаємо про сонечок, ми зазвичай думаємо про червоного або темно-помаранчевого клопа з чорними плямами. Хоча це не обов'язково, оскільки є також чорні з червоними / оранжевими плямистими сонечками або сонечка без плям , ми в основному зображаємо сонечок щось подібне до цієї азіатської сонечко:

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

Ще одна річ, яку слід зазначити, плями на сонечко майже завжди симетричні. І саме тут виникає цей виклик.

Виклик:

Враховуючи ціле число n( >= 0), виведіть наступну божевільну корівку ASCII один або кілька разів із симетричними плямами, рівномірно розділеними між двома сторонами, а також двома та більше корівками.

Ось макет корівки за замовчуванням:

    _V_ 
  /(@I@)\
 /   |   \
|    |    |
 \   |   /
  ''-!-''

Якщо n=0, ми виводимо сонечку вище, як є.

Коли nбільший за нуль, ми або заповнюємо пробіли помилки ASCII art маленькою буквою o, або замінюємо |в центрі великим колом O. Метою є внести nзміни до 'порожніх' сонечок, одночасно виробляючи симетричний вихід (на сонечку) та виводити якомога менше сонечок.

Отже, дійсними результатами для n=1:

    _V_ 
  /(@I@)\
 /   O   \
|    |    |
 \   |   /
  ''-!-''

    _V_ 
  /(@I@)\
 /   |   \
|    O    |
 \   |   /
  ''-!-''

    _V_ 
  /(@I@)\
 /   |   \
|    |    |
 \   O   /
  ''-!-''

Але це буде недійсним:

    _V_ 
  /(@I@)\
 /   |   \
| o  |    |
 \   |   /
  ''-!-''

Дійсні результати для n=2:

    _V_ 
  /(@I@)\
 /   O   \
|    O    |
 \   |   /
  ''-!-''

    _V_ 
  /(@I@)\
 /   O   \
|    |    |
 \   O   /
  ''-!-''

    _V_ 
  /(@I@)\
 /  o|o  \
|    |    |
 \   |   /
  ''-!-''

    _V_ 
  /(@I@)\
 /   |   \
| o  |  o |
 \   |   /
  ''-!-''

etc. There are a lot of possible outputs.

Перше, nщо вже неможливо вписатись у єдину сонечку, - це n=24. У такому випадку вам доведеться розділити її якомога рівномірніше на дві корівки (ви можете вибрати, виводити їх поруч один з одним, або під один - з необов'язково одним пробілом або одним новим рядком між ними). Наприклад:

    _V_        _V_ 
  /(@I@)\    /(@I@)\
 /o o|o o\  /o o|o o\
|o o | o o||o o | o o|
 \o o|o o/  \o o|o o/
  ''-!-''    ''-!-''

АБО:

    _V_ 
  /(@I@)\
 /ooo|ooo\
|    |    |
 \ooo|ooo/
  ''-!-''
    _V_ 
  /(@I@)\
 /ooo|ooo\
|    |    |
 \ooo|ooo/
  ''-!-''

Правила виклику:

  • nбуде в діапазоні 0-1000.
  • Ви можете вибрати вихід STDOUT, повернутися як String або 2D-char масив / список тощо. Ваш дзвінок.
  • Провідні нові рядки або непотрібні пробіли не допускаються. Допускаються пробіли білого пробілу та один проміжок нового рядка.
  • Як згадувалося вище, коли необхідні дві або більше сонечок, ви можете вибрати, чи виводити їх поруч один з одним або під один одного (або суміш обох ..)
  • Коли дві або більше сонечок друкуються поруч, допускається єдиний пробіл між ними. Коли дві або більше сонечок друкуються один на одного, допускається один необов'язковий новий рядок між ними.
  • Ви можете вибрати макет сонечок на будь-якому кроці протягом послідовності, якщо вони симетричні і рівні вхідному n.
  • Оскільки мета полягає в тому, щоб nзмінити І якомога менше сонечок, ви почнете використовувати більше однієї сонечко, коли вище n=23. Макет цих корів не обов'язково повинен бути однаковим. Насправді, це навіть неможливо для деяких входів, наприклад, n=25або n=50назвати два.
  • Крім того, іноді неможливо рівномірно розділити крапки між двома або більше сонечками. У такому випадку вам доведеться розділити їх максимально рівномірно, максимум з різницею 1 між ними.

Отже n=50, маючи на увазі останні два правила, це було б можливим можливим результатом (де перша помилка має 16 плям, а в інших двох - 17):

    _V_        _V_        _V_ 
  /(@I@)\    /(@I@)\    /(@I@)\
 /oooOooo\  /   O   \  /o oOo o\
|ooooOoooo||ooooOoooo||o ooOoo o|
 \   |   /  \oooOooo/  \o oOo o/
  ''-!-''    ''-!-''    ''-!-''

Загальні правила:

  • Це , тому найкоротша відповідь у байтах виграє.
    Не дозволяйте мовам коду-гольфу відштовхувати вас від публікації відповідей з не кодовими гольф-мовами. Спробуйте придумати якомога коротшу відповідь на "будь-яку" мову програмування.
  • Стандартні правила застосовуються до вашої відповіді, тому вам дозволяється використовувати STDIN / STDOUT, функції / метод із відповідними параметрами та повним програмами типу "повернення". Твій дзвінок.
  • Лазівки за замовчуванням заборонені.
  • Якщо можливо, додайте посилання з тестом для вашого коду.
  • Також, будь ласка, додайте пояснення, якщо це необхідно.

Що ви маєте на увазі під "якомога меншими змінами" до порожньої сонечко? Розміщуючи n (<24) літери o / O на одній сонечко, ви вносите в неї n змін. Або ви маєте на увазі зміни від n-1 до n (тому результати змінюються якнайменше, коли входи змінюються на 1)?
Хеймдалл

@Heimdall Ах вибачте за плутанину через погані формулювання. Тоді у мене виникла ідея дозволити кілька персонажів утворювати одне місце, коли я думав про це завдання, але я кинув це і просто використав oі Oзамість цього. Я трохи змінив формулювання.
Кевін Круїссен

Для n=50прикладу, я вважаю, що ви маєте на увазі, що перший помилок має 16 плям, а два інші
Джон Клаус

Це мій улюблений альбом Джимі Хендрікса.
Відновіть Моніку ямнотмайнар

@iamnotmaynard Можливо, я пропускаю щось очевидне, чи ви прокоментували неправильний виклик? Я не бачу зв’язку між Джімі Хендрікс та сонечками ..
Кевін Круїйсен

Відповіді:


5

Вугілля деревне , 84 81 байт

Nθ≔⌈∕∨θ¹¦²³ηFη«≔⁺÷θη‹ι﹪θηζV_¶I@)↘²↙|/←''-↑!↑⎇›ζ²¹OO²§|OζE037×o⌊⟦⁻÷ζ²Iκ⁺³⁼κ3⟧↙»‖B←

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Пояснення:

Nθ

Введіть загальну кількість плям.

≔⌈∕∨θ¹¦²³η

Обчисліть кількість необхідних божих корів.

Fη«

Петля над кожною сонечко.

≔⁺÷θη‹ι﹪θηζ

Обчисліть кількість плям, які слід нанести на цю корівку.

V_¶I@)↘²↙|/←''-↑!

Друкуйте голову і праве крило сонечко.

↑⎇›ζ²¹OO²

Якщо плям більше 21, надрукуйте дві плями, інакше роздрукуйте спинку.

§|Oζ

Якщо кількість плям непарна, надрукуйте інше місце, інакше роздрукуйте решту спинки.

E037×o⌊⟦⁻÷ζ²Iκ⁺³⁼κ3⟧

Розділіть кількість плям на два і розподіліть їх між трьома рядами по 3, 4 та 3 плями.

↙»

Перехід до початку наступної корівки.

‖B←

Відбийте полотно зліва, зберігаючи спинку.


8

Python 2 , 252 249 238 212 211 213 209 байт

n=input()
x=(n+22)/23or 1
for i in range(x):b=n/x+(n%x>i);c=r"""    _V_
  /(@I@)\
 /361%s163\
|408717804|
 \5201025/
  ''-!-''"""%'|O'[b%2];i=0;exec"c=c.replace(`i%9`,' |oO'[i>9::2][i<b/2],2);i+=1;"*11;print c

Спробуйте в Інтернеті!

  • Збережено 9 байт завдяки Кевіну Крейсейну
  • Збережено 18 байт завдяки панові Xcoder
  • Збережено 2 байти завдяки Джонатану Фреху

Я думаю, ви можете видалити .replace('A','|O'[b%2])та використовувати c=" _V_\n /(@I@)\ \n /361"+'|O'[b%2]+"163\ \n|4087B7804|\n \\529B925/\n ''-!-''"замість цього?
Kevin Cruijssen

230 байт , повертаючи [' o','|O'][i>9]в ' |oO'[i>9::2]і використовуючи |замість логічних або. Також звернувшись for i in range(11)до execоператора, збережено 4 байти.
Містер Xcoder

1
І вибачте за захаращення коментарів, але 218 байт , змішавши ваше розуміння списку з forциклом, видаливши і непотрібну змінну.
Містер Xcoder

@ Mr.Xcoder Спасибі велике :)
TFeld

Це повинно зробити найменше можливих сонечок, ні? Коли я поміщаю в TIO від 24 до 46, він дає 3 сонечко замість двох.
Нік Маттео

7

JavaScript (ES6), 183 186 байт

Використовує ту саму формулу, що і відповідь TFeld, щоб розділити плями серед сонечок.

n=>(g=k=>k--?`    _V_
  /(@I@)\\
 /3\\
|4|
 \\3/
  ''-!-''
`.replace(/\d/g,i=>(h=s=>i--?h((p=N?(N-=2,'o'):' ')+s+p):s)('|O'[N>2*i|N&1&&+!!N--]),N=(n%j>k)+n/j|0)+g(k):'')(j=n/23+.99|0||1)

Демо


6

Befunge, 292 279 байт

#j07-00p&>::1-27*9+/\!!*:1+06pv-1_@#:<<g61$<<:
v"h"**95%2:+`g61%g60\/g60::p61<>-0g*+35*-,:!|
>\-30p2/:55+`:59**"g"\-40p-26pv^*84\!`"."::<<9
v\%+55+g62:%+55+4*g62:::-1<+55<>:"/n"$#->#<^#<
>`26g!+"O"*"Y"\-\-\5+0p:>#^_" 66<0<66// >,-"v
"n //>7OXO8k />'&%$%&'k !(*+)#)+*(! /k,-.$."<v

Спробуйте в Інтернеті!

Пояснення

Мистецтво ASCII для сонечко кодується в одній рядку Befunge, зміщеній на 15, щоб дозволити зарезервувати перші 15 символів для друку для спеціальних цілей. Перші два з цих спеціальних символів являють собою новий рядок та |персонаж, обидва вони інакше не підлягають друку. Третій не використовується, тому що це a ", який не можна використовувати в рядку. Наступні два являють собою великі плями в центрі. А решта десять - для плям на крилах.

Ці спеціальні символи переводяться в остаточну форму через таблицю пошуку, яка записується над першою частиною першого рядка.

Щоб полегшити пояснення, це код з виділеними різними компонентами:

Вихідний код із виділеними шляхами виконання

*Почнемо з ініціалізації нового рядка та |символу в таблиці пошуку, оскільки вони постійні.
*Далі ми читаємо в кількості плям від stdin і обчислюємо кількість необхідних сонечок.
*Потім ми можемо запустити зовнішній цикл для набору помилок, обчисливши кількість плям для наступної сонечки, яку потрібно винести.
*Для кожної сонечко ми обчислюємо, чи потрібно показувати велике центральне місце (якщо spots%2 == 1), і записуємо відповідне значення в таблицю пошуку.
*Аналогічно ми обчислюємо, чи потрібно відобразити іншу пару великих плям (якщо spots/2 > 10), знову оновивши таблицю пошуку. Ми також обчислюємо необхідні плями на кожному крилі.
*Заключна частина ініціалізації таблиці пошуку - це цикл, який обчислює, які з невеликих плям потрібно відобразити. По суті алгоритм такий: якщо (spotnum*spotcount+4)%10 > ((spotnum+1)*spotcount+4)%10, тоді потрібно вивести пляму.
*Далі ми висуваємо кодоване рядкове подання сонечко на стек. Це по суті просто простий рядок, але він став трохи перекрученим, коли я намагався втиснути його в прогалини в коді, щоб джерело утворювало прямокутник.
*На цьому етапі ми готові розпочати цикл виводу, обробляючи символи один за одним, перетворюючи спеціальні випадки (плями, розриви рядків тощо) за допомогою раніше побудованої таблиці пошуку.
*Нарешті ми перевіряємо, чи відобразили ми всі необхідні корівки, інакше продовжуємо повертатися до початку зовнішньої петлі.


Приємно, мені дуже подобаються візерунки, які мають ваші сонечко для кожного етапу від 1-23. Зовсім інші, ніж деякі інші відповіді. +1 від мене. Ви б не хотіли додати пояснення (після того, як, можливо, будете займатися гольфом далі)?
Кевін Кройсейсен

1
Я радий, що тобі сподобалися візерунки. Я фактично витратив досить багато часу на те, щоб випробувати різні комбінації, щоб знайти алгоритм, який добре виглядав на якомога більше етапів. Також додав трохи пояснень до моєї відповіді.
Джеймс Холдернесс

3

Рубі , 203 193 190 байт

f=->n{s=%q{    _V_ 
  /(@I@)\
 /137x731\
|0596x6950|
 \248x842/
  ''-!-''
}
n-=d=n>0?n/(1+~-n/23):0
s.gsub!(/\d/){$&.to_i<d/2??o:' '}
x=[d%2,d<=>21]*2
s.gsub!(?x){"|O|"[x.pop]}
n>0?s+f[n]:s}

Спробуйте в Інтернеті!

  • Збережено 10 байт завдяки Джордану

{|m|m.можна замінити на {$&.; b=(n-1)/23+1можна замінити на b=1+~-n/23; і x=[z=d>21,d%2>0,z]⏎s.gsub!(?x){x.pop ? ?O:?|}може бути замінено на x=[d%2,d<=>21]*2⏎s.gsub!(?x){"|O|"[x.pop]}.
Йорданія

Ви можете зберегти ще один байт, використовуючи %q{XY}замість 'X'+"Y"перших восьми рядків і ще пару, роблячи d=n>0?n/(b=1+~-n/23):b=0замість цього n>0?d=n/(b=(n-1)/23+1):d=b=0.
Йорданія

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.