[此处为圣诞节主题免责声明]


86

要注意mod,如果标题不公正,请将其更改为任何内容,我认为这很有趣。


您的任务是为此圣诞节季节挂灯,并且您的家人已决定,要使其成为圣诞节快乐,您需要在房屋上悬挂至少2个圣诞灯。因此,您面临的挑战是,给定一个数字1 < n,根据以下规范输出要悬挂的相应数量的圣诞灯...


这是基本的圣诞灯的结构:

  _?_
 [___]
 /:' \ 
|::   |
\::.  /
 \::./
  '='

唯一不确定的部分是问号,因为取决于灯光在链中的位置,连接方式将有很大不同。

对于链中的第一盏灯,您需要输出:

    .--._ 
  _(_ 
 [___]
 /:' \ 
|::   |
\::.  /
 \::./
  '='

对于链中的最后一盏灯,您需要输出:

_.--. 
    _)_
   [___]
   /:' \ 
  |::   |
  \::.  /
   \::./
    '='

对于中间的所有灯:

_.--.--._
   _Y_ 
  [___]
  /:' \ 
 |::   |
 \::.  /
  \::./
   '='

例:

N = 2

    .--.__.--.    
  _(_        _)_  
 [___]      [___] 
 /:' \      /:' \ 
|::   |    |::   |
\::.  /    \::.  /
 \::./      \::./ 
  '='        '='  

N = 6

    .--.__.--.--.__.--.--.__.--.--.__.--.--.__.--.
  _(_       _Y_      _Y_      _Y_      _Y_       _)_
 [___]     [___]    [___]    [___]    [___]     [___]
 /:' \     /:' \    /:' \    /:' \    /:' \     /:' \
|::   |   |::   |  |::   |  |::   |  |::   |   |::   |
\::.  /   \::.  /  \::.  /  \::.  /  \::.  /   \::.  /
 \::./     \::./    \::./    \::./    \::./     \::./
  '='       '='      '='      '='      '='       '='

信用

ASCII艺术来自:http : //www.chris.com/ascii/index.php? art=holiday/christmas/ other

它由名为“ jgs”的用户开发,该用户负责该网站上约40%的内容。


规则

  • 尾随空格很好,与尾随换行符相同。
  • 链中其余部分的第一个和最后一个灯泡之间还有1个空间。
  • 您只能使用1个整数作为输入,而输出必须为字符串,不能为数组。
  • 您的程序可能具有小于2的未定义函数。

这是,最低字节数获胜。


Sanbox发布链接在这里。


如果字符串是字符数组的同义词怎么办?
2009年

36
那个基本的圣诞灯看起来与手榴弹非常荒谬:)
nicael

18
@nicael替代挑战说明:圣诞老人今年严厉打击坏孩子,每犯下顽皮的行为,孩子都会收到一个活手榴弹。作为他的礼物的深思熟虑的提供者,圣诞老人将手榴弹绑在一起,这样世界上的坏孩子就不会偶然丢失它们!
魔术章鱼缸

@MagicOctopusUrn嗯,左右分别有3个空格,否则有2个空格?我希望间隔是一致的。这是一个丑陋的手榴弹带。
polkovnikov.ph

1
@ polkovnikov.ph要么是,要么圆括号上的点(看起来很奇怪),或者圆括号不是圆括号。海事组织,这是最好看的方法(虽然不是最可打高尔夫球的)。
dzaima

Answers:


35

SOGL V0.1273 71 70 66 字节

