圣诞老人之家


16

圣诞老人之家

注意:这是我尝试设置的第一个挑战。它已经通过了沙箱,但是,如果您发现它有问题,请不要投下反对票,而要发表评论,以便我改善它。

背景

有一个古老的儿童拼图游戏,其中的挑战是要在中间画一个有屋顶和十字架的盒子,而又不能从纸上抬起笔或翻越任何线条两次。

在德国,它被称为“ das Haus des Nikolaus”或“圣诞老人之家”。老实说,我不记得我们曾经怎么称呼它。对于不熟悉该难题的任何人,请在此处获取完整的详细信息。

这是房子的ASCII艺术表示形式。

 /\
/__\
|\/|
|/\|
----

挑战

编写程序或函数以您选择的任何语言绘制圣诞老人之家。

听起来太容易了?好吧,这就是陷阱。它还必须输出绘图的每个阶段并遵守拼图规则。您的程序不需要进行任何输入。完工的房屋必须与上图完全相同。

根据上面的网站,有44种可能的解决方案。您可以使用其中任何一个。这是一个ASCII艺术挑战,因此您无需计算解决方案,而只需绘制它。

输出量

下面显示了来自44个解决方案之一的所需输出的示例:

---- 

 \
  \
----

 __
 \
  \
----

  \
 __\
 \
  \
----

 /\
/__\
 \
  \
----

 /\
/__\
|\
| \
----

 /\
/__\
|\/
|/\
----

 /\
/__\
|\/|
|/\|
----

规则

  • 我在每个预期的输出之间添加了1条额外的换行符,以使要求更加明确。这是可选的。每个输出之间允许有任意数量的空行。
  • 您的输出必须仅包含字符/,\,-,_和空格,如上所示。允许尾随空格。
  • 绘图中的每一行都必须从上一行的末尾开始,并且您不得重复任何行。
  • 禁止出现标准漏洞。
  • 您无需输出上述链接中提到的押韵。
  • 这是代码高尔夫球,所以最短的答案(以字节为单位)将是赢家。

结果

一些出色的答案,并感谢所有张贴者。我确实说过最低字节数,但我不仅将其标记为最佳答案,还将其作为代码的出色解释。尼斯@丹尼斯。


这本可以在沙箱中花费一些时间。尝试添加用于房屋大小的参数-或级联房屋的数量(或两者)。我觉得这太容易了。您可能还想将韵添加到示例输出中-或根本不提及它。我觉得这个gif很好,或者这个
泰特斯(Titus)2016年


4
@Titus感谢您的反馈。我的意图不是创造一个特别困难的挑战,而是创造一个相当容易实现的挑战,并因此鼓励尽可能多的人提出解决方案。我会在下次尝试时采纳您的建议。
ElPedro '16

1
我的错; 我原本对ASCII艺术来说太复杂了。:)但我仍然喜欢这些gif图像。
泰特斯(Titus)2016年

的gif很酷,我也喜欢在其他语言中加入韵的想法:)
ElPedro

Answers:


10

果冻40 39 36 字节

“ḥ%DtƊVḍI’ḃ9W;“|_/-\/\|‘Ė¤y@\FỌ»⁶s4Y

在线尝试!

怎么运行的

“ḥ%DtƊVḍI’

是双射基数为250的文字;每个字符都对应于Jelly代码页中的代码点。结果是整数13192938935880491074

          ḃ9

将生成的整数转换为双射基数9,得出整数数组
[ 9、6、7、9、6、2、7、1、5、3、8、1、3、5、8、4、4 , 4,4]。整数对应于笔画的顺序,但9除外,它表示空格。

            W

将生成的数组包装为单例数组,将其添加到我们现在将生成的数组之前将是必需的。

              “|_/-\/\|‘Ė¤

