Codegolf Rainbow: Draw in Black-and-White

12

Wprowadzenie:

wprowadź opis zdjęcia tutaj(Źródło: Wikipedia )
Kiedy spojrzymy na tęczę, zawsze będzie miała kolory od góry do dołu:
Czerwony; Pomarańczowy; żółty; Zielony; niebieski; indygo; fioletowy

Jeśli spojrzymy na te pojedyncze pierścienie, czerwony pierścień jest oczywiście większy niż pierścień fioletowy.
Ponadto możliwe jest jednoczesne posiadanie dwóch lub nawet trzech tęcz.

Wszystkie powyższe kombinacje zostaną wykorzystane w tym wyzwaniu:

Wyzwanie:

Biorąc pod uwagę liczbę całkowitą n, wyprowadzaj tyle pierścieni (prawdopodobnie więcej niż jednej) „tęczy”, w której użyjemy liter vibgyordla kolorów.

Zobacz przypadki testowe poniżej, aby zobaczyć, jak są one zbudowane w górę n=1i jak należy zachować odstępy (at n=8). Jak widać, między dwiema tęczami dodaje się jedno miejsce, w tym odstępy u góry, zanim dodamy pierścień następnej tęczy w linii.

Zasady konkursu:

  • Możesz używać kapitału VIBGYORzamiast małych liter
  • Pomiędzy poszczególnymi tęczami powinna być przestrzeń
  • Dozwolona jest dowolna liczba wiodących i / lub końcowych spacji / nowych linii, o ile rzeczywista tęcza (gdziekolwiek jest umieszczona na ekranie) jest poprawna
  • Dane wejściowe zawsze będą dodatnimi liczbami całkowitymi ( >= 1). Zachowanie n=0jest wtedy niezdefiniowane, a program / funkcja może robić, co chce (nic nie n=1generować; generować tęczę ; losowe wyjście; zawodzić z błędem itp.)
  • Jeśli chcesz, możesz wypisać listę / tablicę ciągów lub tablicę 2D / listę znaków (możesz dodać rzeczywisty ładny kod drukujący w stopce TIO).
  • Zignoruj ​​fakt, że wyniki bardziej przypominają świątynie Majów niż tęcze .. xD

Główne zasady:

  • To jest , więc wygrywa najkrótsza odpowiedź w bajtach.
    Nie pozwól, aby języki kod-golfowe zniechęcały Cię do publikowania odpowiedzi w językach niekodujących golfa. Spróbuj znaleźć możliwie najkrótszą odpowiedź na „dowolny” język programowania.
  • Do odpowiedzi mają zastosowanie standardowe reguły , więc możesz używać STDIN / STDOUT, funkcji / metody z odpowiednimi parametrami i zwracanymi typami, pełnych programów. Twoja decyzja.
  • Domyślne luki są zabronione.
  • Jeśli to możliwe, dodaj link z testem swojego kodu.
  • Zalecane jest również dodanie wyjaśnienia do odpowiedzi.

Przypadki testowe (od pierwszego n=1do n=10i 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
źródło
3
Być może wiesz o tym i jest to zgodne z projektem (wiem, że tęcze też nie są rombami ani ascii, a pozycje wyższych rzędów stają się bardziej skomplikowane), ale czy kolory w drugiej tęczy nie są odwrócone?
Chris M
1
@ChrisM Ach, rzeczywiście masz rację. Z dwiema tęczami druga rzeczywiście jest odwrócona , ale z trzema tylko zewnętrzna jest odwrócona , a przy czterech obie zewnętrzne są odwrócone. Ach, trochę za późno, żeby to teraz zmienić. Może później wymyślę trzecie związane z tym wyzwanie. :)
Kevin Cruijssen
Och, fajnie, miło: ¬)
Chris M

Odpowiedzi:

5

Python 2 , 84 82 81 bajtów

-2 bajty dzięki ElPedro.

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

Wypróbuj online!

ovs
źródło
3

JavaScript (ES6), 100 bajtów

Zwraca tablicę ciągów.

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)

Wypróbuj online!

Arnauld
źródło
3

05AB1E , 32 31 23 bajtów

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

