アスキーアートオクタゴン


22

入力整数を指定するとn > 1n文字で構成される辺の長さのASCIIアートオクタゴンを出力します。以下の例を参照してください。

n=2
 ##
#  #
#  #
 ##

n=3
  ###
 #   #
#     #
#     #
#     #
 #   #
  ###

n=4
   ####
  #    #
 #      #
#        #
#        #
#        #
#        #
 #      #
  #    #
   ####

n=5
    #####
   #     #
  #       #
 #         #
#           #
#           #
#           #
#           #
#           #
 #         #
  #       #
   #     #
    #####

and so on.

STDOUTに出力するか、関数の結果として返すことができます。

文字が適切に並んでいる限り、任意の量の無関係な空白を使用できます。

ルールとI / O

  • 入力と出力は、任意の便利な方法で指定できます。
  • #(スペースを除く)の代わりに任意の印刷可能なASCII文字を使用できますが、「背景」文字はスペース(ASCII 32)でなければなりません。
  • 完全なプログラムまたは機能のいずれかが受け入れられます。
  • 標準的な抜け穴は禁止されています。
  • これはので、通常のゴルフルールがすべて適用され、最短のコード(バイト単位)が勝ちます。

1
異なる出力文字を使用できますか、それとも一貫性が必要ですか?
エミグナ

@Emignaさまざまな文字で構いません。
AdmBorkBork

回答:


22

05AB1E、3バイト

7ÝΛ

オンラインでお試しください!

説明

      # implicit input as length
      # implicit input as string to print
7Ý    # range [0...7] as directions
  Λ   # canvas print

05AB1Eキャンバスを理解するには、この回答を参照してください。


確かにこれは5バイトでなければなりませんか?またはコードゴルフの課題は、交換としてバイトや文字を参照しています
ダグ

3
@Doug:それは3バイトです05ab1eのコード・ページ
Emigna

かっこいい、イケてる!ドキュメントのリンクをありがとう!
ダグ

> :( damnit、adnan
ASCIIのみ

11

JavaScriptの(ES6)、114の 106 105 104 103バイト

n=>(g=x=>v=x*2>w?w-x:x,F=x=>~y?`# 
`[~x?(h=g(x--))*g(y)>0&h+v!=n|n>h+v:(y--,x=w,2)]+F(x):'')(y=w=--n*3)

オンラインでお試しください!

どうやって?

これにより、文字ごとに出力が構築されます。

入力n与えられると、以下を計算します。

n=n1w=3n

バツy各文字について、を計算します:hv

h=w/2|バツw/2|v=w/2|yw/2|

八角形に属するセルは、次の条件のいずれかを満たします。

  • ( OR)AND(下の赤)h=0v=0h+vn
  • h+v=n(下のオレンジ色)

たとえば、(および)の場合:n=4n=3

00102030404030201000011121314141312111010212223242423222120203132333434333231303041424344444342414040414243444443424140403132333434333231303021222324242322212020111213141413121110100102030404030201000


うわー、これは素晴らしいです!私が思うにように簡略化することができそれがすべてではゴルフのロジックを助け場合、私はわからないが、。 H + V > N 'h+vnh+v>n
ジュゼッペ

@Giuseppe両方の条件をテストすれば、実際にそのように単純化できます。ただし、コードでは、ケースとは分離されています。ただし、実際には逆の条件()をテストしていますが、これはすでに1バイト短くなっています。h v 0 n > h + vhv=0hv0n>h+v
アーナウルド

@Giuseppeあなたのコメントは、式を詳しく見るように私を促し、私はついに少し違った方法でバイトを保存しました。:)
アーナウルド

1
ええと、まあ、についてのあなたのコメントは、あなたのロジックの私のポートを見て、さらに数バイトを節約するように促しました!hv=0
ジュゼッペ



4

R122の 117 115バイト

function(n){n=n-1
m=matrix(0,y<-3*n+1,y)
v=t(h<-(w=3*n/2)-abs(row(m)-1-w))
m[h*v&h+v-n|h+v<n]=' '
write(m,1,y,,"")}

オンラインでお試しください!

Arnauld's answerからのロジックを移植します。具体的には、さらに改善が必要な場合に備えてこの改訂版を移植します。Arnauldがロジックを反転するという提案のおかげで、さらに2バイト節約されました!


-2バイトを逆の方法で実行します(ビット単位の演算子であるh*v&h+v-nためJS では実行できませんが&、Rでは論理的であるため、動作します)。
アーナウルド

@Arnauldありがとう!
ジュゼッペ



3

Powershell、91バイト

param($n)($s=' '*--$n+'#'*$n+'#')
--$n..0+,0*$n+0..$n|%{' '*$_+"#$(' '*(3*$n-2*$_+2))#"}
$s

2

