별 별 만들기


17

소개

아이디어는 별표 문자 (별표)를 사용하여 *지정된 차원에서 별자리를 표시하는 것입니다. 치수는 별의 상단 점의 선으로 높이를 지정하는 이상의 입력 숫자 입니다. 여기의 별은 그림의 관점에서 더 큰 크기로 더 큰 크기를 가진 6 개의 별 모양입니다.1

모든 경우에 별의 아스키 아트 표현은 다음 예와 같이 겹치는 두 개의 삼각형으로 나타납니다.

파라 메트릭

다음 그림과 데이터 표는 별의 처음 7 개 크기에 대한 속성을 설명합니다. N = 1 이 다른 것을 제외하고 증가함에 따라 각 매개 변수는 산술 진행으로 증가 합니다.=1

여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오

1 (변성 사례)의 입력에 대한 프로그램 출력은 다음과 같아야합니다.

  *
*****
*****
  *

2의 입력 :

    *
   ***
*********
 *******
*********
   ***
    *

(삼)

       *
      ***
     *****
***************
 *************          
  ***********
 *************
***************
     *****
      ***
       *

(5)

             *
            ***
           *****
          *******
         *********
***************************
 *************************
  ***********************
   *********************
    *******************
   *********************
  ***********************
 *************************
***************************
         *********
          *******
           *****
            ***
             *

도전

너의 임무는 숫자 N을 입력으로 받아 들여 문자와 *문자 만 사용하여 적절한 크기의 별을 출력하는 함수 또는 프로그램을 만드는 것 입니다.

  • 입력 값이 항상 양의 정수라고 가정 할 수 있습니다.
  • 출력 라인의 후행 공백은 정상입니다.
  • 프로그램 알고리즘은 모든 입력이 스타 아트 출력을 생성 할 수있을 정도로 일반적이어야합니다 . 물론 디스플레이 출력 크기로 인해 실질적인 제한이 있습니다.
  • 출력은 STDOUT으로 인쇄되어야합니다.
  • 표준 허점 은 금지되어 있습니다.
  • 이것은 이므로 일반적인 모든 골프 규칙이 적용됩니다.

채점

이것은 이므로 가장 짧은 바이트 수를 가진 코드가 승리합니다!


5
또한 함수일 수 있지만 "STDOUT에 인쇄"해야합니다. 이것은 의도적 인 것입니까?
Post Rock Garf Hunter

5
예, 일반적인 건설 규칙은 훌륭합니다 ... 예를 들어 N = 4와 같은 입력조차 확실하지 않습니다.
digEmAll

7
"별을 생성하는 알고리즘은 프로그래밍 과제의 일부입니다."라고 말하지 마십시오. 이것은 ASCII 아트 챌린지를 할 때 대부분의 골퍼들이 즐기는 것이 아니며, 지정자 책임이있는 것을 졸라 내리는 것처럼 들립니다. 즉, 사람들이 여기 건설에 대해 명확하지 않은 것에 놀랐습니다. 도전이 말한 것처럼 두 개의 삼각형이 겹쳐져 있습니다. 삼각형의 크기와 오프셋을 명시 적으로 말하면 도움이됩니까?
xnor

9
@TimPederick N = 1이 다른 것에 대한 좋은 캐치. 솔버가 이것을 놓치지 않도록 메모를 작성했습니다. 나는이 특별한 경우가 없다면 도전이 더 나을 것이라고 생각합니다.
xnor

4
@ xnor : n = 1이 다르기 때문에 일반적인 규칙을 추론 할 수 없었습니다 ... IMO 규칙은 항상 ASCII 아트에 대해 지정해야합니다. 그렇지 않으면 정의 된 범위 밖에서 원하는 것을 인쇄 할 수 있습니다. 예;)
digEmAll

답변:


7

05AB1E , 21 바이트

3*s≠-L·<sÅ0«Âø€à'*×.C

온라인으로 사용해보십시오! 또는 테스트 스위트

설명