.”L7:±¹‘Ο4↕ooā.⁾ Y*¾(){"}^ņF⁵),WοΓy⅜¬κ8ΕL▓‚7m~Ε⅝Γ‘7n┼F (=f⁄2=+⁽{@┼

在这里尝试!

通过(YYY)木炭答案这样字符串循环-4字节

如果不需要处理2,则63个字节将起作用:/


9
[思想震撼。]
罗伯特·哈维

2
这绝对是荒谬的。(特别是如果是通过电话完成的。)+ 1

10
从打印某些未初始化的内存开始,我有90%的把握肯定已经看过这个确切的代码。
Nic Hartley's

那是113个字节,70个字符。
polkovnikov.ph

@ polkovnikov.ph如果单击该save SOGL codepage encoded file按钮,它将为您提供70字节的文件,您也可以将其加载到该文件中(尽管浏览按钮距离很远,但已修复)。SOGL使用自定义代码页来做到这一点。(代码页链接在答案的标题中)
dzaima

26

Python 3中,200个 195 191 190 186字节

d,*l=" _%c_     , [___]   , /:' \   ,|::   |  ,\::.  /  , \::./   ,  '='    ".split(',')
x=int(input())-2
print(' '*3,-~x*'.--.__.--'+'.\n',d%'(',d%'Y'*x,d%')')
for s in l:print(s,s*x,s)

来自dylnan的-1个
字节-来自Rod的-4个字节

在stdin上接受输入。

在线尝试!

说明:

d,*l=" _%c_     , [___]   , /:' \   ,|::   |  ,\::.  /  , \::./   ,  '='    ".split(',')
# d is the second row, without the (, Y, or ) to connect the light to the strand
# l is the third through eighth rows in a list
x=int(input())-2
# x is the number of lights in the middle of the strand
print(' '*3,-~x*'.--.__.--'+'.\n',d%'(',d%'Y'*x,d%')')
# print x+1 wire segments and a trailing dot, starting four spaces over
# on the next line, print the connectors, _(_, then _Y_ * x, then _)_
for s in l:print(s,s*x,s)
# on the Nth line, print the Nth light row, a space,
#     x * the Nth light row, a space, and the Nth light row

额外的节日版本!


更改最后一行以for s in l:print(s,s*x,s)保存一个字节。
dylnan '17

感谢您的解释,Python对我来说看起来很奇怪...大声笑
ArtisticPhoenix

1
具有讽刺意味的是,@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
jpmc26


15

JavaScript(ES6),180字节

n=>`    .${'--.__.--.'.repeat(n-1)}
`+`  _Y_  
 [___] 
 /:' \\ 
|::   |
\\::.  /
 \\::./ 
  '='  `.replace(/.+/g,(r,p)=>`${p?r:'  _(_  '}  ${` ${r} `.repeat(n-2)}  ${p?r:'  _)_'}`)

测试

var f=
n=>`    .${'--.__.--.'.repeat(n-1)}
`+`  _Y_  
 [___] 
 /:' \\ 
|::   |
\\::.  /
 \\::./ 
  '='  `.replace(/.+/g,(r,p)=>`${p?r:'  _(_  '}  ${` ${r} `.repeat(n-2)}  ${p?r:'  _)_'}`)
  
function update()
{
  var n=+I.value
  P.textContent=f(n)
}  

update()
<input id=I type=number value=2 min=2 oninput='update()'>
<pre id=P></pre>


13

的JavaScript(ES6),204个 201 196 194 192字节

N=>`     ${(r=x=>x.repeat(N-1))(`.--.__.--`)}.
   _(_    ${N--,r(`   _Y_   `)}    _)_
`+` [___] 
 /:' \\ 
|::   |
\\::.  /
 \\::./ 
  '='  `.split`
`.map(x=>`${x=` ${x} `} ${r(x)} `+x).join`
`


1
您可以替换.--._${(r=x=>x.repeat(N-2))(`_.--.--._`)}_.--.${(r=x=>x.repeat(N-1))(`.--.__.--`)}.
Kuilin Li

@KuilinLi N在第一次调用时r,我必须递减,但是效果很好。
darrylyeo

13

木炭78 74字节

M⁴→×….--.__⁹⊖θ.⸿F⪫()×Y⁻貫M⁼ι)→P“ ▷υ ρ1↗N⁷Σ⭆ C✂⪪⟲⦃¬≡↘↨H℅⌕Σêλ⍘”  _ι_M⁺⁴⁼ι(→

在线尝试!链接是详细版本的代码。编辑:通过简化接线方式节省了2个字节。由于新代码自动将输入转换为整数,因此节省了2个字节。说明:

M⁴→×….--.__⁹⊖θ.⸿

通过拉线,将其.--.__成型为长度9,然后每次连接重复一次,完成最后的打印,然后.移至灯泡的下一行的开始,来打印布线。

F⪫()×Y⁻貫

循环连接一串连接器:()在末端,Y在中间是s。

M⁼ι)→

如果这是最后一个灯泡,请向右移动一个字符。

P“ ▷υ ρ1↗N⁷Σ⭆ C✂⪪⟲⦃¬≡↘↨H℅⌕Σêλ⍘”

在不移动光标的情况下打印灯泡的主体。

  _ι_

打印包括连接器的灯泡盖。