PowerShell107 97バイト

param($n)($z=$n-1)..1+,0*$n+1..$z|%{" "*$_+"#"+($x=" "*($z-$_))+(" ","#")[!($_-$z)]*($n-2)+"$x#"}

オンラインでお試しください!

前半を逆転させる安価な方法があれば、この答えはずっと良くなるでしょう。左半分、次にコア(x #'sまたはスペース)を構築し、左のロジックをミラーリングして右にします。おもしろいことに、末尾の空白をコピーする必要はありません。

展開して説明:

param($n)
($z=$n-1)..1 + ,0*$n + 1..$z |%{  #Range that repeats 0 n times in the middle
" "*$_ + "#" +($x=" "*($z-$_)) +  #Left side
(" ","#")[!($_-$z)]*($n-2) +      #Core that swaps when it's the first or last row
"$x#"}                            #Right side which is left but backwards

2

C(clang)-DP=printf( -DF=for(i + 179 = 199 180バイト

i;*m="%*s%*s\n";g(n){P"%*s",n,H;F;--i;)P H;P"\n");}f(n){g(n);F;--i;)P m,i,(H,3*n-i+~i,H;F-2;i--;)P"#%*s\n",3*n-3,H;F;--i;)P m,n-i,(H,n+i+i-1,H;g(n);}

オンラインでお試しください!

ゴルフをしていない:

f(n){
	int i;
	printf("%*d",n,0);
	for(i=0;i<n-1;i++){
		printf("0");
	}
	printf("\n");
	for(i=1;i<n;i++){
		printf("%*d%*d\n",n-i,0,n+i+i-1,0);
	}
	for(i=0;i<n-2;i++){
		printf("0%*d\n",n+n+n-3,0);
	}
	for(i=n-1;i>0;i--){
		printf("%*d%*d\n",n-i,0,n+i+i-1,0);
	}
	printf("%*d",n,0);
	for(i=0;i<n-1;i++){
		printf("0");
	}
}

@ceilingcatのおかげで-19バイト




1

バッチ、260バイト

@echo off
set s=
for /l %%i in (1,1,%1)do call set s= %%s%%
echo %s% %s: =#%
call:c %1,-1,3
for /l %%i in (1,1,%1)do echo   #%s:~2%%s%%s:~2%#
call:c 3,1,%1
echo %s% %s: =#%
exit/b
:c
for /l %%i in (%*)do call echo %%s:~,%%i%%#%%s:~%%i%%%s%%%s:~%%i%%#

