วาดรูปหกเหลี่ยม ASCII ของความยาวด้าน n

Jan 06 2021

รับจำนวนเต็มบวก\$n\$ส่งออก ASCII หกเหลี่ยมที่มีความยาวด้านทแยงมุม\$n\$ตามภาพ (โปรดทราบว่ามี\$2n\$ _ อักขระที่ขอบด้านบน)

ตัวอย่าง:

\$n = 1\$

 __
/  \
\__/

\$n = 2\$

  ____
 /    \
/      \
\      /
 \____/

\$n = 5\$

     __________
    /          \
   /            \
  /              \
 /                \
/                  \
\                  /
 \                /
  \              /
   \            /
    \__________/

เป็นต้น

รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ ใช้วิธีการอินพุต / เอาต์พุตปกติ

คำตอบ

11 Razetime Jan 06 2021 at 16:01

ผ้าใบ , 15 9 ไบต์

 _;1*⁸/∔╬

ลองดูที่นี่!

-6 ไบต์หลังจากแก้ไขโปรแกรม

วาดหนึ่งในสี่ของรูปหกเหลี่ยมและรูปสี่เหลี่ยม palindromizes

9 xnor Jan 06 2021 at 17:16

Python 2 , 92 ไบต์

k=n=input()
while 1:a=k^k>>n;print" "*a+"\/_"[k/n-2]+"_ "[-n<k<n]*2*(2*n+~a)+"\_/"[k/n];k-=1

ลองออนไลน์!

6 Razetime Jan 06 2021 at 15:54

ถ่าน 14 ไบต์

←×_θ↖θ→↗θ×_θ‖M

ลองออนไลน์!

+1 ไบต์แก้ไขจาก ASCII-Only

วาดครึ่งหนึ่งของรูปหกเหลี่ยมและสะท้อนมัน

6 AZTECCO Jan 07 2021 at 15:50

C (gcc) , 119109ไบต์

a,i,j;f(n){for(i=a+=a=j=n*2;~j;)putchar(!i--?i=a,j--,13:i%(n*3)<n|j%(n*2)?(i-~j-n)%a?(i-j+n)%a?32:92:47:95);}

ลองออนไลน์!

  • บันทึก 2 ขอบคุณ @ceilingcat

ตารางด้านล่างไม่ได้รับการอัปเดตดังนั้นค่าจึงอาจแตกต่างกันได้ แต่แนวคิดคือ:

  • เรามีเส้นขนาน 2 คู่
        . .
_______.______.________   
  | / \ | .
. | / \ | .
 . | / \ |.
  | / \ |
  | \ / |.
 . | \ / | .
. | \ / |
__ | ___ \ ________ / ___ | ___   
  | . .

เราวนซ้ำ x, y จากขนาดเป็น 0 และเรารวมเข้าด้วยกันเพื่อตรวจสอบว่าควรพิมพ์ a / หรือไม่เราลบเพื่อตรวจสอบ \ เราใช้โมดูโลเพื่อตรวจสอบทั้งสองแนว

    ฉัน 65432109876543210. j
 i + jn ________ 8 
13 + 7-4 => / \ 7 
14 + 6-4 / \ 6 
15 + 5-4 / \ 5 
      / \ 4 
      \ 1 + 3-4 => / 3
       \ 2 + 2-4 / 2
        \ 3 + 1-4 / 1
         \ ________ / 0
5 NahuelFouilleul Jan 07 2021 at 03:22

Perl 5 ( -p), 102 ไบต์

