您想编码一个雪人吗?


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代表右眼

(与左眼相同。)

X是左臂

  1. 普通手臂

     
    <
  2. 上臂

    \
     
  3. 下臂

     
    /
  4. 没有

     
     

Y代表右臂

  1. 普通手臂

     
    >
  2. 上臂

    /
     
  3. 下臂

     
    \
  4. 没有

     
     

T代表躯干

  1. 纽扣 :

  2. 背心 ] [

  3. 内向武器 > <

  4. 没有

B代表基地

  1. 纽扣 :

  2. " "

  3. 平面 ___

  4. 没有

挑战

编写一个程序,该程序采用格式为的八个字符串(通过stdin或命令行)HNLRXYTB,其中每个字母都是1到4的数字,表示要用于雪人对应部分的预置。将完整的snowperson打印到stdout。

例如,输入11114411是页面顶部的雪人。(第一1:他戴草帽,第二1:他鼻子正常,等等。)

另一个例子,输入的雪人33232124

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

细节

  • 只要前导/后跟空格和前导/后跟换行符的数量和组合是允许的,只要...

    • 雪人的所有部分都相对于彼此正确排列,并且
    • 总的空白字符不得超过64个(一般模式仅为7×5,因此您可能不会达到此限制)。

    如果它们仅包含空格,则无需打印模式的行/列。例如,不需要草帽的空行。

  • 您必须使用上面给出的零件顺序。

  • 您可以编写一个以数字字符串作为参数的函数,而不是程序。输出应正常打印或作为字符串返回。

  • 如果愿意,可以将输入视为整数而不是字符串。

计分

以字节为单位的最短代码获胜。

额外的问题:您最喜欢65536个独特的雪人中的哪一个?


19
我喜欢天使14441133。或者是小眼睛的四臂怪兽。您的选择。
Sp3000

14
一定要堆雪人吗?

54
不必是雪人。(免责声明:可能是个雪人)
约瑟巴伦(Joshpbarron

3
偶尔的机智评论是不错的选择,但是对于扩展讨论,请使用聊天而不是评论。我已经整理了一下。
马丁·恩德

36
接下来要做的问题:“无论如何代码永远不会打扰我”
卡尔文的爱好

Answers:


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为底数)表示帽子第一行中的空格和下划线的数量。我们打印这些字符,换行符,空格和移位后的字符串的其余部分。然后,我们在堆栈底部推送另一个换行符。

对于主体部分,我们将与所有它们对应的字符串连接起来。让我们把这个字符串小号。为了组装身体部位,我们执行音译:我们获取字符串M的每个字符,在sort(M)中计算其索引,然后将其替换为S的相应字符。我们利用了这样一个事实,即音译操作员会根据需要重复输入S的最后一个字符,从而自动填充S以匹配sort(M)的长度。

最后,我们将结果字符串分成长度为7的子字符串,并在每对子字符串之间放置换行符。

假设变量M,并P包含字符串中号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')。最麻烦的部分是手臂,占用两行,因此我必须同时包含顶部和底部的代码。

下面的堆栈摘录包含未注释,未经过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”非常酷。
Topher

7
亲爱的,看看8眼的蜘蛛雪人:22112333
Claudiu)

1
我喜欢沉睡中的俄罗斯猫头鹰:41444442
ETHproductions 2015年

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 +向下的手臂=面纱,而头部实际上在fez /面纱中。通常较大的形式是波浪形连衣裙,而“眼睛”和“鼻子”是连衣裙中的褶皱。

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

其他“眼睛”选择有点过时。


17
对我来说,您的奖金看起来更像是KKK会员而不是新娘。
ace_HongKong独立

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
现在,困倦的俄罗斯熊也是我的最爱。
加尔文的爱好2015年

1
第一排的下划线在非斯和俄罗斯帽子上似乎并不正确。例如,它带有螺旋桨帽子 ..
卡尔文的爱好2015年

@ Calvin'sHobbies:俄罗斯帽子还可以,但菲斯帽子很烂。我现在修复它,并检查了所有其他情况。将来我必须更加小心!
克劳迪(Claudu),2015年

派对晚了,但是这个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) 
 (] [)>
 (   )

但我的最爱是4424212341341144

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

1
当我这样做时s('33232124'),未绘制斜杠。实际上,在很多情况下,帽子的下半部分都没有使用。另外,0不是选项之一。
加尔文的爱好2015年

@ 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粘贴数据”部分,而不是行号旁边的部分。您可以在线尝试,但永久链接在某些浏览器中可能无法使用。

说明

"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-CE连接的程序编辑器或SourceCoder 3或东西来构建并传送给你的计算器; 在TI-Connect的情况下,它将说它具有无效的令牌。SC3使用反斜杠作为注释定界符(//在SC3中开始注释;/\/不过,将导出为//),因此不会正确导出手臂和帽子等,从而导致程序同时显示错误的身体部位并抛出ERROR:DOMAIN不时出现。好玩的东西!

