Codegolf Rainbow:白黒で描く


12

前書き:

ここに画像の説明を入力してください(出典:Wikipedia
虹を見ると、上から下まで常に色が付いています:
赤; オレンジ; 黄; 緑; 青い; インジゴ; バイオレット

これらの個々のリングを見ると、もちろん赤いリングは紫のリングよりも大きくなっています。
さらに、2つまたは3つの虹を同時に持つこともできます。

上記のすべてを組み合わせたものが、このチャレンジで使用されます。

チャレンジ:

integerを指定するnと、(おそらく複数の) '虹'の多くのリングが出力されます。ここではvibgyor、色に文字を使用します。

以下のテストケースを参照してn=1、からどのように構築されるか、および間隔を(atでn=8)処理する方法を確認してください。ご覧のように、2つの虹の間に1つのスペースが追加されます(上部のスペースを含む)。次に、次の虹の輪を一列に追加します。

チャレンジルール:

  • VIBGYOR小文字の代わりに大文字を使用できます
  • 個々の虹の間にスペースが必要です
  • 実際の虹(画面上のどこにでも)が正しい限り、任意の量の先頭および/または末尾のスペース/改行が許可されます
  • 入力は常に正の整数(>= 1)です。そのときの動作n=0は未定義であり、プログラム/関数は何でもできます(何も出力せず、虹をn=1出力します;ランダム出力;エラーで失敗します;など)
  • 必要に応じて、文字列のリスト/配列、または文字の2D配列/リストを出力できます(TIOフッターに実際のプリティプリンティングコードを追加できます)。
  • 出力が虹よりもマヤの寺院のように見えるという事実を無視します。xD

一般的なルール:

  • これはであるため、バイト単位の最短回答が優先されます。
    コードゴルフ言語では、非コードゴルフ言語で回答を投稿することを妨げないでください。「任意の」プログラミング言語の可能な限り短い答えを考えてみてください。
  • 回答には標準の規則が適用されるため、STDIN / STDOUT、適切なパラメーターと戻り値型、完全なプログラムを持つ関数/メソッドの使用が許可されます。あなたの電話。
  • デフォルトの抜け穴は禁止されています。
  • 可能であれば、コードのテストへのリンクを追加してください。
  • また、回答の説明を追加することを強くお勧めします。

テストケース(最初n=1からn=10、そしてn=25):

1:
 vvv
v   v

2:
  iii
 ivvvi
iv   vi

3:
   bbb
  biiib
 bivvvib
biv   vib

4:
    ggg
   gbbbg
  gbiiibg
 gbivvvibg
gbiv   vibg

5:
     yyy
    ygggy
   ygbbbgy
  ygbiiibgy
 ygbivvvibgy
ygbiv   vibgy

6:
      ooo
     oyyyo
    oygggyo
   oygbbbgyo
  oygbiiibgyo
 oygbivvvibgyo
oygbiv   vibgyo

7:
       rrr
      rooor
     royyyor
    roygggyor
   roygbbbgyor
  roygbiiibgyor
 roygbivvvibgyor
roygbiv   vibgyor

8:
         vvv
        v   v
       v rrr v
      v rooor v
     v royyyor v
    v roygggyor v
   v roygbbbgyor v
  v roygbiiibgyor v
 v roygbivvvibgyor v
v roygbiv   vibgyor v

9:
          iii
         ivvvi
        iv   vi
       iv rrr vi
      iv rooor vi
     iv royyyor vi
    iv roygggyor vi
   iv roygbbbgyor vi
  iv roygbiiibgyor vi
 iv roygbivvvibgyor vi
iv roygbiv   vibgyor vi

10:
           bbb
          biiib
         bivvvib
        biv   vib
       biv rrr vib
      biv rooor vib
     biv royyyor vib
    biv roygggyor vib
   biv roygbbbgyor vib
  biv roygbiiibgyor vib
 biv roygbivvvibgyor vib
biv roygbiv   vibgyor vib

25:
                            ggg
                           gbbbg
                          gbiiibg
                         gbivvvibg
                        gbiv   vibg
                       gbiv rrr vibg
                      gbiv rooor vibg
                     gbiv royyyor vibg
                    gbiv roygggyor vibg
                   gbiv roygbbbgyor vibg
                  gbiv roygbiiibgyor vibg
                 gbiv roygbivvvibgyor vibg
                gbiv roygbiv   vibgyor vibg
               gbiv roygbiv rrr vibgyor vibg
              gbiv roygbiv rooor vibgyor vibg
             gbiv roygbiv royyyor vibgyor vibg
            gbiv roygbiv roygggyor vibgyor vibg
           gbiv roygbiv roygbbbgyor vibgyor vibg
          gbiv roygbiv roygbiiibgyor vibgyor vibg
         gbiv roygbiv roygbivvvibgyor vibgyor vibg
        gbiv roygbiv roygbiv   vibgyor vibgyor vibg
       gbiv roygbiv roygbiv rrr vibgyor vibgyor vibg
      gbiv roygbiv roygbiv rooor vibgyor vibgyor vibg
     gbiv roygbiv roygbiv royyyor vibgyor vibgyor vibg
    gbiv roygbiv roygbiv roygggyor vibgyor vibgyor vibg
   gbiv roygbiv roygbiv roygbbbgyor vibgyor vibgyor vibg
  gbiv roygbiv roygbiv roygbiiibgyor vibgyor vibgyor vibg
 gbiv roygbiv roygbiv roygbivvvibgyor vibgyor vibgyor vibg
gbiv roygbiv roygbiv roygbiv   vibgyor vibgyor vibgyor vibg

3
たぶん、あなたはこれを知っていて、それは設計によるものです(虹も菱形やアスキーではなく、高次の位置がより複雑になることを知っています)が、2番目の虹では色が反転していませんか?
クリスM

1
@ChrisMああ、あなたは確かに正しい。虹が2つある場合、2目は実際に反転しますが、3つある場合は外側のみが反転し、4つある場合は外側両方反転します。ああ、今すぐ変更するには遅すぎます。多分、これに関連する3番目の課題を考えます。:)
ケビンクルーイッセン