s/_+/__$&/g,s/^|$/ /gm,s/^ *\S /$& /gm,s-( +)\\ -$&/ $1 \\ \\ $1 /
- for($\=' __ / \ \__/')x--$_}{

ลองออนไลน์!

-pและ}{ในตอนท้ายเป็นเคล็ดลับในการพิมพ์ตัวคั่นเร็กคอร์ดเอาต์พุต$\ในตอนท้ายเท่านั้น ใช้ได้กับเรกคอร์ดอินพุตเดียวเท่านั้น ส่วนหัวจะใช้เพื่อพิมพ์ทั้งหมดในลิงค์เดียว

$\=' __ 
/  \
\__/'   # output record separator initialized with hexagon (size 1)

s/_+/__$&/g,s/^|$/ /gm,s/^ *\S /$& /gm,s-( +)\\ -$&/ $1 \\ \\ $1 /
- # regexes to increase the hexagon by 1

for .. --$_ # to repeat n-1 times where n is the input
5 WheatWizard Jan 08 2021 at 23:56

Haskell 150 ไบต์

r=reverse
m(o:c:k)=o:c:c:c:k++" "
f 1=[["\\  /","__ "],["/__\\"]]
f n|[w:i,j]<-map m<$>f(n-1),_:_:k<-r$m w=[r k:w:i,k:j]
h[i,j]=unlines$r<$>r i++j
h.f

ลองออนไลน์!

คำตอบนี้แบบเรียกซ้ำมากขึ้น ความเด็ดขาดของความท้าทายนี้ทำให้สิ่งนี้น่าหงุดหงิด

คำอธิบาย

คำตอบนี้ยากที่จะอธิบาย ความท้าทายก็คืออย่างที่ฉันพูดไปแล้วโดยพลการในสองสามวิธีดังนั้นรหัสจึงเป็นเพียงรังของสัญลักษณ์

ความคิด

แนวคิดของโปรแกรมที่นี่คือการสร้างสองครึ่ง นั่นคือเมื่อคำนวณรูปหกเหลี่ยมที่ n เราจะได้สองซีกสำหรับรูปหกเหลี่ยม n-1 และใช้มันเพื่อสร้างให้ใหญ่ที่สุดถัดไป

มีข้อแม้อยู่บ้าง เราสร้างครึ่งบนขึ้น - ลงและเราสร้างทั้งสองซีกที่สะท้อนจากซ้ายไปขวา เราทำเพราะสะดวกที่จะทำด้วยวิธีนี้ ไม่มีเหตุผลลึก ๆ เพียงแค่ทำให้สิ่งต่างๆสั้นลงแม้ว่ามันจะทำให้เข้าใจยากเล็กน้อยก็ตาม

รายละเอียด

บรรทัดแรกจะสวยตรงไปตรงมาเป็นนามแฝงสำหรับr reverseบรรทัดที่สองไม่ตรงไปข้างหน้า mเป็นฟังก์ชั่นไร้สาระซึ่งมีอยู่เนื่องจากหรือการดำเนินการที่คล้ายคลึงกันจำเป็นต้องทำในไม่กี่แห่ง มันไม่ได้มีความหมายจริงๆ คำอธิบายที่ดีที่สุดของสิ่งนี้คือรหัส

m(o:c:k)=o:c:c:c:k++" "

จากตรงนี้เราจะเริ่มfจัดการกับตรรกะทั้งหมดโดยพื้นฐาน เคสแรกสำหรับfเบสเคสก็สวยได้มาตรฐาน

f 1=[["\\  /","__ "],["/__\\"]]

โปรดทราบว่าเราส่งคืนรายการสองรายการแทนที่จะเป็นทูเปิล ในโปรแกรมที่มีเหตุผลใด ๆ เราจะใช้ทูเปิลเนื่องจากได้รับการแก้ไขที่ 2 องค์ประกอบ อย่างไรก็ตามในภายหลังเราจะแมปอาร์กิวเมนต์ทั้งสองนี้ด้วยฟังก์ชันเดียวกัน มันยากที่จะทำด้วยทูเปิล แต่ใช้งานง่ายและรายการไม่ก่อให้เกิดข้อบกพร่องใด ๆ ดังนั้นเราจึงใช้มัน

จากนั้นเรามีกรณีอุปนัย ครั้งแรกที่เราสามารถดึงข้อมูลกรณีก่อนหน้านี้และดับเบิลแผนที่ของเราmมากกว่านั้น สิ่งนี้ทำให้หน่วยหกเหลี่ยม 1 กว้างขึ้น (2 อักขระ) และย้ายครึ่งหน่วย (1 อักขระ) ไปทางขวา (แม้ว่าทั้งหมดนี้จะย้อนกลับไปจึงมีการเพิ่มอักขระเว้นวรรคทางด้านขวา ) เราจับคู่รูปแบบนี้กับ[w:i,j]เนื่องจากเราต้องการใช้wเพื่อสร้างแถวใหม่ในภายหลัง พูดถึงสิ่งต่อไปที่เราสร้างแถว เราทำสิ่งนี้ด้วยการจับคู่รูปแบบ:

_:_:k<-r$m w

นี่เป็นรหัสไร้สาระ มันแค่ตบสิ่งที่เรามีอยู่แล้วเพื่อสร้างผลลัพธ์ที่ถูกต้อง kและย้อนกลับในรูปแบบแถวใหม่ดังนั้นเราจึงเพิ่มเข้าไปและส่งกลับ

หลังจากที่fเราhเปลี่ยนเอาต์พุตfเป็นสตริงแล้ว มันยกเลิกการเปลี่ยนแปลงที่แปลกประหลาดทั้งหมดที่เราใช้ในระหว่างการสร้างและบรรจุหีบห่อเพื่อใช้งาน

ด้วยสิ่งที่เราเพิ่งเขียนfและhสำหรับฟังก์ชันสุดท้าย

5 xnor Jan 11 2021 at 00:58

Haskell , 100 ไบต์

f n=unlines[q<$>[1..3*n]++[1-n..0]|y<-[-n..n],let q x|abs y==n,x>n='_'|x==y='\\'|x+y==1='/'|1>0=' ']

ลองออนไลน์!

คำตอบของการเล่นกอล์ฟAZTECCOพร้อมเทคนิคใหม่ ๆ

แนวคิดหลักคือรูปหกเหลี่ยมนั้นง่ายกว่าถ้าเราปลูกถ่ายnคอลัมน์แรกไปจนสุด

|-|
   ______   
  /      \  
 /        \ 
/          \
\          /
 \        / 
  \______/  

         |-|
______      
      \    /
       \  / 
        \/  
        /\  
       /  \  
______/    \

ตอนนี้ทั้งหมด/และ\อยู่ในบรรทัดเดียวและ_ทั้งหมดอยู่ทางซ้ายของสิ่งเหล่านั้น ทำให้ง่ายขึ้นมากในการทำกลยุทธ์ของ AZTECCO ในการกำหนดอักขระจากพิกัด ที่จะใช้พิกัด relabeled เหล่านี้เราแทนที่x-coordinates กับรุ่นกรณืและขยับตัว[1..4*n][1..3*n]++[1-n..0]

4 Neil Jan 06 2021 at 17:08

Retina 0.8.2 , 94 ไบต์

.+
$* ¶$&$* \G ¶$%'/$`$%_$%_$`\
r` \G
$%`\$'$%_$%_$%'/¶ ^¶( *) $1 $.&$*_$.&$*_$& T` `\_` +/$

ลองออนไลน์! ลิงก์รวมกรณีทดสอบ คำอธิบาย:

.+
$* ¶$&$* 

แทรกสองแถวของnช่องว่าง

\G 
¶$%'/$`$%_$%_$`\

แปลงแถวแรกเป็นด้านบนสุดของรูปหกเหลี่ยม

r` \G
$%`\$'$%_$%_$%'/¶

แปลงแถวที่สองเป็นด้านล่างของรูปหกเหลี่ยม

^¶( *)
$1 $.&$*_$.&$*_$&

แทรกบรรทัดบนสุด

T` `\_` +/$

แทนที่บรรทัดล่างสุด

4 ovs Jan 06 2021 at 16:32

Python 2 , 119114ไบต์

i=n=input()
d=0
exec"k=i/n|d;print' '*i+'\_/'[~k]+'_ '[i-d<n]*2*(2*n+~i)+'\_/'[k]\nif i==d:d=i=-1\ni-=d|1;"*(n-~n)

ลองออนไลน์!

4 Arnauld Jan 07 2021 at 03:27

JavaScript (ES6),  109107 ไบต์

w=>(x=0,W=w*4,i=g=y=>~y?`
 /\\_`[x++-W?y*!i|w/x|x>w*3?(x+~y+w)%W?(x+y)%W-w?1:3:2:4:x=i=0&y--]+g(y):'')(w*2)

ลองออนไลน์!

แสดงความคิดเห็น

w => (                        // w = input
  x = 0,                      // initialize x to 0
  W = w * 4,                  // W = total width
  i =                         // initialize i to a non-zero value
  g = y =>                    // g is a recursive function taking y
  ~y ?                        //   if y is not equal to -1:
    `\n /\\_`[                //     list of characters
      x++ - W ?               //     if this is not the end of the row:
        y * !i |              //       if this is neither the first nor the last row
        w / x |               //       or x is less than or equal to w
        x > w * 3 ?           //       or x is greater than w * 3:
          (x + ~y + w) % W ?  //         if (x - y - 1 + w) mod W is not equal to 0:
            (x + y) % W - w ? //           if (x + y) mod W is not equal to w:
              1               //             draw a space
            :                 //           else:
              3               //             draw a '\'
          :                   //         else:
            2                 //           draw a '/'
        :                     //       else:
          4                   //         draw a '_'
      :                       //     else:
        x = i = 0 & y--       //       decrement y, set x and i to 0 and draw a linefeed
    ] + g(y)                  //     append the result of a recursive call
  :                           //   else:
    ''                        //     stop the recursion
)(w * 2)                      // initial call to g with y = w * 2
4 Noodle9 Jan 06 2021 at 21:18

C (gcc) , 194 \$\cdots\$ 149144ไบต์

บันทึก13 14 19 ไบต์ขอบคุณceilingcat !!!

p(n,c){for(;n--;)printf(L"/\\ _\n"+c);}i;t;f(n){p(n,2);for(i=t=p(2*n,3);i>=p(1,4);t=i/n?--i,1:t)i+=!p(!p(n+i<<!p(!p(n+~i,2),t),t&!i|2),!t)-2*t;}

ลองออนไลน์!

คำอธิบาย (ก่อนเล่นกอล์ฟ)

p(n,c){for(;n--;)                     // Helper function to print  
         putchar("/\\ _\n"[c]);}      //  one of '/', '\', ' ', '_' , or  
                                      //  newline n times, this function  
                                      //  also returns 0 
i;t;f(n){                             // Main function prints an n hexagon  
        p(n,2);                       // Print n leading spaces for the 1st  
                                      //  line 
        for(                          // Main loop
            i=t=p(2*n,3);             // Set i and t to 0,  
                                      //  and print 2*n '_'s for the 1st line
            i>=p(1,4);                // Loop until i goes below 0, and 
                                      //  print a newline
                                      // At the end of each loop:  
            i+=1-2*t,                 //  increment i for the 1st half  
                                      //   and then decrement i in the 2nd  
            t=i/n?--i,1:t)            //  keep t as t unless i equals n,   
                                      //  then make t 1 and decrement i   
                                      // In the main loop:
                p(n+~i,2),            //  print n-i-1 leading spaces     
                p(1,t),               //  print a '/' in the 1st half and a  
                                      //   '\' in the 2nd    
                p(n+i<<1,t&!i|2),     //  print the 2*(n+i) middle spaces  
                                      //   unless at the bottom print '_'s  
                p(1,!t);              //  print a '\' in the 1st half and a  
                                      //   '/' in the 2nd    
   }  
 
4 ovs Jan 07 2021 at 05:12

05AB1E , 33 29 25 ไบต์

-4 ( 7 ) ไบต์ขอบคุณKevin Cruijssen !

L+<'/úíºI·'_ך»∊¶¡`ðs‡).c

