Gambarkan segi enam ASCII dengan panjang sisi n

Jan 06 2021

Diberikan bilangan bulat positif \$n\$mengeluarkan segi enam ASCII dengan panjang sisi diagonal \$n\$, seperti yang digambarkan (catatan ada \$2n\$ _ karakter di tepi atas)

Contoh:

\$n = 1\$

 __
/  \
\__/

\$n = 2\$

  ____
 /    \
/      \
\      /
 \____/

\$n = 5\$

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

dll.

Kode terpendek dalam byte menang. Metode masukan / keluaran biasa berlaku.

Jawaban

11 Razetime Jan 06 2021 at 16:01

Kanvas , 15 9 byte

 _;1*⁸/∔╬

Coba di sini!

-6 byte setelah memperbaiki program.

Menggambar seperempat segi enam, dan empat palindromisasi.

9 xnor Jan 06 2021 at 17:16

Python 2 , 92 byte

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

Cobalah secara online!

6 Razetime Jan 06 2021 at 15:54

Arang , 14 byte

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

Cobalah secara online!

Memperbaiki +1 byte dari Hanya ASCII.

Menggambar setengah dari segi enam, dan mencerminkannya.

6 AZTECCO Jan 07 2021 at 15:50

C (gcc) , 119109 byte

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);}

Cobalah secara online!

  • menghemat 2 berkat @ceilingcat

Tabel di bawah ini tidak diperbarui sehingga nilainya dapat berbeda, tetapi konsepnya adalah:

  • kami memiliki 2 pasang garis sejajar
        . .
_______.______.________   
  | / \ | .
. | / \ | .
 . | / \ |.
  | / \ |
  | \ / |.
 . | \ / | .
. | \ / |
__ | ___ \ ________ / ___ | ___   
  | . .

kami mengulang x, y dari size ke 0 dan kami menjumlahkannya untuk memeriksa apakah a / harus dicetak, kami mengurangi untuk memeriksa \, kami menggunakan modulo untuk memeriksa kedua paralel.

    saya 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 byte

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

Cobalah secara online!

-pdan }{pada akhirnya adalah trik untuk hanya mencetak pemisah rekaman keluaran $\di akhir. Ini hanya bekerja untuk satu catatan masukan; header digunakan untuk mencetak all in one tio link.

$\=' __ 
/  \
\__/'   # 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 byte

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

Cobalah secara online!

Versi yang lebih rekursif dari jawaban ini. Kesewenang-wenangan tantangan ini membuat hal ini cukup membuat frustrasi.

Penjelasan

Jawaban ini agak sulit untuk dijelaskan. Tantangannya adalah, seperti yang sudah saya katakan, sewenang-wenang dalam beberapa hal, jadi kode tersebut hanyalah semacam sarang simbol.

Ide

Ide program di sini adalah untuk membangun dua bagian. Saat menghitung segi enam ke-n kita mendapatkan dua bagian untuk segi enam n-1 dan menggunakannya untuk membuat yang terbesar berikutnya.

Namun ada beberapa peringatan. Kami membangun setengah bagian atas menghadap ke bawah dan kami membangun kedua bagian yang dicerminkan dari kiri ke kanan. Kami melakukan ini karena lebih mudah melakukannya dengan cara ini. Tidak ada alasan yang dalam itu hanya membuat segalanya lebih pendek bahkan jika itu membuat hal-hal sedikit tidak bisa dimengerti.

Detail

Baris pertama cukup lurus ke depan radalah alias reverse. Baris kedua tidak terlalu lurus ke depan. madalah fungsi yang tidak masuk akal, itu ada karena itu atau operasi serupa perlu dilakukan di beberapa tempat. Itu tidak benar-benar memiliki makna semantik. Penjelasan terbaik tentang apa yang dilakukannya di sini adalah kodenya.

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

Dari sini kita mulai fmenangani yang pada dasarnya menangani semua logika. Kasus pertama fadalah kasus dasar, ini cukup standar

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

Perhatikan bahwa kami mengembalikan daftar dua item, bukan tupel. Dalam program waras kita akan menggunakan tupel karena ditetapkan pada 2 elemen. Namun nanti kita akan memetakan kedua argumen ini dengan fungsi yang sama. Sulit untuk melakukannya dengan tupel tetapi mudah dengan daftar, dan daftar tersebut tidak menimbulkan kerugian sehingga kami menggunakannya.

Kemudian kami memiliki kasus induktif. Pertama kita mengambil kasus sebelumnya, dan memetakan dua kali mdi atasnya. Ini membuat unit hexagon 1 lebih lebar (2 karakter) dan memindahkannya setengah unit (1 karakter) ke kanan (walaupun karena semuanya mundur, karakter spasi ditambahkan di sebelah kanan ). Kami mencocokkan pola ini dengan [w:i,j]karena kami ingin menggunakan wuntuk membuat baris baru nanti. Ngomong-ngomong, selanjutnya kita membuat baris. Kami melakukan ini dengan pencocokan pola:

_:_:k<-r$m w

Ini semacam kode yang tidak masuk akal. Itu hanya menyatukan hal-hal yang sudah kita miliki untuk menghasilkan keluaran yang benar. kdan kebalikannya membentuk baris baru jadi kita menambahkannya. dan mengembalikannya.

Setelah fkita memiliki hyang mengubah output fmenjadi string. Itu membatalkan semua transformasi aneh yang kami gunakan selama konstruksi dan mengemasnya untuk digunakan.

Dengan semua yang baru kita buat fdan huntuk fungsi terakhir.

5 xnor Jan 11 2021 at 00:58

Haskell , 100 byte

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=' ']