M⁺⁴⁼ι(→

移至下一个灯泡的开头(如果这是第一个灯泡,请额外输入一个字符)。


那是74个字符,而不是字节。
polkovnikov.ph

@ polkovnikov.ph木炭使用自定义代码页,允许其将每个字符计为一个字节。
dzaima

13

Excel VBA中,224 207 205个字节

匿名VBE立即窗口功能,该功能从范围获取输入[A1]并输出到VBE立即窗口。

从左上到右下逐行打印灯泡

?Spc(4)[Rept(".--.__.--",A1-1)]".":?"  _(_ "[Rept("      _Y_",A1-2)]"       _)_":For i=0To 5:b=Split(" [___]   1 /:' \   1|::   |  1\::.  /  1 \::./   1  '='    ",1)(i):[B1]=b:?b" "[Rept(B1,A1-2)]" "b:Next

样品I / O

[A1]=7 ''  Input to worksheet, may also be done manually
?Spc(4)[Rept(".--.__.--",A1-1)]".":?"  _(_ "[Rept("      _Y_",A1-2)]"       _)_":For i=0To 5:b=Split(" [___]   1 /:' \   1|::   |  1\::.  /  1 \::./   1  '='    ",1)(i):[B1]=b:?b" "[Rept(B1,A1-2)]" "b:Next
    .--.__.--.--.__.--.--.__.--.--.__.--.--.__.--.--.__.--.
  _(_       _Y_      _Y_      _Y_      _Y_      _Y_       _)_
 [___]     [___]    [___]    [___]    [___]    [___]     [___]   
 /:' \     /:' \    /:' \    /:' \    /:' \    /:' \     /:' \   
|::   |   |::   |  |::   |  |::   |  |::   |  |::   |   |::   |  
\::.  /   \::.  /  \::.  /  \::.  /  \::.  /  \::.  /   \::.  /  
 \::./     \::./    \::./    \::./    \::./    \::./     \::./   
  '='       '='      '='      '='      '='      '='       '='    

-17个字节,感谢@ YowE3k

-2个字节用于添加临时变量 b


2
哦,我喜欢用文书软件宏语言编写的答案!另一方面,我输给了VBA。+1
十分之一,2017年

1
(您让我注册了,以便我可以留下此评论!): [Rept(B1,A1-2)]不使用循环开始之前的内容。
YowE3K '17

@ YowE3K-你说得对!由于用来捕获-其已更正
泰勒·斯科特

10

C, 279个   278  272  262  259字节

感谢@NieDzejkob节省了六个字节!

#define P;printf(
i,j;f(n){char*S=" [___]   \0 /:' \\   \0|::   |  \0\\::.  /  \0 \\::./   \0  \'=\'    \0"P"    ");for(i=n--;--i P".--.__.--"))P".\n  _(_ ");for(;++i<n P"      _Y_"))P"       _)_\n%s ",S);for(;*S P"%10s\n%s ",S,S+10),S+=10)for(i=n;--i P S));}

在线尝试!

展开:

#define P;printf(

i, j;

f(n)
{
    char*S = " [___]   \0 /:' \\   \0|::   |  \0\\::.  /  \0 \\::./   \0  \'=\'    \0"
    P"    ");

    for (i=n--; --i P".--.__.--"))
    P".\n  _(_ ");

    for (; ++i<n P"      _Y_"))
    P"       _)_\n%s ",S);

    for (; *S P"%10s\n%s ", S, S+10), S+=10)
        for(i=n; --i P S));
}

1
C,太好了!(:
SilverWolf


9

PHP,276307303301293283280,278个字节

function g($n){$a=["     .--._".r("_.--.--._",$n)."_.--.",r("_(_")." ".r(_Y_,$n)." ".r("_)_")];foreach(explode(9,"[___]9/:' \9|::   |9\::.  /9\::./9'='")as$b)$a[]=r($b)." ".r($b,$n)." ".r($b);return join("\n",$a);}function r($s,$n=3){return str_repeat(str_pad($s,9," ",2),$n-2);}

可读版本进行测试:

function g($n){
    $a=[
         "     .--._".r("_.--.--._",$n)."_.--.",
         r("_(_")." ".r(_Y_,$n)." ".r("_)_")
    ];

    foreach(explode(9, "[___]9/:' \9|::   |9\::.  /9\::./9'='") as$b)
         $a[]=r($b)." ".r($b,$n)." ".r($b);

    return join("\n",$a);
}
function r($s,$n=3){
    return str_repeat(str_pad($s,9," ",2),$n-2);
}

在此处检查缩小版本

在此处检查可读版本

更新

将其包装在一个函数中,



2
使用数字作为定界符的旧JavaScript技巧在PHP中也能正常工作,只是您必须转义\ 分隔符数字之前的,因此将仅保存1个字符。可以通过使相同更大字符串的空格字符部分保存另一个2个字符,包含在中间作为扩展表达式:$a[]=$r($b)." {$r($b,$n)} ".$r($b);
操作

@manatwork-感谢您的提示更新
ArtisticPhoenix

1
@manatwork-如果我使用 9因为不需要转义的分隔符,大概这也与其他的数字只是没有0
ArtisticPhoenix

1
还有一个是您可以定义 $r() lambda函数为常规函数function r()(可以在同一个地方,可以在函数中使用函数)。您确实需要修复字符串解析:" {r("")} "将不起作用。另一个-7个字节;)
7ochem

8

Java中,310个 307 300 275字节