ลองออนไลน์!

05AB1Eมี builtin ผ้าใบซึ่งอาจจะเป็นประโยชน์ แต่เป็นเรื่องยุ่งยากมากทีเดียวที่จะได้รับการทำงานนี้เป็นเพียง builtins กระจกºและและ .cbuiltin

4 xash Jan 07 2021 at 01:26

J , 50 47 ไบต์

-3 ขอบคุณโจนาห์!

' \/_'{~]|."1((0,]+2*|.)@=@i.,.3,3,~0$~<:,])@+:

ลองออนไลน์!

((0,]+2*|.)@=@i.  ,.  3,3,~0$~<:,])@+:
     0 0 0 0            3 3 3 3
     1 0 0 2            0 0 0 0
     0 1 2 0            0 0 0 0
     0 2 1 0            0 0 0 0
     2 0 0 1            3 3 3 3

    ]|."1
0 0 3 3 3 3 0 0
0 2 0 0 0 0 1 0
2 0 0 0 0 0 0 1
1 0 0 0 0 0 0 2
0 1 3 3 3 3 2 0

' \/_'{~ 
  ____
 /    \    
/      \    
\      /  
 \____/  
4 Anakhand Jan 06 2021 at 17:25

Python 3.8 (รุ่นก่อนวางจำหน่าย) 174 ไบต์

n=int(input())
b,a,s="\/ "
z,f=range(n),lambda c,d,t:((n-1-i)*s+c+2*(n+i)*s+d for i in t)
print(f"{'_'*2*n:^{4*n}}",*f(a,b,z),*f(b,a,z[:0:-1]),f"{b:>{n}}{'_'*2*n}/",sep="\n")

ลองออนไลน์!

-1 ไบต์ขอบคุณ @Duncan

-8 ไบต์ขอบคุณ @Danis

4 AZTECCO Jan 10 2021 at 18:02

Haskell , 129 120 ไบต์

g=mod
f n|a<-n*4=[c|y<-[-n..n],x<-[0..a],let c|x<1='\n'|g x(n*3+1)>n,abs y==n='_'|g(x+y)a==1='/'|g(x-y)a<1='\\'|1>0=' ']

ลองออนไลน์!

  • บันทึก 9 ขอบคุณ @Wheat Wizard และ @xnor

  • ตรวจสอบคำตอบ @xnor และการปรับปรุงครั้งใหญ่เกี่ยวกับแนวทางในการแก้ปัญหา (หลีกเลี่ยงโมดูโลและเส้นขนาน)

  • เทียบเท่ากับคำตอบ C ของฉัน

เราสร้างพิกัดคาร์ทีเซียนโดยใช้ความเข้าใจรายการ | y <- [0..n * 2], x <- [0..a]

[c | ... ให้ค | ... | ... | ... ] และเราใส่อักขระที่ต้องการตาม xy หรือ x + y เพื่อลากเส้น ..
เราใช้โมดูโลในการวาดเส้นหลาย ๆ เส้น (2)
กรณีพิเศษคือ_ที่ไม่ต้องการอัตราส่วน ax / y แต่เป็นช่วงเรา ใช้โมดูโลเพื่อทำการเปรียบเทียบเพียงครั้งเดียว>แทนที่จะเป็น a> x> b like

2 vrintle Jan 06 2021 at 15:15

Ruby , 141 ไบต์

->(n,g=->c,d{(1..n).map{|i|" "*(n-i)+d+" "*2*(n+i-1)+c}},l=g[?/,e=?\\].reverse){[" "*n+?_*n*2,g[e,?/],l[0..-2],l[-1].sub(/ +(?=\/)/,?_*n*2)]}

ลองออนไลน์!

ถ้าอนุญาตขีดล่างก็จะใช้ไบต์น้อยกว่าเล็กน้อยในขณะที่รูปหกเหลี่ยมนั้นสวยเหมือนเดิม ;-)

