산타 클로스의 집


16

산타 클로스의 집

참고 : 이것은 제가 시도한 첫 번째 도전입니다. 그러나 샌드 박스를 통해 문제가 발생하면 문제를 발견하지 말고 그냥 개선하지 말고 개선 할 수 있도록 의견을 남겨주십시오.

배경

종이에서 펜을 들어 올리거나 선을 두 번 쓰지 않고 지붕과 십자가가있는 상자를 가운데로 그리는 것이 어려운 어린이 퍼즐이 있습니다.

독일에서는 "das Haus des Nikolaus"또는 "산타 클로스의 집"으로 알려져 있습니다. 솔직히 우리가 전화했던 것을 기억할 수 없습니다. 퍼즐에 익숙하지 않은 사람은 여기에서 자세한 내용을 확인할 수 있습니다 .

집의 ASCII 예술 표현은 다음과 같습니다.

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

도전

원하는 언어로 산타 클로스의 집을 그릴 수있는 프로그램이나 기능을 작성하십시오.

너무 쉬운 소리? 여기에 캐치가 있습니다. 또한 그림의 각 단계를 출력하고 퍼즐 규칙을 준수해야합니다. 프로그램은 입력 할 필요가 없습니다. 완성 된 집은 위와 같이 정확하게 보여야합니다.

위의 사이트에 따르면 44 가지 가능한 솔루션이 있습니다. 당신은 그들 중 하나를 사용할 수 있습니다. 이것은 ASCII 아트 챌린지이므로 솔루션을 계산할 필요는 없지만 그립니다.

산출

44 개 솔루션 중 하나의 필수 출력 예는 다음과 같습니다.

---- 

 \
  \
----

 __
 \
  \
----

  \
 __\
 \
  \
----

 /\
/__\
 \
  \
----

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

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

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

규칙

  • 요구 사항을 더 명확하게하기 위해 각 예상 출력 사이에 줄 바꿈 1 개를 추가했습니다. 이것은 선택 사항입니다. 각 출력 사이에는 빈 줄이 허용됩니다.
  • 출력은 위에 표시된대로 문자 /, \,-, _ 및 공백으로 만 구성되어야합니다. 후행 공백이 허용됩니다.
  • 도면의 각 선은 이전 선의 끝부터 계속되어야하며 어떤 선도 반복 할 수 없습니다.
  • 표준 허점은 금지되어 있습니다.
  • 위 링크에서 언급 된 운율을 출력 할 필요는 없습니다.
  • 이것은 코드 골프이므로 바이트 단위의 최단 답변이 승자가됩니다.

결과

게시 한 모든 사람에게 큰 답변과 감사와 존경. 나는 가장 낮은 바이트 수를 말했지만 그뿐만 아니라 코드에 대한 훌륭한 설명을 위해 최고의 대답으로 표시했습니다. 멋진 @Dennis.


이것은 샌드 박스 에서 어느 정도 시간을 보냈을 수 있습니다 . 집의 크기 또는 연결된 집 수 (또는 둘 다)에 대한 매개 변수를 추가하십시오. 나는 그것이 너무 쉽다는 것을 안다. 예제 출력에 운율을 추가하거나 전혀 언급하지 않을 수도 있습니다. 나는 이 gif가 좋 거나 이것을 발견 한다 .
Titus


4
@Titus 피드백에 감사드립니다. 저의 의도는 특히 어려운 도전을 만드는 것이 아니라, 쉽게 할 수있는 도전을 만들고 가능한 많은 사람들이 해결책을 제안하도록 격려하는 것이 었습니다. 다음 시도를 위해 귀하의 제안을 기내로 가져 가겠습니다.
ElPedro

1
내 잘못; 아스키 아트에는 너무 복잡한 것을 기대하고있었습니다. :) 그러나 나는 여전히 gif를 좋아한다.
Titus

GIF를 또한 : 언어의 선택도 운율 등의 생각처럼 멋진 내가되는
ElPedro

답변:


10

젤리 , 40 39 36 바이트

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

온라인으로 사용해보십시오!

작동 원리

“ḥ%DtƊVḍI’

bijective base-250 리터럴입니다. 각 문자는 젤리 코드 페이지의 코드 포인트에 해당 합니다 . 결과는 정수 13192938935880491074 입니다.

          ḃ9

생성 된 정수를 bijective base 9로 변환하여 정수 배열
[9, 6, 7, 9, 6, 2, 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], [1,124)입니다. ], [2,95], [3,47], [4,45], [5,92], [6,47], [7,92], [8,124]] .

                          y@\

y교환 된 인수 ( @) 와 음역 ( )을 사용하여 누적 (즉, 모든 중간 단계 표시) 축소를 수행합니다 . 첫 번째 단계에서, 예를 들어, 원래 배열의 각 1124로 대체합니다 . 이는 문자 | .

                             FỌ

결과를 평평하게하고 모든 코드 포인트를 해당 ASCII 문자로 바꿉니다. 모든 단계에서,이 코드 포인트 일부 인쇄 할 수없는 문자를 생성합니다 (1)9 .

                               »⁶

