산타 클로스의 집
참고 : 이것은 제가 시도한 첫 번째 도전입니다. 그러나 샌드 박스를 통해 문제가 발생하면 문제를 발견하지 말고 그냥 개선하지 말고 개선 할 수 있도록 의견을 남겨주십시오.
배경
종이에서 펜을 들어 올리거나 선을 두 번 쓰지 않고 지붕과 십자가가있는 상자를 가운데로 그리는 것이 어려운 어린이 퍼즐이 있습니다.
독일에서는 “das Haus des Nikolaus”또는 “산타 클로스의 집”으로 알려져 있습니다. 솔직히 우리가 전화했던 것을 기억할 수 없습니다. 퍼즐에 익숙하지 않은 사람은 여기에서 자세한 내용을 확인할 수 있습니다 .
집의 ASCII 예술 표현은 다음과 같습니다.
/\
/__\
|\/|
|/\|
----
도전
원하는 언어로 산타 클로스의 집을 그릴 수있는 프로그램이나 기능을 작성하십시오.
너무 쉬운 소리? 여기에 캐치가 있습니다. 또한 그림의 각 단계를 출력하고 퍼즐 규칙을 준수해야합니다. 프로그램은 입력 할 필요가 없습니다. 완성 된 집은 위와 같이 정확하게 보여야합니다.
위의 사이트에 따르면 44 가지 가능한 솔루션이 있습니다. 당신은 그들 중 하나를 사용할 수 있습니다. 이것은 ASCII 아트 챌린지이므로 솔루션을 계산할 필요는 없지만 그립니다.
산출
44 개 솔루션 중 하나의 필수 출력 예는 다음과 같습니다.
----
\
\
----
__
\
\
----
\
__\
\
\
----
/\
/__\
\
\
----
/\
/__\
|\
| \
----
/\
/__\
|\/
|/\
----
/\
/__\
|\/|
|/\|
----
규칙
- 요구 사항을 더 명확하게하기 위해 각 예상 출력 사이에 줄 바꿈 1 개를 추가했습니다. 이것은 선택 사항입니다. 각 출력 사이에는 빈 줄이 허용됩니다.
- 출력은 위에 표시된대로 문자 /, \,-, _ 및 공백으로 만 구성되어야합니다. 후행 공백이 허용됩니다.
- 도면의 각 선은 이전 선의 끝부터 계속되어야하며 어떤 선도 반복 할 수 없습니다.
- 표준 허점은 금지되어 있습니다.
- 위 링크에서 언급 된 운율을 출력 할 필요는 없습니다.
- 이것은 코드 골프이므로 바이트 단위의 최단 답변이 승자가됩니다.
결과
게시 한 모든 사람에게 큰 답변과 감사와 존경. 나는 가장 낮은 바이트 수를 말했지만 그뿐만 아니라 코드에 대한 훌륭한 설명을 위해 최고의 대답으로 표시했습니다. 멋진 @Dennis.
답변
젤리 , 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
교환 된 인수 ( @
) 와 음역 ( )을 사용하여 누적 (즉, 모든 중간 단계 표시) 축소를 수행합니다 . 첫 번째 단계에서, 예를 들어, 원래 배열의 각 1 을 124로 대체합니다 . 이는 문자 | .
FỌ
결과를 평평하게하고 모든 코드 포인트를 해당 ASCII 문자로 바꿉니다. 모든 단계에서,이 코드 포인트 일부 인쇄 할 수없는 문자를 생성합니다 (1) 에 9 .
»⁶
공백 문자로 문자 별 최대 값을 가져와 인쇄 할 수없는 모든 문자를 공백으로 바꿉니다.
s4Y
생성 된 문자열을 길이가 4 인 청크로 분할하고 구분자로 줄 바꿈과 결합합니다.
답변
자바 (ES6) 119 116 96 92 91 바이트
for(i=8;i--;)console.log(`834
3554
2610
2160
7777`.replace(/./g,c=>'|/|/\\_\\- '[c<i?8:c]))
답변
배치, 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
. 왼쪽 벽부터 시작하면 여전히 가장 적은 바이트가 필요하다고 생각합니다.
답변
C, 118 바이트
main(){char *p,n;for(n='B';n++<'J';)for(p="ZFEAFDDEAGCHIAGHCIABBBBAA";*p;p++)putchar(" \n-\\_\\/|/|"[(*p<n)**p&15]);}
답변
/// , 112 바이트
/!/\/\///*/----
!@/\\\\!$/ @@!^/
*@\/@@
@\/__@@
/*@
$
*__
$
$
*$
__@
$
$^$
$^|@
|$^|@\/
|\/@^|@\/|
|\/@|
*
답변
PHP, 98 95 바이트
Arnauld의 솔루션에서 영감을 얻은
for($i=8;$i--;)for($p=24;$p--;)echo"|/|/\\_\\-
"[($c="977779061290162945539438"[$p])<$i?8:$c];
참고 : 첫 번째 코드 줄에는 후행 공백이 있습니다.
답변
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
려면 원하는 너비로 변경 하십시오.