Хотите кодировать снеговика?


176

Вот простой ASCII арт снеговик:

_===_
(.,.)
( : )
( : )

Давайте сделаем его друзьями. Это будет общий образец для наших снежных людей искусства ASCII:

 HHHHH
 HHHHH
X(LNR)Y
X(TTT)Y
 (BBB)

Ведущие места и круглые скобки всегда одинаковы для всех снежных людей. Различные буквы представляют разделы шаблона, которые могут индивидуально меняться. Каждый раздел имеет ровно четыре предустановки, которые могут заполнять символы ASCII. Смешивая и подбирая эти пресеты для всех восьми секций, мы можем создавать разнообразных снежных людей.

Все пресеты

(Обратите внимание, что пробелы ставятся на пустые строки, поэтому форма сечения всегда правильная.)

H для шляпы

  1. Соломенная шляпа

         
    _===_
  2. Мексиканская шляпа

     ___ 
    .....
    
  3. феска

      _  
     /_\ 
    
  4. Русская шапка

     ___ 
    (_*_)
    

N для носа / рта

  1. Обычный ,

  2. точка .

  3. Линия _

  4. Никто

L для левого глаза

  1. точка .

  2. Большая точка o

  3. Большая точка O

  4. Закрыто -

R для правого глаза

(Тот же список, что и для левого глаза.)

Х для левой руки

  1. Нормальная рука

     
    <
  2. Рука вверх

    \
     
  3. Вниз рука

     
    /
  4. Никто

     
     

Y для правой руки

  1. Нормальная рука

     
    >
  2. Рука вверх

    /
     
  3. Вниз рука

     
    \
  4. Никто

     
     