ああクールでいいもの:¬)
クリスM

回答:




3

05AB1E32 31 23バイト

.•VvÈ©•¹∍¬„ v:Rηε¬ý}.c

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

-1はKevin Cruijssenに、-8はAdnanに感謝


説明(3の入力を含むスタックの例):

.•VvÈ©•                  # Push 'aibgyor'           | ['aibgyor']
       ¹∍                # Extend to input length.  | ['aib']
         ¬               # Push head.               | ['aib','a']
          „ v:           # Replace with ' v'.       | [' vib']
              R          # Reverse.                 | ['biv ']
               η         # Prefixes.                | ['b', 'bi', 'biv', 'biv ']
                ε   }    # For each....             | []
                 ¬ý     # Bifurcate, join by head. | ['b','b']       ->    ['bbb']
                                                    | ['bi','ib']     ->   ['biiib']
                                                    | ['biv','vib']   ->  ['bivvvib']
                                                    | ['biv ',' vib'] -> ['biv   vib']
                     .c # Center the result.        | Expected output.

1
"vibgyor"から1バイトでゴルフできます.•2Bãθ(•。(ここでは、「辞書の一部ではない文字列を圧縮する方法」セクションで説明しています。)さらに、„vr…v r:ð«にゴルフすることができます'v„v .:。だから、28バイト。いい答えだ、私から+1。
ケビンCruijssen

2
@KevinCruijssenああ、文字列の圧縮についてはすべて知っています-3バイトの肥大化は.••1バイトを保存しないだろうと思っただけです(通常、超小型文字列の場合)。図1の時間、私は実際にチェックしていないが、それはxDでバイト節約になる時間です。良いキャッチ
マジックタコ


1
@Adnan公平に言えば、ミラーの欠如はそれを私の目での重要なリファクタリングにします(そして、私は自分でそこに着いたとは思わないでしょう:P)。
魔法のタコ

1
@Adnanも¬ý天才です... うわあ...あなたはとても違って考えて、それは素晴らしいです。
魔法のタコ

3

キャンバス29 28 26バイト

7÷U+{ <ibgyor@¹×/n}⇵K2*∔─↶

ここで試してみてください!

説明:

7÷U+                          ceil(input/7) + input
    {             }         for n in 1..the above
      <ibgyor@                in the string " <ibgyor", pick the nth character
              ¹×              repeat n times
                /             create a diagonal of that
                 n            and overlap the top 2 stack items (the 1st time around this does nothing, leaving an item for the next iterations)
                   ⇵        reverse the result vertically
                    K       take off the last line (e.g. " <ibgyor <ib")
                     2*     repeat that vertically twice
                       ∔    and append that back to the diagonals
                        ─   palindromize vertically
                         ↶  and rotate 90° anti-clockwise. This rotates "<" to "v"

25 24 22バイトは、必要な長さが入力長よりも大きい場合に、moldを循環させ、10回目のように固定する必要があります。


好奇心から、v横向き(<)なのはなぜですか?あるvもしそうなら、なぜ使用しないで、すでにキャンバスの予約キーワード<代わりにその逆のキーワードとして?
ケビンCruijssen

1
文字は垂直に使用されてから回転し、Canvasは<90°反時計回りに回転したことを理解するのに十分スマートですv:P ASCIIはすべてCanvasの文字列の一部です
dzaima

ああ、だからvここで使って、反時計回りに90度回転すると、>代わりになります。そうですか。:D
ケビンクルーッセン

@KevinCruijssen 他の結果もあるだろう
-dzaima

ああ、あなたもどこかにミラーを持っていますか?Canvas tbhが読めないので、コードの説明を楽しみにしています。;)
ケビン・クルーッセン