各行に2つの先行スペースを出力します。説明:バッチにはストリング反復演算子がなく、ストリングスライシング機能が制限されており、算術を実行するために別個のステートメントが必要です。したがって、入力長さの文字列をスペースで構成し(バッチは少なくともこれらを#上下の行にsに変換することができます)、3から長さまでの特定の位置からスライスするか、対角線を生成するのが最もゴルファーでした(これは、スクリプトの最後の行が達成するものです)。



1

、171バイト

func[n][c:(a: n - 1)* 2 + n
b: collect[loop c[keep pad/left copy"^/"c + 1]]s: 1x1 s/1: n
foreach i[1x0 1 0x1 -1x1 -1x0 -1 0x-1 1x-1][loop a[b/(s/2)/(s/1): #"#"s: s + i]]b]

オンラインでお試しください!

説明:

Red[]
f: func [ n ] [
    a: n - 1                                         ; size - 1
    c: a * 2 + n                                     ; total size of widht / height 
    b: collect [                                     ; create a block
        loop c [                                     ; composed of size - 1 rows
            keep pad/left copy "^/" c + 1            ; of empty lines of size c (and a newline)
        ]
    ]
    s: a * 1x0 + 1                                   ; starting coordinate
    foreach i [ 1x0 1 0x1 -1x1 -1x0 -1 0x-1 1x-1 ] [ ; for each offset for the 8 directions
        loop a [                                     ; repeat n - 1 times  
            b/(s/2)/(s/1): #"#"                      ; set the array at current coordinate to "#"
            s: s + i                                 ; next coordinate
        ]        
    ]
    b                                                ; return the block 
]

1

APL(Dyalog Unicode)、46 バイトSBCS

(' '@~5 6∊⍨1⊥⊢∘,)⌺3 3⊢<(⍉⌽⌊⊢)⍣2∘(∘.+⍨∘⍳¯2+3×⊢)

このソリューションはAdámによって提供されました-ありがとう!

オンラインでお試しください!

私の(ほぼ)元のソリューション:

APL(Dyalog Unicode)、61 バイトSBCS

(((⊃∘' #'¨1+5∘=+6∘=)⊢)1⊥⊢∘,)⌺3 3⊢<(((⊖⌊⊢)⌽⌊⊢)(∘.+⍨(⍳¯2+3×⊢)))

オンラインでお試しください!

アダムの助けに感謝します!

アイデアは、部分的に正方形にある「ダイアモンド」を見つけて、エッジ検出フィルターを適用してオクタゴンの「輪郭を描く」ことです。



1
のために実際にここでクラシックを使用することはできません。むしろMetaに従ってSBCSを参照して1バイト/文字をカウントします。
アダム

@Adámありがとう!ヘッダーを編集する方法がわかりませんが、私のためにそれを行うことができますか?
ガレンイワノフ

ヘッダーを編集するとはどういう意味ですか?
アダム

1
ここから編集してコピーします
アダム

1

Perl 5、201 197 188 187 186バイト:

$a=<>;$b=3*$a-4;$c='$"x($e-$_)."#".$"x$f."#\n"';$e=($b-$a)/2+1;$d=$"x$e."#"x$a.$/;$f=$a;print$d,(map{(eval$c,$f+=2)[0]}1..$a-2),("#".$"x$b."#\n")x$a,(map{$f-=2;eval$c}reverse 1..$a-2),$d

オンラインでお試しください!

の最初の行から八角形のサイズを読み取りSTDINます。


PPCGへようこそ!おそらく、この投稿にあるトリックを使用して、あちこちで数バイト削ることができます。
メゴ

@Megoうん。の$"代わりにを使用して4バイトを節約できました" "
ネイサンミルズ

1

Perl 5、176バイト

$f=$a=<>;$b=3*$a-4;$c='$"x($e-$_)."#".$"x$f."#\n"';$e=$a-1;$d=$"x$e."#"x$a.$/;print$d,(map{(eval$c,$f+=2)[0]}1..$a-2),("#".$"x$b."#\n")x$a,(map{$f-=2;eval$c}reverse 1..$a-2),$d

上記のNathan Millsの回答に基づいています(コメントするには不十分な担当者がいます!)。

$e$a-16バイトの節約に簡略化できます。 $fチェーンを割り当てることができます。2バイトの節約。他の2つがどこから来たのかわからない!

一方で$e置き換えることができ$a-1、それが発生した2つの場所で、余分な括弧は、この唯一の休憩にも手段を必要としていました。

ゴルフをしていない:

$f = $a = <>;
$b = 3 * $a - 4;
$c = '$"x($e-$_)."#".$"x$f."#\n"';
$e = $a - 1;
$d = $" x $e . "#" x $a . $/;
print $d, ( map { ( eval $c, $f += 2 )[0] } 1 .. $a - 2 ),
  ( "#" . $" x $b . "#\n" ) x $a,
  ( map { $f -= 2; eval $c } reverse 1 .. $a - 2 ), $d




0

パール5、170の 168 166バイト

$a=<>-1;$\="#\n";print$x=$_=$"x$a."#"x$a;if(s/^( *)  #*/$1 #  $1 /){print}while (s/ #/#  /){print}$z=$_;for(1..$a){print$_=$z}while(s/#  (\s{$a})/ #$1/){print}print$x

これは正規表現の魔法で機能します。「if」は、n = 2の病理学的ケースを処理するためにのみ必要です。

 ##
 ##
#  #
 ##

おそらくこれは離れてコーディングすることができます。

中間点までストリングを作成し、それを元に戻すことで、さらに多くのことが得られると思います。もちろん、nが奇数の場合は余分なスペースを挿入/削除する必要があります(またはthin-space:pを使用します)。

非ゴルフ

$a = <> -1;                          # Subtracting one is very useful! 
$\ = "#\n";                          # Every line ends with a '#' let perl provide.  
$x=$_ = " " x $a. "#" x $a;          # The horiz line (one short)  
print;                               # print it plus the extra #
if(s/^( *)  #*/$1 #  $1 /){print}    # create a hole and remove a leading space(if n=2 this fails)
while (s/ #/#  /){                   # make the hole bigger      
    print;                           # and print (with a trailing #)
}
$z=$_;                               # store $_ for later use
for (1 .. $a) {                      # nice that we don't have to do 2..$a but not golf-nice  
  $_ =$z;                            # restore $_ (we could use $z but since we have
  print;                             # to restore somewhere, doing  it here saves us bytes)
}
while (s/#  (\s{$a})/ #$1/){         # now move the # to the right and reduce the trailing spaces  
  print;
}
print $x;                            # and finish...

おそらく$@最後にそれを押して印刷するなどの重要な変更は別として、これはおそらくもう少しゴルフできると思います。

[スペースをゴルフで囲み..、割り当て前に印刷を移動して、2つのケースでセミコロンを節約しました。]


最後の正規表現のスペースだけでなく、いくつかの命令TIOを並べ替えて20バイトを節約しました\s
Nahuel Fouilleul


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.