Вот простой ASCII арт снеговик:
_===_
(.,.)
( : )
( : )
Давайте сделаем его друзьями. Это будет общий образец для наших снежных людей искусства ASCII:
HHHHH
HHHHH
X(LNR)Y
X(TTT)Y
(BBB)
Ведущие места и круглые скобки всегда одинаковы для всех снежных людей. Различные буквы представляют разделы шаблона, которые могут индивидуально меняться. Каждый раздел имеет ровно четыре предустановки, которые могут заполнять символы ASCII. Смешивая и подбирая эти пресеты для всех восьми секций, мы можем создавать разнообразных снежных людей.
Все пресеты
(Обратите внимание, что пробелы ставятся на пустые строки, поэтому форма сечения всегда правильная.)
H для шляпы
Соломенная шляпа
_===_
Мексиканская шляпа
___ .....
феска
_ /_\
-
___ (_*_)
N для носа / рта
Обычный
,
точка
.
Линия
_
Никто
L для левого глаза
точка
.
Большая точка
o
Большая точка
O
Закрыто
-
R для правого глаза
(Тот же список, что и для левого глаза.)
Х для левой руки
Нормальная рука
<
Рука вверх
\
Вниз рука
/
Никто
Y для правой руки
Нормальная рука
>
Рука вверх
/
Вниз рука
\
Никто
T для Торса
Кнопки
:
Жилет
] [
Внутреннее оружие
> <
Никто
B для базы
Кнопки
:
ноги
" "
Плоский
___
Никто
Вызов
Напишите программу, которая принимает строку из восьми символов (через stdin или командную строку) в формате HNLRXYTB
, где каждая буква представляет собой цифру от 1 до 4, которая обозначает, какую предустановку использовать для соответствующего раздела снежного человека. Напечатайте полный снеговик на стандартный вывод.
Например, ввод 11114411
снеговика в верхней части страницы. (Первое 1
: у него соломенная шляпа, второе 1
: у него нормальный нос и т. Д.)
Другой пример, снеговик для ввода 33232124
:
_
/_\
\(o_O)
(] [)>
( )
подробности
Любые количества и комбинации начальных / конечных пробелов и начальных / конечных новых строк допускаются до тех пор, пока ...
- у снеговика все секции правильно расположены относительно друг друга, и
- никогда не бывает более 64 символов пробела (общий шаблон - только 7 × 5, так что вы, вероятно, не достигнете этого предела).
Вам не нужно печатать строки / столбцы шаблона, если они содержат только пробелы. например, пустая строка соломенной шляпы не требуется.
Вы должны использовать порядок деталей, как указано выше.
Вместо программы вы можете написать функцию, которая принимает цифровую строку в качестве аргумента. Вывод должен быть напечатан нормально или возвращен в виде строки.
- При желании вы можете рассматривать ввод как целое число вместо строки.
счет
Самый короткий код в байтах побеждает.
Дополнительный вопрос: Какой из 65536 отличных снежных людей ваш любимый?
Ответы:
CJam,
135134132130126125 байтЧтобы создать файл на вашем компьютере, выполните
xxd -r > snowman.cjam
команду, вставьте обратимый шестнадцатеричный код сверху, нажмите Enterи, наконец, Ctrl+ D.Кроме того, вы можете попробовать код онлайн с помощью интерпретатора CJam .
бонус
Мой любимый снеговик Олаф:
Зима - хорошее время, чтобы остаться и обниматься, но посадите меня летом, и я буду… счастливым снеговиком!
идея
Шестнадцатеричная строка
кодирует возможные варианты для всех частей снеговика, включая фиксированные. Назовем эту строку P .
Чтобы декодировать его, мы конвертируем P (здесь рассматриваемый как массив целых чисел) из основания 256 в основание 20 и заменяем каждое из полученных целых чисел соответствующим символом строки M :
Это приводит к строке T :
Первая строка кодирует все варианты выбора шляпы, последняя - все фиксированные части тела. Другие строки содержат 28 переменных частей тела.
Мы разделяем T в переводах строк и делим строки полученного массива на четыре части одинаковой длины. Затем мы читаем ввод из STDIN, помещаем массив его цифр в основание 10 и выбираем соответствующие элементы разделенных строк. Мы используем тот факт, что массивы оборачиваются в CJam, поэтому элемент с индексом 4 массива длины 4 фактически является первым элементом. Последняя разделенная строка не соответствует ни одному входу, поэтому она будет выделена целиком.
Мы работаем со шляпой, сдвигая первый элемент из полученного массива. Индекс в M первого символа, читаемый как число 4, показывает количество пробелов и подчеркиваний в первой строке шляпы. Мы печатаем эти символы, перевод строки, пробел и остаток сдвинутой строки. Затем мы помещаем дополнительный перевод строки в конец стека.
Для частей тела мы объединяем строку, соответствующую всем из них. Давайте назовем эту строку S . Для того, чтобы собрать части тела, мы выполняем транслитерации: мы берем каждый символ строки М , вычислить его индекс в роде (M) и заменить его соответствующим символом S . Мы используем тот факт, что оператор транслитерации автоматически дополняет S, чтобы соответствовать длине сортировки (M) , повторяя последний символ S столько раз, сколько необходимо.
Наконец, мы разделяем полученную строку на подстроки длиной 7 и помещаем перевод строки между каждой парой подстрок.
Код
Предположим , что переменные
M
иP
содержат строки M и P .источник
JavaScript ES6,
210208202 байтаЭто анонимная функция; Вы используете это, выполняя
([function code])('42232124')
. Самым отягчающим фактором были руки, занимающие 2 строки, поэтому мне пришлось включать код как для верхней, так и для нижней частей.В приведенном ниже фрагменте стека приведен некомментированный код без комментариев ES6. И вы можете использовать его, чтобы легко протестировать код и опробовать различные комбинации. Редактировать: я получаю слишком много удовольствия от этого. Я добавил несколько новых функций, в том числе способ генерации случайного снеговика.
Спасибо Yair Rand за сохранение шести байтов.
источник
1 1
->11
) и добавив||' '
в конце.CJam, 164 байта
Создает снеговика слева направо, сверху вниз. Это устраняет необходимость в любых операциях соединения или перемещения строк, так как я просто оставляю каждый кусочек снеговика в стеке. А потом, из-за автоматического дампа стека в конце программы:
♫ CJam хочет построить снеговика! ♫
Попробуйте онлайн.
бонус
Нестандартное мышление!
32443333
дает снег (муж) невесте. Вам нужно немного постараться, чтобы увидеть это, но есть внутренние руки, фес + нисходящие руки = вуаль, и голова фактически находится в фесе / вуали. Обычно большая форма - это волнистое платье, а «глаза» и «нос» - это складки в платье.Другие "глазные" варианты немного рискованны ...
источник
Python,
276289 байтЭтот код имеет 8 дополнительных байтов (
\
* 4) для удобства чтения.Строит снеговика по крупицам.
бонус
F("44444432")
дает "сонный русский медведь"источник
Python 2,
354280241261 байтВызов
s('33232124')
дает:Но мои любимые
44242123
и41341144
:источник
s('33232124')
фески не прорисовываются. На самом деле нижняя половина шляпы отсутствует во многих случаях. Кроме того,0
это не один из вариантов.CJam,
150145 байтовБаза конвертирует все вещи!
SE портит непечатные, так что вот копия на Pastebin. Убедитесь, что вы скопировали часть «RAW Paste Data», а не часть рядом с номерами строк. Вы можете попробовать это онлайн , но постоянная ссылка может не работать в некоторых браузерах.
объяснение
"b8li'U9gN;|"125:Kb8bp
Часть генерирует массивкоторый отображает каждую цифру входных данных, где используется цифра. Все, что является общим для всех входных данных (например, начальные пробелы и
()
), произвольно присваивается 0, кроме первого, которому присваивается 1, чтобы базовое преобразование могло работать.l:~f=
затем преобразует каждую цифру к междунар и отображает соответственно, например , для14441133
получаем"G.HMtNY7VM=BM@$^$dX8a665V"KbFb"=_./ <[(*-oO,\":"f=
дает строкупосле чего мы дублируем, заменяем
/<[(
на\>])
и добавляем длинную строку. Затем мы разбиваем строку на группы по 4 и отображаем в соответствии с другим массивом"r pL|P3{cR`@L1iT"Kb21b
, получая, таким образом, массив строк длиной 4, описывающих все возможные параметры в каждой ячейке (например,_=./
это все возможные параметры для второго символа во второй строке, начиная с Русская шапка).Наконец, мы соотносим параметры с входами соответственно
.=
, разбиваем на строки длиной 77/
и рифляемся в некоторых новых строкахN*
.Тестовые прогоны
источник
TI-BASIC, 397 байтов
Важно: если вы хотите проверить это, загрузите его отсюда и отправьте этот файл на свой калькулятор. Вы не пытаться скопировать код ниже в редактор программы TI-Connect СЕ или SourceCoder 3 или что - то построить и отправить его в калькулятор; в случае TI-Connect он скажет, что имеет неверный токен. SC3 использует обратную косую черту в качестве разделителя комментариев (
//
запускает комментарий в SC3; тем не/\/
менее, экспортирует как//
), поэтому не будет экспортировать оружие и шляпу и тому подобное, что приведет к тому, что программа отобразит неправильные части тела и выдаст ОШИБКА: ДОМЕН время от времени. Прикольные вещи!Важно # 2: мне сейчас лень исправлять загрузку, поэтому, когда вы переносите ее на свой каль, поменяйте
7
на третью строку снизу наX+6
. Код ниже исправлен, если вам нужно сравнить.Бонус: я особенно люблю
12341214
.Некоторые заметки:
[2ND] → [0]CATALOG → [3]θ → scroll down, it's between ﹢ (small plus) and · (interpunct)
), а не точку, чтобы глаза не совпадали с запятой, потому что это выглядит странно, как ад.источник
length(Ans
должно бытьlength(Str9
; во-вторых, вы пытались объединить Str3 через Str6 в одну строку?C
280 272264 байтаТолько частично игра в гольф на данный момент, но это увлекательная задача.
(С некоторыми дополнительными \ n для удобочитаемости.) Я ожидаю, что
define
следует уйти с дальнейшей игрой в гольф.Более читаемая версия
источник
C, 212 байтов
Читаемая версия:
Я взял идею из ответа Рето Коради . Я сделал несколько забавных улучшений, которые могут потребовать публикации отдельного ответа:
\"
(-3)t[i++]
на*t++
(-4)while
наfor
; удален{}
(-4)\0
(-9)t[...],t+=4
в(...)[t+=4]
оператор запятой (-1)Почему все эти проблемы? Чтобы поделиться своим любимым, снежный призрак:
источник
d
вmain
JavaScript, 489 (без перевода строки и вкладок)
бежать с
node snowman.js 33232124
источник
parseInt
вызов, так как вычитание автоматически пытается привести строковые операнды к числам. Кроме того, вы можете избавиться отfunction
переноса и простоi=process.argv[2]
использовать его, если только вы не используете его для рекурсии или определения области действия. Кроме того, вы можете избавиться отs
целиком и просто сделатьconsole.log([ ... ].join('\n'))
.,
символов, но позволяет вам удалить более 50. Наконец,q=j[4]-1
вместо оченьq=j[4]==1
(и затем переверните использованиеq
и!q
) используйте одну очень привередливую оптимизацию . Это приведетq
к тому, что будет0
(ложное значение), когдаj[4]
есть1
, и в противном случае истинное ненулевое значение. Это полная противоположность вашим текущим значениям true / false, поэтому вы просто переключаетесьq
и!q
.Pyth, 203 байта
Лол. Попробуйте онлайн: Pyth Compiler / Executor
объяснение
Сначала я определяю вспомогательную функцию
g
, которая принимает список и символ в качестве входных данных, преобразует символ в его ASCII-значение и принимает соответствующий элемент (модульная упаковка).Другое дело просто печать построчно. Например, первая строка:
Btw. Я немного поэкспериментировал с
.F"{:^7}"
центрированием струны. Используя его, я мог бы сохранить несколько пробелов в своем коде, но в конце он не сохраняет никаких байтов.источник
R
436437 байтВот моя первая попытка в код-гольфе , использующая R, которая не самая короткая, но все же забавная. По крайней мере, я бью JavaScript (пока) ...
Тестирование:
Я на самом деле боролся с
X
иY
быть многострочным , но с материалом между ними, в конечном итоге отделяя каждую строку (X
,S
) и (Y
,U
).function
и преобразование из строки в целое число также очень многословно.Изменить 436 => 437
Пришлось исправить пропущенное пустое место, замеченное @OganM
Я мог бы уменьшить до 428, заменив разрывы строк между переменными
;
, но «однострочный» код выглядит так плохо и нечитаемо, что я не буду таким жадным.источник
Haskell,
361306289 байтИспользование:
Как это работает: индексировать каждый элемент списка
[hat options, left upper arm options, left eye options, ..., base options]
с соответствующим входным номером и объединять его в один список. Я разделил левую и правую руку на верхнюю и нижнюю части, чтобы я мог строить снеговика построчно.Мой любимый классик
11112211
.Редактировать: переключено из списка строк в строки для частей (шляпа, глаз, ...). Нужен второй параметр, длина подстроки, которую нужно взять.
Редактировать II: извлеченные общие подстроки
источник
C
233230 байтС символами новой строки и пробелами для лучшей читаемости:
Все это довольно грубая сила. Он использует таблицу, которая содержит одну запись для каждого из 35 (5 строк длиной 7) символов. Каждая запись в таблице:
,
(
,)
. Длина записи в таблице составляет 1 символ.Затем код перебирает 35 символов и ищет значение в таблице.
источник
R 414 байта
Слегка измененная версия версии Molx
Просто слил отдельные переменные в одну. Shaving некоторого места, которое использовалось для
X=c(
рутины.источник
CJam,
200191 байтЭто, безусловно, может быть много в гольфе. (Особенно, если я закодирую его). Но здесь для начала:
Ввод идет в STDIN. Например, вход
23232223
дает:Попробуйте это онлайн здесь
источник
Haskell, 333 байта
Моя первая подача! Строит снеговика сверху вниз, слева направо. Я разделил руки на две функции для каждой руки: часть рядом с головой и часть рядом с телом.
Функция s берет список целых чисел и объединяет выходные данные функций, которые производят части тела с заданными правильными подсписками ввода.
Опирается на функцию
который возвращает n-й элемент списка, который ему дан. Это позволяет список шляпы в, а также такие вещи, как
все эти функции используют бета-редукцию, поэтому их аргумент передается в качестве индекса функции y.
Выход:
источник
Python 3,
349336254251 байтТак много для моей диссертации.
Вот содержимое файла snowman.py :
И вот как я заклинаю моего любимого снеговика:
объяснение
источник
[int(i)]
иfor
. Точно так же вы можете удалить пробел в строке 7 междуf(int(i))
иfor
. Кроме того, в вашемprint()
заявлении вам не нужно печатать последний пробел - это не часть снеговика. Наконец, измените вашprint()
звонок на одну линиюprint("{}\n{}({}{}{}){}\n{}({}){}\n ({})".format(*c))
. Каждый из них должен сэкономить вам 1 байт, сохраняя всего 4 байта :)n
вы можете определить атрибут функцииf
. Таким образом, вы можете заменить строки 5-6 на:def f(m):f.n+=1;return l[4*m+int(b[f.n])-1]
<newline>f.n=-1
. Это уменьшает еще 3 байта.PowerShell , 199 байт
Вдохновлен Рето Коради и Анатолигом .
Попробуйте онлайн!
Примечание. В строке 3 есть 2 пробела, в строке 4 - пробел.
Мой любимый
44444444
"сонный русский охранник":источник
JavaScript (ES6), 247
Не очень хорошая реклама @ NinjaBearMonkey's :(
Тест во фрагменте (с Firefox)
источник
05AB1E ,
137135128122 байтов-6 байт благодаря @Grimy .
Попробуйте онлайн или проверьте еще несколько тестов .
Объяснение:
Сначала мы создаем строку-шаблон:
Который выглядит так:
Затем я перебираю цифры на входе:
И сделайте следующее:
нажмите (0-индексированный) индекс
N
списка:Выдвиньте все возможные части в виде списка символов:
Используйте индекс цикла,
N
чтобы получить список символов части, с которой мы сейчас работаем:Затем разделите список символов на четыре равные части и используйте входную цифру
y
(которая индексируется 1) для индексации в нем. (ПРИМЕЧАНИЕ. Поскольку 05AB1E индексируется 0, а вход индексируется 1, было бы логично уменьшить цифру на 1 до индексации. Однако, поскольку 05AB1E имеет автоматическое циклическое преобразование (то есть3
в[1,3,5]
результате индексации в списке1
), я просто Поверните части один раз, так что части с номером 4 в описании вызова находятся в начале списков.)А затем замените индекс с 0 индексами цикла, который мы сначала выдавили, один за другим на символы части:
И в итоге результат выводится неявно.
Посмотрите этот совет 05AB1E (раздел « Как сжимать большие целые числа?» И « Как сжимать целочисленные списки?» ), Чтобы понять, как работают части сжатия.
Что касается моего фаворита, это все тот же «снежный кролик», что и 1,5 года назад, когда я опубликовал свое решение Java :
источник
0
между глазами. :)Java 8
548545432401399 байтПопробуй это здесь.
Объяснение:
Мой любимый:
Я не знаю почему, но это выглядит довольно мило. Как зайчик с русской шапкой вместо ушей.
источник
F #, 369 байт
Попробуйте онлайн!
Потому что
g
используется метод доступа к массиву, мне нужно явно указать тип в определении функции как astring
, поэтому определение функции имеет(g:string)
.Кроме того, обычно это массив,
strings
доступ к которому осуществляется по индексу. Шляпа, левая и правая руки, которые идут по отдельным линиям, делятся на отдельные верхние и нижние массивы.i
Функция изменяет число в аргументеg
в индекс массива. И эта букваb
заменяет строки с одним пробелом в массивах.Отличный вызов! Мой любимый снеговик наверное
242244113
:я наблюдаю, слежу за тобой
источник
PHP, 378 байт
Попробуйте онлайн!
Мне нравится мудрый мистер Сова
31333342
источник
Python 2,7, 257 байт (я думаю)
где «i» является вводом в виде строки (например, «13243213»)
источник
i
наinput()
в общей сложности 262 байтДротик , 307 байт
Попробуйте онлайн!
источник
Zsh, 247 байт
попробуйте это онлайн!
любимый снеговик:
источник