ASCII Art Octagons


22

Diberikan integer input n > 1, mengeluarkan oktagon seni ASCII dengan panjang sisi yang terdiri dari nkarakter. Lihat contoh di bawah ini:

n=2
 ##
#  #
#  #
 ##

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

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

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

and so on.

Anda dapat mencetaknya ke STDOUT atau mengembalikannya sebagai hasil fungsi.

Berapapun ruang kosong ekstranus dapat diterima, asalkan karakter berbaris dengan tepat.

Aturan dan I / O

  • Input dan output dapat diberikan dengan metode apa pun yang mudah .
  • Anda dapat menggunakan karakter ASCII yang dapat dicetak alih-alih #(kecuali spasi), tetapi karakter "latar belakang" harus berupa spasi (ASCII 32).
  • Program lengkap atau fungsi dapat diterima.
  • Celah standar dilarang.
  • Ini adalah sehingga semua aturan golf biasa berlaku, dan kode terpendek (dalam byte) menang.

1
Bisakah kita menggunakan karakter keluaran yang berbeda, atau perlu konsisten?
Emigna

@Emigna Karakter yang berbeda baik-baik saja.
AdmBorkBork

Jawaban:


22

05AB1E , 3 byte

7ÝΛ

Cobalah online!

Penjelasan

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

Lihat jawaban ini untuk memahami kanvas 05AB1E.


Tentunya ini harus 5 byte? Atau apakah tantangan kode golf melihat byte dan karakter sebagai yang dapat dipertukarkan
Doug

3
@Doug: Ini adalah 3 byte di halaman kode
05ab1e

Oh keren! Terima kasih atas tautan dokumen!
Doug

> :( sial, adnan
ASCII

11

JavaScript (ES6), 114 106 105 104 103 byte

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)

Cobalah online!

Bagaimana?

Ini membangun karakter keluaran dengan karakter.

Diberikan input n , kami menghitung:

n=n-1w=3n

Untuk setiap karakter di (x,y) , kami menghitung (h,v) :

h=w/2-|x-w/2|v=w/2-|y-w/2|

Sel-sel yang termasuk dalam oktagon memenuhi salah satu kondisi berikut:

  • ( h=0 ATAU v=0 ) DAN h+vn (merah di bawah)
  • h+v=n (oranye di bawah)

Misalnya, dengan n=4 (dan n=3 ):

(0,0)(1,0)(2,0)(3,0)(4,0)(4,0)(3,0)(2,0)(1,0)(0,0)(0,1)(1,1)(2,1)(3,1)(4,1)(4,1)(3,1)(2,1)(1,1)(0,1)(0,2)(1,2)(2,2)(3,2)(4,2)(4,2)(3,2)(2,2)(1,2)(0,2)(0,3)(1,3)(2,3)(3,3)(4,3)(4,3)(3,3)(2,3)(1,3)(0,3)(0,4)(1,4)(2,4)(3,4)(4,4)(4,4)(3,4)(2,4)(1,4)(0,4)(0,4)(1,4)(2,4)(3,4)(4,4)(4,4)(3,4)(2,4)(1,4)(0,4)(0,3)(1,3)(2,3)(3,3)(4,3)(4,3)(3,3)(2,3)(1,3)(0,3)(0,2)(1,2)(2,2)(3,2)(4,2)(4,2)(3,2)(2,2)(1,2)(0,2)(0,1)(1,1)(2,1)(3,1)(4,1)(4,1)(3,1)(2,1)(1,1)(0,1)(0,0)(1,0)(2,0)(3,0)(4,0)(4,0)(3,0)(2,0)(1,0)(0,0)


Wow, ini luar biasa! Saya pikir dapat disederhanakan menjadi h + v > n , meskipun saya tidak yakin apakah itu membantu logika golf sama sekali. h+vnh+v>n
Giuseppe

