Вступ:
Коли ми думаємо про сонечок, ми зазвичай думаємо про червоного або темно-помаранчевого клопа з чорними плямами. Хоча це не обов'язково, оскільки є також чорні з червоними / оранжевими плямистими сонечками або сонечка без плям , ми в основному зображаємо сонечок щось подібне до цієї азіатської сонечко:
Ще одна річ, яку слід зазначити, плями на сонечко майже завжди симетричні. І саме тут виникає цей виклик.
Виклик:
Враховуючи ціле число 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, функції / метод із відповідними параметрами та повним програмами типу "повернення". Твій дзвінок.
- Лазівки за замовчуванням заборонені.
- Якщо можливо, додайте посилання з тестом для вашого коду.
- Також, будь ласка, додайте пояснення, якщо це необхідно.
oі Oзамість цього. Я трохи змінив формулювання.
n=50прикладу, я вважаю, що ви маєте на увазі, що перший помилок має 16 плям, а два інші


Почнемо з ініціалізації нового рядка та
Далі ми читаємо в кількості плям від stdin і обчислюємо кількість необхідних сонечок.
Потім ми можемо запустити зовнішній цикл для набору помилок, обчисливши кількість плям для наступної сонечки, яку потрібно винести.
Для кожної сонечко ми обчислюємо, чи потрібно показувати велике центральне місце (якщо
Аналогічно ми обчислюємо, чи потрібно відобразити іншу пару великих плям (якщо
Заключна частина ініціалізації таблиці пошуку - це цикл, який обчислює, які з невеликих плям потрібно відобразити. По суті алгоритм такий: якщо
Далі ми висуваємо кодоване рядкове подання сонечко на стек. Це по суті просто простий рядок, але він став трохи перекрученим, коли я намагався втиснути його в прогалини в коді, щоб джерело утворювало прямокутник.
На цьому етапі ми готові розпочати цикл виводу, обробляючи символи один за одним, перетворюючи спеціальні випадки (плями, розриви рядків тощо) за допомогою раніше побудованої таблиці пошуку.
Нарешті ми перевіряємо, чи відобразили ми всі необхідні корівки, інакше продовжуємо повертатися до початку зовнішньої петлі.