重要提示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(眼睛)中,我使用“ plot dot”([2ND] → [0]CATALOG → [3]θ → scroll down, it's between ﹢ (small plus) and · (interpunct))而不是句点,以便眼睛不会与逗号对齐,因为这看起来很奇怪。
  • 在Str8(基础版)中,我不得不使用diaeresis(¨)而不是双引号,因为在TI-BASIC中无法转义字符,并且双引号用于开始/结束字符串。
  • 在TI-BASIC中,如果括号和括号后接冒号,换行符或→(用于var赋值),则不需要将括号和方括号括起来,而在换行符或→之后,双引号(字符串)可以保持不闭合。

1
首先,在第二行中length(Ans应为length(Str9; 第二,您是否尝试过将Str3到Str6组合成一个字符串?
lirtosiast 2015年

哦,哎呀!我认为这已在下载中修复。除此之外,自从我做完这个以后,我还没有研究太多,但是我确实提到我可能可以将一些字符串合并在一起。我将在今天/本周的某个时间进行调查。
赖特

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];
}

我从Reto Koradi的回答中得出了这个想法。我做了几个有趣的改进,可能需要发布一个单独的答案:

  • 从功能转换为程序(+10)
  • 将换行符移入控制字符串(-7)
  • 在所有字符代码中添加3,以减少转义字符,例如\"(-3)
  • 用自动增量从字符串中读取;也t[i++]*t++(-4)代替
  • 替换whilefor; 移除{}(-4)
  • 简化的循环终止:读取直到\0(-9)
  • 转换t[...],t+=4(...)[t+=4]消除逗号运算符(-1)

为什么这么麻烦?分享我最喜欢的一个,雪鬼:

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

可以放在d后面的括号中main
ceilingcat '18

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'))
a药

3
实际上,如果您在每个数组中放置一个前导逗号以增加每个项目的索引,则可以完全消除输入字符串到数组的转换。它增加了7个,字符,但允许您删除50个以上的字符。最后,一个非常挑剔的优化方法是使用q=j[4]-1而不是q=j[4]==1(然后翻转使用q!q)。当is时,这将q0(假值),否则将是真非零值。这与您当前的true / false值完全相反,因此您只需切换和即可。j[4]1q!q
apsillers

很抱歉您对第一个答案有很多反馈!我个人认为修改意见书是打高尔夫球最有趣的部分之一。如果您不同意我的话,我深表歉意。:)
ps弹手

@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作为输入,将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

顺便说一句。我对进行了一些实验.F"{:^7}",将字符串居中。使用它,我可以在代码中节省一些空间,但最后不保存任何字节。


9

R,436个 437字节

这是我第一次尝试使用go ,它不是最短的,但仍然很有趣。至少我现在击败了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.-) 
 (] [)\
 ( : )

我实际上在挣扎XY处于多行状态,但中间夹了东西,最终将(XS)和(YU)中的每一行分开。

function 从字符串到整数的转换也很冗长。

编辑436 => 437

必须修复@OganM注意到的缺少的空白空间

我可以减少到428,用来代替变量之间的换行符;,但是“ 单行”代码看起来很糟糕并且不可读,我不会那么贪心。


你需要和第四届帽子额外字符
OganM

@OganM感谢您提供额外的字节!:(已修正
。– Molx

在进行代码高尔夫时,我们通常将每一行换成一个字符(如* nix),而不是两个字符(如Windows)。因此,无论使用分号还是换行都没关系。
ace_HongKong独立

@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

编辑:从字符串列表切换为零件(帽子,眼睛,...)的字符串。需要第二个参数,即子字符串的长度。

编辑二:提取公共子串


8

C,233230字节

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" /  "

所有这些函数都使用beta缩减,因此它们的参数将作为索引传递给y函数。

输出:

λ> s $ repeat 1

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

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

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

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

@ Calvin'sHobbies谢谢,我想我已经解决了这个问题。
Craig Roy 2015年

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。同样,您可以删除f(int(i))和之间的第7行中的空格for。另外,在您的对print()帐单中,您无需打印最终空间-它不是雪人的一部分。最后,将您的print()呼叫更改为单线print("{}\n{}({}{}{}){}\n{}({}){}\n ({})".format(*c))。每一个都应为您节省1个字节,总共节省4个字节:)
ace_HongKongIndependence,2015年

1
另外,n您可以定义function的属性,而不是使用全局变量f。因此,您可以将5-6 def f(m):f.n+=1;return l[4*m+int(b[f.n])-1]行替换为:<newline> f.n=-1。这样减少了3个字节。
ace_HongKong独立

1
@ace谢谢,以前从未听说过function属性,学到了一些新知识!
马蒂(Matty)

6

PowerShell,199字节

受到Reto Koradianatolyg的启发。

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

05AB1E137个 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您的122字节版本0在两眼之间有一个。:)
凯文·克鲁伊森

只是一个以12为底的编码错误,应该很容易解决!
肮脏的

@Grimy你是对的。昨天我没有很多时间,但这确实是列表中的简单修复。感谢-6!:)
Kevin Cruijssen

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使用数组访问器,所以我需要在函数定义中将类型明确指定为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) 
 (] [)>
 (" ")
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.