Codegolf Rainbow: In Schwarzweiß zeichnen

12

Einführung:

Bildbeschreibung hier eingeben(Quelle: Wikipedia )
Wenn wir einen Regenbogen betrachten, hat er immer die Farben von oben nach unten:
Rot; Orange; Gelb; Grün; Blau; Indigo; violett

Wenn wir uns diese einzelnen Ringe ansehen, ist der rote Ring natürlich größer als der violette Ring.
Darüber hinaus ist es auch möglich, zwei oder sogar drei Regenbogen gleichzeitig zu haben.

All dies oben kombiniert wird in dieser Herausforderung verwendet:

Herausforderung:

Bei einer gegebenen Ganzzahl ngeben Sie die Anzahl der Ringe des (möglicherweise mehr als einen) "Regenbogens" aus, wobei wir die Buchstaben vibgyorfür die Farben verwenden.

Sehen Sie sich die folgenden Testfälle an, um zu sehen, wie sie aufgebaut sind n=1und wie mit dem Abstand umgegangen werden solln=8 ) . Wie Sie sehen, wird ein Leerzeichen zwischen zwei Regenbogen eingefügt, einschließlich des Abstands oben, bevor der Ring des nächsten Regenbogens in der Zeile eingefügt wird.

Herausforderungsregeln:

  • Sie dürfen Kapital VIBGYORanstelle von Kleinbuchstaben verwenden
  • Zwischen den einzelnen Regenbögen sollte ein Abstand sein
  • Jede Menge von führenden und / oder nachfolgenden Leerzeichen / Zeilenumbrüchen ist zulässig, solange der tatsächliche Regenbogen (wo immer er auf dem Bildschirm platziert ist) korrekt ist
  • Die Eingabe ist immer eine positive Ganzzahl ( >= 1). Das Verhalten n=0ist daher undefiniert, und das Programm / die Funktion kann tun, was immer es will (nichts ausgeben; den Regenbogen ausgeben n=1; zufällige Ausgabe; mit einem Fehler scheitern usw.).
  • Wenn Sie möchten, können Sie eine Liste / ein Array von Zeichenfolgen oder ein 2D-Array / eine Liste von Zeichen ausgeben (Sie können den eigentlichen Pretty-Printing-Code in die TIO-Fußzeile einfügen).
  • Ignorieren Sie die Tatsache, dass die Ausgänge eher Mayatempeln als Regenbogen ähneln. XD

Allgemeine Regeln:

  • Das ist , also gewinnt die kürzeste Antwort in Bytes.
    Lassen Sie sich von Code-Golf-Sprachen nicht davon abhalten, Antworten mit Nicht-Codegolf-Sprachen zu veröffentlichen. Versuchen Sie, für jede Programmiersprache eine möglichst kurze Antwort zu finden.
  • Für Ihre Antwort gelten Standardregeln. Daher dürfen Sie STDIN / STDOUT, Funktionen / Methoden mit den richtigen Parametern und vollständige Programme vom Rückgabetyp verwenden. Ihr Anruf.
  • Standardlücken sind verboten.
  • Fügen Sie nach Möglichkeit einen Link mit einem Test für Ihren Code hinzu.
  • Es wird außerdem dringend empfohlen, eine Erklärung für Ihre Antwort hinzuzufügen.

Testfälle (zuerst n=1bis n=10und 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
Kevin Cruijssen
quelle
3
Vielleicht wissen Sie das und es ist beabsichtigt (ich weiß, dass Regenbogen auch keine Rauten oder Ascii sind und die Positionen höherer Ordnungen komplizierter werden), aber sind die Farben im 2. Regenbogen nicht umgekehrt?
Chris M
1
@ ChrisM Ah, du hast in der Tat recht. Bei zwei Regenbögen ist die zweite zwar umgekehrt , bei drei jedoch nur die äußere und bei vier beide äußere . Na ja, ein bisschen zu spät, um es jetzt zu ändern. Vielleicht denke ich später an eine dritte damit verbundene Herausforderung. :)
Kevin Cruijssen
Oh cool, schön: €)
Chris M

Antworten:

3

JavaScript (ES6), 100 Byte

Gibt ein Array von Zeichenfolgen zurück.

f=(n,a=[i='   '])=>++i<n+n/7?f(n,[c=' vibgyor'[i&7],...a].map(s=>c+s+c)):a.map(s=>' '.repeat(--i)+s)

Probieren Sie es online!

Arnauld
quelle
3

05AB1E , 32 31 23 Bytes

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

Probieren Sie es online!

-1 dank Kevin Cruijssen und -8 dank Adnan