3*                     # multiply input by 3
  s≠-                  # subtract 1 if the input isn't 1
     L                 # push range [1 ... (3*n-(n!=1))]
      ·<               # multiply by 2 and subtract 1 to get odd numbers
        sÅ0«           # append n zeroes
            Âø         # zip with a reversed copy
              ۈ       # get the largest number in each pair
                '*×    # repeat "*" for each number in the list
                   .C  # format centered

1
출력 별이 올바르게 보입니다.
Michael Karas

1
3*s≠-L·<같은 6*s≠·-ÅÉ또는에 대한 많은 대안을 찾을 수 ≠3/-6*ÅÉ있지만 불행히도 더 짧은 것은 없습니다. 항상 그렇듯이 좋은 대답입니다! :)
Kevin Cruijssen

xs3*<ŸRsLì'*×.º.C.∊19 :). 나는 그것이 효과가 없다고 거짓말했다.
Magic Octopus Urn

7

하스켈 , 114 바이트

별을 STDOUT에 인쇄 g하는 숫자를 가져오고 IO모나드를 생성 하는 함수 를 작성합니다 . 나는 이것이 괜찮다고 생각한다.

f=replicate
a%b=mapM_(\n->putStrLn$f(a-n)' '++f(2*n-3)'*')$zipWith max<*>reverse$[2..a]++f b 0
g 1=4%1
g a=(3*a)%a

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

설명

먼저 람다에 대해 이야기하겠습니다.

\n->putStrLn$f(a-n)' '++f(2*n-1)'*'

n별표로 그리려면 숫자가 필요합니다 . 그 별 두 배를 인쇄 한 다음 1 개를 더 인쇄하고 이미지 크기 오른쪽에 채 웁니다. a별의 중심 을 맞추기 위해 오른쪽에 공백으로 채 웁니다. 이 람다를 사용하여 각 선을 그릴 수 있습니다.

이 람다에서 우리는을 만듭니다 (%). (%)일을 시작 mapM_모양으로 프로파일을 설정하는 우리의 람다와 함께.

이제 우리가해야 할 일은 별의 프로파일 목록을 만드는 것입니다. 먼저으로 삼각형을 만든 [1..a]다음 0으로 채워서이 작업을 수행 할 수 있습니다 ++replicate b 0. 우리가 삼각형의 프로파일을 취하고 그것을 뒤집 으면 별의 다른 절반을 얻습니다. 그것들을 강요하기 위해 각 항목이 두 삼각형의 최대 값 인 새 프로파일을 만듭니다. 이것은입니다 zipWith max.

우리는 다음 두 가지 방법 중 하나를 호출로 3%1의 입력 1과와 (3*a-1)%a달리.

여기에서 우리는 약간의 바이트를 면도하기 위해 약간의 값으로 약간의 조정을 수행합니다. 3*a-1다소 길기 때문에 모든 다른 값을 1로 오프셋하여 모든 것이 취소되고 3*a대신 의도 한 동작을 얻습니다 . 즉 우리는에서 목록을 시작 2대신 1하고 수행 2*n-3하는 대신 2*n-1변경을 만회 할 수 있습니다.

대체 버전, 114 바이트

이것은 포인트 프리 기능을 만듭니다. (%)<*>min 2

f=replicate
a%b=mapM_(\n->putStrLn$f(3*a-n)' '++f(2*(n-b)+1)'*')$zipWith max<*>reverse$[b..3*a]++f a 0
(%)<*>min 2

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

>1

f=replicate
g a=mapM_(\n->putStrLn$f(3*a-n)' '++f(2*n-3)'*')$zipWith max<*>reverse$[2..3*a]++f a 0

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

와 같은 모든 경우를 처리합니다.=1

f=replicate
g a=mapM_(\n->putStrLn$f(3*a-n)' '++f(2*n-1)'*')$zipWith max<*>reverse$[1..3*a]++f a 0

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


출력 결과가 좋아 보입니다.
Michael Karas

6

R , 125 (107) 101 바이트

function(n,S=3*n+!n-1,P=pmax(I<-c(2:S*2-3,!1:n),rev(I)),`~`=strrep)write(paste0(' '~S-1-P/2,'*'~P),1)

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

  • @Giuseppe 덕분에 -24