Wypróbuj online!

-1 dzięki Kevin Cruijssen i -8 dzięki Adnan


Objaśnienie (Przykład stosu z wejściem 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.
Urna Magicznej Ośmiornicy
źródło
1
"vibgyor"można zagrać w golfa o 1 bajt do .•2Bãθ(•. ( Tutaj wyjaśnienie znajduje się w części „ Jak kompresować ciągi znaków nie będące częścią słownika? ”). Ponadto „vr…v r:ð«można grać w golfa 'v„v .:. Więc 28 bajtów . Dobra odpowiedź, +1 ode mnie.
Kevin Cruijssen
2
@KevinCruijssen oh, wiem wszystko o kompresji ciągów - właśnie pomyślałem (jak to zwykle bywa z bardzo małymi ciągami), że 3-bajtowe wzdęcie .••nie uratuje bajtu. Liczby, w których za jednym razem nie sprawdzam, to czas, który oszczędziłby bajty xD. Dobry połów
Magic Octopus Urn
1
@Adnan dość uczciwie, brak lustra sprawia, że ​​jest to znaczący refaktor w moich oczach (to i wątpię, że dostałbym się sam: P).
Magic Octopus Urn
1
@Adnan też ¬ýjest genialny ... Jezu ... Myślisz inaczej i to jest niesamowite.
Magic Octopus Urn
3

Płótno , 29 28 26 bajtów

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

Wypróbuj tutaj!

Wyjaśnienie:

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 bajtów po ustaleniu, że should stary powinien się cyklicznie, jeśli pożądana długość jest większa niż długość wejściowa i ustalenie po raz dziesiąty

dzaima
źródło
Z ciekawości, dlaczego jest vsideways ( <)? Czy vsłowo Canvas jest już zarezerwowanym słowem kluczowym, jeśli tak, dlaczego nie użyć go <jako tego odwróconego słowa kluczowego?
Kevin Cruijssen
1
znaki są używane w pionie, a następnie obracane, a Canvas jest na tyle sprytny, aby stwierdzić, że <obrócony o 90 ° w lewo jest równy v: P Wszystkie ASCII są częścią ciągów w Canvas btw
dzaima
Ach, ok, więc jeśli byś vtu użył , a następnie obrócisz go o 90 stopni przeciwnie do ruchu wskazówek zegara, >zamiast tego będzie . Widzę. : D
Kevin Cruijssen
@KevinCruijssen Że mieć inne konsekwencje zbyt
dzaima
Ach, gdzieś tam też jest lustro? Nie mogę odczytać Canvas tbh, więc czekam na wyjaśnienie kodu. ;)
Kevin Cruijssen
3

Haskell , 114 110 101 bajtów

Dzięki [nimi] [1] za - 4 13 bajtów!

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)

Wypróbuj online!

ovs
źródło
3

Dyalog APL , 41 39 38 bajtów

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

Wypróbuj online!

Podobne podejście do innych: A←⌈⎕×8÷7wyszukuje wysokość tęczy (również szerokość najdłuższego „pół rzędu” po lewej / prawej stronie środka) i przypisuje ją do Apóźniejszego użycia, podczas gdy ¨-⍳iteruje przez wartości 1..A, negując je, aby wybrać po właściwej stronie, jeśli są używane z .

A⍴' vibgyor'generuje „pół wiersz” i ⍵↑wybiera podciąg o właściwej długości. (⌽,⊃,A↑⊢)generuje pełny wiersz w odwrotnej kolejności (co wymaga mniejszej liczby znaków), zaczynając od odwróconego pół wiersza ( ), następnie znak środkowy pobrany z początku ciągu pół wiersza ( ), a na końcu odpowiednio wypełniona wersja pół wiersza ( A↑⊢). Końcowy odwraca wiersz do prawidłowej orientacji i przekształca wektor wierszy w tablicę 2D.

Edycja: -2 dzięki dzaima

Edycja: -1 dzięki ngn

pułapka na myszy
źródło
Można wymienić ⍕⍪z - wyprowadzanie tablicę 2D znaków jest dozwolone
dzaima
39 bajtów
dzaima
1+÷7->8÷7
ngn
2

