ASCII Sanat Sekizgenleri


22

Bir giriş tamsayısı verildiğinde n > 1, nkarakterlerden oluşan yan uzunlukları olan bir ASCII-sanat sekizgenini çıkar . Aşağıdaki örneklere bakınız:

n=2
 ##
#  #
#  #
 ##

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

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

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

and so on.

STDOUT'a yazdırabilir veya işlev sonucu olarak geri döndürebilirsiniz.

Karakterler uygun şekilde hizalandığı sürece herhangi bir miktarda boş boşluk kabul edilebilir.

Kurallar ve G / Ç

  • Giriş ve çıkış herhangi bir uygun yöntemle verilebilir .
  • #(Boşluk hariç) herhangi bir yazdırılabilir ASCII karakterini kullanabilirsiniz , ancak "arka plan" karakteri boşluk olmalıdır (ASCII 32).
  • Tam bir program veya bir işlev kabul edilebilir.
  • Standart boşluklar yasaktır.
  • Bu olduğundan, tüm normal golf kuralları geçerlidir ve en kısa kod (bayt cinsinden) kazanır.

1
Farklı çıktı karakterleri kullanabilir miyiz veya tutarlı olması gerekiyor mu?
Emigna

@Emigna Farklı karakterler iyi.
AdmBorkBork

Yanıtlar:


22

05AB1E , 3 bayt

7ÝΛ

Çevrimiçi deneyin!

açıklama

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

05AB1E kanvasını anlamak için bu cevaba bakınız .


Elbette bu 5 bayt olmalı? Veya kod golf zorlukları, baytları ve karakterleri birbirinin yerine kullanılabilir olarak görüyor
Doug


Oh harika! Dokümanlar bağlantısı için teşekkürler!
Doug

> :( kahretsin, adnan
ASCII

11

JavaScript (ES6), 114 106 105 104 103 bayt

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)

Çevrimiçi deneyin!

Nasıl?

Bu çıktı karakterini karakter oluşturur.

n girişi göz önüne alındığında , biz hesaplıyoruz:

n'=n-1w=3n'

(x,y) deki her karakter için , (h,v) hesaplarız :

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

Sekizgene ait hücreler aşağıdaki koşullardan birini sağlar:

  • ( h=0 VEYA v=0 ) VE h+vn' (aşağıda kırmızı)
  • h+v=n' (aşağıda turuncu)

Örneğin, n=4 (ve n=3 ) ile:

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


Vay, bu harika! nin h + v > n ile sadeleştirilebileceğini düşünüyorum , ancak bunun golf mantığına yardımcı olup olmadığından emin değilim. h+vn'h+v>n'
Giuseppe

@Giuseppe Her iki koşul da test edildiğinde, bu şekilde basitleştirilebilir. Ancak kodda, ve h v 0 durumları birbirinden ayrılır. Ancak, aslında 1 bayt daha kısa olan ( n > h + v ) zıt koşulu test ediyorum . hv=0hv0n'>h+v
Arnauld

@Giuseppe Yorumunuz, formüle daha yakından bakmamı istedi ve sonunda biraz farklı yazarak bir bayt kaydettim. :)
Arnauld

1
hakkındaki yorumunuz , benim mantığımın portuna bakmamı ve bir kaç bayt daha kurtarmamı istedi! hv=0
Giuseppe

8

Kömür , 5 bayt

GH*N#

Kömür ile ilk cevabım!

Açıklama:

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

Çevrimiçi deneyin!


3
Ayrıntılı Kömür tercih edenler için, bu PolygonHollow(:*, InputNumber(), "#");.
Neil

5

Tuval , 15 14 12 bayt

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

Burada dene!

Açıklama:

/             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 bayt .


4

R , 122 117 115 bayt

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

Çevrimiçi deneyin!

Mantığı, Arnauld'un cevabından , özellikle daha fazla iyileştirme olması durumunda , bu revizyondan taşır . Arnauld'un mantığı tersine çevirme önerisi sayesinde 2 bayt daha kurtarıldı!


-2 bayt'ı tersi yönde yaparak ( h*v&h+v-nJS'de yapamam çünkü &bitsel bir işlektir; ancak R'de mantıklı bir işlemdir, bu nedenle işe yarar).
Arnauld,

@Arnauld teşekkürler!
Giuseppe



3

Powershell, 91 bayt

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

2

PowerShell , 107 97 bayt

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

Çevrimiçi deneyin!

