星は星を作る


17

前書き

アスタリスク文字(星)を使用*して、指定された次元でascii-art星を表示するという考え方です。次元は、星の上部の点の高さを線で指定する1以上の入力数です。ここでの星は、写真の観点から見たときのサイズが大きく見える6つの尖った星を意図しています。

すべての場合において、星のascii-art表現は、次の例に示すように重なり合う2つの三角形として表示されます。

パラメトリック

次の図とデータの表は、星の最初の7つのサイズの属性を説明しています。N = 1が異なる場合を除き、各パラメーターはNが増加するにつれて等差数列で増加します。N=1

ここに画像の説明を入力してください

ここに画像の説明を入力してください

入力が1の場合(縮退の場合)、プログラムの出力は次のようになります。

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

入力2:

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

(3)

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

(5)

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

チャレンジ

あなたの仕事は、入力として数値Nを受け入れ、文字と*文字だけを使用して適切なサイズの星を出力する関数またはプログラムを作成することです。

  • 入力値は常に正の整数であると仮定できます。
  • 出力行の末尾の空白は問題ありません。
  • N
  • 出力はSTDOUTに出力されます。
  • 標準的な抜け穴は禁止されています。
  • これはので、通常のゴルフ規則はすべて適用されます。

得点

これはなので、バイト数が最も短いコードが勝ちです!


5
また、それは関数になる可能性があると言いますが、「STDOUTに出力」する必要があります。これは意図的なものですか?
ウィートウィザード

5
うん、一般的な構成規則は、素晴らしいことだ...例えば、私はN = 4 ...のようにも入力、わからないんだけど
digEmAll

7
「星を生成するアルゴリズムはプログラミングの課題の一部です」と言わないでください。これは、ほとんどのゴルファーがASCIIアートチャレンジを行うときに楽しむものではなく、指定者の責任である何かを解き明かす試みのように聞こえます。とはいえ、ここでの構造について人々が不明確であることは驚きです。課題が示すように、2つの三角形が重なり合っています。三角形のサイズとオフセットを明示的に言うと役立ちますか?
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
出力スターは正しく見えます。
マイケルカラス

1
またはの3*s≠-L·<ような選択肢がたくさん見つかりますが、残念ながら短いものはありません。いつものようにいい答えです!:)6*s≠·-ÅÉ≠3/-6*ÅÉ
ケビンクルーッセン

xs3*<ŸRsLì'*×.º.C.∊19の場合:)。私は嘘をついた、それは1のために機能しません。インスピレーションのためにそれを残す。
魔法のタコUr

7

Haskell、114バイト

g数字を受け取りIO、スターをSTDOUTに出力するモナドを生成する関数を作成します。これは大丈夫だと思います。

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星として描画される数字が必要です。星を2倍印刷し、さらに1星を印刷して、画像のサイズまで右側に埋め込みます。これを右側にaスペースで埋めて、星の線を中央に配置します。このラムダを使用して、各線を描画できます。

このラムダから作成します(%)(%)やってで始まるmapM_形にプロフィールを回すために私たちのラムダと。

あとは、星のプロファイルのリストを作成するだけです。これを行うには、まず三角形を作成し[1..a]、次にゼロをパディングします++replicate b 0。三角形のプロファイルを取得して逆にすると、星の残り半分が得られます。それらをスーパーインポーズするには、各エントリが2つの三角形の最大値である新しいプロファイルを作成します。これです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

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

N>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

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

N=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

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


これで出力がきれいになりました。
マイケルカラス

6

R125の 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)

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

  • -24 @Giuseppeに感謝

以前の(異なる)アプローチ:

R150の 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='','
')

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

  • -14 @Kirill L.に感謝
  • -1 @ t-clausen.dkに感謝
  • -7 @Giuseppeに感謝

ええ、私もS [] =の割り当てが繰り返されるのは好きではなく、この
Kirill L.

すごい !私はそのようなことを考えていました...しかし、私は夕食を食べていました:P
digEmAll

バイトを保存できるようです:i> n-1i> = nに
t-clausen.dk

@ t-clausen.dk:うん、ありがとう!
digEmAll

1
新しいバージョンでは117バイト
ジュゼッペ

5

パイソン2101の 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)

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

-2バイト、Lynnのおかげ


セレクター式に括弧を必要としないので、i+x>n*6or2バイト節約できます。
リン

@Lynnありがとう:)
TFeld

行くこともできi+x>~i/n/2%2*6*nますし、i+x>3*n*(~i/n&2)(両方とも96バイトです)
Lynn

5

JavaScriptの(V8)  101の  108バイト

編集:STDOUTに出力する+7バイト

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)

頭を悩ますだけで、出力を直接コンソールに出力する必要があるようです。これは技術的にその要件を満たしていません。
ウィートウィザード

@ SriotchilismO'Zaic教えてくれてありがとう。これは現在「修正済み」です。
アーナルド

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つ以内でそれを行うことができました。しかし、一度使用するɓことに決めたのは問題ではありませんでしたが、私はそれがまだ好きだったので、それを保持しました!
ニックケネディ

2

、25バイト

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

オンラインでお試しください!リンクは、コードの詳細バージョンです。説明:

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

星の右上4分の1を表す不規則な五角形を描画しますが、特別なケーシング1を使用して行を余分な列に広げます。

‖O¬

反射して星を完成させます。

C⁰¬⊖θ

特別なケーシングを使用して1、余分な列の星を高くします。

代替ソリューション、25バイト:

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

オンラインでお試しください!リンクは、コードの詳細バージョンです。説明:

∧¬⊖θ*

*の場合は追加を印刷し1ます。

G↗↓⊖׳N*

適切なサイズの三角形の左半分を描画します。

‖O

反射して三角形を完成させます。

‖OO↓∧⊖θ⊖⊗θ

の場合を除き、そのリフレクションでオーバーラップ1します。

特別なケースなしの14バイト1

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

オンラインでお試しください!リンクは、コードの詳細バージョンです。説明:

G<⊖׳N*

適切なサイズの三角形を描きます。

‖OO↑⊖⊗θ

反射でオーバーラップします。


2

Perl 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

J53 50バイト

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

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

食べない

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

どうやって

関数>:として(以上)を使用して、三角形の半分を構成するには、関数テーブル(3年生の時間テーブルなど)を使用します。次に、各行を反転し、最後の列を切り刻み、2つの辺をつなぎ合わせて完全な三角形を作成します(ただし、1と0で構成されます)。n下部にゼロの行を追加します。最後に全体を反転し、ブール値を使用し+.て結果を取得するために元のオブジェクトにオーバーレイします。次に、1から*0をスペースに変換します。


いいね!ここに私のソリューションがあります-同じ長さ、異なるアプローチ:オンラインで試してみてください!
ガレンイワノフ

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.