รูปหกเหลี่ยมแบบฝัง!


18

งานของคุณ: ได้รับจำนวนเต็มnสร้างรูปแบบหกเหลี่ยมที่ฝังตัวตามกฎด้านล่างเพื่อความลึกที่ n

รูปหกเหลี่ยมที่ฝังตัวมีรูปร่างพื้นฐานของสิ่งนี้: ( n=0)

 __      
/  \
\__/

รูปหกเหลี่ยมแบบฝังn=1และn=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 :))
Mr. Xcoder

1
เฮ้กราฟิกเต่าของการส่งโค้ง Koch ของฉันก็ทำได้เช่นกัน (เปลี่ยนฟังก์ชั่นแรกเท่านั้น) แม้ว่าจะยาวเกินไปแน่นอน :)
Ørjan Johansen

คำตอบ:


10

Charcoal , 40 29 ไบต์

บันทึก 11 ไบต์ด้วย @Neil ด้วยการเปลี่ยน while loop เป็น for-loop ท่ามกลางเทคนิคอื่น ๆ

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

ลองออนไลน์!

คำอธิบาย (ล้าสมัย)

โปรแกรมนี้เริ่มต้นด้วยการสร้างรูปหกเหลี่ยมที่ใหญ่ที่สุดจากนั้นจึงสร้างรูปหกเหลี่ยมที่เล็กลงทีละหนึ่งในขณะที่ลูป (ดัชนี 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

ฉันสังเกตว่าไม่มี "สวัสดีโลก!" โปรแกรมสำหรับ Charcoal คุณควรเพิ่มมัน
mbomb007

@ mbomb007 จะไม่ซ้ำซ้อนหรือไม่ "ภาษานี้พิมพ์ไฟล์ต้นฉบับหากไม่มีคำสั่ง"
Neil

ฉันบันทึกบางไบต์เมื่อฉันรู้ว่า×_X²ιเป็นแบบเดียวกัน×__βและอีกหลายไบต์โดยการแปลงของคุณเป็น a ซึ่งหลีกเลี่ยงการต้องเก็บหมายเลขอินพุต ลองออนไลน์! .
Neil

@Neil ขอบคุณที่เป็นระเบียบสวย :)
Kritixi Lithos

5

Haskell , 230 217 207 ไบต์

แก้ไข:

  • -13 ไบต์: @xnor เห็นว่าฉัน#เป็นmaxได้
  • -10 ไบต์: และยังรวมถึงสิ่งนั้นzipWithและpสามารถรวมเข้ากับ?โอเปอเรเตอร์replicateได้

mใช้เวลาและผลตอบแทนIntegerString

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หนึ่งขนาดใหญ่lเป็นรายการของStringเส้น
    • a เป็นบรรทัดบนสุดของรูปหกเหลี่ยมโดยมีเครื่องหมายขีดล่าง
    • bคือรายการของเส้นอื่น ๆ ในครึ่งบนของรูปหกเหลี่ยม เส้นของbจะอยู่กึ่งกลางใน padding ซึ่งเป็นรูปสี่เหลี่ยมผืนผ้า สิ่งนี้จะช่วยให้ขั้นตอนต่อไปทำงานได้
    • ครึ่งล่างของรูปหกเหลี่ยมจะaซ้อนทับด้านบนbด้วยoแล้วกลับรายการ (ทั้งคำสั่งของบรรทัดและภายในแต่ละบรรทัด)
  • cc[1,3,2]"abc" == "abbbcc"เวลาสองขัดแย้งรายการของความยาวและสตริงและสร้างสตริงที่มีเป็นจำนวนมากสำเนาของตัวละครแต่ละตัวเดิมเป็นระยะเวลาที่สอดคล้องกันเช่น มันถูกใช้ใน&การสร้างเส้น
  • o รับอาร์กิวเมนต์สองตัวที่แทนรูปภาพเป็นรายการของบรรทัด
    • มันถูกใช้ทั้งในการรวมรูปหกเหลี่ยมและเพื่อเพิ่มด้านล่างให้กับรูปหกเหลี่ยมแต่ละอัน
    • มันใช้งานได้ดีโดยใช้?สองครั้งเพื่อวางรูปภาพแรกที่มีช่องว่างมากมายทั้งด้านล่างและด้านขวาจากนั้นบีบซิปอักขระที่สอดคล้องกันเข้าด้วยกันmaxซึ่งเลือกอักขระที่ไม่ใช่ช่องว่างหากมี
  • (f?e)l mเพิ่มรายการlโดยการต่อท้ายองค์ประกอบ 'e' จำนวนมากจากนั้นบีบรายการผลลัพธ์และรายการmด้วยfฟังก์ชัน

1
ทางออกที่ดี! ผมคิดว่าอาจจะเป็น(#) max
xnor

1
ซิปสามารถใช้ร่วมกับการบันทึกไบต์:p o=max?' '?"";f?e=z f.(++repeat e)อาจเป็นจุดที่สั้นกว่า
xnor

2
(\n->(<$[1..n]))replicateเป็น
xnor

@xnor replicate? ตอนนี้มันเป็นเรื่องน่าอาย ฉันเพิ่งชินกับ<$[1..n]หรือ[1..n]>>เกือบจะชนะเสมอ อย่างไรก็ตามฉันไม่เห็นวิธีย่อให้สั้นลง?อีก ฉันพยายามแล้วทำให้ppointfree และเป็นเพียงในจุดที่ผิดเป่าขึ้นสิ่งที่มี++ flip
Ørjan Johansen

3

JavaScript (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: สมมาตรดี ;-)
ลุค

@ ลุคฉันสามารถเปลี่ยนตัวแปรเป็นพูดvแต่น่าเศร้าที่1ไม่สมมาตรในแบบอักษรปกติของฉัน
Neil

2

PHP, 337 ไบต์

0 การจัดทำดัชนี

$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.