工作方式如下。¤将左侧的两个链接组合成一个尼拉度链。第一个“|_/-\/\|‘产生指定字符的代码点,产生[124,95,47,45,92,47,92,124]。然后,Ė枚举代​​码点,产生
[[1,124],[2、95],[3、47],[4、45],[5、92],[6、47],[7、92] ,[8,124]]。对[n,c]表示n笔画将是代码点为c的ASCII字符。

             ;

连接生成的数组。结果是数组
[[9,6,7,9,6,2,2,7,1,5,3,8,1,3,5,8,4,4,4,4,4],[1,124 ],[2,95],[3,47],[4,45],[5,92],[6,47],[7,92],[8,124]]

                          y@\

使用y带有交换参数(@)的音译()执行累积(即显示所有中间步骤)缩减。第一步,例如,我们将原始数组中的每个1替换为 124,这是字符|的代码点。。

                             FỌ

展平结果,并用相应的ASCII字符替换所有代码点。在所有步骤中,这将生成一些代码点为1的不可打印字符9的

                               »⁶

用空格字符取最大字符数,用空格替换所有不可打印的字符。

                                 s4Y

将生成的字符串拆分为长度为四的块,并使用换行符作为分隔符将它们连接起来。


2
哇。只是哇。+1
ElPedro

但是等等,这些是字节吗?
Leif Willerts

1
@LeifWillerts是的。为了避免出现无法打印的字符,Jelly使用了一个自定义代码页,该页将它理解为每个字节的256个字符编码。标头中的字节链接指向它。
丹尼斯

抱歉,无法确定您是否点击该链接:D
Leif Willerts

无论从什么角度讲,它都能赢得更多的解释。尊重。
ElPedro '16

13

Javascript(ES6),119 116 96 92 91字节

for(i=8;i--;)console.log(`834
3554
2610
2160
7777`.replace(/./g,c=>'|/|/\\_\\- '[c<i?8:c]))


好答案。我感到Javascript将会存在或附近:-)
ElPedro

抱歉,多次修改。我不应该在第二杯咖啡之前发布。
Arnauld

多次编辑是好的。很高兴看到字节数下降。
ElPedro

在答案中拥有两个相同的代码副本有什么意义吗?
尼尔

@Neil-我将只保留一个,直到我找到有两个的充分理由为止。^^
Arnauld

9

分批,356个 344 341 337字节

