辺の長さがnのASCII六角形を描画します
正の整数が与えられた\$n\$対角辺の長さがASCII六角形を出力します\$n\$、写真のように(\があることに注意してください$2n\$ _
上端の文字)
例:
\$n = 1\$
__
/ \
\__/
\$n = 2\$
____
/ \
/ \
\ /
\____/
\$n = 5\$
__________
/ \
/ \
/ \
/ \
/ \
\ /
\ /
\ /
\ /
\__________/
等
バイト単位の最短コードが優先されます。通常の入出力方法が適用されます。
回答
キャンバス、15の9バイト
_;1*⁸/∔╬
ここで試してみてください!
-プログラム修正後6バイト。
六角形の4分の1を描画し、大腿四頭筋をパリンドローム化します。
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
オンラインでお試しください!
木炭、14バイト
←×_θ↖θ→↗θ×_θ‖M
オンラインでお試しください!
ASCIIからの+1バイト修正-のみ。
六角形の半分を描画し、それをミラーリングします。
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);}
オンラインでお試しください!
- @ceilingcatのおかげで2を節約しました
以下の表は更新されていないため、値が異なる場合がありますが、概念は次のとおりです。
- 2対の平行線があります
。。 _______.______.________ | / \ | 。 。| / \ | 。 。| / \ |。 | / \ | | \ / |。 。| \ / | 。 。| \ / | __ | ___ \ ________ / ___ | ___ | 。。
x、yをサイズから0まで繰り返し、それらを合計して/を出力するかどうかを確認し、減算して\を確認し、モジュロを使用して両方の並列を確認します。
i65432109876543210。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バイト
s/_+/__$&/g,s/^|$/ /gm,s/^ *\S /$& /gm,s-( +)\\ -$&/ $1 \\ \\ $1 /
- for($\=' __ / \ \__/')x--$_}{
オンラインでお試しください!
-p
そして}{
最後に、最後に出力レコード区切り文字のみを印刷するトリックがあります$\
。1つの入力レコードに対してのみ機能します。ヘッダーは、すべてを1つのtioリンクに印刷するために使用されます。
$\=' __
/ \
\__/' # 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バイト
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
オンラインでお試しください!
この回答のより再帰的なバージョン。この挑戦の恣意性はこれをかなり苛立たせます。
説明
この答えを説明するのは少し難しいです。すでに述べたように、課題はいくつかの点で恣意的であるため、コードは単なるシンボルのネストのようなものです。
考え
ここでのプログラムのアイデアは、2つの半分を構築することです。つまり、n番目の六角形を計算するときに、n-1番目の六角形の2つの半分を取得し、それを使用して次に大きい六角形を作成します。
ただし、いくつかの注意点があります。上半分を上下逆さまに作成し、両方の半分を左から右にミラーリングして作成します。このようにすると便利なので、これを行います。それが物事を少し理解できないようにしたとしても、それが物事を短くするだけの深い理由はありません。
詳細
最初の行は非常に単純r
で、のエイリアスですreverse
。2行目はそれほど単純ではありません。m
はナンセンスな関数ですが、それまたは同様の操作をいくつかの場所で実行する必要があるために存在します。それは実際には意味的な意味を持っていません。ここで何をするのかを最もよく説明しているのはコードです。
m(o:c:k)=o:c:c:c:k++" "
ここからf
、基本的にすべてのロジックを処理するものに到達し始めます。の最初のケースf
はベースケースで、かなり標準的です
f 1=[["\\ /","__ "],["/__\\"]]
タプルの代わりに2つのアイテムのリストを返すことに注意してください。正気のプログラムでは、2つの要素に固定されているため、タプルを使用します。ただし、後で同じ関数を使用して、これの両方の引数をマップします。タプルでそれを行うのは難しいですが、リストでは簡単です。リストには欠点がないので、それを使用します。
次に、帰納的なケースがあります。まず、前のケースをフェッチし、そのm
上にダブルマップします。これにより、六角形が1単位広くなり(2文字)、右に半分単位(1文字)移動します(ただし、この全体が後方にあるため、スペース文字が右側に追加されます)。後で新しい行を作成するため[w:i,j]
に使用w
するため、これをパターンマッチングします。次に、どの行を作成するかについて言えば。これはパターンマッチで行います。
_:_:k<-r$m w
これは一種のナンセンスなコードです。それは、私たちがすでに正しい出力を生成するために必要だったものを一緒に叩くだけです。k
そしてその逆が新しい行を形成するので、それらを追加して返します。
後f
、私たちは持っているh
の出力をオンされf
た文字列の中に。構築中に使用したすべての奇抜な変換を元に戻し、使用できるようにパッケージ化します。
これらすべてを使用して、最終的な機能を作成f
しh
ます。
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
列を最後まで移植すると、六角形がより単純になるということです。
|-|
______
/ \
/ \
/ \
\ /
\ /
\______/
|-|
______
\ /
\ /
\/
/\
/ \
______/ \
これで、すべて/
と\
が1行になり、_
すべてがそれらの左側にあります。これにより、座標から文字を決定するAZTECCOの戦略をはるかに簡単に実行できます。これらの再ラベル付けされた座標を実装するために、x
-coordinates[1..4*n]
を循環およびシフトされたバージョンに置き換え[1..3*n]++[1-n..0]
ます。
Retina 0.8.2、94バイト
.+
$* ¶$&$* \G ¶$%'/$`$%_$%_$`\
r` \G
$%`\$'$%_$%_$%'/¶ ^¶( *) $1 $.&$*_$.&$*_$& T` `\_` +/$
オンラインでお試しください!リンクにはテストケースが含まれています。説明:
.+
$* ¶$&$*
2行のn
スペースを挿入します。
\G
¶$%'/$`$%_$%_$`\
最初の行を六角形の上面に変換します。
r` \G
$%`\$'$%_$%_$%'/¶
2番目の行を六角形の下側に変換します。
^¶( *)
$1 $.&$*_$.&$*_$&
一番上の行を挿入します。
T` `\_` +/$
収益を置き換えます。
パイソン2、119の114バイト
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)
オンラインでお試しください!
JavaScriptの(ES6)、 109の 107バイト
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
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
}
05AB1E、33の 29 25バイト
-Kevin Cruijssenのおかげで4(7)バイト!
L+<'/úíºI·'_ך»∊¶¡`ðs‡).c
オンラインでお試しください!
05AB1Eには、便利なキャンバスビルトインがありますが、動作させるのは非常に難しいです。これは、ミラービルトインº
と∊
集中型ビルトインだけ.c
です。
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
' \/_'{~
____
/ \
/ \
\ /
\____/
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")
オンラインでお試しください!
-@ Duncanのおかげで1バイト
-@ Danisのおかげで8バイト
Haskell、129120バイト
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=' ']
オンラインでお試しください!
@WheatWizardと@xnorのおかげで9を節約しました。
@xnorの回答と、問題へのアプローチの大幅な改善(モジュロおよび平行線の回避)を確認してください!
私のCの答えに相当
リスト内包表記| y <-[0..n * 2]、x <-[0..a]を使用して、デカルト座標を作成します。
[c | ...、let c | ... | ... | ...]そして、線を描くためにxyまたはx + yに基づいて必要な文字をyeldします。
モジュロを使用して複数の線を描きます(2)
特別な場合は、_
ax / y比を必要とせず、範囲を必要とします。>
a> x> bのように、モジュロを使用して1つの比較のみを実行しました
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)]}
オンラインでお試しください!
上部のアンダースコアが許可されている場合、六角形は以前と同じようにきれいですが、それは少し少ないバイトを取ります;-)
Ruby、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]}
オンラインでお試しください!
05AB1E、70バイト
ðש'_¹·×«©¶«©¹'/1Λ¹·Ì'.2Λ¹'\3.Λ«©„./`.;©¶¡Â‚€»`s'.ð:,¹3*>(£„._`:„/\‡,
オンラインでお試しください!
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
}
Haskell、
186168
バイト
-xnorの修正と最後の行の不要なスペースの削除を含む18バイト
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) ' '