@ Giuseppe Memang bisa disederhanakan seperti itu jika kedua kondisi diuji. Namun dalam kode, kasus dan h v 0 dipisahkan. Namun, saya sebenarnya menguji kondisi yang berlawanan ( n > h + v ), yang sudah 1 byte lebih pendek. hv=0hv0n>h+v
Arnauld

@ Giuseppe Komentar Anda mendorong saya untuk melihat lebih dekat pada formula dan saya akhirnya menyelamatkan satu byte dengan menulisnya sedikit berbeda. :)
Arnauld

1
hv=0

8

Arang , 5 byte

GH*N#

Jawaban pertama saya dengan Charcoal!

Penjelasan:

GH*N#      //Full program
GH          //Draw a hollow polygon
   *         //with 8 sides
    N       //of side length from input
      #      //using '#' character

Cobalah online!


3
Bagi mereka yang lebih suka verbose Charcoal, itu PolygonHollow(:*, InputNumber(), "#");.
Neil

5

Kanvas , 15 14 12 byte

/⁸⇵╷+×+:⤢n╬┼

Coba di sini!

Penjelasan:

/             a diagonal of length n
 ⁸            the input,
  ⇵           ceiling divided by 2, (storing the remainder)
   ╷          minus one
    #×        repeat "#" that many times
      +       append that to the diagonal
       :⤢n    overlap that with its transpose
          ╬┼  quad-palindromize with the overlap being the remainder stored earlier

Alternatif 12-byter .


4

R , 122 117 115 byte

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

Cobalah online!

Port logika dari jawaban Arnauld , khususnya revisi ini jika ada perbaikan lebih lanjut. 2 byte lainnya disimpan berkat saran Arnauld untuk membalik logika!


-2 byte dengan melakukannya sebaliknya (saya tidak bisa melakukannya h*v&h+v-ndi JS karena &operator bitwise; tapi ini logis di R, jadi itu berfungsi).
Arnauld

@Arnauld terima kasih!
Giuseppe



3

Powershell, 91 byte

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

2

PowerShell , 107 97 byte

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

Cobalah online!