@set s=@set "
%s%g=@goto 1
%s%r=
%s%c=
%s%u=|
%s%l=|
%s%f=
@for /l %%i in (1,1,7)do @call:%%i
%s%u=|\/|
%s%l=|/\|
%g%
:7
%s%u=|\/
%s%l=|/\
%g%
:6
%s%f=----
%g%
:5
%s%u=|\
%s%l=| \
%g%
:4
%s%c=/__\
%g%
:3
%s%r= /\
%s%c=/  \
%g%
:2
%s%r= /
%s%c=/
:1
@for %%l in ("%r%" "%c%" "%u%" "%l%" "%f%")do @echo(%%~l

愚蠢的批处理|引用规则...如果要|在变量中使用a,则需要用3来引用它^,因此使用@它代替并在输出中替换它更便宜,尽管要实现此目的,我必须从左墙开始。第一行有一个尾随空格。 echo(之所以使用r,是因为c,和f变量可能为空,我们不希望ECHO is off.打印。

编辑:最后一部分使用fallthrough节省了12个字节。通过使用for循环打印每个部分节省了3个字节,这意味着我现在|在变量中使用了s,这使代码更易于阅读。使用显式@字符(而不是)节省了4个字节@echo off。我认为从左墙开始仍然需要最少的字节。


2
可能不是最短的,但是我得到了赞扬,因为我实际上设法在批+1中做到了
ElPedro

echo:更为标准,但echo(看起来您正在滥用语言功能,因此+1。
wizzwizz4 2016年

@ wizzwizz4 echo:在某些晦涩的边缘情况下失败,但我不知道的任何失败情况echo(
尼尔

@ wizzwizz4如果foo.bat当前目录中有文件,则echo(\..\foo.bat回显\..\foo.batecho:\..\foo.bat执行foo.bat
尼尔

@Neil你知道为什么吗?似乎echo:.\foo.bat会产生这种效果。是否由于目录堆栈故障而导致,根目录中的“ UP”是当前目录?
wizzwizz4 2016年

7

C,118字节

main(){char *p,n;for(n='B';n++<'J';)for(p="ZFEAFDDEAGCHIAGHCIABBBBAA";*p;p++)putchar(" \n-\\_\\/|/|"[(*p<n)**p&15]);}

令人印象深刻!不错的第一个答案,欢迎访问该网站!
DJMcMayhem

1
要保存3个字节:(char*p无空格),'B'然后'J'将其更改为ASCII码。
水平河圣

感谢您的回答。我没想到C会竞争。这确实令人印象深刻,值得+1
ElPedro 16/09/17

6

///,112字节

/!/\/\///*/----
 !@/\\\\!$/ @@!^/
*@\/@@
@\/__@@
/*@
 $
*__
$
 $
*$
 __@
$
 $^$
 $^|@
|$^|@\/
|\/@^|@\/|
|\/@|
*

在线尝试!


我听不懂112的单个字节,但我在网上尝试了一下,它的确符合锡
盒上的指示,

1
@ElPedro尝试单击标题上的链接,您可能会明白这个概念,但是,如果不了解,请直接联系我。我希望越来越多的人能够理解一种语言,如果您不理解,那是一个可悲的事实。我知道我不能仅仅让每个人都了解///(有些人只想要食物和水,///和PPCG相距甚远,尽管并非不可能)。
Erik the Outgolfer

谢谢。有太多的语言要学习!我一定会看看。我仍在使用Python和Lotus Formula打高尔夫球,但要多加一些。语言越多越有趣。再次感谢您的贡献:)
ElPedro

2

PHP,98 95字节

Arnauld解决方案启发

for($i=8;$i--;)for($p=24;$p--;)echo"|/|/\\_\\- 
"[($c="977779061290162945539438"[$p])<$i?8:$c];

注意:第一行代码具有尾随空格。


很好@Titus。允许尾随空格。
ElPedro '16

@ElPedro:我只知道有些人在其中配置了编辑器以自动修剪它们。这就是为什么我提到它。
泰特斯(Titus)2016年

1

带有GD的PHP,348338字节(不竞争)

不完全是所要的,但是...

function f($v,$w){global$x,$y,$i;imageline($i,$x,$y,$x=$v,$y=$w,1);ob_start();imagepng($i);$s=ob_get_clean();ob_end_clean();echo'<img src="data:image/png;base64,',base64_encode($s),'" > ';}$i=imagecreate($w=9,$h=$w+$z=$w/2);imagecolorallocate($i,255,255,255);f(--$w,$y=--$h);f(0,$z);f($w,$z);f($w/2,0);f(0,$z);f(0,$h);f($w,$z);f($w,$h);

保存到文件,在浏览器中调用

分解

function f($v,$w)
{
    global$x,$y,$i;
    imageline($i,$x,$y,$x=$v,$y=$w,1);      // draw line, set end coords as new start coords
    ob_start();imagepng($i);$s=ob_get_clean();ob_end_clean();           // get image output
    echo'<img src="data:image/png;base64,',base64_encode($s),'" > ';    // print <img> tag
}
// calculate dimensions, create image, allocate background color (foreground implicitly black)
$i=imagecreate($w=9,$h=$w+$z=$w/2);imagecolorallocate($i,255,255,255);
// paint lines: implicit `$x=0`
f(--$w,$y=--$h);f(0,$z);f($w,$z);f($w/2,0);f(0,$z);f(0,$h);f($w,$z);f($w,$h);

要绘制更大的房子,请更改$w=9为所需的宽度。


我也给这个+1。即使它不能解决直接的挑战,它也可以涵盖您建议的改进并且看起来很酷:)
ElPedro
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.