Введение:
Когда мы думаем о божьих коровках, мы обычно думаем о красном или темно-оранжевом жуке с черными пятнами. Хотя это и не обязательно так, поскольку есть также черные с божьими коровками с красными / оранжевыми пятнами или божьи коровки без пятен , в основном мы изображаем божьих коровок что-то вроде азиатской божьей коровки:
Следует также отметить, что пятна на божьих коровках почти всегда симметричны. И вот тут возникает эта проблема.
Вызов:
Учитывая целое число 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, функции / метод с правильными параметрами и типом возврата, полные программы. Ваш звонок.
- По умолчанию лазейки запрещены.
- Если возможно, добавьте ссылку с тестом для вашего кода.
- Также, пожалуйста, добавьте объяснение, если это необходимо.
o
иO
вместо этого. Я немного изменил формулировку.n=50
примера, я считаю , что вы имеете в виду первый ошибка имеет 16 точек и два других каждый из которых имеет 17.Ответы:
Древесный уголь ,
8481 байтПопробуйте онлайн! Ссылка на подробную версию кода. Объяснение:
Введите общее количество мест.
Подсчитайте количество нужных божьих коровок.
Обмотайте каждую божью коровку.
Подсчитайте количество пятен, чтобы положить на эту божью коровку.
Напечатайте голову и правое крыло божьей коровки.
Если имеется более 21 пятна, напечатайте две точки, в противном случае распечатайте заднюю часть.
Если число пятен нечетное, выведите другое пятно, в противном случае напечатайте остальную часть спины.
Разделите количество пятен на два и распределите их по трем рядам из 3, 4 и 3 пятен.
Перейти к началу следующей божьей коровки.
Отразите холст влево, удерживая спину.
источник
Python 2 ,
252249238212211213209 байтПопробуйте онлайн!
источник
.replace('A','|O'[b%2])
и использоватьc=" _V_\n /(@I@)\ \n /361"+'|O'[b%2]+"163\ \n|4087B7804|\n \\529B925/\n ''-!-''"
вместо этого?[' o','|O'][i>9]
в' |oO'[i>9::2]
и используя|
вместо логического или. Также при обращенииfor i in range(11)
кexec
выписке сохраняется 4 байта.for
циклом, удаляя также ненужную переменную.JavaScript (ES6),
183186 байтИспользует ту же формулу, что и ответ TFeld, чтобы разделить места среди божьих коровок.
демонстрация
Показать фрагмент кода
источник
Befunge,
292279 байтПопробуйте онлайн!
объяснение
Искусство ASCII для божьей коровки закодировано в одной строке Befunge, смещенной на 15, чтобы первые 15 печатных символов были зарезервированы для специальных целей. Первые два из этих специальных символов представляют новую строку и
|
символ, которые в противном случае не были бы напечатаны. Третий не используется, потому что это"
, который нельзя использовать в строке. Следующие два представляют большие пятна в центре. А оставшиеся десять для пятен на крыльях.Эти специальные символы переводятся в окончательную форму через справочную таблицу, которая пишется поверх первой части первой строки.
Чтобы было легче объяснить, это код с выделенными различными компонентами:
Мы начнем с инициализации новой строки и
|
символа в таблице поиска, поскольку они постоянны.Далее мы читаем количество мест из stdin и вычисляем количество требуемых божьих коровок.
Затем мы можем запустить внешний цикл для набора ошибок, подсчитав количество пятен для следующей божьей коровки, которая будет отрисована.
Для каждой божьей коровки мы вычисляем, нужно ли показывать большое центральное пятно (если
spots%2 == 1
), и записываем соответствующее значение в таблицу поиска.Точно так же мы вычисляем, должна ли быть показана другая пара больших пятен (если
spots/2 > 10
), снова обновляя таблицу поиска. Мы также рассчитываем оставшиеся места, необходимые для каждого крыла.Последняя часть инициализации справочной таблицы представляет собой цикл, который вычисляет, какие из небольших пятен необходимо отобразить. По сути, алгоритм таков: если
(spotnum*spotcount+4)%10 > ((spotnum+1)*spotcount+4)%10
, то место должно быть отображено.Затем мы помещаем закодированное строковое представление божьей коровки в стек. По сути, это просто простая строка, но она стала немного запутанной, когда я попытался втиснуть ее в пробелы в коде, чтобы исходный код образовывал прямоугольник.
К этому моменту мы готовы начать цикл вывода, обрабатывая символы один за другим, преобразовывая особые случаи (точки, разрывы строк и т. Д.) Через ранее созданную таблицу поиска.
Наконец, мы проверяем, отобразили ли мы все необходимые божьи коровки, иначе вернемся к началу внешнего цикла.
источник
Рубин ,
203193190 байтовПопробуйте онлайн!
источник
{|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
.