Jika ada cara murah untuk membalikkan babak pertama, jawaban ini akan terasa jauh lebih baik. Itu membangun setengah kiri, lalu inti (yang merupakan x#'s atau spasi), lalu cermin logika kiri untuk membuat yang benar. Kenyataan yang menyenangkan, Anda tidak perlu menyalin di atas spasi putih.

Belum dibuka dan dijelaskan:

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 (dentang) , -DP=printf( -DF=for(i + 179 = 199 180 byte

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

Cobalah online!

Tidak Disatukan:

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

-19 byte berkat @ceilingcat



1

Python 2 , 130 byte

def f(n):
 a=[' '*~-n+n*'#']
 b=[' '*(n-i-2)+'#'+' '*(n+2*i) +'#'for i in range(n-2)]
 return a+b+['#%*s'%(3*n-3,'#')]*n+b[::-1]+a

Cobalah online!

Di ponsel, jadi tidak luar biasa golf.


Anda dapat menghapus ruang setelah (n+2*i).
Zacharý

1

Batch, 260 byte

@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%%#

Menghasilkan dua spasi utama pada setiap baris. Penjelasan: Batch tidak memiliki operator pengulangan string, kemampuan mengiris string terbatas dan memerlukan pernyataan terpisah untuk melakukan aritmatika. Oleh karena itu paling golf untuk membuat string dari panjang input dalam spasi (Batch setidaknya dapat menerjemahkannya menjadi #s untuk garis atas dan bawah) dan kemudian mengiris dari atau ke posisi tertentu mulai dari 3 hingga panjang untuk menghasilkan diagonal. (Inilah yang dicapai baris terakhir skrip).


1

Ruby , 96 byte

->n{[*(n-=2).step(z=n*3+2,2),*[z]*n,*z.step(n,-2)].map{|x|([?#]*2*('# '[x<=>n]*x)).center(z+2)}}

Cobalah online!

Belum terlalu bermain golf. Bisa bermain golf jika saya menemukan waktu.


1

Merah , 171 byte

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]

Cobalah online!

Penjelasan:

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

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

Solusi ini disediakan oleh Adám - terima kasih!

Cobalah online!

Solusi asli saya (hampir):

APL (Dyalog Unicode) , 61 byte SBCS

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

Cobalah online!

Terima kasih kepada Adám atas bantuannya!

Idenya adalah untuk menemukan "berlian" yang terletak sebagian di alun-alun dan menerapkan filter deteksi tepi untuk "menguraikan" octagone.



1
Anda tidak dapat menggunakan Klasik di sini karena . Alih-alih menghitung 1 byte / char dengan merujuk ke SBCS sesuai Meta .
Adám

@ Adam Terima kasih! Saya tidak tahu cara mengedit tajuk, dapatkah Anda melakukannya untuk saya?
Galen Ivanov

Apa yang Anda maksud dengan mengedit tajuk?
Adám

1
Edit dan salin dari sini .
Adám

1

Perl 5, 201 197 188 187 186 byte:

$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

Cobalah online!

Membaca ukuran segi delapan dari baris pertama STDIN.


Selamat datang di PPCG! Anda mungkin dapat memotong beberapa byte di sana-sini dengan menggunakan trik yang ditemukan dalam posting ini .
Mego

@Mego Yap. Saya dapat menyimpan 4 byte dengan menggunakan $"bukan " ".
Nathan Mills

1

Perl 5, 176 byte

$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

Berdasarkan jawaban Nathan Mills di atas (yang saya punya cukup banyak komentar untuk berkomentar!).

$edapat disederhanakan untuk $a-1menghemat 6 byte; $fdapat ditugaskan rantai; menghemat dua byte; Tidak yakin dari mana dua lainnya berasal!

Sementara $edapat diganti dengan $a-1di dua tempat itu terjadi, kurung tambahan yang dibutuhkan berarti ini hanya impas.

Tidak Disatukan:

$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

1

Perl 6 , 76 73 byte

-3 byte terima kasih kepada Jo King

{(' 'x$_-1~\*x$_,{S/.\S(.)+/* {' 'x$0}*/}...*)[^$_,$_ xx$_-2,[R,] ^$_;*]}

Cobalah online!

Mengembalikan daftar garis.



0

Python 3 , 224 byte

n=int(input())
z=" "*(n-1)+"#"*n+" "*(n-1)
print(z)
for i in range(n-2):print(" "*(n-i-2)+"#"+" "*(i*2+n)+"#")
print((("#"+" "*(n*3-4)+"#\n")*n)[:-1])
for i in range(n-3,-1,-1):print(" "*(n-i-2)+"#"+" "*(i*2+n)+"#")
print(z)

Cobalah online!


0

Perl 5, 170 168 166 byte

$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

Ini bekerja dengan keajaiban regex. "Jika" hanya diperlukan untuk menangani kasus patologis n = 2, yang sebaliknya menghasilkan sesuatu seperti:

 ##
 ##
#  #
 ##

mungkin ini bisa dikodekan.

Saya pikir mungkin ada banyak lagi yang bisa didapat dengan membuat string hingga titik tengah kemudian membalikkannya. Tentu saja kita perlu memasukkan / menghapus ruang tambahan jika n ganjil (atau menggunakan ruang tipis: p).

Tidak disatukan

$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...

Saya pikir ini mungkin bisa sedikit lebih golf, terlepas dari perubahan signifikan seperti mendorong $@dan mencetak yang pada akhirnya.

[Memutar spasi di sekitar ..dan memindahkan pencetakan sebelum menetapkan dalam dua kasus, menghemat titik koma.]


disimpan 20 byte menata ulang beberapa instruksi TIO , mengapa \sdan bukan hanya spasi di regex terakhir
Nahuel Fouilleul


0

Perl 5, 98 byte

$_=2x$_.1x$_.$/;s/2//;s/.$/ #/,y/1/ /while$a.=$_,$b=$_.$b,s/2[#1]/# /;$_=$a.$_ x("@F"-2).$b;y/2/ /

TIO

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.