이전 (다른) 접근법 :

R , 150 148 136 135 130 128 바이트

function(n,G=n<2,K=4*n-1+G)for(i in 1:K-1)cat(`[<-`(rep(' ',W<-3*n-2+G),1+W+c(-i:i*(i<K-n),-(j=K-i-1):j*(i>=n)),'*'),sep='','
')

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

  • @Kirill L. 덕분에 -14
  • @ t-clausen.dk 덕분에 -1
  • @Giuseppe 덕분에 -7

그래, 나는 또한 S [] 등의 = 할당 및 외모 반복 그들 같이하지 않는 이 작품
키릴 L.

대단해! 나는 그런 식으로 생각하고 있었지만 저녁을 먹고 있었다 : P
digEmAll

바이트를 절약 할 수있는 것 같습니다 : i> n-1i> = n
t-clausen.dk

@ t-clausen.dk : 네, 감사합니다!
digEmAll

1
최신 버전에서 117 바이트
Giuseppe

5

파이썬 2 , 101 99 97 바이트

n=input()
x=2*(n>1)
for i in range(1,8*n,2):print('*'*[i,8*n-i-x][i+x>n*6or i/n/2%2]).center(6*n)

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

Lynn 덕분에 -2 바이트


셀렉터 표현식에 파렌이 필요하지 않다고 확신하므로 i+x>n*6or2 바이트를 절약합니다.
Lynn

@Lynn Thanks :)
TFeld

당신은 갈 i+x>~i/n/2%2*6*n수도 있고 i+x>3*n*(~i/n&2)(96 바이트 모두)
Lynn

5

자바 스크립트 (V8) ,  101  (108) 바이트

편집 : + 7 바이트는 STDOUT으로 인쇄

n=>print((k=3*n+!~-n,g=y=>++y<k+n?`
`.padEnd(w=k-Math.max(y>n&&n-y+k,y<k&&y)).padEnd(2*k+~w,'*')+g(y):'')``)

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

댓글 없음 ( print)

n => (                    // n = input
  k =                     // k is half the maximum width of the star + 1.5
    3 * n + !~-n,         // k = 3n if n > 1 or 4 if n = 1
  g = y =>                // g = recursive function taking y
    ++y < k + n ?         //   increment y; if y is less than k + n:
      `\n`                //     append a line feed
      .padEnd(            //     append w - 1 leading spaces:
        w =               //       where w is defined as
          k -             //       k minus
          Math.max(       //       the maximum of:
            y > n         //         - true (coerced to 1) if y > n
            && n - y + k, //           or n - y + k otherwise (bottom triangle)
            y < k &&      //         - true (coerced to 1) if y < k
            y             //           or y otherwise (top triangle)
          )               //       end of Math.max()
      )                   //     end of padEnd()
      .padEnd(            //     append 2 * (k - w) - 1 stars
        2 * k + ~w,       //       by padding to 2 * k - w - 1
        '*'               // 
      ) +                 //     end of padEnd() 
      g(y)                //     append the result of a recursive call
    :                     //   else:
      ''                  //     stop recursion
)``                       // initial call to g with y = [''] (zero-ish)

도전에 직면하기 만하면 출력을 콘솔에 직접 인쇄해야합니다. 이것은 기술적으로 해당 요구 사항을 충족하지 않습니다.
Post Rock Garf Hunter

@ SriotchilismO'Zaic 알려 주셔서 감사합니다. 이것은 이제 '고정'되었습니다.
Arnauld

3

젤리 , 21 바이트

×3’+ỊR;Ṭ»Ṛ$”*ẋz⁶ṚZŒBY

STDOUT에 인쇄되는 양의 정수를 허용하는 전체 프로그램.

온라인으로 사용해보십시오! 또는 테스트 스위트를 참조하십시오.

어떻게?

×3’+ỊR;Ṭ»Ṛ$”*ẋz⁶ṚZŒBY - Main Link: integer, n   e.g. 3
 3                    - three                        3