Węgiel drzewny , 30 bajtów

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

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

Zmień kierunek rysowania w górę.

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

Oblicz wysokość tęczy i powtórz literalny ciąg do tej długości.

θ⸿

Wydrukuj środkową linię tęczy.

Eθ✂θκ

Wydrukuj prawą połowę tęczy, biorąc kolejne plastry i drukując każdą na osobnej „linii”.

‖O←

Zastanów się, aby ukończyć tęczę.

Neil
źródło
2

Galaretka , 28 bajtów

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

Łącze monadyczne akceptujące liczbę całkowitą, która daje listę list znaków.

Wypróbuj online! (stopka łączy się ze znakami nowej linii)

Lub zobacz pakiet testowy .

W jaki sposó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)
Jonathan Allan
źródło
2

Haskell , 106 113 bajtów

Nie mogę jeszcze komentować innych postów (mianowicie tego ), więc muszę opublikować rozwiązanie jako osobną odpowiedź.

Grał w golfa 7 bajtów przez 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]]

Wypróbuj online!

( Stara wersja , 113 bajtów)

Max Yekhlakov
źródło
Niezła odpowiedź. Nie znam Haskella, ale kod wydaje się różny od innych odpowiedzi Haskell. PS: Ta druga odpowiedź Haskella ma w rzeczywistości 110 bajtów po wskazówkach golfowych w komentarzu @ nich . Niezależnie od tego, jest to fajna alternatywna odpowiedź Haskella, więc daj +1 ode mnie.
Kevin Cruijssen
1
Wygląda na to, że zestawienia list były lepszym narzędziem tego wyzwania. Udało mi się rozegrać Twoje rozwiązanie do 106 bajtów , zmniejszając całkowitą liczbę funkcji. Dostosuj te zmiany.
'18
2

PowerShell , 108 98 89 85 bajtów

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

Wypróbuj online!

Ten wydaje się teraz całkiem w porządku. Zaokrąglanie przez bankiera wciąż jest diabłem i wymyśliłem, jak zrobić nieme połączenie. Próbowałem małpować za pomocą $ ofs, aby nie odnieść wielkiego sukcesu. Mówiąc o tym, wyniki bez złączeń wyglądają całkiem nieźle, trochę melanżowo:

         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
źródło
[int] $ x + = $ x / 7?
mazzy
@mazzy To się nie powiedzie dla x = 25. Musisz obciąć, ale przesyłać do rund int
Veskah
Tak. I obcinanie działa
mazzy
1
@mazzy Wiem, jedynym sposobem, który znam, aby obciąć, jest albo [matematyka] :: truncate () lub sztuczka wyrażenia regularnego używana powyżej. [int] $ x zaokrągla liczbę. Jeśli znasz lepszy sposób, jestem cały w uszach.
Veskah
1

Python 2 , 132 131 bajtów

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)

Wypróbuj online!


Zapisano:

  • -1 bajt, dzięki Jonathan Frech
TFeld
źródło
Dlaczego //w Python 2?
Jonathan Frech,
@JonathanFrech Ponieważ jestem głupi: P
TFeld
@dzaima, tak. Powinien zostać teraz naprawiony
TFeld
1

Czerwony , 153 bajty

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

Wypróbuj online!

Nieco bardziej czytelny:

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 Iwanow
źródło
1

Java (JDK 10) , 184 bajty

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

Wypróbuj online!

Drukuje dodatkowe wiodące i końcowe miejsce dla każdej wielokrotności 7.

Wyjaśnienie

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
}

Kredyty

Olivier Grégoire
źródło
Możesz zapisać 2 bajty, zmieniając ,w=-~h*2+1,i=h+1na,i=h+1,w=i*2+1
Kevin Cruijssen
Wow, naprawdę nie powinienem grać w golfa o północy! Dzięki za to, @KevinCruijssen! :)
Olivier Grégoire
Zaproponuj i-~izamiasti*2+1
ceilingcat 25.09.19
1

Stax , 23 bajty

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

Uruchom i debuguj

Rozpakowane, niepolowane i skomentowane, wygląda to tak.

" 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

Uruchom ten

rekurencyjny
źródło