抄写员


23

介绍

仙人掌有各种不同的大小,形状和颜色。然而,最具标志性的仙人掌和必须在每一个西方必须是仙人掌。重要特征是它的大小和臂,它们定义了定型仙人掌的外观。

您的任务是将柱仙人掌引入ASCII世界。但是,就像在现实世界中一样,没有柱仙人掌像另一个,因此您的程序必须能够生成具有不同手臂配置的柱仙人掌。

仙人掌的例子

  • 输入:[0b10, 0b11][2, 3]十进制,输入长度2
     _     
    / \    
 _  | |    
/ \ | |    
| | | |    
\ \_| |    
 \__  |    
    \ |    
 _  | |  _ 
/ \ | | / \
| | | | | |
\ \_| |_/ /
 \__   __/ 
    \ /    
    | |    
    | |    

技术指标

柱仙人掌总是有一个底和一个顶,中间有不同数量的茎。茎部可以没有任何臂,右臂,左臂或两臂。

柱仙人掌的生长模式作为包含两位值的输入列表给出。00表示没有手臂,01右边10的手臂,左边的手臂和11两条手臂(全部为二进制)。输入列表的长度决定了柱仙人掌的高度。

柱仙人掌部分如下所示。#为清楚起见,仙人掌部分被八oth包围,不应打印。
柱仙人掌的高度始终等于4+6*k非负整数的字符k

#############
#     _     # Saguaro top
#    / \    #
#############
# _  | |  _ # Stem, both arms
#/ \ | | / \# Stem id: 11
#| | | | | |#
#\ \_| |_/ /#
# \__   __/ #
#    \ /    #
#############
# _  | |    # Stem, left arm
#/ \ | |    # Stem id: 10
#| | | |    #
#\ \_| |    #
# \__  |    #
#    \ |    #
#############
#    | |  _ # Stem, right arm
#    | | / \# Stem id: 01
#    | | | |#
#    | |_/ /#
#    |  __/ #
#    | /    #
#############
#    | |    # Stem, no arms
#    | |    # Stem id: 00
#    | |    #
#    | |    #
#    | |    #
#    | |    #
#############
#    | |    # Saguaro base
#    | |    #
#############

输入项

如前所述,输入包含一个两位值列表(0, 1, 2, 3十进制)。可以任何合理的格式给出。列表的第一个元素对应于仙人掌的最高茎部分,第二个元素对应其第二高茎的部分,依此类推。
如果需要,您可以要求输入列表的长度作为附加输入。如果需要,请在答案中指定。

输出量

您的输出ASCII仙人掌柱应该使用上述确切的茎部构建。一行上的尾随空格和尾随的新行将被忽略;您可以打印更多,更少或上面指定的数量。

规则

测试用例

  • 离群值。输入:[0b01, 0b00, 0b01, 0b11]
     _     
    / \    
    | |  _ 
    | | / \
    | | | |
    | |_/ /
    |  __/ 
    | /    
    | |    
    | |    
    | |    
    | |    
    | |    
    | |    
    | |  _ 
    | | / \
    | | | |
    | |_/ /
    |  __/ 
    | /    
 _  | |  _ 
/ \ | | / \
| | | | | |
\ \_| |_/ /
 \__   __/ 
    \ /    
    | |    
    | |    

  • 交替臂。输入:[0b10, 0b01, 0b10]
     _     
    / \    
 _  | |    
/ \ | |    
| | | |    
\ \_| |    
 \__  |    
    \ |    
    | |  _ 
    | | / \
    | | | |
    | |_/ /
    |  __/ 
    | /    
 _  | |    
/ \ | |    
| | | |    
\ \_| |    
 \__  |    
    \ |    
    | |    
    | |    

  • 大量的武器。输入:[0b11, 0b11]
     _     
    / \    
 _  | |  _ 
/ \ | | / \
| | | | | |
\ \_| |_/ /
 \__   __/ 
    \ /    
 _  | |  _ 