感谢DevelopingDeveloper将其转换为lambda表达式

i->{int j=1;String o="     .";for(;j++<i;)o+="--.__.--.";o+="\n   _(_    ";for(;--j>2;)o+="   _Y_   ";o+="    _)_";String[]a={"  [___]  ","  /:' \\  "," |::   | "," \\::.  / ","  \\::./  ","   '='   "};for(String b:a)for(j=0;j++<i;)o+=j==1?"\n"+b+" ":j==i?" "+b:b;return o;};

展开:

i->
{
    int j=1;
    String o="     .";
    for(;j++<i;)
        o+="--.__.--.";
    o+="\n   _(_    ";
    for(;--j>2;)
        o+="   _Y_   ";
    o+="    _)_";
    String[]a={"  [___]  ","  /:' \\  "," |::   | "," \\::.  / ","  \\::./  ","   '='   "};
    for(String b:a)
        for(j=0;j++<i;)
            o+=j==1?"\n"+b+" ":j==i?" "+b:b;
    return o;
};

研究了乘以字符串的更短方法,并发现流的详细程度令人惊讶

在线尝试!


2
String o="";+ o+=" .";=String o=" .";
manatwork'Dec

@manatwork谢谢,错过了
phflack

2
@phflack我得到它下降到290,如果你使用的λ表达
DevelopingDeveloper

1
@phflack此外,运表示,它只是需要返回字符串,不是打印到控制台,这样就可以把它降到279这样做
DevelopingDeveloper

1
@DevelopingDeveloper很酷,我还找到了一种j=#摆脱循环的方法
phflack

5

干净305个 292 288 275字节

import StdEnv
f c=mklines['  _',c,'_  \n [___] \n /:\' \\ \n|::   |\n\\::.  /\n \\::./ \n  \'=\'  ']
@n=flatlines[a++b++c\\a<-[['    .--._']:[e++['  ']\\e<-f'(']]&b<-map(flatten o(repeatn(n-2)))[['_.--.--._']:[[' ':e]++[' ']\\e<-f'Y']]&c<-[['_.--.    ']:[['  ':e]\\e<-f')']]]

在线尝试!


3

Python 2中(PyPy) 365 316 315 251 245字节

-21感谢FlipTack

-43感谢 ovs

-6感谢Xcoder先生

v,p=' \n'
a,l,n=".--._",["[___]"," /:' \ ","|::   |","\::.  /"," \::./ ","  '='  "],input()-2
e,b=v*5+"_)_",a[::-1]
r=v*4,a,(b[:4]+a)*n,b,p+"  _(_   ",(v*4+"_Y_  ")*n,e+p+v
for i in l:b=4-2*(i in l[1:]);r+=i+v*-~b,(i+v*b)*n,v+i+p
print''.join(r)

在线尝试!




我认为您在最后一个建议中编辑后忘记了更新字节数。
NieDzejkob

1

科特林,261字节

{val c="  [___]\n/:' \\\n |::|\n \\::./\n  \\::./\n   '='"
(0..7).map{i->print("     .--._\n   _(_\n$c".lines()[i].padEnd(10))
(0..L-3).map{print("_.--.--._\n   _Y_\n$c".lines()[i].padEnd(9))}
if(i>1)print(' ')
print("_.--.\n    _)_\n$c".lines()[i])
println()}}

美化

{
    val c = "  [___]\n  /:' \\\n |::   |\n \\::.  /\n  \\::./\n   '='"

    (0..7).map {i->
        print("     .--._\n   _(_\n$c".lines()[i].padEnd(10))
        (0..L - 3).map {
            print("_.--.--._\n   _Y_\n$c".lines()[i].padEnd(9))
        }
        if (i > 1) print(' ')
        print("_.--.\n    _)_\n$c".lines()[i])
        println()
    }
}

测试

fun f(L: Int)
{val c="  [___]\n/:' \\\n |::|\n \\::./\n  \\::./\n   '='"
(0..7).map{i->print("     .--._\n   _(_\n$c".lines()[i].padEnd(10))
(0..L-3).map{print("_.--.--._\n   _Y_\n$c".lines()[i].padEnd(9))}
if(i>1)print(' ')
print("_.--.\n    _)_\n$c".lines()[i])
println()}}

fun main(args: Array<String>) {
    f(6)
}

蒂奥

在线试用


1

Google表格,190字节

匿名工作表函数,用于接收范围内的输入A1并将其输出到调用单元格

="    "&Rept(".--.__.--",A1-1)&".
  _(_    "&Rept("   _Y_   ",A1-2)&"    _)_"&RegexReplace("
 [___]   
 /:' \   
|::   |  
\::.  /  
 \::./   
  '='    
","
(.*)","
$1 "&Rept("$1",A1-2)&" $1
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.