Lục giác nhúng!


18

Nhiệm vụ của bạn: được cung cấp một số nguyên n, tạo ra một hình lục giác được nhúng theo các quy tắc dưới đây, đến độ sâu thứ n.

Một hình lục giác nhúng có hình dạng cơ bản của điều này: ( n=0)

 __      
/  \
\__/

Các hình lục giác nhúng n=1n=2:

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

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

Chiều dài của mỗi bên gấp 2 lần chiều dài của cùng một bên trong độ sâu hai lần trước. Mặt trên và mặt dưới dài 2 ký tự n=0và phần còn lại bắt đầu dài 1 ký tự. Độ dài không phải từ trên xuống dưới phải 2^ndài ( OEIS: A000079 ) và các cạnh trên và dưới phải tuân theo quy tắc 2^(n+1)(cùng OEIS).

Các hình lục giác hiện tại được lập chỉ mục 0, bạn có thể chọn sử dụng chỉ mục 1 nếu bạn muốn.

Đây là , vì vậy câu trả lời ngắn nhất sẽ thắng!


@LuisMendo Được rồi, tôi sẽ đổi tên.
Đồng chí SparklePony

Có thể khó xử lý đầu vào lớn (ví dụ 64). Có giới hạn nnào không?
Matthew Roh

@SIGSEGV Không có giới hạn cho n.
Đồng chí SparklePony

1
Sẽ thích thú khi thấy câu trả lời trong Hexagony :))
Ông Xcoder

1
Heh, đồ họa rùa của trình đệ trình đường cong Koch của tôi cũng có thể làm điều này (chỉ chức năng đầu tiên thay đổi). Chắc chắn là quá lâu cho việc này, mặc dù vậy :)
rjan Johansen

Câu trả lời:


10

Than , 40 29 byte

11 byte được lưu nhờ @Neil bằng cách thay đổi vòng lặp while thành vòng lặp for giữa các thủ thuật khác

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

Hãy thử trực tuyến!

Giải thích (lỗi thời)

Chương trình này bắt đầu với việc tạo ra các hình lục giác lớn nhất, và sau đó thực hiện từng cái nhỏ hơn trong một vòng lặp (lập chỉ mục 1). Để tham khảo, αlà số đầu vào, βlà biến chứa 2^(α-1)ιlà biến lặp trong vòng lặp.

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

Tôi nhận thấy không có "Xin chào, Thế giới!" chương trình cho Than chưa. Bạn nên thêm nó.
mbomb007

@ mbomb007 Sẽ không phải là một bản sao của câu trả lời tầm thường "ngôn ngữ này in tệp nguồn của nó nếu nó không chứa lệnh"?
Neil

Tôi đã lưu một số byte khi tôi nhận ra nó ×_X²ιgiống như ×__βvà một số byte khác bằng cách chuyển đổi của bạn thành a , điều này cũng tránh việc phải lưu trữ số đầu vào. Hãy thử trực tuyến! .
Neil

@Neil Cảm ơn, điều đó khá gọn gàng :)
Kritixi Lithos

5

Haskell , 230 217 207 byte

BIÊN TẬP:

  • -13 byte: @xnor thấy rằng tôi #có thể là chính max.
  • -10 byte: Và cũng có zipWithpcó thể được sáp nhập vào một ?nhà điều hành, và tôi muốn (bằng cách nào đó!) Reimplemented replicate.

mmất một Integervà trả về a 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

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

  • mlà chức năng chính. Nó sử dụng &để tạo ra các hình lục giác với phần đệm thích hợp, sau đó gập chúng lại với nhau o.
  • l&ttạo ra một hình lục giác nhỏ có chiều dài cạnh t, được đệm bên trong một hình lớn có chiều dài cạnh l, như một danh sách các Stringdòng.
    • a là dòng trên cùng của hình lục giác, với dấu gạch dưới.
    • blà một danh sách các dòng khác ở nửa trên của hình lục giác. Các đường bđược định tâm trong phần đệm, là hình chữ nhật; Điều này cho phép bước tiếp theo để làm việc.
    • Nửa dưới của hình lục giác được aphủ lên trên cùng bvới o, sau đó đảo ngược (cả thứ tự của dòng và trong mỗi dòng).
  • cnhận hai đối số, một danh sách dài và một chuỗi, và tạo ra một chuỗi có nhiều bản sao của mỗi nhân vật trong bản gốc như độ dài tương ứng, ví dụ c[1,3,2]"abc" == "abbbcc". Nó được sử dụng &để tạo ra các dòng.
  • o lấy hai đối số biểu thị các hình ảnh làm danh sách các dòng và chồng lên lớp thứ nhất, nhỏ hơn trên đầu dòng thứ hai.
    • Nó được sử dụng cả để kết hợp các hình lục giác và để thêm đáy vào mỗi hình lục giác.
    • Về cơ bản, nó hoạt động bằng cách sử dụng ?hai lần để đệm hình ảnh đầu tiên với vô số khoảng trắng cả xuống và phải, sau đó nén các ký tự tương ứng với nhau max, chọn ký tự không phải không gian nếu có.
  • (f?e)l mđệm một danh sách lbằng cách nối thêm vô số phần tử 'e', ​​sau đó nén danh sách kết quả và danh sách mvới fhàm.

1
Giải pháp tốt đẹp! Tôi nghĩ rằng (#)có thể max.
xnor

1
Việc nén có thể được kết hợp với pđể lưu byte : o=max?' '?"";f?e=z f.(++repeat e). Có thể ngắn hơn pointfree.
xnor

2
(\n->(<$[1..n]))replicate.
xnor

@xnor replicate? Bây giờ chỉ là xấu hổ. Tôi đã quá quen <$[1..n]hoặc [1..n]>>gần như luôn luôn chiến thắng. Tuy nhiên, tôi không thấy làm thế nào để rút ngắn ?hơn nữa. Tôi đã cố gắng làm cho không có pđiểm và ++chỉ là sai, làm nổ tung mọi thứ với flip.
Ørjan Johansen

3

JavaScript (ES6), 258 byte

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>

Giải thích: Đối với các hình lục giác sau hình đầu tiên, hình lục giác trước được tạo và đệm đầu tiên ở mỗi bên (điều này phụ thuộc vào đầu ra là một hình chữ nhật). (Đối với tiêu đề đầu tiên, một số phần đệm giả được tạo.) Các cạnh trên và trên của hình lục giác được tạo và tất cả các khoảng trắng được hợp nhất với hình lục giác trước đó. . Chăm sóc phải được thực hiện để trả về đầu ra hình chữ nhật, bao gồm một dòng mới, để đệ quy hoạt động.


Vì vậy, bạn đang chứng minh rằng cái này, cái Teflon và Deep Dish Pizza, tất cả đều có cấu trúc thực sự giống nhau? Thật là gọn gàng.
admBorkBork

1
@AdmBorkBork Tôi có một vài câu trả lời khác làm được điều đó; những đường chéo /đó là phổ biến trong nghệ thuật ASCII và replacephương pháp này là một cách tương đối rẻ để tạo ra chúng trong JavaScript.
Neil

1<<n>>1: Đối xứng đẹp ;-)
Luke

@Luke Tôi có thể thay đổi biến thành, vnhưng thật đáng buồn 1là không đối xứng trong bất kỳ phông chữ thông thường nào của tôi.
Neil

2

PHP, 337 byte

0 lập chỉ mục

$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ãy thử trực tuyến!

Mở rộng

$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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.