ASCII 아트 팔각형


22

입력 integer가 주어지면 문자 n > 1로 구성된 측면 길이를 가진 ASCII 아트 팔각형을 출력하십시오 n. 아래 예를 참조하십시오.

n=2
 ##
#  #
#  #
 ##

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

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

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

and so on.

STDOUT에 인쇄하거나 함수 결과로 리턴 할 수 있습니다.

문자가 적절하게 정렬되는 한 외부 공백은 허용됩니다.

규칙 및 I / O

  • 입력 및 출력은 편리한 방법 으로 제공 할 수 있습니다 .
  • #(공백 제외) 대신 인쇄 가능한 ASCII 문자를 사용할 수 있지만 "백그라운드"문자는 공백이어야합니다 (ASCII 32).
  • 전체 프로그램 또는 기능이 허용됩니다.
  • 표준 허점 은 금지되어 있습니다.
  • 이것은 이므로 모든 일반적인 골프 규칙이 적용되며 가장 짧은 코드 (바이트)가 이깁니다.

1
다른 출력 문자를 사용할 수 있습니까, 아니면 일관성이 필요합니까?
Emigna

@Emigna 다른 문자는 괜찮습니다.
AdmBorkBork

1
매우 관련이 있습니다.
찰리

답변:


22

05AB1E , 3 바이트

7ÝΛ

온라인으로 사용해보십시오!

설명

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

05AB1E 캔버스를 이해하려면 이 답변 을 참조하십시오 .


확실히 이것은 5 바이트 여야합니까? 또는 코드 골프 문제는 바이트와 문자를 서로 바꿔서 볼 수 있습니다
Doug

3
@Doug : 그것은 3 바이트 05ab1e의 코드 페이지
Emigna

오, 멋지다! 문서 링크에 감사드립니다!
Doug

> :( damnit, adnan
ASCII 전용

11

자바 스크립트 (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

(x,y) 각 문자에 대해 (h,v) 계산합니다 .

h=w/2|xw/2|v=w/2|yw/2|

팔각형에 속하는 셀은 다음 조건 중 하나를 만족합니다.

  • ( h=0 OR v=0 ) AND h+vn (아래 빨간색)
  • h+v=n (아래 주황색)

예를 들어, n=4 (및 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)


와, 대단해! 골프 로직에 도움이되는지 확실하지 않지만 h + v > n ' 로 단순화 할 수 있다고 생각 합니다. h+vnh+v>n
주세페

@Giuseppe 두 조건을 모두 테스트하면 실제로 그렇게 간단해질 수 있습니다. 그러나 코드에서 h v 0의 경우 가 구분됩니다. 그러나 실제로 는 이미 1 바이트 더 짧은 반대 조건 ( n ' > h + v )을 테스트하고 있습니다. hv=0hv0n>h+v
Arnauld

@Giuseppe 귀하의 의견에 따라 수식을 자세히 살펴볼 수 있었고 마침내 조금 다르게 작성하여 바이트를 저장했습니다. :)
Arnauld

1
흠, 에 대한 귀하의 의견은 귀하의 논리 포트를보고 다른 바이트를 저장하라는 메시지를 표시했습니다! hv=0
주세페

8

, 5 바이트

GH*N#

차콜에 대한 첫 번째 답변!

설명:

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

온라인으로 사용해보십시오!


3
장황한 숯을 선호하는 사람들에게는 그렇습니다 PolygonHollow(:*, InputNumber(), "#");.
Neil

5

캔버스 , 15 14 12 바이트

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

여기 사용해보십시오!

설명:

/             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

대안 12 바이어 .


4

R , 122 (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의 답변 에서 논리 , 특히 추가 개선 이 필요한 경우이 개정 을 포팅합니다 . Arnauld의 논리 반전에 대한 제안 덕분에 또 다른 2 바이트가 절약되었습니다!


-2 바이트 는 다른 방법으로 수행합니다 ( 비트 연산자 h*v&h+v-n이므로 JS 에서는 할 수 없지만 &R에서는 논리적이므로 작동합니다).
Arnauld

@Arnauld 감사합니다!
주세페



3

파워 쉘, 91 바이트

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

2

PowerShell , 107 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 (클랑) , -DP=printf( -DF=for(i + 179 = 199180 바이트

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

파이썬 2 , 130 바이트

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

온라인으로 사용해보십시오!

모바일에서는 믿을 수 없을 정도로 골프를 타지 않습니다.


뒤에 공백을 제거 할 수 있습니다 (n+2*i).
Zacharý

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

각 줄에 두 개의 선행 공백을 출력합니다. 설명 : Batch에는 문자열 반복 연산자가없고 문자열 슬라이싱 기능이 제한되어 있으며 산술을 수행하기 위해 별도의 명령문이 필요합니다. 따라서 공간에서 입력 길이의 문자열을 구성하고 (배치가 적어도 #위와 아래 줄에 대해 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×⊢)))

온라인으로 사용해보십시오!

그의 도움을 주신 Adám에게 감사드립니다!

아이디어는 부분적으로 사각형에있는 "다이아몬드"를 찾고 가장자리 감지 필터를 적용하여 옥타곤을 "개요"하는 것입니다.



1
여기서 클래식을 사용할 수 없습니다 . 오히려 MetaSBCS 를 참조하여 1 바이트 / char을 계산하십시오 .
Adám

@ Adám 감사합니다! 헤더를 편집하는 방법을 모르겠습니다. 나를 위해 할 수 있습니까?
Galen Ivanov

헤더를 편집한다는 것은 무슨 뜻입니까?
Adám

1
여기 에서 편집 및 복사 .
Adám

1

펄 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 바이트를 절약 할 수있었습니다 " ".
Nathan Mills

1

펄 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 바이트 절약; 다른 두 사람이 어디에서 왔는지 확실하지 않습니다!

발생하는 두 곳에서 $e교체가 가능 하지만 $a-1, 추가 된 괄호는 이것이조차도 깨짐을 의미합니다.

언 골프 드 :

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

나는 이것이 결국에는 그것을 밀고 $@인쇄하는 것과 같은 중요한 변화와는 별개로 아마도 더 골프 될 수 있다고 생각합니다 .

[ ..두 가지 경우에 할당하기 전에 세미콜론으로 저장하기 전에 주변의 골프 공간 과 인쇄가 이동했습니다.]


마지막 정규 표현식의 공백이 아니라 왜 몇 바이트 TIO 명령을 다시 정렬하여 20 바이트를 \s절약했습니다.
Nahuel Fouilleul


0

펄 5, 98 바이트

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

TIO

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.