Ви хочете зашифрувати сніговика?


176

Ось простий художній сніговик ASCII :

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

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

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

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

Усі пресети

(Зауважте, що пробіли розміщуються на порожніх рядках, щоб форма секції завжди була правильною.)

H - це для Hat

  1. Солом'яний капелюх

         
    _===_
  2. Мексиканський капелюх

     ___ 
    .....
    
  3. Фес

      _  
     /_\ 
    
  4. Російський капелюх

     ___ 
    (_*_)
    

N - це ніс / рот

  1. Нормальний ,

  2. Крапка .

  3. Лінія _

  4. Немає

L - для лівого ока

  1. Крапка .

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

  3. Найбільша крапка O

  4. зачинено -

R - для "Правого ока"

(Той самий список, що і ліве око.)

X - для лівої руки

  1. Звичайна рука

     
    <
  2. Рука вгору

    \
     
  3. Рука вниз

     
    /
  4. Немає

     
     

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

  1. Звичайна рука

     
    >
  2. Рука вгору

    /
     
  3. Рука вниз

     
    \
  4. Немає

     
     

Т - для Торса

  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
Це не повинно бути сніговиком. (Відмова: Можливо, це буде сніговик)
Джошпбаррон

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 рядки, тому мені довелося включити код і для верхнього, і для нижнього.

У фрагменті стека, наведеному нижче, є коментований код unololf, un-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) і додавши ||' 'в кінці.
Yair Rand

30

CJam, 164 байти

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

CJam хоче побудувати сніговика!

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

Спробуйте в Інтернеті.

Бонус

Мислення поза коробкою! 32443333дарує сніговій (ва) людині наречену. Ви повинні трохи спробувати, щоб побачити це, але є внутрішні руки, fez + руки вниз = вуаль, а голова насправді знаходиться у фесі / вуалі. Взагалі великою формою є плаття, що балакає, а «очі» та «ніс» - це складки у сукні.

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

Інші варіанти "очей" трохи ризиковані ...


17
Для мене ваш бонус більше схожий на члена KKK, ніж на наречену.
ace_HongKongIndependence

26

Пітон, 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
Підкреслення верхнього ряду не видається правильним на капелюхах fez та Russian. напр., це дає шапку пропелера ..
Хобі Кальвіна

@ Calvin'sHobbies: Російський капелюх був у порядку, але капелюх fez був зіпсований. Я зараз це виправив і перевірив усі інші випадки. Я повинен бути обережнішим у майбутньому!
Клавдіу

надто пізно на вечірку, але ця TIO каже, що це 297 для мене. Intellij каже 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 Спасибі, я виправив це.
Cees Timmerman

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 Data 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=потім перетворює кожну цифру в int і відображає відповідно відповідно, наприклад, для 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: Наразі я лінивий, щоб виправити завантаження, тому, коли ви перенесете його на свій calc, змініть 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 в єдиний рядок?
ліртосіаст

Ой, ой! Я думаю, що це виправлено у завантаженні. Крім того, я не дивився на це багато , так як я зробив це, але я робив згадка , що я міг би об'єднати кілька рядків разом; Я вивчу це десь сьогодні / на цьому тижні.
М. І. Райт

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, а в іншому випадку - неістотне значення. Це точно протилежне вашим поточним справжнім / хибним значенням, тому ви просто переключаєте 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

Пояснення

Спочатку я визначаю функцію помічника g, яка приймає список і знак як вхід, перетворює char у його 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 Дякую за пораду, добре знати!
Molx

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="")}

Просто злилися окремі змінні в одну. Шоування деякого простору, який використовувався для 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 :(

Тест на фрагмент (за допомогою 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!
Гримі

1
Вниз до 122 , а також ближче до того, що ви мали спочатку.
Grimy

@Grimy У вашої 122-байтної версії 0між очима. :)
Кевін Круїссен

Просто помилка в кодуванні базової 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.