Codegolf Rainbow: disegna in bianco e nero


12

Introduzione:

inserisci qui la descrizione dell'immagine(Fonte: Wikipedia )
Quando guardiamo un arcobaleno avrà sempre i colori dall'alto verso il basso:
rosso; arancia; giallo; verde; blu; indaco; viola

Se guardiamo questi singoli anelli, l'anello rosso è ovviamente più grande dell'anello viola.
Inoltre, è anche possibile avere due o anche tre arcobaleno contemporaneamente.

Tutto questo sopra combinato verrà utilizzato in questa sfida:

Sfida:

Dato un numero intero n, genera molti anelli dei "arcobaleni" (forse più di uno), dove useremo le lettere vibgyorper i colori.

Vedere i casi di test di seguito per vedere come sono costruiti verso l'alto n=1e come deve essere gestita la spaziatura (at n=8). Come puoi vedere, viene aggiunto uno spazio tra due arcobaleni, compresa la spaziatura nella parte superiore, prima di aggiungere l'anello del prossimo arcobaleno in linea.

Regole della sfida:

  • È consentito utilizzare il capitale VIBGYORanziché il minuscolo
  • Dovrebbe esserci uno spazio tra i singoli arcobaleni
  • È consentita qualsiasi quantità di spazi / nuove linee iniziali e / o finali, purché l'arcobaleno reale (ovunque sia posizionato sullo schermo) sia corretto
  • L'input sarà sempre un numero intero positivo ( >= 1). Il comportamento quando n=0è quindi indefinito e il programma / funzione può fare tutto ciò che vuole (emettere nulla; emettere l'arcobaleno di n=1; output casuale; fallire con un errore; ecc.)
  • È possibile generare un elenco / array di stringhe o array / elenco di caratteri 2D se lo si desidera (è possibile aggiungere il codice di stampa piuttosto reale nel piè di pagina TIO).
  • Ignora il fatto che le uscite assomigliano più ai templi Maya che agli arcobaleni .. xD

Regole generali:

  • Questo è , quindi vince la risposta più breve in byte.
    Non lasciare che le lingue di code-golf ti scoraggino dal pubblicare risposte con lingue non codegolfing. Prova a trovare una risposta il più breve possibile per "qualsiasi" linguaggio di programmazione.
  • Per la tua risposta valgono regole standard , quindi puoi usare STDIN / STDOUT, funzioni / metodo con i parametri corretti e tipo di ritorno, programmi completi. La tua chiamata.
  • Le scappatoie predefinite sono vietate.
  • Se possibile, aggiungi un link con un test per il tuo codice.
  • Inoltre, si consiglia vivamente di aggiungere una spiegazione per la risposta.

Casi di test (dal primo n=1al n=10, e 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
Forse lo sai ed è di progettazione (so che anche gli arcobaleni non sono rombi o ascii e le posizioni degli ordini superiori diventano più complicate), ma i colori non sono invertiti nel 2 ° arcobaleno?
Chris M,

1
@ChrisM Ah, hai davvero ragione. Con due arcobaleni il secondo è effettivamente invertito , ma con tre solo l'esterno è invertito e con quattro entrambi gli esterni sono invertiti. Ah bene, un po 'troppo tardi per cambiarlo ora. Forse penserò a una terza sfida correlata con questo in seguito. :)
Kevin Cruijssen,


Oh bello, bello: ¬)
Chris M,

Risposte:


5

Python 2 , 84 82 81 byte

-2 byte grazie a ElPedro.

n=input();n+=n/7;w=''
while-~n:w+=" vibgyor"[n%8];print' '*n+w+w[-1]+w[::-1];n-=1

Provalo online!


3

JavaScript (ES6), 100 byte

Restituisce una matrice di stringhe.

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)

Provalo online!


3

05AB1E , 32 31 23 byte

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

Provalo online!

-1 grazie a Kevin Cruijssen e -8 grazie ad Adnan


Spiegazione (esempio di stack con input di 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"può essere giocato a golf da 1 byte a .•2Bãθ(•. ( Qui la spiegazione per esso nella sezione " Come comprimere le stringhe che non fanno parte del dizionario? ") Inoltre, è „vr…v r:ð«possibile giocare a golf 'v„v .:. Quindi 28 byte . Bella risposta però, +1 da parte mia.
Kevin Cruijssen,

2
@KevinCruijssen oh, so tutto sulla compressione delle stringhe, ho solo immaginato (come di solito accade con stringhe super piccole) che il gonfiamento di 3 byte di .••non avrebbe salvato un byte. Cifre che una volta non controllo effettivamente è il momento in cui salverebbe byte xD. Buona cattura
Magic Octopus Urn


1
@Adnan abbastanza equamente, la mancanza dello specchio lo rende un significativo rifrattore nei miei occhi (questo e dubito che ci sarei arrivato da solo: P).
Magic Octopus Urn

1
@Adnan ¬ýè anche geniale ... Cavolo ... La pensi così diversamente ed è fantastico.
Magic Octopus Urn,

3

Tela , 29 28 26 byte

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

Provalo qui!

Spiegazione:

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 byte dopo aver risolto che shouldvecchio dovrebbe scorrere se la lunghezza desiderata è maggiore della lunghezza degli ingressi e fissarsi per la decima volta


Per curiosità, perché è vlateralmente ( <)? vSe in tal caso è già una parola chiave riservata in Canvas, perché non utilizzare <invece quella parola chiave invertita?
Kevin Cruijssen,

1
i caratteri vengono usati verticalmente e quindi ruotati, e Canvas è abbastanza intelligente da capire che <ruotato di 90 ° in senso antiorario equivale a v: P Tutti gli ASCII fanno parte delle stringhe in Canvas btw
dzaima

Ah ok, quindi se avessi usato vqui, e poi lo ruotassi di 90 gradi in senso antiorario, diventa >invece. Vedo. : D
Kevin Cruijssen,

@KevinCruijssen Sarebbe hanno altre conseguenze troppo
dzaima

Ah, hai anche uno specchio lì da qualche parte? Non riesco a leggere Canvas tbh, quindi non vedo l'ora di spiegare il codice. ;)
Kevin Cruijssen,

3

Haskell , 114 110 101 byte

Grazie a [nimi] [1] per - 4 13 byte!

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)

