카테고리 보관물: 코딩

코딩

산타 클로스의 집 클로스의 집을 그릴

산타 클로스의 집

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

배경

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

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

                             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려면 원하는 너비로 변경 하십시오.