Симметричные божьи коровки


22

Введение:

Когда мы думаем о божьих коровках, мы обычно думаем о красном или темно-оранжевом жуке с черными пятнами. Хотя это и не обязательно так, поскольку есть также черные с божьими коровками с красными / оранжевыми пятнами или божьи коровки без пятен , в основном мы изображаем божьих коровок что-то вроде азиатской божьей коровки:

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

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

Вызов:

Учитывая целое число n( >= 0), выведите следующую божью коровку ASCII-art один или несколько раз, с симметричными точками, равномерно разделенными между двумя сторонами, а также двумя или более божьими коровками.

Вот макет божьей коровки по умолчанию:

    _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, возврат в виде массива / списка строк или 2D-символов и т. Д. Ваш вызов.
  • Новые строки или лишние пробелы запрещены. Конечные пробелы и одиночная новая строка допускаются.
  • Как упомянуто выше, когда нужны две или более божьих коровок, вы можете выбрать, выводить ли их рядом друг с другом или друг под другом (или смесь обоих ..)
  • Когда две или более божьих коровок печатаются рядом друг с другом, допускается один дополнительный интервал между ними. Когда две или более божьих коровок печатаются друг на друге, допускается одна дополнительная строка между ними.
  • Вы можете выбрать расположение божьих коровок на любом этапе последовательности, если они симметричны и равны входным данным 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

@Heimdall Извините за путаницу из-за плохой формулировки. Именно тогда у меня возникла идея разрешить нескольким персонажам формировать одно место, когда я подумал об этом испытании, но я отбросил это и просто использовал oи Oвместо этого. Я немного изменил формулировку.
Кевин Круйссен

Для n=50примера, я считаю , что вы имеете в виду первый ошибка имеет 16 точек и два других каждый из которых имеет 17.
Джон Клаус

Это мой любимый альбом Джими Хендрикса.
Восстановить Монику - Нотмайнард

@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 байтов благодаря Mr. Xcoder
  • Сохранено 2 байта благодаря Джонатану Фреху

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

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

1
И извините за беспорядок комментариев, но 218 байтов , смешивая ваше понимание списка с forциклом, удаляя также ненужную переменную.
г-н Xcoder

@ Mr.Xcoder Спасибо большое :)
TFeld

Он должен производить как можно меньше божьих коровок, нет? Когда я ставлю 24–46 на TIO, он дает 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 печатных символов были зарезервированы для специальных целей. Первые два из этих специальных символов представляют новую строку и |символ, которые в противном случае не были бы напечатаны. Третий не используется, потому что это ", который нельзя использовать в строке. Следующие два представляют большие пятна в центре. А оставшиеся десять для пятен на крыльях.

Эти специальные символы переводятся в окончательную форму через справочную таблицу, которая пишется поверх первой части первой строки.

Чтобы было легче объяснить, это код с выделенными различными компонентами:

Исходный код с выделенными путями исполнения

*Мы начнем с инициализации новой строки и |символа в таблице поиска, поскольку они постоянны.
*Далее мы читаем количество мест из 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.