×                     - multiply (n by)              9
  ’                   - decrement                    8
    Ị                 - insignificant (abs(n)<=1)?   0
   +                  - add                          8
     R                - range                        [1,2,3,4,5,6,7,8]
       Ṭ              - un-truth (n)                 [0,0,1]
      ;               - concatenate                  [1,2,3,4,5,6,7,8,0,0,1]
          $           - last two links as a monad:
         Ṛ            -   reverse                    [1,0,0,8,7,6,5,4,3,2,1]
        »             -   maximum (vectorises)       [1,2,3,8,7,6,7,8,3,2,1]
           ”*         - an asterisk character        '*' 
             ẋ        - repeat (vectorises)          ["*","**",...]
               ⁶      - a space character            ' '
              z       - transpose with filler        ["***********"," ********* ",...]
                Ṛ     - reverse                      ["   *   *   ","   ** **   ",...]
                 Z    - transpose                    ["       *","      **",...]
                  ŒB  - bounce (vectorises)          ["       *       ","      ***      ",...]
                    Y - join with newline characters "       *       \n      ***      \n..."
                      - implicit print


2

젤리 , 21 바이트

×’»ɗ3”*xⱮz⁶ɓ⁶x;»Ṛ$ŒBY

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

왼쪽 인수로 단일 정수를 허용하고 별을 출력으로 사용하여 줄 바꾸기로 구분 된 젤리 문자열을 반환하는 모나드 링크. 전체 프로그램으로 실행하면 별표가 STDOUT에 내재적으로 인쇄됩니다.

설명

   ɗ3                 | Last three links as a dyad with 3 as right argument:
×                     |   Multiply (by 3)
 ’                    |   Decrease by 1
  »                   |   Maximum of this (and 3)
     ”*xⱮ             | An implicit range from 1 to this many asterisks
         z⁶           | Zip with space as filler
           ɓ          | Start a new dyadic chain with the input as left argument and the list of asterisks as right argument
            ⁶x        | Input many spaces
              ;       | Concatenated to the asterisk list
                 $    | Last two links as a monad:
               »Ṛ     |   Maximum of this list and its reverse
                  ŒB  | Bounce each list (i.e. mirror it without duplicating the middle entry)
                    Y | Join with newlines

1
×3’»3같은 길이 인데도 스타일리쉬 한 방식으로 시작을 작성해 주셔서 감사합니다 ^ _ ^
Lynn

1
@Lynn은 여러 링크를 병합하기 위해 또 다른 빠른 링크를 사용할 것이라고 생각했으며 최대 4 허용 범위 내에서 그렇게 할 수 있음을 의미했습니다. 그러나 일단 사용하기로 결정한 ɓ것은 중요하지 않지만 여전히 그것을 좋아했기 때문에 보관했습니다!
Nick Kennedy

2

, 25 바이트

G↙θ←⁺⊗θ¬⊖θ↑⊗θ↘⊕θ*‖O¬C⁰¬⊖θ

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 설명:

G↙θ←⁺⊗θ¬⊖θ↑⊗θ↘⊕θ*

별의 오른쪽 상단을 나타내는 불규칙한 오각형을 그리십시오. 그러나 1행을 추가 열로 넓히려면 특수한 케이스 를 사용하십시오.

‖O¬

별을 완성하십시오.

C⁰¬⊖θ

더 많은 1행 의 스타를 키우는 더 특별한 경우 .

대체 솔루션, 25 바이트 :

∧¬⊖θ*G↗↓⊖׳N*‖O‖OO↓∧⊖θ⊖⊗θ

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 설명:

∧¬⊖θ*

*의 경우 추가 를 인쇄하십시오 1.

G↗↓⊖׳N*

적절한 크기의 삼각형의 왼쪽 절반을 그립니다.

‖O

삼각형을 완성하십시오.

‖OO↓∧⊖θ⊖⊗θ

의 경우를 제외하고 반사로 1겹치십시오.이 경우에는 반사하십시오.

특별한 경우가없는 14 바이트 1:

G<⊖׳N*‖OO↑⊖⊗θ

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 설명:

G<⊖׳N*

적절한 크기의 삼각형을 그립니다.