İlk yarıyı geri çevirmenin ucuz bir yolu olsaydı, bu cevap çok daha iyi olurdu. Sol yarısını, sonra çekirdeği (ya x #'sya da boşlukları) oluşturur, sonra sağı yapmak için solun mantığını yansıtır. Eğlenceli gerçek, takip eden beyaz boşluğa kopyalamanıza gerek yok.

Unrolled ve açıkladı:

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

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

Çevrimiçi deneyin!

Ungolfed:

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 sayesinde -19 bayt



1

Python 2 , 130 bayt

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

Çevrimiçi deneyin!

Mobil cihazlarda, inanılmaz derecede golf oynadı.


Sonra boşluğu kaldırabilirsiniz (n+2*i).
Zacharý

1

Toplu iş, 260 bayt

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

Her satıra iki satır aralığı çıkarır. Açıklama: Toplu işin dize tekrarlama operatörü, sınırlı dize dilimleme özelliği yoktur ve aritmetik işlem yapmak için ayrı ifadeler gerekir. Bu nedenle, boşluklarda giriş uzunluğunun bir dizgisini oluşturmak en iyisiydi (Toplu iş en azından bunları #üst ve alt çizgiler için çevirebilir ) ve daha sonra, köşegenleri oluşturmak için 3 ila uzunluk arasında değişen belirli bir pozisyona veya dilime dilimlemek (betiğin son satırı budur).


1

Ruby , 96 bayt

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

Çevrimiçi deneyin!

Henüz çok golf oynamam. Zaman bulabilirsem golf olabilir.


1

Kırmızı , 171 bayt

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]

Çevrimiçi deneyin!

Açıklama:

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

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

Bu çözüm Adám tarafından sağlandı - teşekkürler!

Çevrimiçi deneyin!

Benim (neredeyse) orijinal çözümüm:

APL (Dyalog Unicode) , 61 bayt SBCS

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

Çevrimiçi deneyin!

Adám'a yardımları için teşekkürler!

Buradaki fikir, karenin içinde kısmen bulunan "elması" bulmak ve oktazonu "dışlamak" için bir kenar algılayıcı filtre uygulamaktır.



1
Aslında burada Klasik kullanamazsınız . Aksine atıfta 1 bayt / kömürü sayısı SBCS göre Meta .
Ad

@ Adám Teşekkürler! Başlığı nasıl düzenleyeceğimi bilmiyorum, benim için yapabilir misin?
Galen Ivanov

Başlığı düzenleyerek ne demek istiyorsunuz?
Ad

1
Buradan düzenleyin ve kopyalayın .
Ad

1

Perl 5, 201 197 188 187 186 bayt:

$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

Çevrimiçi deneyin!

Sekizgen boyutunu ilk satırdan okur STDIN.


PPCG'ye Hoşgeldiniz! Muhtemelen burada ve orada birkaç byte tıraş olabilir bu yazıda bulunan püf noktaları kullanarak .
Mego

@Mego Yep. Ben kullanarak 4 bayt tasarruf edebildi $"yerine " ".
Nathan Mills,

1

Perl 5, 176 bayt

$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'in yukarıdaki cevabına dayanarak (bu konuda yorum yapmak için yeterli cevabım yok!).

$e$a-16 bayt tasarrufu basitleştirilebilir ; $fatanmış zincir olabilir; iki bayt tasarrufu; Diğer ikisinin nereden geldiğinden emin değilim!

Oluşan iki yerle $edeğiştirilebilse de $a-1, gereken ekstra braketler bunun sadece eşit olarak kırıldığı anlamına gelir.

Ungolfed:

$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

Python 3 , 224 bayt

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)

Çevrimiçi deneyin!


0

Perl 5, 170 168 166 bayt

$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

Bu regex büyüsü ile çalışır. "If", sadece n = 2 olan patolojik durumla başa çıkmak için gereklidir, aksi halde şöyle bir şey çıktı:

 ##
 ##
#  #
 ##

Muhtemelen bu kodlanmış olabilir.

Ben orta noktaya kadar bir dize oluşturarak sonra tersine çevirerek kazanmak için daha fazla olabileceğini düşünüyorum. Tabii ki eğer n tuhafsa fazladan bir boşluk eklememiz / silmemiz gerekir (veya ince boşluk kullanın: p).

Ungolfed

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

Sanırım bu, bunun üzerine $@baskı yapmak ve sonunda baskı yapmak gibi önemli değişikliklerden ayrı olarak biraz daha fazla golf oynayabileceğini düşünüyorum .

[Etraftaki golf alanları ..ve iki durumda atamadan önce baskı yapıldı , noktalı virgüllerden tasarruf sağlandı.]


bazı talimatlar TIO'yu yeniden düzenleyerek 20 bayt \skazandı , neden ve son
regex'te


0

Perl 5, 98 bayt

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

TIO

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.