Gambarkan segi enam ASCII dengan panjang sisi n
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
Kanvas , 15 9 byte
_;1*⁸/∔╬
Coba di sini!
-6 byte setelah memperbaiki program.
Menggambar seperempat segi enam, dan empat palindromisasi.
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!
Arang , 14 byte
←×_θ↖θ→↗θ×_θ‖M
Cobalah secara online!
Memperbaiki +1 byte dari Hanya ASCII.
Menggambar setengah dari segi enam, dan mencerminkannya.
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
Perl 5 ( -p
), 102 byte
s/_+/__$&/g,s/^|$/ /gm,s/^ *\S /$& /gm,s-( +)\\ -$&/ $1 \\ \\ $1 /
- for($\=' __ / \ \__/')x--$_}{
Cobalah secara online!
-p
dan }{
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
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 r
adalah alias reverse
. Baris kedua tidak terlalu lurus ke depan. m
adalah 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 f
menangani yang pada dasarnya menangani semua logika. Kasus pertama f
adalah 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 m
di 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 w
untuk 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. k
dan kebalikannya membentuk baris baru jadi kita menambahkannya. dan mengembalikannya.
Setelah f
kita memiliki h
yang mengubah output f
menjadi string. Itu membatalkan semua transformasi aneh yang kami gunakan selama konstruksi dan mengemasnya untuk digunakan.
Dengan semua yang baru kita buat f
dan h
untuk fungsi terakhir.
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 n
kolom 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 x
relabeled ini, kami mengganti -coordinates [1..4*n]
dengan versi cycled dan shifted [1..3*n]++[1-n..0]
.
Retina 0.8.2 , 94 byte
.+
$* ¶$&$* \G ¶$%'/$`$%_$%_$`\
r` \G
$%`\$'$%_$%_$%'/¶ ^¶( *) $1 $.&$*_$.&$*_$& T` `\_` +/$
Cobalah secara online! Tautan termasuk kasus uji. Penjelasan:
.+
$* ¶$&$*
Sisipkan dua baris n
spasi.
\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.
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!
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
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
}
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
.
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
' \/_'{~
____
/ \
/ \
\ /
\____/
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
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
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!
05AB1E , 70 byte
ðש'_¹·×«©¶«©¹'/1Λ¹·Ì'.2Λ¹'\3.Λ«©„./`.;©¶¡Â‚€»`s'.ð:,¹3*>(£„._`:„/\‡,
Cobalah secara online!
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
}
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) ' '