Cobalah secara online!

Golf jawaban AZTECCO ditambah beberapa teknik baru.

Ide utamanya adalah segi enam lebih sederhana jika kita memindahkan nkolom pertama ke akhir.

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

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

Sekarang semua /dan \berada dalam satu baris, dan _semua ada di kiri itu. Hal ini mempermudah dalam melakukan strategi AZTECCO dalam menentukan karakter dari koordinat tersebut. Untuk mengimplementasikan koordinat xrelabeled ini, kami mengganti -coordinates [1..4*n]dengan versi cycled dan shifted [1..3*n]++[1-n..0].

4 Neil Jan 06 2021 at 17:08

Retina 0.8.2 , 94 byte

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

Cobalah secara online! Tautan termasuk kasus uji. Penjelasan:

.+
$* ¶$&$* 

Sisipkan dua baris nspasi.

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

Ubah baris pertama menjadi sisi atas segi enam.

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

Ubah baris kedua menjadi sisi bawah segi enam.

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

Sisipkan baris teratas.

T` `\_` +/$

Ganti garis bawah.

4 ovs Jan 06 2021 at 16:32

Python 2 , 119 114 byte

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)

Cobalah secara online!

4 Arnauld Jan 07 2021 at 03:27

JavaScript (ES6),  109  107 byte

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)

Cobalah secara online!

Berkomentar

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 byte

Menyimpan 13 14 19 byte berkat 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;}

Cobalah secara online!

Penjelasan (sebelum bermain golf)

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 byte

-4 ( 7 ) byte berkat Kevin Cruijssen !

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

Cobalah secara online!

05AB1E memiliki kanvas bawaan yang mungkin berguna, tetapi cukup sulit untuk bekerja, ini hanya bawaan cermin ºdan bawaan terpusat .c.

4 xash Jan 07 2021 at 01:26

J , 50 47 byte

-3 Terima kasih Jonah!

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

Cobalah secara online!

((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 (pra-rilis) , 174 byte

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")

Cobalah secara online!

-1 byte berkat @Duncan

-8 byte berkat @Danis

4 AZTECCO Jan 10 2021 at 18:02

Haskell , 129.120 byte

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=' ']

Cobalah secara online!

  • menghemat 9 berkat @Wheat Wizard dan @xnor.

  • Periksa jawaban @xnor dan peningkatan besar pada pendekatan masalah (hindari modulo dan garis paralel)!

  • Setara dengan jawaban C saya

Kami membuat koordinat kartesius menggunakan pemahaman daftar | y <- [0..n * 2], x <- [0..a]

[c | ..., biarkan c | ... | ... | ...] dan kami yeld karakter yang dibutuhkan berdasarkan xy atau x + y untuk menggambar garis ..
Kami menggunakan modulo untuk menggambar banyak garis (2)
Kasus khusus untuk _yang tidak membutuhkan rasio sumbu / y tetapi rentang, kami menggunakan modulo untuk melakukan hanya satu perbandingan, >bukan seperti a> x> b

2 vrintle Jan 06 2021 at 15:15

Ruby , 141 byte

->(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)]}

Cobalah secara online!

Jika garis bawah atas diperbolehkan, maka dibutuhkan byte yang sedikit lebih kecil, sedangkan segi enam secantik sebelumnya ;-)

Ruby , 114 byte

->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]}

Cobalah secara online!

2 Makonede Jan 07 2021 at 00:45

05AB1E , 70 byte

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

Cobalah secara online!

2 KjetilS. Jan 07 2021 at 00:54

Perl 5 , 143 byte

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}

Cobalah secara online!

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 byte

-18 byte dengan perbaikan xnor dan menghapus spasi yang tidak dibutuhkan di baris terakhir

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]

Cobalah secara online!

Ungolfed:

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) ' '