Erläuterung (Stack-Beispiel mit Eingabe von 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.
Magic Octopus Urn
quelle
1
"vibgyor"kann von 1 Byte bis Golf gespielt werden .•2Bãθ(•. ( Hier die Erklärung dazu im Abschnitt " Wie komprimiere„vr…v r:ð« ich Saiten, die nicht Teil des Wörterbuchs sind? ") 'v„v .:. Also 28 Bytes . Gute Antwort, +1 von mir.
Kevin Cruijssen
2
@ KevinCruijssen Oh, ich weiß alles über String-Komprimierung. Ich habe nur herausgefunden (wie es normalerweise bei sehr kleinen Strings der Fall ist), dass das 3-Byte-Aufblähen von .••kein Byte retten würde. Die Zahlen der einmal überprüfe ich eigentlich gar nicht die Zeit ist , Bytes xD retten würde. Guter Fang
Magic Octopus Urn
1
@Adnan Fair genug, das Fehlen des Spiegels macht es in meinen Augen zu einem bedeutenden Refaktor (das und ich bezweifle, dass ich es alleine geschafft hätte: P).
Magic Octopus Urn
1
@Adnan ¬ýist auch genial ... Herrgott ... Du denkst so anders und es ist großartig.
Magic Octopus Urn
3

Canvas , 29 28 26 Bytes

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

Probieren Sie es hier aus!

Erläuterung:

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 Bytes nach dem Korrigieren sollte das mold zyklisch ablaufen, wenn die gewünschte Länge größer als die Länge der Eingaben ist, und das Korrigieren zum zehnten Mal

dzaima
quelle
Warum ist die vSeite aus Neugier ( <)? Befindet sich vbereits ein reserviertes Schlüsselwort in Canvas, wenn ja, warum nicht <stattdessen dieses umgekehrte Schlüsselwort verwenden?
Kevin Cruijssen
1
die Zeichen werden verwendet , vertikal und dann gedreht und Canvas ist intelligent genug , um herauszufinden , dass <90 ° gedreht gegen den Uhrzeigersinn entspricht v: P Alle ASCII sind Teil - Strings in Canvas btw
dzaima
Ah ok, also wenn du es hier benutzt vhättest und du es dann um 90 Grad gegen den Uhrzeigersinn drehst, wird es >stattdessen. Aha. : D
Kevin Cruijssen
@KevinCruijssen Das haben würde andere Folgen zu
dzaima
Ah, hast du da auch irgendwo einen Spiegel? Ich kann Canvas tbh nicht lesen und freue mich auf die Erklärung des Codes. ;)
Kevin Cruijssen
3

Haskell , 114 110 101 Bytes

Danke an [nimi] [1] für - 4 13 Bytes!

f n=""#(n+1+div n 7)
w#0=[]
w#n|x<-cycle"r vibgyo"!!n=((' '<$[2..n])++reverse w++x:x:x:w):(x:w)#(n-1)

Probieren Sie es online!

ovs
quelle
3

Dyalog APL , 41 39 38 Bytes

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

Probieren Sie es online!

Ein ähnlicher Ansatz für andere: A←⌈⎕×8÷7Ermittelt die Höhe des Regenbogens (auch die Breite der längsten "halben Reihe" links / rechts von der Mitte) und weist sie zur Aspäteren Verwendung zu, während ¨-⍳die Werte durchlaufen werden 1..A, Negieren Sie sie, um bei Verwendung mit die richtige Seite auszuwählen .

A⍴' vibgyor'generiert eine 'halbe Zeile' und ⍵↑wählt die richtige Länge der Teilzeichenfolge aus. (⌽,⊃,A↑⊢)Erzeugt die vollständige Zeile in umgekehrter Reihenfolge (was weniger Zeichen erfordert), beginnend mit einer umgekehrten halben Zeile ( ) und dann dem mittleren Zeichen, das am Anfang der halben Zeichenfolge steht ( ) und schließlich einer rechts gepolsterten Version der halben Zeile (). A↑⊢). Das Finale kehrt die Zeile in die richtige Ausrichtung um und verwandelt den Vektor der Zeilen in ein 2D-Array.

Bearbeiten: -2 dank dzaima

Edit: -1 danke an ngn

Mausefalle
quelle
Sie können ersetzen ⍕⍪durch - die Ausgabe eines 2D-Arrays von Zeichen ist zulässig
dzaima
39 Bytes
Dzaima
1+÷7->8÷7
ngn
2

Kohle , 30 Bytes

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

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:

Ändern Sie die Zeichenrichtung nach oben.

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

