Codegolf Rainbow: Draw in Black-and-White

12

Pengantar:

masukkan deskripsi gambar di sini(Sumber: Wikipedia )
Ketika kita melihat pelangi ia akan selalu memiliki warna dari atas ke bawah:
Merah; jeruk; kuning; hijau; biru; nila; violet

Jika kita melihat masing-masing cincin, cincin merah tentu saja lebih besar dari cincin ungu.
Selain itu, juga dimungkinkan untuk memiliki dua atau bahkan tiga pelangi secara bersamaan.

Semua gabungan di atas akan digunakan dalam tantangan ini:

Tantangan:

Diberikan bilangan bulat n, mengeluarkan banyak cincin dari (mungkin lebih dari satu) 'pelangi', tempat kami akan menggunakan huruf vibgyoruntuk warna.

Lihat kotak uji di bawah ini untuk melihat bagaimana mereka dibangun ke atas n=1, dan bagaimana ruang harus ditangani (at n=8). Seperti yang Anda lihat, satu spasi ditambahkan di antara dua pelangi, termasuk spasi di bagian atas, sebelum kita menambahkan cincin pelangi berikutnya dalam barisan.

Aturan tantangan:

  • Anda diizinkan menggunakan modal VIBGYORalih-alih huruf kecil
  • Harus ada ruang di antara masing-masing pelangi
  • Jumlah ruang terdepan dan / atau trailing / garis baru diperbolehkan, selama pelangi sebenarnya (di mana pun ditempatkan di layar) sudah benar
  • Input akan selalu berupa bilangan bulat positif ( >= 1). Perilaku ketika n=0karenanya tidak terdefinisi, dan program / fungsi dapat melakukan apa pun yang diinginkannya (tidak menghasilkan apa-apa; mengeluarkan pelangi n=1; output acak; gagal dengan kesalahan; dll.)
  • Anda diperbolehkan untuk mengeluarkan daftar / array string atau 2D array / daftar karakter jika Anda mau (Anda bisa menambahkan kode pencetakan cantik yang sebenarnya di footer TIO).
  • Abaikan fakta bahwa output lebih mirip kuil Maya daripada pelangi .. xD

Aturan umum:

  • Ini adalah , jadi jawaban tersingkat dalam byte menang.
    Jangan biarkan bahasa kode-golf mencegah Anda memposting jawaban dengan bahasa non-codegolf. Cobalah untuk memberikan jawaban sesingkat mungkin untuk bahasa pemrograman 'apa pun'.
  • Aturan standar berlaku untuk jawaban Anda, jadi Anda diperbolehkan menggunakan STDIN / STDOUT, fungsi / metode dengan parameter yang tepat dan tipe pengembalian, program penuh. Panggilanmu.
  • Celah default tidak diperbolehkan.
  • Jika memungkinkan, silakan tambahkan tautan dengan tes untuk kode Anda.
  • Juga, menambahkan penjelasan untuk jawaban Anda sangat dianjurkan.

Uji kasus (pertama n=1sampai n=10, dan 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
sumber
3
Mungkin Anda tahu ini dan itu dengan desain (saya tahu bahwa pelangi juga bukan rhombus atau ascii, dan posisi pesanan yang lebih tinggi menjadi lebih rumit), tetapi bukankah warnanya terbalik dalam pelangi ke-2?
Chris M
1
@ Chris Ah, Anda memang benar. Dengan dua pelangi yang kedua memang terbalik , tapi dengan tiga hanya luar dibalik , dan dengan empat kedua luar terbalik. Ah well, sedikit terlambat untuk mengubahnya sekarang. Mungkin saya akan memikirkan tantangan terkait ketiga dengan ini nanti. :)
Kevin Cruijssen
Oh keren, bagus: ¬)
Chris M

Jawaban:

5

Python 2 , 84 82 81 byte

-2 byte terima kasih kepada ElPedro.

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

Cobalah online!

ovs
sumber
3

JavaScript (ES6), 100 byte

Mengembalikan array string.

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)

Cobalah online!

Arnauld
sumber
3

05AB1E , 32 31 23 byte

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

Cobalah online!

-1 berkat Kevin Cruijssen dan -8 terima kasih kepada Adnan