Provalo online!


3

Dyalog APL , 41 39 38 byte

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

Provalo online!

Un approccio simile agli altri: A←⌈⎕×8÷7trova l'altezza dell'arcobaleno (anche la larghezza della "mezza fila" più lunga a sinistra / a destra del centro) e lo assegna Aper un uso successivo, mentre ¨-⍳scorre i valori 1..A, negandoli per selezionare dal lato corretto se utilizzato con .

A⍴' vibgyor'genera una 'mezza fila' e ⍵↑seleziona la sottostringa di lunghezza corretta. (⌽,⊃,A↑⊢)genera l'intera riga al contrario (che richiede meno caratteri da eseguire), iniziando con una mezza riga invertita ( ), quindi il carattere centrale preso dall'inizio della stringa della mezza riga ( ) e infine una versione imbottita a destra della mezza riga ( A↑⊢). Il finale inverte la riga nell'orientamento corretto e trasforma il vettore di righe in un array 2D.

Modifica: -2 grazie a dzaima

Modifica: -1 grazie a ngn


È possibile sostituire ⍕⍪con : è consentita l'output di una matrice 2D di caratteri
dzaima


1+÷7->8÷7
ngn


2

Carbone , 30 byte

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

Provalo online! Il collegamento è alla versione dettagliata del codice. Spiegazione:

Cambia la direzione del disegno verso l'alto.

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

Calcola l'altezza dell'arcobaleno e ripeti la stringa letterale a quella lunghezza.

θ⸿

Stampa la linea centrale dell'arcobaleno.

Eθ✂θκ

Stampa la metà destra dell'arcobaleno prendendo sezioni successive e stampandole ognuna sulla propria "linea".

‖O←

Rifletti per completare l'arcobaleno.



2

Gelatina , 28 byte

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

Un collegamento monadico che accetta un numero intero che produce un elenco di elenchi di caratteri.

Provalo online! (il piè di pagina si unisce ai caratteri di nuova riga)

Oppure vedi la suite di test .

Come?

: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

Haskell , 106 113 byte

Non posso ancora commentare altri post (vale a dire questo ), quindi devo pubblicare la soluzione come risposta separata.

Golfato via 7 byte da ovs

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

Provalo online!

( Vecchia versione , 113 byte)


Bella risposta. Non conosco Haskell, ma il codice sembra piuttosto diverso dall'altra risposta di Haskell. PS: L'altra risposta di Haskell è in realtà 110 byte dopo i suggerimenti sul golf nel commento di @ nimi . Indipendentemente da ciò, questa è una bella risposta Haskell alternativa, quindi +1 da parte mia.
Kevin Cruijssen,

1
Sembra che la comprensione delle liste fosse lo strumento migliore per questa sfida. Sono stato in grado di golfare la tua soluzione a 106 byte riducendo il numero totale di funzioni. Sentiti libero di adattare questi cambiamenti.
Ovs

2

PowerShell , 108 98 89 85 byte

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

Provalo online!

Questo ora sembra abbastanza bene. L'arrotondamento del banco è ancora il diavolo e ho capito come fare un join non stupido. Ho provato a fare scimmie con $ ofs senza molto successo. A proposito, i risultati senza join sembrano abbastanza buoni, un po 'melty:

         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 Che fallisce per x = 25. Devi troncare ma lanciare in round int
Veskah

Sì. E troncare le opere
mazzy

1
@mazzy Lo so, l'unico modo che conosco per troncare è o [math] :: truncate () o il trucco regex usato sopra. [int] $ x arrotonda il numero. Se conosci un modo migliore, sono tutto orecchie.
Veskah,

1

Python 2 , 132 131 byte

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)

Provalo online!


Salvato:

  • -1 byte, grazie a Jonathan Frech

Perché //in Python 2?
Jonathan Frech,

@JonathanFrech Perché sono stupido: P
TFeld

@dzaima, Sì. Dovrebbe essere risolto ora
TFeld

1

Rosso , 153 byte

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

Provalo online!

Leggermente più leggibile:

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

Provalo online!

Stampa uno spazio iniziale e finale aggiuntivo per ogni multiplo di 7.

Spiegazione

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
}

Titoli di coda


È possibile salvare 2 byte cambiando ,w=-~h*2+1,i=h+1in,i=h+1,w=i*2+1
Kevin Cruijssen il

Wow, non dovrei davvero passare il golf a mezzanotte! Grazie per questo, @KevinCruijssen! :)
Olivier Grégoire il

Suggerisci i-~iinvece dii*2+1
ceilingcat il

1

Stax , 23 byte

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

Esegui ed esegui il debug

Disimballato, non golfato e commentato, sembra così.

" 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

Esegui questo

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.