ทับทิม 114 ไบต์

->n{[" "*n+?_*2*n,(g=->c,d{(1..n).map{|i|" "*(n-i)+c+" "*2*(n+i-1)+d}})[?/,e=?\\],g[e,?/].reverse," "*n+?‾*n*2]}

ลองออนไลน์!

2 Makonede Jan 07 2021 at 00:45

05AB1E , 70 ไบต์

ðש'_¹·×«©¶«©¹'/1Λ¹·Ì'.2Λ¹'\3.Λ«©„./`.;©¶¡Â‚€»`s'.ð:,¹3*>(£„._`:„/\‡,

ลองออนไลน์!

2 KjetilS. Jan 07 2021 at 00:54

Perl 5 , 143 ไบต์

sub f{$n=pop;@b=map{join'',$"x($n-$_),'/','  'x($n+$_-1),'\\',$/}1..$n;join('',$"x$n,$u=__ x$n,$/,@b,map y|/\\|\\/|r,reverse@b)=~s| +/$|$u/|sr}

ลองออนไลน์!

sub f{
  $n=pop;             #n = input
  @b=map{             #set array @b to line 2 - n+1
    join'',           #join parts into a line string
    $" x ($n-$_), #space times n-1 '/', #char / ' ' x ($n+$_-1), #space times n+iterator minus 1 '\\', #char \ $/                #char newline
  } 1..$n; #n lines join('', #return string of these joined: $" x $n, #n spaces $u = __ x$n, #n*2 underscores $/,               #char newline
    @b,               #lines 2 to n+1 constructed above
    map y|/\\|\\/|r,  #and bottom part which is the same
      reverse@b       #as top part reversed and /\ rotated
  )=~s| +/$|$u/|sr    #and change last spaces of last line to _'s
}
2 StevenFontanella Jan 07 2021 at 12:31

Haskell , 186168 ไบต์

-18 ไบต์พร้อมการแก้ไขของ xnor และลบช่องว่างที่ไม่จำเป็นในบรรทัดสุดท้าย

s=' '
(!)=replicate
e=reverse
h n=unlines$(\m->(n!s++(2*n)!'_'++n!s):e(e<$>m)++init m++[(n-1)!s++'\\':(2*n)!'_'++"/"])$(\i->i!s++'\\':(4*n-2*i-2)!s++'/':i!s)<$>[0..n-1]

ลองออนไลน์!

ไม่พอใจ:

hex :: Int -> String
hex n = unlines $ first: middle ++ (init $ reverse (map reverse middle)) ++ [last]
  where
    first = replicate n ' ' ++ replicate (2*n) '_' ++ replicate n ' '
    f i = replicate i ' ' ++ "/" ++ replicate (n-i + 2*n + n-i -2) ' ' ++ "\\" ++ replicate i ' '
    middle = map f [n-1,n-2..0]
    last = replicate (n-1) ' ' ++ "\\" ++ replicate (2*n) '_' ++ "/" ++ replicate (n-2) ' '