‖OO↑⊖⊗θ

반사와 겹치십시오.


2

펄 6 , 74 바이트

{$_ Z~|[R,] $_}o{.&{|((' 'x--$+$_*3~'*'x$++*2+1)xx$_*3-($_>1)),|($ xx$_)}}

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

문자 그대로 올바른 비율의 삼각형을 만들고 문자열이나 연산자를 사용하여 거꾸로 된 복사본과 겹칩니다 (~| )를 . 선행 및 후행 줄 공백이있는 줄 목록으로 출력합니다.

설명:

                {.&{                                                     }  # Anonymous code block
                      (                        )xx$_*3-($_>1)   # Repeat n*3-(n!=1) times
                       ' 'x--$+$_*3      # With a decreasing indentation
                                   ~'*'x$++*2+1  # Append an increasing triangle
                                       # This creates the triangle
                                                            ,|($ xx$_)  # And add some padding lines
{             }o   # Pass the triangle to the combining function
    Z~|            # Zip string bitwise or
 $_                # The list
       [R,] $_     # With its reverse

2

J , 53 50 바이트

' *'{~[:(+.|.),.@#&0,~[:(|.,}.)"1*@<:>:/~@i.@-~3*]

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

언 골프

' *' {~ [: (+. |.) ,.@#&0 ,~ [: (|. , }.)"1 *@<: >:/~@i.@-~ 3 * ]

어떻게

함수로 (3 학년 시간표와 같은) 함수 테이블을 사용하여 함수로 >:(보다 크거나 같은) 삼각형을 반 으로 만듭니다. 그런 다음 각 줄을 뒤집어 놓고 마지막 열을 자르고 양쪽을 함께 꿰어 삼각형을 만듭니다 (그러나 1과 0으로 만들어 짐). n맨 아래에 0의 행을 추가하십시오 . 마지막으로 전체를 뒤집어 부울을 사용하거나 +.결과를 얻기 위해 원본에 오버레이하십시오 . 그런 다음 1 *과 0을 공백으로 돌립니다 .


좋은! 내 해결책은 다음과 같습니다-같은 길이의 다른 접근법 : 온라인으로 사용해보십시오!
Galen Ivanov

1
감사. 골프를 더 많이 할 수있을 것 같은 느낌이 들지만, 몇 가지 다른 접근법을 시도했지만 그것을 할 수 없었습니다.
요나

2

T-SQL, 194 바이트

@ 입력 값입니다

@c 상단 삼각형의 너비를 처리

@d 너비 하단 삼각형을 처리

@e출력을 포함 @c하거나@d -이것은 몇 바이트를 절약합니다

@f1의 특수한 경우를 입력으로 처리합니다. @c*@=3사용시기를 결정합니다 @f. 쓰기보다 5 바이트 저렴@c=3and @=1

DECLARE @ INT=8

,@c INT=1,@e INT=1,@d INT,@f INT=0SET @d=@*8-3r:PRINT
space(@*3-@e/2+@f/2)+replicate('*',@e-@f)SELECT
@c=nullif(@c,@*6-3)+2,@f=iif(@c*@=3,2,0),@d-=2-@f,@e=iif(@c>@d
or @c/2<@,@c,@d)IF @d>0goto r

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


1

Japt -R , 25 바이트

n=1: \ 5 바이트

õ cUon3*U-´UÎ)®ç* êÃê!U û

시도 해봐

õ cUon3*U-´UÎ)®ç* êÃê!U û     :Implicit input of integer U
õ                             :Range [1,U]
  c                           :Concatenate
   Uo                         :  Range [0,U)
     n                        :  Subtract each from
      3*U-                    :    Multiply U by 3 and subtract
          ´U                  :      Decrement U
            Î                 :      Get sign
             )                :End concat
              ®               :Map each Z
               ç*             :  Repeat "*" Z times
                  ê           :  Palindromise
                   Ã          :End map
                    ê!U       :If decremented U is 0, append reverse, else, palindromise
                        û     :Centre pad each line with spaces to the length of the longest
                              :Implicitly join with newlines and output
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.