T для Торса

  1. Кнопки :

  2. Жилет ] [

  3. Внутреннее оружие > <

  4. Никто

B для базы

  1. Кнопки :

  2. ноги " "

  3. Плоский ___

  4. Никто

Вызов

Напишите программу, которая принимает строку из восьми символов (через stdin или командную строку) в формате HNLRXYTB, где каждая буква представляет собой цифру от 1 до 4, которая обозначает, какую предустановку использовать для соответствующего раздела снежного человека. Напечатайте полный снеговик на стандартный вывод.

Например, ввод 11114411снеговика в верхней части страницы. (Первое 1: у него соломенная шляпа, второе 1: у него нормальный нос и т. Д.)

Другой пример, снеговик для ввода 33232124:

   _
  /_\
\(o_O)
 (] [)>
 (   )

подробности

  • Любые количества и комбинации начальных / конечных пробелов и начальных / конечных новых строк допускаются до тех пор, пока ...

    • у снеговика все секции правильно расположены относительно друг друга, и
    • никогда не бывает более 64 символов пробела (общий шаблон - только 7 × 5, так что вы, вероятно, не достигнете этого предела).

    Вам не нужно печатать строки / столбцы шаблона, если они содержат только пробелы. например, пустая строка соломенной шляпы не требуется.

  • Вы должны использовать порядок деталей, как указано выше.

  • Вместо программы вы можете написать функцию, которая принимает цифровую строку в качестве аргумента. Вывод должен быть напечатан нормально или возвращен в виде строки.

  • При желании вы можете рассматривать ввод как целое число вместо строки.

счет

Самый короткий код в байтах побеждает.

Дополнительный вопрос: Какой из 65536 отличных снежных людей ваш любимый?


19
Мне нравится ангел 14441133 . В качестве альтернативы - четырехглазый монстр с маленькими глазами. Твой выбор.
Sp3000

14
Это должен быть снеговик?

54
Это не должен быть снеговик. (Отказ от ответственности: это может быть снеговик)
Joshpbarron

3
Случайные остроумные комментарии хороши, но для расширенного обсуждения используйте чат вместо комментариев. Я немного прибрался.
Мартин Эндер

36
Вопрос, который нужно сделать дальше: «Код все равно меня никогда не беспокоил»
Увлечения Кэлвина

Ответы:


39

CJam, 135 134 132 130 126 125 байт

0000000: 4e22285b200a5c225f2a295c2d2e2f6f2c3e4f3a3c3d5d225f  N"([ .\"_*)\-./o,>O:<=]"_
0000019: 2422dd7382d6bfab28707190992f240c362ee510262bd07a77  $".s....(pq../$.6...&+.zw
0000032: 08556de9dcdb566c676817c2b87f5ecb8bab145dc2f2f76e07  .Um...Vlgh....^....]...n.
000004b: 22323536624b623224663d4e2f7b5f2c342f2f7d25723a7e2e  "256bKb2$f=N/{_,4//}%r:~.
0000064: 3d2828342423346222205f0a20222e2a6f6f736572372f4e2a  =((4$#4b" _. ".*ooser7/N*

Чтобы создать файл на вашем компьютере, выполните xxd -r > snowman.cjamкоманду, вставьте обратимый шестнадцатеричный код сверху, нажмите Enterи, наконец, Ctrl+ D.

Кроме того, вы можете попробовать код онлайн с помощью интерпретатора CJam .

бонус

Мой любимый снеговик Олаф:

$ LANG=en_US cjam snowman.cjam <<< 12222212

 _===_
\(o.o)/
 ( : ) 
 (" ")

Зима - хорошее время, чтобы остаться и обниматься, но посадите меня летом, и я буду… счастливым снеговиком!

идея

Шестнадцатеричная строка

dd7382d6bfab28707190992f240c362ee510262bd07a7708
556de9dcdb566c676817c2b87f5ecb8bab145dc2f2f76e07

кодирует возможные варианты для всех частей снеговика, включая фиксированные. Назовем эту строку P .

Чтобы декодировать его, мы конвертируем P (здесь рассматриваемый как массив целых чисел) из основания 256 в основание 20 и заменяем каждое из полученных целых чисел соответствующим символом строки M :

([ 
"_*)\-./o,>O:<=]

Это приводит к строке T :

/(_*_)"_===_/....., /_\ 
 ,._
-.oO
-.oO
   <\  /
   >/  \
    : ] [> <
    : " "___
 ((()

Первая строка кодирует все варианты выбора шляпы, последняя - все фиксированные части тела. Другие строки содержат 28 переменных частей тела.

Мы разделяем T в переводах строк и делим строки полученного массива на четыре части одинаковой длины. Затем мы читаем ввод из STDIN, помещаем массив его цифр в основание 10 и выбираем соответствующие элементы разделенных строк. Мы используем тот факт, что массивы оборачиваются в CJam, поэтому элемент с индексом 4 массива длины 4 фактически является первым элементом. Последняя разделенная строка не соответствует ни одному входу, поэтому она будет выделена целиком.

Мы работаем со шляпой, сдвигая первый элемент из полученного массива. Индекс в M первого символа, читаемый как число 4, показывает количество пробелов и подчеркиваний в первой строке шляпы. Мы печатаем эти символы, перевод строки, пробел и остаток сдвинутой строки. Затем мы помещаем дополнительный перевод строки в конец стека.

Для частей тела мы объединяем строку, соответствующую всем из них. Давайте назовем эту строку S . Для того, чтобы собрать части тела, мы выполняем транслитерации: мы берем каждый символ строки М , вычислить его индекс в роде (M) и заменить его соответствующим символом S . Мы используем тот факт, что оператор транслитерации автоматически дополняет S, чтобы соответствовать длине сортировки (M) , повторяя последний символ S столько раз, сколько необходимо.

Наконец, мы разделяем полученную строку на подстроки длиной 7 и помещаем перевод строки между каждой парой подстрок.

Код

Предположим , что переменные Mи Pсодержат строки M и P .

N        e# Push a linefeed.
M_$      e# Push M and a sorted copy.
P256bKb  e# Push P and convert it from base 256 to base 20.
2$       e# Push a copy of M.
f=       e# Compute T by retrieving the proper chars from M.
N/       e# Split T at linefeeds.
{_,4//}% e# Divide each string into four substrings of equal length.
r:~      e# Read a number from STDIN and push the array of its digits in base 10.
.=       e# Get the corresponding chunks from T.
((       e# Shift out the first string and that string's first character.
4$#      e# Find its index in M.
4b       e# Compute its digits in base 4.
" _
 ".*     e# Repeat the space and underscore that many times in place.
oo       e# Print the result and the shifted string.
s        e# Flatten the remainder of the array. This pushes S.
er       e# Perform transliteration.
7/       e# Split into chunks of length 7.
N*       e# Join using linefeeds.

60

JavaScript ES6, 210 208 202 байта

s=>` 0
8(213)9
4(6)5
 (7)`.replace(/\d/g,p=>`_===_1 ___
 .....1  _
  /_\\1 ___
 (_*_)1,1.1_11.1o101-1.1o101-1<11/11>11\\11 : 1] [1> <1   1 : 1" "1___1   11\\11 11/11 `.split(1)[s[p>7?p-4:p]-1+p*4]||' ')

Это анонимная функция; Вы используете это, выполняя ([function code])('42232124'). Самым отягчающим фактором были руки, занимающие 2 строки, поэтому мне пришлось включать код как для верхней, так и для нижней частей.

В приведенном ниже фрагменте стека приведен некомментированный код без комментариев ES6. И вы можете использовать его, чтобы легко протестировать код и опробовать различные комбинации. Редактировать: я получаю слишком много удовольствия от этого. Я добавил несколько новых функций, в том числе способ генерации случайного снеговика.

Спасибо Yair Rand за сохранение шести байтов.

var f=function(s){
  return' 0\n8(213)9\n4(6)5\n (7)' // Start with a placeholder string with all the static components
    .replace(/\d/g,function(p){ // Go through each placeholder number to replace it with its value
    // The massive string below holds all the possible body parts, separated by 1 for easy splitting.
    // The two at the end are for the top of the arms
    return'_===_1 ___\n .....1  _\n  /_\\1 ___\n (_*_)1,1.1_11.1o101-1.1o101\
-1<11/11>11\\11 : 1] [1> <1   1 : 1" "1___1   11\\11 11/11 '.split(1)
    [s[p>7?p-4:p]-1 // Get the value from the input string. If the current body part
                    // is the top of the two-line arms (8 or 9), drop it down to 4 or 5
                    // Subtract 1 to account for the 0-indexed array.
     +p*4] // multiply by 4 to skip to the relevant code
     ||' ' // To save bytes in the above string, spaces are empty strings, so replace them here
  })
}

// Code for the interactive version follows
// http://codepen.io/hsl/pen/bdEgej
function updateRadios(){$('input[type="radio"]').each(function(){if($(this).is(":checked")){var t=$(this).data("p"),i=$(this).data("v");input[t]=i}}),inputS=input.join(""),update()}var input=[],inputS=$("#code").val(),update=function(){$("#p").text(f(inputS)),$("#code").val(inputS)};$('input[type="radio"]').change(updateRadios),$("#code").keyup(function(){inputS=$(this).val(),update()}),updateRadios(),$("#random").click(function(){for(var t=0;8>t;t++)$("div:eq("+t+") input:eq("+Math.floor(4*Math.random())+")").prop("checked",!0);updateRadios()});
body{font-family:sans-serif}h2{font-size:18px;font-weight:400}label{display:block}div{display:inline-block;margin:0 10px}#code{width:70px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script><div><h2>Hat</h2><label><input type="radio" name="p1" data-p="1" data-v="1"> Straw hat</label><label><input type="radio" name="p1" data-p="1" data-v="2"> Mexican hat</label><label><input type="radio" name="p1" data-p="1" data-v="3"> Fez</label><label><input type="radio" name="p1" data-p="1" data-v="4" checked> Russian hat</label></div><div><h2>Nose/mouth</h2><label><input type="radio" name="p2" data-p="2" data-v="1"> Normal</label><label><input type="radio" name="p2" data-p="2" data-v="2" checked> Dot</label><label><input type="radio" name="p2" data-p="2" data-v="3"> Line</label><label><input type="radio" name="p2" data-p="2" data-v="4"> None</label></div><div><h2>Left eye</h2><label><input type="radio" name="p3" data-p="3" data-v="1"> Dot</label><label><input type="radio" name="p3" data-p="3" data-v="2" checked> Bigger dot</label><label><input type="radio" name="p3" data-p="3" data-v="3"> Biggest dot</label><label><input type="radio" name="p3" data-p="3" data-v="4"> Closed</label></div><div><h2>Right eye</h2><label><input type="radio" name="p4" data-p="4" data-v="1"> Dot</label><label><input type="radio" name="p4" data-p="4" data-v="2"> Bigger dot</label><label><input type="radio" name="p4" data-p="4" data-v="3" checked> Biggest dot</label><label><input type="radio" name="p4" data-p="4" data-v="4"> Closed</label></div><div><h2>Left arm</h2><label><input type="radio" name="p5" data-p="5" data-v="1"> Normal</label><label><input type="radio" name="p5" data-p="5" data-v="2" checked> Upwards</label><label><input type="radio" name="p5" data-p="5" data-v="3"> Downwards</label><label><input type="radio" name="p5" data-p="5" data-v="4"> None</label></div><div><h2>Right arm</h2><label><input type="radio" name="p6" data-p="6" data-v="1" checked> Normal</label><label><input type="radio" name="p6" data-p="6" data-v="2"> Upwards</label><label><input type="radio" name="p6" data-p="6" data-v="3"> Downwards</label><label><input type="radio" name="p6" data-p="6" data-v="4"> None</label></div><div><h2>Torso</h2><label><input type="radio" name="p7" data-p="7" data-v="1"> Buttons</label><label><input type="radio" name="p7" data-p="7" data-v="2" checked> Vest</label><label><input type="radio" name="p7" data-p="7" data-v="3"> Inward arms</label><label><input type="radio" name="p7" data-p="7" data-v="4"> None</label></div><div><h2>Base</h2><label><input type="radio" name="p8" data-p="8" data-v="1"> Buttons</label><label><input type="radio" name="p8" data-p="8" data-v="2"> Feet</label><label><input type="radio" name="p8" data-p="8" data-v="3"> Flat</label><label><input type="radio" name="p8" data-p="8" data-v="4" checked> None</label></div><br><button id="random">Randomize</button><pre id="p"></pre><input type="text" id="code">


3
+1 Очень умно, намного лучше моего
edc65

23
«GUI» чертовски круто.
августа

7
Сладкая, посмотри на 8-ти звездного паука-снеговика: 22112333
Клаудиу

1
Мне нравится спящая русская сова: 41444442
ETHproductions

1
Вы можете сохранить шесть байтов, удалив каждый отдельный пробел в слоте ( 1 1-> 11) и добавив ||' 'в конце.
Яир Рэнд

30

CJam, 164 байта

Создает снеговика слева направо, сверху вниз. Это устраняет необходимость в любых операциях соединения или перемещения строк, так как я просто оставляю каждый кусочек снеговика в стеке. А потом, из-за автоматического дампа стека в конце программы:

CJam хочет построить снеговика!

q:Q;SS"
 _===_,___
 ....., _
  /_\,___
 (_*_)"',/0{Q=~(=}:G~N" \ "4G'(".oO-"_2G",._ "1G@3G')" / "5GN"< / "4G'(" : ] [> <   "3/6G')"> \ "5GNS'(" : \" \"___   "3/7G')

Попробуйте онлайн.

бонус

Нестандартное мышление! 32443333дает снег (муж) невесте. Вам нужно немного постараться, чтобы увидеть это, но есть внутренние руки, фес + нисходящие руки = вуаль, и голова фактически находится в фесе / вуали. Обычно большая форма - это волнистое платье, а «глаза» и «нос» - это складки в платье.

   _
  /_\
 (-.-) 
/(> <)\
 (___)

Другие "глазные" варианты немного рискованны ...


17
Для меня ваш бонус больше похож на члена ККК, чем на невесту.
ace_HongKongIndependence

26

Python, 276 289 байт

V='.oO-'
def F(d):
 D=lambda i:int(d[i])-1
 print"  "+("","___"," _ ","___")[D(0)]+"\n "+\
"_. (=./_=._*=.\\__. )"[D(0)::4]+"\n"+\
" \\  "[D(4)]+"("+V[D(2)]+',._ '[D(1)]+V[D(3)]+")"+" /  "[D(5)]+'\n'+\
"< / "[D(4)]+"("+" ]> :    [< "[D(6)::4]+")"+"> \\ "[D(5)]+"\n ("+\
' "_ : _  "_ '[D(7)::4]+")"

Этот код имеет 8 дополнительных байтов ( \* 4) для удобства чтения.

Строит снеговика по крупицам.

бонус

F("44444432") дает "сонный русский медведь"

  ___    
 (_*_)
 (- -)
 (> <)
 (" ")

13
Сонный русский медведь теперь и мой любимый.
Увлечения Кэлвина

1
Подчеркивание верхнего ряда, кажется, не правильно на феске и русских шляпах. например, он дает шляпу пропеллера ..
Увлечения Кэлвина

@ Calvin'sHobbies: Русская шляпа была в порядке, но шляпа фески была испорчена. Я исправил это сейчас и проверил все остальные случаи тоже. Я должен быть более осторожным в будущем!
Клавдиу

супер поздно на вечеринку, но этот TIO говорит, что это 297 для меня. Интеллий говорит 299. Я что-то упустил?
Снег

21

Python 2, 354 280 241 261 байт

def s(g):H,N,L,R,X,Y,T,B=[int(c)-1for c in g];e='.oO-';print(' '*9+'_ _ ___ _ _\n\n\n\n    _. (=./_=._*=.\\__. )')[H::4]+'\n'+' \\  '[X]+'('+e[L]+',._ '[N]+e[R]+')'+' /  '[Y]+'\n'+'< / '[X]+"("+' ]> :    [< '[T::4]+')'+'> \\ '[Y]+'\n ('+' "_ : _  "_ '[B::4]+")"

Вызов s('33232124')дает:

   _ 
  /_\ 
\(o_O) 
 (] [)>
 (   )

Но мои любимые 44242123и 41341144:

  ___      ___
 (_*_)    (_*_)
\(o -)    (O,-) 
 (] [)>  <(   )>
 (___)    (   )

1
Когда я это делаю, s('33232124')фески не прорисовываются. На самом деле нижняя половина шляпы отсутствует во многих случаях. Кроме того, 0это не один из вариантов.
Увлечения Кэлвина

@ Calvin'sHobbies Спасибо, я исправил это.
Сис Тиммерман

20

CJam, 150 145 байтов

База конвертирует все вещи!

"b8li'
U9gN;|"125:Kb8bl:~f="r  pL|P3{cR`@L1iT"Kb21b"G.HMtNY7VM=BM@$^$dX8a665V"KbFb"=_./ <[(*-oO,\":"f=_"/<[(""\>])"er+4/f=.=7/N*

SE портит непечатные, так что вот копия на Pastebin. Убедитесь, что вы скопировали часть «RAW Paste Data», а не часть рядом с номерами строк. Вы можете попробовать это онлайн , но постоянная ссылка может не работать в некоторых браузерах.

объяснение

"b8li'U9gN;|"125:Kb8bpЧасть генерирует массив

[1 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 2 1 3 0 5 4 0 6 6 6 0 5 0 0 7 7 7 0]

который отображает каждую цифру входных данных, где используется цифра. Все, что является общим для всех входных данных (например, начальные пробелы и ()), произвольно присваивается 0, кроме первого, которому присваивается 1, чтобы базовое преобразование могло работать.

l:~f=затем преобразует каждую цифру к междунар и отображает соответственно, например , для 14441133получаем

[2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 2 4 1 2 1 1 3 3 3 1 2 1 1 4 4 4 1]

"G.HMtNY7VM=BM@$^$dX8a665V"KbFb"=_./ <[(*-oO,\":"f= дает строку

"_=./  /  < /  [<(((((_. _ _     _ __*=._-.oO ,._  \"_ :   : _"

после чего мы дублируем, заменяем /<[(на \>])и добавляем длинную строку. Затем мы разбиваем строку на группы по 4 и отображаем в соответствии с другим массивом "r pL|P3{cR`@L1iT"Kb21b, получая, таким образом, массив строк длиной 4, описывающих все возможные параметры в каждой ячейке (например, _=./это все возможные параметры для второго символа во второй строке, начиная с Русская шапка).

Наконец, мы соотносим параметры с входами соответственно .=, разбиваем на строки длиной 7 7/и рифляемся в некоторых новых строках N*.

Тестовые прогоны

11111111

 _===_ 
 (.,.) 
<( : )>
 ( : )

22222222
  ___  
 ..... 
\(o.o)/
 (] [) 
 (" ")

33333333
   _   
  /_\  
 (O_O) 
/(> <)\
 (___)

44444444
  ___  
 (_*_) 
 (- -) 
 (   ) 
 (   )

19

TI-BASIC, 397 байтов

Важно: если вы хотите проверить это, загрузите его отсюда и отправьте этот файл на свой калькулятор. Вы не пытаться скопировать код ниже в редактор программы TI-Connect СЕ или SourceCoder 3 или что - то построить и отправить его в калькулятор; в случае TI-Connect он скажет, что имеет неверный токен. SC3 использует обратную косую черту в качестве разделителя комментариев ( //запускает комментарий в SC3; тем не /\/менее, экспортирует как //), поэтому не будет экспортировать оружие и шляпу и тому подобное, что приведет к тому, что программа отобразит неправильные части тела и выдаст ОШИБКА: ДОМЕН время от времени. Прикольные вещи!

Важно # 2: мне сейчас лень исправлять загрузку, поэтому, когда вы переносите ее на свой каль, поменяйте 7на третью строку снизу на X+6. Код ниже исправлен, если вам нужно сравнить.

Input Str9
seq(inString("1234",sub(Str9,I,1)),I,1,length(Ans→L1
"      ___   _   ___ →Str1
"_===_..... /_\ (_*_)→Str2
",._ →Str3
"•oO-→Str4
"<\/ →Str5
">/\ →Str6
" : ] [> <   →Str7
" : ¨ ¨___   →Str8
"Str1Str2Str3Str4Str5Str6Str7Str8→Str0
For(X,3,5
Output(X,2,"(   )
End
L1
Output(3,3,sub(Str4,Ans(3),1)+sub(Str3,Ans(2),1)+sub(Str4,Ans(4),1
Ans(5
Output(4-(Ans=2),1,sub(Str5,Ans,1
L1(6
Output(4-(Ans=2),7,sub(Str6,Ans,1
L1-1
For(X,1,2
Output(X+3,3,sub(expr(sub(Str0,X+6,1)),1+3Ans(X+6),3
Output(X,2,sub(expr(sub(Str0,X,1)),1+5Ans(1),5
End

Бонус: я особенно люблю 12341214.

 _===_
 (O.-)/
<( : )
 (   )

Некоторые заметки:

  • Это определенно может быть больше в гольфе, нет сомнений. Я почти уверен, что могу объединить большинство, если не все, выходных данных в один цикл For (. Кроме того, я почти уверен, что смогу объединить несколько строк).
  • В Str4 (глаза) я использую «точку графика» ( [2ND] → [0]CATALOG → [3]θ → scroll down, it's between ﹢ (small plus) and · (interpunct)), а не точку, чтобы глаза не совпадали с запятой, потому что это выглядит странно, как ад.
  • В Str8 (основа) мне пришлось использовать диарез (¨) вместо двойных кавычек, потому что в TI-BASIC нет возможности экранировать символы, а двойные кавычки используются для начала / окончания строк.
  • В TI-BASIC нет необходимости закрывать круглые скобки и скобки, если за ними следуют двоеточие, символ новой строки или → (используется для присваивания var), а двойные кавычки (строки) могут оставаться незакрытыми, если после них идет символ новой строки или →.

1
Во-первых, во второй строке length(Ansдолжно быть length(Str9; во-вторых, вы пытались объединить Str3 через Str6 в одну строку?
lirtosiast

Ой, ой! Я думаю, что это исправлено в загрузке, хотя. Кроме того, я не смотрел на это много , так как я сделал это, но я делал упоминание , что я мог бы объединить несколько строк вместе; Я посмотрю на это когда-нибудь сегодня / на этой неделе.
М.И. Райт

18

C 280 272 264 байта

Только частично игра в гольф на данный момент, но это увлекательная задача.

#define P(n)[s[n]&3],
f(char*s){printf("  %.3s\n %.5s\n%c(%c%c%c)%c\n%c(%.3s)%c\n (%.3s)",
"___   ___ _"+*s%4*3,"(_*_)_===_..... /_\\"+*s%4*5,"  \\ "P(4)"-.o0"P(2)    
" ,._"P(1)"-.o0"P(3)"  /"P(5)" < /"P(4)"    : ] [> <"+s[6]%4*3," > \\"P(5)
"    : \" \"___"+s[7]%4*3);}

(С некоторыми дополнительными \ n для удобочитаемости.) Я ожидаю, что defineследует уйти с дальнейшей игрой в гольф.

Более читаемая версия

#define P(n)[s[n]&3],
f(char *s) {
  printf("  %.3s\n"
         " %.5s\n"
         "%c(%c%c%c)%c\n"
         "%c(%.3s)%c\n"
         " (%.3s)",
         "___   ___ _"+*s%4*3,                  /* Top of hat. */
         "(_*_)_===_..... /_\\"+*s%4*5,         /* Lower hat. */
         "  \\ "P(4)                            /* Upper left arm. */
         "-.o0"P(2)                             /* Left eye. */
         " ,._"P(1)                             /* Nose. */
         "-.o0"P(3)                             /* Right eye. */
         "  /"P(5)                              /* Upper right arm. */
         " < /"P(4)                             /* Lower left arm. */
         "    : ] [> <"+s[6]%4*3,               /* Torso. */
         " > \\"P(5)                            /* Lower right arm. */
         "    : \" \"___"+s[7]%4*3              /* Base. */
         );
}

12

C, 212 байтов

d;main(){char*t="##3#b#b3#bbb3#b#b##\r#3b1#+3@12b3@1b-3@1_b3b1#,#\r7#_##+51rR04/1b#61rR0,8#2##\r7?#2#+9#`A#9=###9#^?#,8A#_#\r#+:#%b#:=#b#:#%b#,#",p[9];for(gets(p);d=*t++;putchar(d-3))d=d<51?d:(p[d-51]-53)[t+=4];}

Читаемая версия:

d;
main()
{
    char *t = "##3#b#b3#bbb3#b#b##\r"
              "#3b1#+3@12b3@1b-3@1_b3b1#,#\r"
              "7#_##+51rR04/1b#61rR0,8#2##\r"
              "7?#2#+9#`A#9=###9#^?#,8A#_#\r"
              "#+:#%b#:=#b#:#%b#,#",
        p[9]; // 9 bytes is just enough for the input string of length 8

    for (gets(p); d = *t++; putchar(d-3))
        d = d < 51 ? d : (p[d - 51] - 53)[t += 4];
}

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

  • Преобразовано из функции в программу (+10)
  • Перемещены новые строки в строку управления (-7)
  • Добавлено 3 ко всем кодам символов, чтобы иметь меньше экранированных символов, например \"(-3)
  • Чтение со строки с автоинкрементом; также заменяется t[i++]на *t++(-4)
  • Заменено whileна for; удален {}(-4)
  • Упрощенное завершение цикла: чтение до \0(-9)
  • Преобразуется t[...],t+=4в(...)[t+=4] оператор запятой (-1)

Почему все эти проблемы? Чтобы поделиться своим любимым, снежный призрак:

   _
  /_\
\(. .)/
 (   )
 (___)

Можно поставить dв main
заднем конце

10

JavaScript, 489 (без перевода строки и вкладок)

x=' ';
d="   ";
h=['\n_===_',' ___ \n.....','  _  \n /_\\ ',' ___ \n(_*-)'];
n=[',','.','_',x];
e=['.','o','O','-'];
y=['>',,'\\',x];
u=['<',,'/',x];
t=[' : ','[ ]','> <',d;
b=[' : ','" "',"___",d];

j=process.argv[2].split('').map(function(k){return parseInt(k)-1});
q=j[4]==1;
w=j[5]==1;

console.log([
    h[j[0]].replace(/(.*)\n(.*)/g, " $1\n $2"),
    (q?'\\':x)+'('+e[j[2]]+n[j[1]]+e[j[3]]+')'+(w?'/':x),
    (!q?u[j[4]]:x)+'('+t[j[6]]+')'+(!w?y[j[5]]:x),
    x+'('+b[j[7]]+')'].join('\n'));

бежать с node snowman.js 33232124


6
Добро пожаловать в Code Golf! Несколько указателей: вам может не понадобиться parseIntвызов, так как вычитание автоматически пытается привести строковые операнды к числам. Кроме того, вы можете избавиться от functionпереноса и просто i=process.argv[2]использовать его, если только вы не используете его для рекурсии или определения области действия. Кроме того, вы можете избавиться от sцеликом и просто сделать console.log([ ... ].join('\n')).
Апсиллеры

3
На самом деле, вы можете полностью отказаться от преобразования входной строки в массив, если поместите начальную запятую в каждый из ваших массивов, чтобы увеличить индекс каждого элемента. Он добавляет 7 ,символов, но позволяет вам удалить более 50. Наконец, q=j[4]-1вместо очень q=j[4]==1(и затем переверните использование qи !q) используйте одну очень привередливую оптимизацию . Это приведет qк тому, что будет 0(ложное значение), когда j[4]есть 1, и в противном случае истинное ненулевое значение. Это полная противоположность вашим текущим значениям true / false, поэтому вы просто переключаетесь qи !q.
Апсиллеры

Извините за кучу отзывов о вашем первом ответе! Я лично считаю пересмотр моих работ одной из самых забавных частей игры в гольф; мои извинения, если вы не разделяете мои чувства. :)
Апсиллеры

@apsillers ваш отзыв очень ценится! Я собирался пойти спать прошлой ночью, а затем написал это для шутки с полным намерением довести его до самого простого из возможных позже. Я сделаю некоторые правки сегодня вечером!
Кристофер Рейд

9

Pyth, 203 байта

M@GCHgc"  ___

  ___
   _"bhzgc" (_*_)
 _===_
 .....
  /_\\"bhzs[g"  \ "@z4\(g"-.oO"@z2g" ,._"@z1g"-.oO"@z3\)g"  / "@z5)s[g" < /"@z4\(gc"   
 : 
] [
> <"b@z6\)g" > \\"@z5)++" ("gc"   
 : 
\" \"
___"bez\)

Лол. Попробуйте онлайн: Pyth Compiler / Executor

объяснение

Сначала я определяю вспомогательную функцию g, которая принимает список и символ в качестве входных данных, преобразует символ в его ASCII-значение и принимает соответствующий элемент (модульная упаковка).

M@GCH  def g(G,H): return G[ord(H)]

Другое дело просто печать построчно. Например, первая строка:

 c"  ___\n\n  ___\n   _"b     split the string "  ___\n\n  ___\n   _" at "\n"
                         hz   first char in input
g                             apply g and print

Btw. Я немного поэкспериментировал с .F"{:^7}"центрированием струны. Используя его, я мог бы сохранить несколько пробелов в своем коде, но в конце он не сохраняет никаких байтов.


9

R 436 437 байт

Вот моя первая попытка в , использующая R, которая не самая короткая, но все же забавная. По крайней мере, я бью JavaScript (пока) ...

H=c("_===_"," ___\n .....","  _\n  /_\\"," ___\n (_*_)")
N=c(",",".","_"," ")
L=c(".","o","O","-")
X=c(" ","\\"," "," ")
S=c("<"," ","/"," ")
Y=c(" ","/"," ","")
U=c(">"," ","\\","")
T=c(" : ","] [","> <","   ")
B=c(" : ","\" \"","___","   ")
f=function(x){i=as.integer(strsplit(x,"")[[1]]);cat(" ",H[i[1]],"\n",X[i[5]],"(",L[i[3]],N[i[2]],L[i[4]],")",Y[i[6]],"\n",S[i[5]],"(",T[i[7]],")",U[i[6]],"\n"," (",B[i[8]], ")",sep="")}

Тестирование:

> f("12344321")
 _===_
 (O.-) 
 (] [)\
 ( : )

Я на самом деле боролся с Xи Yбыть многострочным , но с материалом между ними, в конечном итоге отделяя каждую строку ( X, S) и ( Y, U).

function и преобразование из строки в целое число также очень многословно.

Изменить 436 => 437

Пришлось исправить пропущенное пустое место, замеченное @OganM

Я мог бы уменьшить до 428, заменив разрывы строк между переменными ;, но «однострочный» код выглядит так плохо и нечитаемо, что я не буду таким жадным.


вам нужен и дополнительный символ для 4-й шляпы
OganM

@OganM Спасибо за этот дополнительный байт! :( Исправлено.
Molx

При выполнении codegolf мы обычно считаем каждую новую строку одним символом (как в * nix), а не двумя (как в Windows). Поэтому не имеет значения, используете ли вы точку с запятой или новую строку.
ace_HongKongIndependence

@ace Спасибо за совет, приятно знать!
Молкс

8

Haskell, 361 306 289 байт

o l a b=take a$drop((b-1)*a)l
n="\n"
p i=id=<<["  ",o"    \n _===____ \n ..... _  \n  /_\\ ___ \n (_*_)"11a,n,o" \\  "1e,o"(.(o(O(-"2c,o",._ "1 b,o".)o)O)-)"2d,o" /  "1f,n,o"< / "1e,o"( : )(] [)(> <)(   )"5g,o"> \\ "1f,n," (",o" : )\" \")___)   )"4h]where[a,b,c,d,e,f,g,h]=map(read.(:[]))i

Использование:

putStrLn $ p "12333321"

 _===_
 (O.O) 
/(] [)\
 ( : )

Как это работает: индексировать каждый элемент списка [hat options, left upper arm options, left eye options, ..., base options]с соответствующим входным номером и объединять его в один список. Я разделил левую и правую руку на верхнюю и нижнюю части, чтобы я мог строить снеговика построчно.

Мой любимый классик 11112211.

Редактировать: переключено из списка строк в строки для частей (шляпа, глаз, ...). Нужен второй параметр, длина подстроки, которую нужно взять.

Редактировать II: извлеченные общие подстроки


8

C 233 230 байт

char*t="  0 _ _0 ___0 _ _   0_. (0=./_0=._*0=.\\_0_. ) 4 \\  (2.oO-1,._ 3.oO-)5 /  4< / (6 ]> 6:   6 [< )5> \\  (7 \"_ 7: _ 7 \"_ ) ";i,r,d;f(char*p){while(r++<35){d=t[i]-48;putchar(t[d<0?i:i+p[d]-48]);i+=d<0?1:5;r%7?0:puts("");}}

С символами новой строки и пробелами для лучшей читаемости:

char* t = "  0 _ _0 ___0 _ _   0_. (0=./_0=._*0=.\\_0_. ) 4 \\  (2.oO-1,._ 3.oO-)5 /  4< / (6 ]> 6:   6 [< )5> \\  (7 \"_ 7: _ 7 \"_ ) ";
i, r, d;
f(char* p)
{
    while (r++ < 35)
    {
        d = t[i] - 48;
        putchar(t[d < 0 ? i : i + p[d] - 48]);
        i += d < 0 ? 1 : 5;
        r % 7 ? 0 : puts("");
    }
}

Все это довольно грубая сила. Он использует таблицу, которая содержит одну запись для каждого из 35 (5 строк длиной 7) символов. Каждая запись в таблице:

  • Постоянный характер: , (, ). Длина записи в таблице составляет 1 символ.
  • Индекс части тела, за которой следуют 4 возможных символа в зависимости от выбора детали на входе. Длина записи в таблице 5 символов.

Затем код перебирает 35 символов и ищет значение в таблице.


8

R 414 байта

Слегка измененная версия версии Molx

W =c("_===_"," ___\n .....","  _\n  /_\\"," ___\n (_*_)",",",".","_"," ",".","o","O","-"," ","\\"," "," ","<"," ","/"," "," ","/"," ","",">"," ","\\",""," : ","] [","> <","   "," : ","\" \"","___","   ")
f=function(x){i=as.integer(strsplit(x,"")[[1]]);cat(" ",W[i[1]],"\n",W[i[5]+12],"(",W[i[3]+8],W[i[2]+4],W[i[4]+8],")",W[i[6]+20],"\n",W[i[5]+16],"(",W[i[7]+28],")",W[i[6]+24],"\n"," (",W[i[8]+32], ")",sep="")}

Просто слил отдельные переменные в одну. Shaving некоторого места, которое использовалось для X=c(рутины.


7

CJam, 200 191 байт

Это, безусловно, может быть много в гольфе. (Особенно, если я закодирую его). Но здесь для начала:

7S*"_===_  ___  .....   _    /_\   ___  (_*_)"+6/2/Nf*",._ "1/".oO-"1/_" <\  /   >/  \  "2/4/~" : ] [> <    : \" \"___   "3/4/~]l~Ab:(]z::=:L0=N4{L=}:K~0='(2K1K3K')5K0=N4K1='(6K')5K1=NS'(7K')

Ввод идет в STDIN. Например, вход 23232223дает:

  ___ 
 .....
\(o_O)/
 (] [) 
 (___)

Попробуйте это онлайн здесь


7

Haskell, 333 байта

Моя первая подача! Строит снеговика сверху вниз, слева направо. Я разделил руки на две функции для каждой руки: часть рядом с головой и часть рядом с телом.

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

a=y["\n _===_\n","  ___ \n .....\n","   _  \n  /_\\ \n","  ___ \n (_*_)\n"]
d=y",._ "
c=y".oO-"
e=y"< / "
j=y" \\  "
f=y"> \\ "
k=y" /  "
y w n=w!!(n-1)
h=y[" : ","] [","> <","   "]
b=y[" ( : ) \n"," (\" \") \n"," (___) \n"," (   ) \n"]
s(m:x:o:p:n:q:t:l:_)=putStr$a m++j x:'(':c o:d n:c p:')':k q:'\n':e x:'(':h t++')':f q:'\n':b l

Опирается на функцию

y :: [a] -> Int -> a
y w n=w!!(n-1)

который возвращает n-й элемент списка, который ему дан. Это позволяет список шляпы в, а также такие вещи, как

k=y" /  "

все эти функции используют бета-редукцию, поэтому их аргумент передается в качестве индекса функции y.

Выход:

λ> s $ repeat 1

 _===_
 (.,.) 
<( : )>
 ( : ) 

λ> s $ repeat 2
  ___ 
 .....
\(o.o)/
 (] [) 
 (" ") 

λ> s $ repeat 3
   _  
  /_\ 
 (O_O) 
/(> <)\
 (___) 

λ> s $ repeat 4
  ___ 
 (_*_)
 (- -) 
 (   ) 
 (   ) 

@ Calvin'sHobbies Спасибо, думаю, я исправил это сейчас.
Крейг Рой

7

Python 3, 349 336 254 251 байт

Так много для моей диссертации.

Вот содержимое файла snowman.py :

l='_===_| ___\n .....|  _\n  /_\| ___\n (_*_)| : |] [|> <|   |>| |\| | : |" "|___|   '.split('|')
l[4:4]=' \  .oO-,._ .oO- /  < / '
def s(a):print(' {}\n{}({}{}{}){}\n{}({}){}\n ({})'.format(*[l[4*m+int(a[int('0421354657'[m])])-1]for m in range(10)]))

И вот как я заклинаю моего любимого снеговика:

s('11112311')

 _===_ 
\(.,.) 
 ( : )\
 ( : ) 

объяснение

# Create a list containing the 4 * 10 body parts of the snowman in order of drawing:
#   hats,
#   upper left arms, left eyes, noses, right eyes, upper right arms,
#   lower left arms, torso's, lower right arms,
#   bases
l='_===_| ___\n .....|  _\n  /_\| ___\n (_*_)| : |] [|> <|   |>| |\| | : |" "|___|   '.split('|')
l[4:4]=' \  .oO-,._ .oO- /  < / '
# This is the function that draws the snowman
# All the lines of this function are golfed in a single statement, but seperated here for clearity
def s(a):
    # In this list comprehension I put the elements of l that are chosen according to the parameters
    list_comprehension = []
    # m is the number of the body part to draw
    for m in range(10):
        # Get the index for the choice of the m-th bodypart
        # (example: the 2nd bodypart (m = 1: the upper left arm) is in the 4th place of the arguments list)
        choice_index = int('0421354657'[m])
        # n is the parameter of the current bodypart
        n = int(a[choice_index]) - 1
        # Add the body part from list l to the list comprehenseion
        list_comprehension.append( l[4 * m + n] )
    # Print the list comprehension with the static parts
    print(' {}\n{}({}{}{}){}\n{}({}){}\n ({})'.format(*list_comprehension))

Вы можете удалить пробел в строке 2 между [int(i)]и for. Точно так же вы можете удалить пробел в строке 7 между f(int(i))и for. Кроме того, в вашем print()заявлении вам не нужно печатать последний пробел - это не часть снеговика. Наконец, измените ваш print()звонок на одну линию print("{}\n{}({}{}{}){}\n{}({}){}\n ({})".format(*c)). Каждый из них должен сэкономить вам 1 байт, сохраняя всего 4 байта :)
ace_HongKongIndependence

1
Кроме того, вместо использования глобальной переменной nвы можете определить атрибут функции f. Таким образом, вы можете заменить строки 5-6 на: def f(m):f.n+=1;return l[4*m+int(b[f.n])-1]<newline> f.n=-1. Это уменьшает еще 3 байта.
ace_HongKongIndependence

1
@ace Спасибо, никогда не слышал об атрибуте функции раньше, узнал что-то новое!
Мэтти

6

PowerShell , 199 байт

Вдохновлен Рето Коради и Анатолигом .

for($t='  0 _ _0 ___0 _ _
 0_. (0=./_0=._*0=.\_0_. )
4 \  (2.oO-1,._ 3.oO-)5 /  
4< / (6 ]> 6:   6 [< )5> \ 
 (7 "_ 7: _ 7 "_ )';$d=$t[$i++];$r+="$d"){if($d-ge48){$d=$t[$i+"$args"["$d"]-49]
$i+=4}}$r

Попробуйте онлайн!

Примечание. В строке 3 есть 2 пробела, в строке 4 - пробел.

Мой любимый 44444444"сонный русский охранник":

 ___
(_*_)
(- -)
(   )
(   )

5

JavaScript (ES6), 247

Не очень хорошая реклама @ NinjaBearMonkey's :(

Тест во фрагменте (с Firefox)

S=p=>([h,n,c,d,l,r,t,b,e,x]=[...p,' .oO-',`1_===_1 ___
 .....1  _
  /_\\1 ___
 (_*_)1 : 1] [1> <1   1 : 1" "1___1   `.split(1)],` ${x[h]}
${'  \\  '[l]}(${e[c]+' ,._ '[n]+e[d]})${'  /  '[r]}
${' < / '[l]}(${x[3-~t]})${' > \\ '[r]}
 (${x[7-~b]})`)

// TEST // 

function go()
{
  var n=N.value
  if (/^[1-8]{8}$/.test(n)) {
    s=S(n)
    OUT.innerHTML = s+'\n'+n+'\n\n'+ OUT.innerHTML
  }
  else N.focus()
}
  
<input id=N maxlength=8><button onclick="go()">Test</button>
<pre id=OUT></pre>


3

05AB1E , 137 135 128 122 байтов

…( )7ÝJ»•αγʒδÓ₂©8¥ŽQxΣxêÿ•12вèJIvN”</[(
._-=:"ÆŸ,*”º•DùÙÂ+;Èγтáì³ÓW©ÎÂ_`ƒ≠îj*ΓçÊ~ÞÒ¸β¦oåb/õ47/vÎΓ”›≠øØZµλݺ•20в趡Nè4äyè.;

-6 байт благодаря @Grimy .

Попробуйте онлайн или проверьте еще несколько тестов .

Объяснение:

Сначала мы создаем строку-шаблон:

…( )         # Push string "( )"
7ÝJ          # Push a list in the range [0,7] joined together: "01234567"
»            # Join both by a newline: "( )\n01234567"
•αγʒδÓ₂©2°ćì₂òη₆½•
             # Push compressed integer 80545642885242518310229085147411483894
 12в         # Convert it to Base-12 as list: [1,4,4,4,4,4,3,1,4,4,4,4,4,3,8,0,6,5,7,2,9,3,8,0,10,10,10,2,9,3,1,0,11,11,11,2]
    è        # Index each into the string: [" ","0","0","0","0","0","\n"," ","0","0","0","0","0","\n","4","(","2","1","3",")","5","\n","4","(","6","6","6",")","5","\n"," ","(","7","7","7",")"]
     J       # And join it to a single string: " 00000\n 00000\n4(213)5\n4(666)5\n (777)"

Который выглядит так:

 00000
 00000
4(213)5
4(666)5
 (777)

Затем я перебираю цифры на входе:

I            # Get the input
 v           # Loop `y` over each of its digits:

И сделайте следующее:
нажмите (0-индексированный) индекс Nсписка:

  N          # Push the index of the loop

Выдвиньте все возможные части в виде списка символов:

  ”</[(
  ._-=:"ÆŸ,*”
            "# Push dictionary string "</[(\n._-=:" Oo,*"
   º         # Mirror each line: "</[()]\>\n._-=:" Oo,**,oO ":=-_."
  DùÙÂ+;Èγтáì³ÓW©ÎÂ_`ƒ≠îj*ΓçÊ~ÞÒ¸β¦oåb47/vÎΓ”›≠øØZµλݺ•
             # Push compressed integer 492049509496347122906361438631265789982480759119518961177677313610613993948059787418619722816092858096158180892708001681647316210
   20в       # Convert it to Base-20 as list: [15,10,10,10,15,3,10,19,10,4,15,15,15,15,15,10,12,12,12,10,15,10,10,10,15,9,9,9,9,9,15,15,10,15,15,15,1,10,6,15,8,15,18,9,10,8,11,9,17,16,8,11,9,17,16,8,15,15,15,0,6,15,15,1,8,15,15,15,7,1,15,15,6,8,15,15,15,15,13,15,5,15,2,7,15,0,8,15,15,15,15,13,15,14,15,14,10,10,10]
      è      # Index each into the string: [" ","_","_","_"," ","(","_","*","_",")"," "," "," "," "," ","_","=","=","=","_"," ","_","_","_"," ",".",".",".",".","."," "," ","_"," "," "," ","/","_","\"," ","\n"," ",",",".","_","\n","-",".","o","O","\n","-",".","o","O","\n"," "," "," ","<","\"," "," ","/","\n"," "," "," ",">","/"," "," ","\","\n"," "," "," "," ",":"," ","]"," ","[",">"," ","<","\n"," "," "," "," ",":"," ","""," ",""","_","_","_"]
       ¶¡    # Split it by the newline character: [[" ","_","_","_"," ","(","_","*","_",")"," "," "," "," "," ","_","=","=","=","_"," ","_","_","_"," ",".",".",".",".","."," "," ","_"," "," "," ","/","_","\"," "],[" ",",",".","_"],["-",".","o","O"],["-",".","o","O"],[" "," "," ","<","\"," "," ","/"],[" "," "," ",">","/"," "," ","\"],[" "," "," "," ",":"," ","]"," ","[",">"," ","<"],[" "," "," "," ",":"," ","""," ",""","_","_","_"]]

Используйте индекс цикла, Nчтобы получить список символов части, с которой мы сейчас работаем:

  Nè         # Index the loop index into it
             #  i.e. 6 → [" "," "," "," ",":"," ","]"," ","[",">"," ","<"]

Затем разделите список символов на четыре равные части и используйте входную цифру y(которая индексируется 1) для индексации в нем. (ПРИМЕЧАНИЕ. Поскольку 05AB1E индексируется 0, а вход индексируется 1, было бы логично уменьшить цифру на 1 до индексации. Однако, поскольку 05AB1E имеет автоматическое циклическое преобразование (то есть 3в [1,3,5]результате индексации в списке 1), я просто Поверните части один раз, так что части с номером 4 в описании вызова находятся в начале списков.)

    4ä       # Split it into 4 equal parts
             #  i.e. [[" "," "," "],[" ",":"," "],["]"," ","["],[">"," ","<"]]
      yè     # Index the input-digit `y` into it (with automatic wraparound)
             #  i.e. 4 → [" "," "," "]

А затем замените индекс с 0 индексами цикла, который мы сначала выдавили, один за другим на символы части:

  .;         # Replace first; every index of the loop `N` in the template-string
             # is replaced one by one with the characters

И в итоге результат выводится неявно.

Посмотрите этот совет 05AB1E (раздел « Как сжимать большие целые числа?» И « Как сжимать целочисленные списки?» ), Чтобы понять, как работают части сжатия.


Что касается моего фаворита, это все тот же «снежный кролик», что и 1,5 года назад, когда я опубликовал свое решение Java :

44114432:
   _  
 (_*_)
 (. .) 
 (> <) 
 (" ")

-4 , достаточно, чтобы победить CJam!
Grimy

1
До 122 , а также ближе к тому, что у вас было изначально.
Grimy

@Grimy Ваша 122-байтовая версия имеет 0между глазами. :)
Кевин Круйссен

Просто ошибка кодировки base-12, должно быть достаточно легко исправить!
Grimy

@ Грими, ты прав. У меня не было много времени вчера, но это действительно простое исправление в списке. Спасибо за -6! :)
Кевин Круйссен

2

Java 8 548 545 432 401 399 байт

a->{int q=50,H=a[0]-49,N=a[1],L=a[2],R=a[3],X=a[4],Y=a[5];return"".format(" %s%n %s%n%c(%c%c%c)%c%n%c(%s)%c%n (%s)",H<1?"":H%2<1?" ___":"  _","_===_s.....s /_\\s(_*_)".split("s")[H],X==q?92:32,L<q?46:L<51?111:L<52?79:45,N<q?44:N<51?46:N<52?95:32,R<q?46:R<51?111:R<52?79:45,Y==q?47:32,X<q?60:X%2<1?32:47,"   s : s] [s> <".split("s")[a[6]%4],92-(Y%3+Y%6/4)*30,"   s : s\" \"s___".split("s")[a[7]%4]);}

Попробуй это здесь.

Объяснение:

a->{             // Method with character-array parameter and String return-type
  int q=50,      //  Temp integer with value 50 to reduce the byte-count
      H=a[0]-49, //  The hat-character as unicode value minus 49: 1=0; 2=1; 3=2; 4=3
      N=a[1],L=a[2],R=a[3],X=a[4],Y=a[5];
                 //  Most of the other characters as unicode values: 1=49; 2=50; 3=51; 4=52
  return"".format(" %s%n %s%n%c(%c%c%c)%c%n%c(%s)%c%n (%s)",
                                               // Return the snowman with:
    H<1?"":H%2<1?" ___":"  _",                 //  The top of the hat
    "_===_s.....s /_\\s(_*_)".split("s")[H],   //  + the bottom of the hat
    X==q?92:32,                                //  + the top of the left arm
    L<q?46:L<51?111:L<52?79:45,                //  + the left eye
    N<q?44:N<51?46:N<52?95:32,                 //  + the nose
    R<q?46:R<51?111:R<52?79:45,                //  + the right eye
    Y==q?47:32,                                //  + the top of the right arm
    X<q?60:X%2<1?32:47,                        //  + the bottom of the left arm
    "   s : s] [s> <".split("s")[a[6]%4],      //  + the torso
    92-(Y%3+Y%6/4)*30,                         //  + the bottom of the right arm
    "   s : s\" \"s___".split("s")[a[7]%4]);}  //  + the feet

Мой любимый:

44114432:
   _  
 (_*_)
 (. .) 
 (> <) 
 (" ")

Я не знаю почему, но это выглядит довольно мило. Как зайчик с русской шапкой вместо ушей.


1

F #, 369 байт

let f(g:string)=
 let b=" "
 let p=printfn
 let i x=int(g.[x])-49
 p"  %s  "["";"___";" _ ";"___"].[i 0]
 p" %s "["_===_";".....";" /_\ ";"(_*_)"].[i 0]
 p"%s(%c%c%c)%s"[b;"\\";b;b].[i 4]".oO-".[i 2]",._ ".[i 1]".oO-".[i 3][b;"/";b;b;b].[i 5]
 p"%s(%s)%s"["<";b;"/";b].[i 4][" : ";"] [";"> <";"   "].[i 6][">";b;"\\";b].[i 5]
 p" (%s) "[" : ";"\" \"";"___";"   "].[i 7]

Попробуйте онлайн!

Потому что g используется метод доступа к массиву, мне нужно явно указать тип в определении функции как a string, поэтому определение функции имеет (g:string).

Кроме того, обычно это массив, stringsдоступ к которому осуществляется по индексу. Шляпа, левая и правая руки, которые идут по отдельным линиям, делятся на отдельные верхние и нижние массивы. iФункция изменяет число в аргументе gв индекс массива. И эта буква bзаменяет строки с одним пробелом в массивах.

Отличный вызов! Мой любимый снеговик наверное 242244113:

  ___  
 ..... 
 (o o) 
 ( : ) 
 ( : ) 

я наблюдаю, слежу за тобой


1

PHP, 378 байт

<?$f=str_split;$r=$f($argv[1]);$p=[H=>'   _===____..... _  /_\ ___(_*_)',N=>',._ ',L=>'.oO-',R=>'.oO-',X=>' <\  /  ',Y=>' >/  \  ',T=>' : ] [> <   ',B=>' : " "___   '];echo preg_replace_callback("/[A-Z]/",function($m){global$A,$p,$r,$f;$g=$m[0];return$f($f($p[$g],strlen($p[$g])/4)[$r[array_search($g,array_keys($p))]-1])[(int)$A[$g]++];},'  HHH
 HHHHH
X(LNR)Y
X(TTT)Y
 (BBB)');

Попробуйте онлайн!

Мне нравится мудрый мистер Сова 31333342

   _ 
  /_\ 
 (O,O) 
/(   )\
 (" ")

1

Python 2,7, 257 байт (я думаю)

H,N,L,R,X,Y,T,B=map(int,i)
l='\n'
s=' '
e=' .o0-'
F='  \  / '
S=' < / \ >'
o,c='()'
print s+'      _ _ ___ _ _\n\n\n\n    _. (=./_=._*=.\__. )'[H::4]+l+F[X]+o+e[L]+' ,._ '[N]+e[R]+c+F[-Y]+l+S[X]+o+'  ]> :    [< '[T::4]+c+S[-Y]+l+s+o+'  "_ : _  "_ '[B::4]+c

где «i» является вводом в виде строки (например, «13243213»)


2
Добро пожаловать в PPCG! Как это бывает, это 256 байтов. К сожалению, вы не можете предположить, что вход хранится в переменной. Однако вы можете заменить iна input()в общей сложности 262 байт
H.PWiz

0

Дротик , 307 байт

f(i,{r='.o0-',s=' : '}){i=i.split('').map((j)=>int.parse(j)-1).toList();return' ${['_===_',' ___ \n.....',' /_\\ ',' ___ \n (_*_)'][i[0]]}\n${' \\  '[i[4]]}(${r[i[2]]+',._ '[i[1]]+r[i[3]]})${' /  '[i[5]]}\n${'< /  '[i[4]]}(${[s,'] [','> <','  '][i[6]]})${'> \\ '[i[5]]}\n (${[s,'" "','___','   '][i[7]]})';}

Попробуйте онлайн!


0

Zsh, 247 байт

попробуйте это онлайн!

(){H='_===_h ___
 .....h  _
  /_\h ___
 (_*_)'
W=' \  ' L=.oO- N=,._\  Y=' /  '
X='< / ' T=' : ] [> <   ' Z='> \ '
B=' : " "___   '
<<<" ${H[(ws:h:)$1]}
$W[$5]($L[$3]$N[$2]$L[$4])$Y[$6]
$X[$5](${T:3*($7-1):3})$Z[$6]
 (${B:3*($8-1):3})"
} ${(s::)1}

любимый снеговик:

43232122 Cossack dancer
  ___
 (_*_)
\(o_O) 
 (] [)>
 (" ")
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.