임베디드 육각형!


18

당신의 작업 : 정수가 주어지면 n아래 규칙에 따라 n 번째 깊이까지 육각형 패턴을 생성하십시오.

내장 육각형의 기본 모양은 다음과 같습니다. ( n=0)

 __      
/  \
\__/

임베디드 육각형 n=1n=2:

  ____    
 /  \ \
/\__/  \
\      /
 \____/

    ________    
   /  \ \   \
  /\__/  \   \
 /\      /    \
/  \____/      \
\              /
 \            /
  \          /
   \________/

각 변의 길이는 이전 깊이의 두 배인 같은 변의 길이의 2 배입니다. 상단과 하단의 길이는 2 자이며 n=0나머지는 1 자입니다. 상단이 아닌 측면의 길이는 2^n길어야하고 ( OEIS : A000079 ) 상단과 하단이 규칙을 따라야합니다 2^(n+1)(동일한 OEIS).

현재 육각형은 0- 색인이며 원하는 경우 1- 색인을 사용하도록 선택할 수 있습니다.

이것은 이므로 가장 짧은 답변이 이깁니다!


@LuisMendo 좋아요, 이름을 바꾸겠습니다.
동지 SparklePony

큰 입력을 처리하기 어려울 수 있습니다 (예 : 64). 제한이 n있습니까?
Matthew Roh

@SIGSEGV n에는 제한이 없습니다.
동지 SparklePony

1
) : Hexagony의 답변을보고 즐겁게 될 것이다
씨 Xcoder에게

1
허, 내 Koch 곡선 제출의 거북이 그래픽 도이 작업을 수행 할 수 있습니다 (첫 번째 기능 만 변경됨). 그럼에도 불구하고 확실히 너무 길지만 :)
Ørjan Johansen

답변:


10

, 40 29 바이트

@Neil 덕분에 while 루프를 다른 트릭 중에서 for-loop로 변경하여 11 바이트 절약

FN«AX²ιβ×__β↓↘β←↙β↑←×__β↖β→↗β

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

설명 (오래됨)

이 프로그램은 가장 큰 육각형을 생성하는 것으로 시작한 다음 작은 루프를 while 루프 (1 인덱스)에서 하나씩 하나씩 수행합니다. 참고로, α입력 번호 는 루프의 반복 변수 β를 포함 2^(α-1)하고 있는 변수입니다 ι.

Nα                        # Take input and store in α
Wα«                       # While α do:
 ×_X²ι                    #  Write "_"*(2**ι); this forms the top edge of the hexagon
 ↓                         #  Go down
 AX²⁻ι¹β                 #  Assign 2**(ι-1) to β
 ↘β←                       #  Write \ β times in a SE direction (top right edge) and then go left
 ↙β↑                       #  Write / β times in a SW direction (bottom right edge) and then go up
 ←×_X²ι                   #  Write the bottom edge
 ↖β→↗β                    #  Just like before, write the top and bottom left edges
 A⁻α¹α                    #  Decrement α
                          # Now the pointer is at the top left corner of the hexagon,
                          # from where the other smaller hexagons will soon be generated

"Hello, World!"가 없다는 것을 알았습니다. 숯을위한 프로그램. 추가해야합니다.
mbomb007

@ mbomb007 "사소한 명령이 없으면이 언어는 소스 파일을 출력합니다"라는 대답의 단순한 사본이 아닙니까?
Neil

×_X²ι와 같은 것을 깨달았을 때 약간의 바이트를 절약 하고 입력 숫자를 저장하지 않아도되는 으로 ×__β변환하여 더 많은 바이트를 절약했습니다 . 온라인으로 사용해보십시오! .
Neil

감사합니다 @Neil, 그 :) 멋지다
Kritixi LITHOS

5

하스켈 , 230 (217) 207 바이트

편집하다:

  • -13 바이트 : @xnor는 내 것이 #될 수 있음을 보았습니다 max.
  • -10 바이트 : 그리고 또한 zipWithp로 통합 될 수있는 ?연산자, 내가 (어떻게 든!) 다시 구현 거라고 replicate.

m를 가져와 a Integer를 반환합니다 String.

m n=unlines.foldr1 o$((2^n)&).(2^)<$>[0..n]
l&t|a<-c[l,2*t]" _",b<-[c[l-i,1,2*t+2*i-2,1,l-i]" / \\ "|i<-[1..t]]=a:b++r(r<$>o[a]b)
c=(concat.).z replicate
o=max?' '?""
f?e=z f.(++repeat e)
r=reverse
z=zipWith

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

