Codegolf Rainbow: Малюємо чорно-білим


12

Вступ:

введіть тут опис зображення(Джерело: Вікіпедія )
Коли ми дивимось на веселку, у неї завжди будуть кольори зверху вниз:
Червоний; помаранчевий; жовтий; зелений; синій; індиго; фіолетовий

Якщо ми подивимось на ці окремі кільця, червоне кільце, звичайно, більше, ніж кільце фіолетового.
Крім того, також можна одночасно мати дві або навіть три веселки.

Все це вище у поєднанні буде використано в цьому виклику:

Виклик:

З огляду на ціле число n, виведіть багато кілець (можливо, більше одного) 'веселок', де ми будемо використовувати літери vibgyorдля кольорів.

Перегляньте тестові приклади нижче, щоб побачити, як вони побудовані вгору n=1та як слід керувати міжряддями (at n=8). Як бачимо, один пробіл додається між двома веселками, включаючи проміжки вгорі, перш ніж ми додамо кільце наступної веселки в рядку.

Правила виклику:

  • Вам дозволяється використовувати капітал VIBGYORзамість малих літер
  • Між окремими веселками повинен бути пробіл
  • Дозволяється будь-яка кількість провідних та / або пробілів / нових рядків, якщо фактична веселка (де б вона не була розміщена на екрані) є правильною
  • Вхід завжди буде додатним цілим числом ( >= 1). Тому поведінка, коли n=0це не визначено, і програма / функція може робити все, що завгодно (нічого не виводить; виводить веселку n=1; випадковий вихід; провалюється з помилкою тощо)
  • Ви можете виводити список / масив рядків або 2D масив / список символів, якщо хочете (ви можете додати фактичний симпатичний код друку в колонтитулі TIO).
  • Ігноруйте той факт, що виходи більше нагадують храми майя, ніж веселки .. xD

Загальні правила:

  • Це , тому найкоротша відповідь у байтах виграє.
    Не дозволяйте мовам з кодовим гольфом відштовхувати вас від публікації відповідей з мов, що не кодують гольф. Спробуйте придумати якомога коротшу відповідь на "будь-яку" мову програмування.
  • Стандартні правила застосовуються до вашої відповіді, тому вам дозволяється використовувати STDIN / STDOUT, функції / метод із відповідними параметрами та повним програмами типу return. Твій дзвінок.
  • Лазівки за замовчуванням заборонені.
  • Якщо можливо, додайте посилання з тестом для вашого коду.
  • Також настійно рекомендується додавати пояснення до своєї відповіді.

Тестові (перший 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
Можливо, ви це знаєте, і це за дизайном (я знаю, що веселки теж не ромби чи асції, а позиції вищих порядків ускладнюються), але чи не кольори перетворені у другій веселці?
Кріс М

1
@ChrisM Ах, ти справді правий. З двома веселками друга дійсно перевернута , але з трьома лише зовнішня сторона , а з чотирма - обидві зовнішні . Ну добре, трохи пізно, щоб змінити це зараз. Можливо, я придумаю треті проблеми, пов'язані з цим пізніше. :)
Kevin Cruijssen


Ой здорово, приємно: ¬)
Кріс М

Відповіді:




3

05AB1E , 32 31 23 байт

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

Спробуйте в Інтернеті!

-1 спасибі Кевіну Крейсейну і -8 подяці Аднану


Пояснення (приклад стека з входом 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:ð«може бути golfed до 'v„v .:. Так 28 байт . Хоча приємна відповідь, +1 від мене.
Kevin Cruijssen

2
@KevinCruijssen о, я знаю все про стиснення рядків-- я просто зрозумів (як це зазвичай буває із супер невеликими рядками), що 3-байтний проміжок .••не врятує байт. Цифри, коли я насправді не перевіряю - це час, коли він би економив байти xD. Хороший улов
Чарівний восьминіг Урна


1
@Adnan справедливо, відсутність дзеркала робить його значним рефактором в моїх очах (це, і я сумніваюся, що я потрапив туди самостійно: P).
Чарівний восьминіг Урна

1
@Adnan також ¬ýгеніальний ... Jeez ... Ти так думаєш інакше, і це приголомшливо.
Чарівний восьминога Урна

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 байти після фіксації, що m старий повинен пройти циклом, якщо потрібна довжина більша за вхідну довжину та закріплення приблизно, як у 10-й раз


З цікавості, чому vсторона ( <)? Чи є vвже зарезервоване ключове слово на Canvas, якщо так, то чому б не використовувати <замість цього зворотне ключове слово?
Kevin Cruijssen

1
символи використовуються вертикально, а потім повертаються, і Canvas досить розумний, щоб зрозуміти, що <обертання на 90 ° проти годинникової стрілки дорівнює v: P Усі ASCII є частиною струн у Canvas btw
dzaima

Ну добре, тож якщо ви б vтут використовували , а потім обертаєте його на 90 градусів проти годинникової стрілки, це стає >замість цього. Я бачу. : D
Кевін Круїссен

@KevinCruijssen Що б інші наслідки теж
dzaima

Ах, у вас теж є десь дзеркало? Не можу прочитати Canvas tbh, тому з нетерпінням чекаю пояснення коду. ;)
Кевін Круїссен


3

Діялог APL , 41 39 38 байт

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

Спробуйте в Інтернеті!

Аналогічний підхід до інших: A←⌈⎕×8÷7знаходить висоту веселки (також ширину найдовшого "половини ряду" зліва / праворуч від центру) і призначає її Aдля подальшого використання, в той час як вона ¨-⍳перебирається через значення 1..A, заперечуючи їх вибирати правильну сторону при використанні з .

A⍴' vibgyor'створює 'половину рядка' і ⍵↑вибирає підрядку правильної довжини. (⌽,⊃,A↑⊢)генерує повний рядок у зворотному (для цього потрібно менше символів), починаючи з перевернутого половинного рядка ( ), потім центрального символу, взятого на початку рядка на половину рядка ( ), і, нарешті, правої вкладеної версії половини рядка ( A↑⊢). Фінал повертає рядок у правильну орієнтацію і перетворює вектор рядків у 2D масив.

Редагувати: -2 завдяки dzaima

Редагувати: -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 байт

Я ще не можу коментувати інші пости (а саме це ), тому мені доведеться розміщувати рішення як окрему відповідь.

У басейні 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 - це насправді 110 байт після підказки про гольф у коментарі @ nimi . Незважаючи на це, це приємна альтернативна відповідь Haskell, тому +1 від мене.
Kevin Cruijssen

1
Схоже, розуміння списків було кращим інструментом для вирішення цього завдання. Мені вдалося розіграти ваше рішення на 106 байт , зменшивши загальну кількість функцій. Не соромтеся адаптувати ці зміни.
ов

2

PowerShell , 108 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 Це не вдається для x = 25. Ви повинні
усікати,

Так. А
усікати

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
Кевін Круїйсен

Нічого собі, я не повинен би гольф пройшов півночі! Дякую за це, @KevinCruijssen! :)
Олів'є Грегоар

Запропонувати i-~iзамістьi*2+1
roofcat

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

Виконати цей

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.