Berechnen Sie die Höhe des Regenbogens und wiederholen Sie die Zeichenfolge auf diese Länge.

θ⸿

Drucken Sie die Mittellinie des Regenbogens.

Eθ✂θκ

Drucken Sie die rechte Hälfte des Regenbogens, indem Sie aufeinanderfolgende Scheiben nehmen und jede auf eine eigene "Linie" drucken.

‖O←

Überlege, um den Regenbogen zu vervollständigen.

Neil
quelle
2

Gelee , 28 Bytes

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

Ein monadischer Link, der eine Ganzzahl akzeptiert, die eine Liste von Zeichenlisten liefert.

Probieren Sie es online! (Fußzeile wird mit Zeilenumbruchzeichen verbunden)

Oder sehen Sie sich die Testsuite an .

Wie?

: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)
Jonathan Allan
quelle
2

Haskell , 106 113 Bytes

Ich kann noch keine anderen Beiträge kommentieren (nämlich diesen ), daher muss ich die Lösung als separate Antwort posten.

7 Bytes von Ovs weggolfen

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

Probieren Sie es online!

( Alte Version , 113 Bytes)

Max Yekhlakov
quelle
Gute Antwort. Ich kenne Haskell nicht, aber der Code scheint sich von der anderen Haskell-Antwort zu unterscheiden. PS: Diese andere Haskell-Antwort ist tatsächlich 110 Bytes nach den Golftipps in @ nimis Kommentar . Ungeachtet dessen ist dies eine nette alternative Haskell-Antwort, also +1 von mir.
Kevin Cruijssen
1
Es scheint, dass Listenverständnisse das bessere Werkzeug für diese Herausforderung waren. Ich konnte Ihre Lösung auf 106 Bytes reduzieren, indem ich die Gesamtzahl der Funktionen reduzierte. Fühlen Sie sich frei, diese Änderungen anzupassen.
OVS
2

PowerShell , 108 98 89 85 Byte

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

Probieren Sie es online!

Diesem geht es jetzt ziemlich gut. Bankers Rundung ist immer noch der Teufel und ich fand heraus, wie man eine nicht dumme Verbindung macht. Ich habe versucht, Affen mit $ ofs nicht viel Erfolg. Apropos, die Ergebnisse ohne Joins sehen ziemlich gut aus, ein bisschen schmelzig:

         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
Veskah
quelle
[int] $ x + = $ x / 7?
mazzy
@mazzy Das schlägt fehl für x = 25. Sie müssen abschneiden, aber auf int Runden
werfen
Ja. Und abgeschnitten ist funktioniert
mazzy
1
@mazzy Ich weiß, die einzigen Möglichkeiten, die ich kenne, um abzuschneiden, sind entweder [math] :: truncate () oder der oben verwendete Regex-Trick. [int] $ x rundet die Zahl. Wenn Sie einen besseren Weg kennen, bin ich ganz Ohr.
Veskah,
1

Python 2 , 132 131 Bytes

def f(n):
 t=n+n/7;s=('vibgyor '*n)[:t];r=[s[~i:]+t*' 'for i in range(t)]
 for l in zip(*r+3*[' '+s]+r[::-1])[::-1]:print''.join(l)

Probieren Sie es online!


Gerettet:

  • -1 Byte, danke an Jonathan Frech
TFeld
quelle
Warum //in Python 2?
Jonathan Frech
@ JonathanFrech Weil ich dumm bin: P
TFeld
@dzaima, ja. Sollte jetzt behoben sein
TFeld
1

Rot , 153 Bytes

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

Probieren Sie es online!

Etwas besser lesbar:

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 ]
    ]
]
Galen Ivanov
quelle
1

Java (JDK 10) , 184 Byte

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

Probieren Sie es online!

Gibt für jedes Vielfache von 7 ein zusätzliches vorangestelltes und nachfolgendes Leerzeichen aus.

Erläuterung

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
}

Credits

Olivier Grégoire
quelle
Sie können 2 Bytes einsparen, indem Sie ,w=-~h*2+1,i=h+1zu ",i=h+1,w=i*2+1
Kevin Cruijssen
Wow, ich sollte wirklich nicht Mitternacht Golf spielen! Danke dafür, @KevinCruijssen! :)
Olivier Grégoire
Schlagen Sie i-~istattdessen vori*2+1
ceilingcat
1

Stax , 23 Bytes

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

Führen Sie es aus, und debuggen Sie es

Ausgepackt, ungolfed und kommentiert sieht es so aus.

" 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

Führen Sie dieses aus

rekursiv
quelle