3

Dyalog APL41 39 38バイト

↑{⌽(⌽,⊃,A↑⊢)⍵↑A' vibgyor'}¨-⍳A←⌈⎕×8÷7

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

他の人への同様のアプローチ:A←⌈⎕×8÷7虹の高さ(中央の左/右にある最長の「半列」の幅)を見つけて、A後で使用するために割り当て¨-⍳、値1..A、を使用して、正しい側で選択するように無効にします

A⍴' vibgyor'「半分の行」を生成し⍵↑、正しい長さの部分文字列を選択します。(⌽,⊃,A↑⊢)反転した半行()から始めて、逆に全行を生成します(実行する文字数が少なくなります)。次に、中央の文字が半行文字列の先頭()から取得され、最後に半行の右詰めバージョン(A↑⊢)。final は行を正しい方向に反転し、行のベクトルを2D配列に変換します。

編集:dzaimaのおかげで-2

編集: -1おかげでngn


あなたは置き換えることができ⍕⍪許可されている文字の2D配列を出力-
dzaima


1+÷7->8÷7
ngn


2

、30バイト

↶≔… vibgyor⁺²÷×⁸⊖N⁷θθ⸿Eθ✂θκ‖O←

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

描画方向を上に変更します。

≔… vibgyor⁺²÷×⁸⊖N⁷θ

虹の高さを計算し、その長さまでリテラル文字列を繰り返します。

θ⸿

虹の中心線を印刷します。

Eθ✂θκ

連続したスライスを取り、それぞれを「行」に印刷することにより、虹の右半分を印刷します。

‖O←

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



2

ゼリー、28 バイト

:7+‘“ vibgyor”ṁµṫJZz⁶U;"⁸ŒBṚ

文字のリストのリストを生成する整数を受け入れる単項リンク。

オンラインでお試しください!(フッターは改行文字と結合します)

またはテストスイートを見る

どうやって?

:7+‘“ vibgyor”ṁµṫJZz⁶U;"⁸ŒBṚ - Link: integer
:7                           - integer divide by seven (number of full rainbows)
   ‘                         - increment (the input integer)
  +                          - add (gets the number bands)
    “ vibgyor”               - list of characters = " vibgyor"
              ṁ              - mould like the result above (as a range)
               µ             - start a new monadic chain
                 J           - range of length
                ṫ            - tail (vectorises) (gets the suffixes)
                  Z          - transpose
                   z⁶        - transpose with filler space character
                             -   (together these pad with spaces to the right)
                     U       - reverse each
                             -   (now we have the left side of the rainbow upside down)
                        ⁸    - chain's left argument, as right argument of...
                       "     -   zip with:
                      ;      -     concatenation
                             -   (adds the central character)
                         ŒB  - bounce (vectorises at depth 1)
                             -   (reflects each row like [1,2,3,4] -> [1,2,3,4,3,2,1])
                           Ṛ - reverse (turn the rainbow up the right way)


2

ハスケル、106 113バイト

私はまだ他の投稿にコメントできません(つまり これは)にので、別の回答としてソリューションを投稿する必要があります。

ovsで7バイト離れてゴルフ

p x=reverse x++x!!0:x
u m|n<-m+div(m-1)7=[(' '<$[z..n])++p(drop(n-z)$take(n+1)$cycle" vibgyor")|z<-[0..n]]

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

古いバージョン、113バイト)


いい答え。Haskellを知りませんが、コードは他のHaskellの答えとはかなり異なっているようです。PS:他のHaskellの回答は、実際には@nimiのコメントのゴルフのヒントの後の110バイトです。とにかく、これはHaskellの素晴らしい代替答えなので、+ 1してください。
ケビンCruijssen