공백 문자로 문자 별 최대 값을 가져와 인쇄 할 수없는 모든 문자를 공백으로 바꿉니다.

                                 s4Y

생성 된 문자열을 길이가 4 인 청크로 분할하고 구분자로 줄 바꿈과 결합합니다.


2
와. 그냥 와우. +1
ElPedro

그러나 잠깐, 바이트입니다?
Leif Willerts

1
@LeifWillerts 예. 인쇄 할 수없는 문자를 피하기 위해 Jelly는 이해하는 256자를 각각 1 바이트로 인코딩하는 사용자 지정 코드 페이지를 사용합니다. 헤더 의 바이트 링크가이를 가리 킵니다.
Dennis

죄송합니다. 링크를 클릭하지 않으
셔서

그것은 설명만큼이나 승리합니다. 존경.
ElPedro

13

자바 (ES6) 119 116 96 92 91 바이트

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


좋은 대답입니다. 나는 자바 스크립트가있을 것 같은 느낌이
들었다

여러 번 수정하여 죄송합니다. 나는 두 번째 커피 전에 게시해서는 안됩니다.
Arnauld

여러 번 편집하는 것이 좋습니다. 바이트 수가 줄어드는 것을 보게되어 기쁩니다.
ElPedro

답변에 동일한 코드 사본이 두 개 있다는 점이 있습니까?
Neil

@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

멍청한 배치 |인용 규칙 ... |변수에 원하는 경우 세 ^s 로 인용해야 하므로 @대신 사용하고 출력에 대체 하는 것이 더 저렴합니다. 이를 달성하려면 왼쪽 벽부터 시작해야합니다. 첫 번째 줄에는 후행 공백이 있습니다. echo(때문에 사용 r, c그리고 f변수는 비어있을 수 있고 우리가 원하지 않는 ECHO is off.인쇄.

편집 : 마지막 부분에 폴 스루를 사용하여 12 바이트를 저장했습니다. for루프를 사용하여 각 부분을 인쇄 하여 3 바이트를 절약했습니다. 이제 |변수에 s를 사용하여 코드를 약간 쉽게 읽을 수 있습니다. @대신 명시 적 문자를 사용하여 4 바이트를 절약했습니다 @echo off. 왼쪽 벽부터 시작하면 여전히 가장 적은 바이트가 필요하다고 생각합니다.


2
짧은 수 있지만, 실제로 배치 한에서 그것을 할 관리 나에서 upvote에를 얻을하지 않을 수 있습니다
ElPedro을

echo:더 표준이지만 echo(언어 기능을 남용하는 것처럼 보이므로 +1입니다.
wizzwizz4

@ wizzwizz4 echo:는 모호한 일부 경우에 실패하지만에 대한 실패 사례는 모르겠습니다 echo(.

@ wizzwizz4 foo.bat현재 디렉토리에 파일이 있으면 echo(\..\foo.batechos \..\foo.bat지만 echo:\..\foo.bat실행 foo.bat합니다.

@ 닐 왜 그런지 아십니까? echo:.\foo.bat대신 그 효과가있는 것 같습니다 . 루트 디렉토리의 "UP"이 현재 디렉토리 인 디렉토리 스택 결함 때문입니까?
wizzwizz4

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 코드에.
Level River St

답변 해주셔서 감사합니다. 나는 C가 경쟁하기를 기대하지 않았다. 이것은 정말 인상적이고 +1의 가치가 있습니다
ElPedro

6

/// , 112 바이트

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

온라인으로 사용해보십시오!


나는 112 바이트의 단일 바이트를 이해하지 못하지만 온라인에서 그것을 시도하고 그것은 주석에 정확히 그렇게합니다 +1
ElPedro

1
@ElPedro 헤더의 링크를 클릭하면 개념을 이해할 수 있지만 그렇지 않은 경우 다시 연락하십시오. 점점 더 많은 사람들이 언어를 이해할 수 있기를 원하며, 그렇지 않으면 슬픈 사실입니다. 나는 모든 사람들이 ///를 이해하게 할 수 없다는 것을 안다 (일부 사람들은 단지 음식과 물을 원한다 . ///과 PPCG는 불가능하지는 않지만).
Outgolfer Erik

감사. 배울 언어가 너무 많습니다! 나는 확실히 살펴볼 것이다. 나는 아직도 파이썬과 로터스 포뮬러에서 골프를 치고 있지만 더 많이 들어가고 있습니다. 더 많은 언어가 더 재미 있습니다. 귀하의 기여에 다시 한번 감사드립니다 :)
ElPedro

2

PHP, 98 95 바이트

Arnauld의 솔루션에서 영감을 얻은

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

참고 : 첫 번째 코드 줄에는 후행 공백이 있습니다.


@Titus가 좋습니다. 후행 공백이 허용됩니다.
ElPedro

@ElPedro : 자동 편집을 위해 편집자를 구성한 사람들이 있습니다. 그것이 내가 언급 한 이유입니다.
Titus

1

GD가있는 PHP, 348 338 바이트 (경쟁 불가)

정확히 무엇을 요청했는지는 아니지만 ...

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.