Penjelasan (Contoh tumpukan dengan input 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.
Guci Gurita Ajaib
sumber
1
"vibgyor"dapat golf dengan 1 byte ke .•2Bãθ(•. ( Di sini penjelasan untuk itu di bagian " Bagaimana mengompres string bukan bagian dari kamus? ".) Selain itu, „vr…v r:ð«dapat di-golf ke 'v„v .:. Jadi 28 byte . Jawaban yang bagus, +1 dari saya.
Kevin Cruijssen
2
@KevinCruijssen oh saya tahu semua tentang kompresi string - Saya baru saja tahu (seperti biasanya kasus dengan string super kecil) bahwa mengasapi 3 byte .••tidak akan menghemat byte. Angka yang satu kali saya tidak benar-benar periksa adalah waktu itu akan menghemat byte xD. Tangkapan yang bagus
Magic Octopus Mm
1
@ Adnan cukup adil, kurangnya cermin membuatnya menjadi refactor yang signifikan di mata saya (itu dan saya ragu saya sudah sampai di sana sendiri: P).
Magic Octopus Mm
1
@ Adnan juga ¬ýjenius ... Astaga ... Anda berpikir begitu berbeda dan itu luar biasa.
Magic Gurita Guci
3

Kanvas , 29 28 26 byte

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

Coba di sini!

Penjelasan:

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 setelah memperbaiki bahwa shouldold harus berputar jika panjang yang diinginkan lebih besar dari panjang input dan memperbaiki seperti waktu ke-10

dzaima
sumber
Karena penasaran, mengapa vsideways ( <)? Apakah vsudah kata kunci yang dipesan di kanvas, jika demikian, mengapa tidak menggunakan <sebagai kata kunci terbalik bukan?
Kevin Cruijssen
1
karakter digunakan secara vertikal dan kemudian diputar, dan Canvas cukup pintar untuk mengetahui bahwa <diputar 90 ° berlawanan arah jarum jam sama dengan v: P Semua ASCII adalah bagian dari string dalam Canvas btw
dzaima
Ah ok, jadi jika Anda akan digunakan di vsini, dan Anda kemudian memutarnya 90 derajat berlawanan arah jarum jam, itu menjadi >sebaliknya. Saya melihat. : D
Kevin Cruijssen
@KevinCruijssen Itu akan memiliki konsekuensi lain juga
dzaima
Ah, kamu juga punya cermin di suatu tempat? Saya tidak bisa membaca Canvas tbh, jadi saya menantikan penjelasan kodenya. ;)
Kevin Cruijssen
3

Haskell , 114 110 101 byte

Terima kasih kepada [nimi] [1] untuk - 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)

Cobalah online!

ovs
sumber
3

Dyalog APL , 41 39 38 byte

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

Cobalah online!

Pendekatan serupa dengan yang lain: A←⌈⎕×8÷7menemukan ketinggian pelangi (juga lebar 'setengah baris' terpanjang di kiri / kanan tengah) dan menetapkannya Auntuk digunakan nanti, sementara ¨-⍳iterasi melalui nilai-nilai 1..A, meniadakan mereka untuk memilih di sisi yang benar ketika digunakan dengan .

A⍴' vibgyor'menghasilkan 'setengah baris' dan ⍵↑memilih substring panjang yang benar. (⌽,⊃,A↑⊢)menghasilkan baris penuh secara terbalik (yang membutuhkan lebih sedikit karakter untuk dilakukan), dimulai dengan setengah baris terbalik ( ), kemudian karakter tengah diambil dari awal string setengah baris ( ) dan akhirnya versi empuk kanan setengah baris () A↑⊢). Final membalikkan baris menjadi orientasi yang benar dan mengubah vektor baris menjadi array 2D.

Sunting: -2 terima kasih kepada dzaima

Sunting: -1 terima kasih kepada ngn

perangkap tikus
sumber
Anda dapat mengganti ⍕⍪dengan - mengeluarkan array karakter 2D diizinkan
dzaima
39 byte
dzaima
1+÷7->8÷7
ngn
2

Python 2 , 108 byte

n=input()-1
n+=n/7+2
o=[]
for s in(' vibgyor'*n)[:n]:o=[s+l+s for l in[s]+o]
for l in o:print l.center(n-~n)

Cobalah online!

tongkat
sumber
2

Arang , 30 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

Ubah arah gambar ke atas.

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