/ \ | | / \
| | | | | |
\ \_| |_/ /
 \__   __/ 
    \ /    
    | |    
    | |    

  • 没有武器,也被称为长矛。输入:[0b00]
     _     
    / \    
    | |    
    | |    
    | |    
    | |    
    | |    
    | |    
    | |    
    | |    

  • 没有身体,有人称它为年轻的仙人掌。输入:[]
     _     
    / \    
    | |    
    | |    


我可以将输入作为零件数量,然后分别输入每个零件编号吗?(例如第一个测试用例将是4 1 0 1 3
dzaima

我们可以忽略尾随空格吗?
Brian H.

@dzaima可以。
乔纳森·弗雷希

@BrianH。是; 每行末尾的空格都会被忽略。
乔纳森·弗雷希

Answers:


10

木炭50 49字节

↘_\¶/F²«J¹¦²Fθ¿﹪÷Iκ⁺¹ι²”{➙∧⊟≕δaL7YF¬⊕ρ↥↖_K”↓⁶↓²‖T

在线尝试!链接是详细版本的代码。说明:

↘_\¶/

绘制顶部。

F²«

在每一侧循环。

J¹¦²

跳至顶部右侧下方。

Fθ

在每个茎部分上打圈。

¿﹪÷Iκ⁺¹ι²

测试是否有手臂。

”{➙∧⊟≕δaL7YF¬⊕ρ↥↖_K”

如果是这样,请打印一条手臂。

↓⁶

否则,只需打印一条垂直线。

↓²

在打印杆之后,打印底座。

‖T

反射准备画另一面。一旦绘制了两侧,然后将它们反射回其最终位置。


7

JavaScript(ES6),210个字节

在意识到有更好的方法之前,我花了太多时间在另一种解决方案上,这并没有花我想要的时间。

a=>`     _
    / \\`+a.map(([x,y])=>`
 1  | |  2
3 5 | | 4 6
7 7 | | 8 8
5 51| |24 4
 511${`| `[x]} ${`| `[y]}224
    ${`|\\`[x]} `.replace(/\d/g,m=>` _/\\|`[m%2?x*-~m/2:y*m/2])+`|/`[y],s=`
    | |`).join``+s+s

试试吧

o.innerText=(f=
a=>`     _
    / \\`+a.map(([x,y])=>`
 1  | |  2
3 5 | | 4 6
7 7 | | 8 8
5 51| |24 4
 511${"| "[x]} ${"| "[y]}224
    ${"|\\"[x]} `.replace(/\d/g,m=>` _/\\|`[m%2?x*-~m/2:y*m/2])+"|/"[y],s=`
    | |`).join``+s+s
)(i.value=["11","10","01","00"]);oninput=_=>o.innerText=f(i.value.split`,`)
<input id=i><pre id=o>


以字面量00,01,10,11作为输入,而不是二进制输入或0,1,2,3。使用OP测试用例会失败。
Brian H.

@BrianH .:在输入中引用挑战规范:“ 可以以任何合理的格式给出
Shaggy

1
但它指出“输入由两位值列表组成(十进制的0、1、2、3)。” 就在那之前……(顺便说一句,我没有低估或其他任何想法,这是非常聪明的,只是根据我对规则的解释,输入不匹配)
Brian H.

5

Python 2,189字节

lambda l:'     _\n    / \\\n'+'\n'.join(('    |',' /|\  _   \  \|\_    __ |||| \\'[j::6])[i/2]+' '+('|','|||| /   __  /|/_ _   /  \|/'[j::6])[i%2]for i in l for j in range(6))+'\n    | |'*2

在线尝试!


3

Python 2中256 253 ... 205个 203 199字节

r=[('     _',''),('/','\ ')]
for a in input()+[0]:r+=zip(*[['|'*6,'_|    |_,,/|  \/  |\,,||  ||  ||,,\| _\/_ |/,,\ ____ /,,\/'[i::2].split(',')][2-i&a>0]for i in 0,1])
for l in r[:-4]:print'%5s %s'%l

在线尝试!


就像处理其他字符串文字一样,在第一行中可以省略转义的反斜杠。
乔纳森·弗雷希

看起来您可以通过删除所有尾随空格来节省18个字节。
毛茸茸的

for ...:\n r...\n r...-> for ...:r...;r...保存三个字节。
乔纳森·弗雷希

1

PowerShell,235字节

param($a)'     _
    / \'
($a|%{((,'1|'*6),('1|  _
1| / \
1|2
1|_/ /
1 __/ 
1/'),(' _ 2
/ \2
| |2
\ \_| |
 \__  |
    \ |'),(' _ 2  _
/ \2 / \
| |22
\ \_| |_/ /
 \__   __/
    \ /'))[$_]})-replace1,'    | '-replace2,' | |'
,'    | |'*2

在线尝试!

PowerShell没有一种map或一种zip或一种真正简单的方法来反转字符串,因此我们还有其他事情-重复部分的简单替换。

前两行将输入作为整数数组,并输出仙人掌的顶部。然后,我们循环浏览$a并根据当前值选择一个包含四个字符串的数组。这些字符串留在管道上,然后我们使用我们的代码-replace来填充适当的位置。然后,我们也将仙人掌的底部放在管道上。

一切都是从管道中收集的,并且Write-Output在程序完成时隐式发生,在每个元素之间插入换行符。


1

05AB1E76 75字节

„ _…/ \‚4ú»,v6F'|4ú"_ |/\"•Aö¡Èèj{^ë•5вèJ5ôNè©‚y1›èð'|®∞2äθ‚yÉèJ,}}„| 4úû=,

在线尝试!


1
嗯,我想打败你,尽管对此表示怀疑。
魔术章鱼缸

@MagicOctopusUrn:祝你好运!希望您能处理好它(并可能将其变成小冲突:P)
Emigna

我的一个好主意是通过我在“ oasis / 05AB1E”聊天室中发布的命令的b / c字节压缩了30个字节。高尔夫不错,如果我现在尝试,那就太近了。
魔术章鱼缸

1

的Java(OpenJDK的8) 626 566 499 466 398个 312 310 308字节

可以打一吨高尔夫球

a->{String r=" |,",g="    |",n="     _,    / \\,";boolean j,k;for(int e:a)n+=((k=e>1)?" _  |":g)+((j=e%2>0)?" |  _,":r)+(k?"/ \\ |":g)+(j?" | / \\,":r)+(k?"| | |":g)+(j?" | | |,":r)+(k?"\\ \\_|":g)+(j?" |_/ /,":r)+(k?" \\__ ":g)+(j?"  __/,":r)+(k?"    \\":g)+(j?" /,":r);return(n+g+r+g+r).replace(",","\n");}

在线尝试!


1
您也可以通过更改{j=e>1;k=e%2>0;n+=(k?" _ |":g)+(j?" | _,":r)+n+=((k=e%2>0)?" _ |":g)+((j=e>1)?" | _,":r)+和删除}for循环的关闭来节省2个字节。
凯文·克鲁伊森

你有“武器”错误的方式“轮12
毛茸茸的

0

SOGL V0.1256个 54 53 字节

5⁷yΙ‚‘∑≡`a#¾‘O.{@.2%i»¹{"⁸G‘6∙;?X"j1>ζ╔²i[n¹‘5n}┼±↔}O

在这里尝试!

说明:

..‘                   push the ending part - "    | |\n    | |"
   ..‘O               output the starting part - "     _ \n    / \"
       .{             input times do
         @              push a space
          .2%           push input%2
             i»         push floor(prevInput/2)
               ¹        wrap the two in an array

{                   }   for each of the two numbers
 "..‘                     push "|    " - base stem
     6∙                   multiply vertically 6 times
       ;?       }         if the current item iterating over is truthy (i.e. != 0)
         X                  remove ToS - the regular stem - from the stack 
          "..‘              push "|  _ | / \| | ||_/ / __/ /    " - stem with an arm
              5n            split it into line lengths of 5
                 ┼        add that horizontally to the space pushed earlier (or whatever it's become)
                  ±↔      reverse ToS - the stem currently - horizontally
                     O  output the array of the current part
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.