1
リストの内包表記は、この課題に適したツールのようです。関数の総数を減らすことで、ソリューションを106バイトにゴルフすることができました。これらの変更を自由に適用してください。
ovs

2

PowerShell108 98 89 85バイト

param($x)($x+=$x/7-replace'\..*')..0|%{' '*$_+-join(" vibgyor"*$x)[$x..$_+$_+$_..$x]}

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

これは今ではかなり気分がいい。銀行家の丸めは依然として悪魔であり、私は非ダム結合を行う方法を見つけました。私は、$ ofsを使ってサルをやってみましたが、あまり成功しませんでした。言えば、結合なしの結果はかなり良く見え、少し融けています:

         vvv
        v     v
       v   rrr   v
      v   r ooo r   v
     v   r o yyy o r   v
    v   r o y ggg y o r   v
   v   r o y g bbb g y o r   v
  v   r o y g b iii b g y o r   v
 v   r o y g b i vvv i b g y o r   v
v   r o y g b i v     v i b g y o r   v

[int] $ x + = $ x / 7?
mazzy

@mazzy x = 25では失敗します。切り捨てる必要がありますが、intラウンドにキャストします
ヴェスカ

はい。そして、切り捨ては機能している
奇抜な

1
@mazzy私が知っている、切り捨てる唯一の方法は、[math] :: truncate()または上記で使用した正規表現のトリックのいずれかです。[int] $ xは数値を丸めます。より良い方法を知っているなら、私はすべて耳です。
ヴェスカ


1

、153バイト

func[n][r: take/last/part append/dup copy"""roygbiv "n l: 9 * n + 8 / 8
repeat i l[print rejoin[t: pad/left take/part copy r i l last t reverse copy t]]]

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

少し読みやすい:

f: func[ n ] [
    r: copy ""
    append/dup r "roygbiv " n
    r: take/last/part r l: 9 * n + 8 / 8
    repeat i l [
        print rejoin [ t: pad/left take/part copy r i l
                       last t 
                       reverse copy t ]
    ]
]

1

Java(JDK 10)、184バイト

n->{int h=n+n/7,i=h+1,w=i*2+1,j,k=0;var o=new char[i][w];for(;i-->0;o[i][w/2]=o[i][w/2+1])for(j=w/2;j-->0;)o[i][j]=o[i][w+~j]=i<h?j<1?32:o[i+1][j-1]:" vibgyor".charAt(k++%8);return o;}

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

7の倍数ごとに余分な先行スペースと後続スペースを出力します。

説明

n->{                             // IntFunction
 int h=n+n/7,                    //  Declare that height = n + n/7
     i=h+1,                      //          that index  = h + 1
     w=i*2+1,                    //          that width  = (h+1)*2+1
     j,                          //          j
     k=0;                        //          that k      = 0
 var o=new char[i][w];           //  Declare a 2D char array
 for(;                           //  Loop
   i-->0;                        //    Until i is 0
   o[i][w/2]=o[i][w/2+1]         //    After each run, copy the middle letter.
 )
  for(j=w/2;                     //   Loop on j = w/2
   j-->0;                        //     Until j = 0
  )                              //
   o[i][j]                       //    copy letters to the left side,
    =o[i][w+~j]                  //      and the right side
    =i<h                         //      if it's not the last line
     ?j<1                        //        if it's the first (and last) character
      ?32                        //          set it to a space.
      :o[i+1][j-1]               //          else set it to the previous character on the next line.
     :" vibgyor".charAt(k++%8);  //      else assign the next letter.
 return o;                       //  return everything
}

クレジット


あなたは、変更することで、2つのバイトを保存することができます,w=-~h*2+1,i=h+1,i=h+1,w=i*2+1
ケビンCruijssen

うわー、ゴルフは真夜中過ぎてはいけません!@KevinCruijssen、これをありがとう!:)
オリヴィエグレゴワール

提案i-~iの代わりにi*2+1
ceilingcat

1

スタックス、23 バイト

⌡G'5h!M╩EV[Ez ▼>≈<S⌡⌡0`

実行してデバッグする

開梱されていない、コメントされていない、これはこのように見えます。

" vibgyor"  string literal
,8*7/^      input * 8 / 7 + 1
:m          repeat literal to that length
|]          get all prefixes
Mr          rectangularize, transpose array of arrays, then reverse
            this is the same as rotating counter-clockwise
m           map over each row with the rest of the program, then implicitly output
            the stack starts with just the row itself
  _h        push the first character of the row
  _r        push the reversed row
  L         wrap the entire stack in a single array

これを実行する

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.