Hitung ketinggian pelangi dan ulangi string literal sejauh itu.

θ⸿

Cetak garis tengah pelangi.

Eθ✂θκ

Cetak bagian kanan pelangi dengan mengambil irisan yang berurutan dan mencetak masing-masing pada "garis" sendiri.

‖O←

Refleksikan untuk melengkapi pelangi.

Neil
sumber
2

Jelly , 28 byte

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

Tautan monadik yang menerima bilangan bulat yang menghasilkan daftar daftar karakter.

Cobalah online! (footer bergabung dengan karakter baris baru)

Atau lihat test-suite .

Bagaimana?

: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
sumber
2

R , 130 byte

function(n,k=n%/%7*8+1+n%%7,a=el(strsplit(' vibgyor'/k,'')))for(i in k:1)cat(d<-' '/(i-1),a[c(k:i,i,i:k)],d,sep='','
')
"/"=strrep

Cobalah online!

  • -6 byte terima kasih kepada @JayCe
menggali semua
sumber
Anda dapat menyimpan 6 byte . Juga membuat Anda untuk memvotasikan nominasi R untuk bahasa bulan ini :)
JayCe
@JayCe: terima kasih! diperbarui dan ditingkatkan!
digEmAll
2

Haskell , 106 113 byte

Saya belum dapat mengomentari postingan lain (yaitu ini ) jadi saya harus memposting solusinya sebagai jawaban terpisah.

Golf jauhnya 7 byte demi ov

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

Cobalah online!

( Versi lama , 113 byte)

Max Yekhlakov
sumber
Jawaban bagus. Saya tidak tahu Haskell, tetapi kodenya agak berbeda dari jawaban Haskell lainnya. PS: Jawaban Haskell yang lain itu sebenarnya 110 byte setelah tips golf dalam komentar @imi . Apapun, ini adalah jawaban Haskell alternatif yang bagus, jadi +1 dari saya.
Kevin Cruijssen
1
Sepertinya pemahaman daftar adalah alat yang lebih baik untuk tantangan ini. Saya dapat mengubah solusi Anda menjadi 106 byte dengan mengurangi jumlah fungsi. Jangan ragu untuk menyesuaikan perubahan ini.
Ovs
2

PowerShell , 108 98 89 85 byte

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

Cobalah online!

Yang ini terasa cukup baik-baik saja sekarang. Pembulatan Bankir masih iblis dan saya menemukan cara untuk membuat bergabung non-bodoh. Saya mencoba monyet dengan $ ofs untuk tidak terlalu sukses. Omong-omong, hasil tanpa bergabung terlihat cukup bagus, agak 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
Veskah
sumber
[int] $ x + = $ x / 7?
mazzy
@ Mazzy Itu gagal untuk x = 25. Anda harus memotong tetapi melakukan putaran int
Veskah
Iya. Dan truncate adalah karya
mazzy
1
@ Mazzy Saya tahu, satu-satunya cara saya tahu untuk memotong adalah [matematika] :: truncate () atau trik regex yang digunakan di atas. [int] $ x membulatkan angka. Jika Anda tahu cara yang lebih baik, saya semua telinga.
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)

Cobalah online!


Diselamatkan:

  • -1 byte, terima kasih kepada Jonathan Frech
TFeld
sumber
Kenapa //dengan Python 2?
Jonathan Frech
@JonathanFrech Karena saya bodoh: P
TFeld
@zaza, Ya. Harus diperbaiki sekarang
TFeld
1

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

Cobalah online!

Sedikit lebih mudah dibaca:

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

Cobalah online!

Mencetak ruang ekstra depan dan belakang untuk setiap kelipatan 7.

Penjelasan

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
}

Kredit

Olivier Grégoire
sumber
Anda dapat menyimpan 2 byte dengan mengubah ,w=-~h*2+1,i=h+1ke,i=h+1,w=i*2+1
Kevin Cruijssen
Wow, saya seharusnya tidak golf melewati tengah malam! Terima kasih untuk ini, @KevinCruijssen! :)
Olivier Grégoire
Sarankan i-~ialih-alihi*2+1
ceilingcat
1

Stax , 23 byte

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

Jalankan dan debug itu

Dibongkar, tidak diserang, dan dikomentari, sepertinya ini.

" 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

Jalankan yang ini

rekursif
sumber