작동 원리

  • m주요 기능입니다. 그것은 사용 &후와 함께 주름, 적절한 패딩과 육각형을 생성 o.
  • l&t측면 길이의 작은 육각형을 생성하고 , 목록의 t측면 길이 중 큰 것을 안쪽으로 채 웁니다 . lString
    • a 밑줄이있는 육각형의 맨 위 줄입니다.
    • b육각형의 위쪽 절반에있는 다른 줄의 목록입니다. 의 선은 b패딩의 중심에 있으며 사각형입니다. 이렇게하면 다음 단계가 작동합니다.
    • 육각형의 아래쪽 절반이 와 a위에 겹친 다음 반전됩니다 (두 줄의 순서와 각 줄 내).bo
  • c는 길이 목록과 문자열이라는 두 개의 인수를 사용하여 원본에있는 각 문자의 사본이 해당 길이만큼 많은 문자열을 생성합니다 (예 :) c[1,3,2]"abc" == "abbbcc". &라인을 생성하는 데 사용됩니다 .
  • o 행 목록으로 그림을 나타내는 두 개의 인수를 취하고 첫 번째 작은 행을 두 번째 행 위에 오버레이합니다.
    • 육각형을 결합하고 각 육각형에 바닥을 추가하는 데 사용됩니다.
    • 본질적으로 ?두 번 사용 하여 첫 번째 그림을 아래쪽과 오른쪽으로 무한히 많은 공간으로 채운 다음 해당하는 문자를 함께 압축하여 max공백이 아닌 문자가있는 경우 선택합니다.
  • (f?e)l ml무한히 많은 'e'요소를 추가 하여 목록 을 채우고 결과 목록과 목록 mf함수 로 압축합니다 .

1
좋은 해결책! 나는 (#)될 수 있다고 생각 한다 max.
xnor April

1
압축은 p바이트를 절약하기 위해 결합 될 수 있습니다 : o=max?' '?"";f?e=z f.(++repeat e). 더 짧을 수 있습니다.
xnor

2
(\n->(<$[1..n]))입니다 replicate.
xnor April

@xnor replicate? 이제는 부끄러운 일입니다. 나는 너무 익숙 <$[1..n]하거나 [1..n]>>거의 항상 승리합니다. 그러나 ?더 짧아지는 방법을 모르겠습니다 . 나는 이미 ppointfree를 만들려고 시도 했지만가 ++잘못되었습니다 flip.
Ørjan Johansen

3

자바 스크립트 (ES6), 258 바이트

f=(n,s=` `.repeat(1<<n),p=(n?f(n-1):`


`).replace(/(.*)\n/g,s+`$1 `+s)+s,t=`_`.repeat(2<<n))=>(s+t+s+`
`+s.replace(/ /g,"$'/$'$'  $`$`$`$`\\$'\n")).replace(/ /g,(c,i)=>p[i+(1<<n>>1)])+s.replace(/ /g,"$`\\$`$`  $'$'$'$'/$`\n").replace(/ +\/( *)\n$/,t+`/$1
`)
<input type=number min=0 oninput=o.textContent=f(+this.value)><pre id=o>

설명 : 첫 번째 이후의 육각형의 경우, 이전 육각형이 먼저 생성되고 각면에 채워집니다 (이는 출력이 직사각형 임). 첫 번째 제목의 경우 더미 패딩이 생성됩니다. 육각형의 상단과 상단이 생성되고 모든 공간이 이전 육각형과 병합됩니다. (육각형을 정렬하려면 약간의 트릭이 있습니다. 여분의 여백이 허용되면 더 쉬울 것입니다.) 육각형의 밑면이 위쪽과 비슷하게 생성되고 육각형의 바닥이 채워집니다. 재귀가 작동하려면 후행 줄 바꿈을 포함하여 직사각형 출력을 반환하도록주의를 기울여야합니다.


테프론과 딥 디쉬 피자가 모두 비슷한 구조라는 것을 증명하고 있습니까? 좀 깔끔합니다.
AdmBorkBork

1
@AdmBorkBork 그에 대한 몇 가지 다른 답변이 있습니다. 이 대각선 /은 ASCII 기술에서 널리 사용되며이 replace방법은 JavaScript 에서 대각선 을 생성하는 비교적 저렴한 방법입니다.
Neil

1<<n>>1: Nice symmetry ;-)
Luke

@Luke 변수를 변경할 수 는 v있지만 슬프게도 1일반적인 글꼴에서는 대칭이 아닙니다.
Neil

2

PHP, 337 바이트

인덱싱

$h=array_fill(0,1+2*$v=2**($c=$argn),str_pad("",4*$v));for(;1+$c;$c--)for($i=0;$i<$e=2**$c*2+1;$i++){$z=$e-$i<2;$y=$i&&$i<$e/2;$x=$i>=$e/2&$i<$e-1;$h[$i]=substr_replace($h[$i],$s=str_pad(!$y?$z|$x?"\\":"":"/",$e-1+$z-$y+$y*$i*2-$x+$x*2*($e-$i),$z|!$i?"_":" ").(!$y?$z|$x?"/":"":"\\"),$v-$z-$y*$i-$x*($e-$i),strlen($s));}echo join("\n",$h);

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

넓히는

$h=array_fill(0,1+2*$v=2**($c=$argn),str_pad("",4*$v)); # fill array with maximal width
for(;1+$c;$c--)  # greatest hexagon to lowest
for($i=0;$i<$e=2**$c*2+1;$i++){ # loop through the rows
    $z=$e-$i<2;$y=$i&&$i<$e/2;$x=$i>=$e/2&$i<$e-1; # booleans last first ad second half
    $h[$i]=substr_replace($h[$i], # replace substring
    $s=str_pad(
        $z?"\\":($y?"/":($x?"\\":"")),
        $e-1+$z-$y+$y*$i*2-$x+$x*2*($e-$i),
        $z|!$i?"_":" "
        ).(!$z?!$y?$x?"/":"":"\\":"/"), # with string for smaller hexagon
    $v-$z-$y*$i-$x*($e-$i), # at offset
    strlen($s));
}
echo join("\n",$h); # Output
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.