Codegolf Rainbow: рисовать в черно-белом


12

Вступление:

введите описание изображения здесь(Источник: Википедия )
Когда мы смотрим на радугу, она всегда будет иметь цвета сверху вниз:
красный; апельсин; желтый; зеленый; синий; индиго; Фиолетовый

Если мы посмотрим на эти отдельные кольца, красное кольцо, конечно, больше, чем фиолетовое кольцо.
Кроме того, также возможно иметь две или даже три радуги одновременно.

Все это, вместе взятые, будет использовано в этой задаче:

Вызов:

Учитывая целое число n, выведите столько колец из (возможно, более одного) «радуг», где мы будем использовать буквы vibgyorдля цветов.

См. Контрольные примеры ниже, чтобы увидеть, как они построены вверх n=1и как следует обрабатывать интервалы (в n=8). Как видите, между двумя радугами добавляется один пробел, включая расстояние сверху, прежде чем мы добавим кольцо следующей радуги в линию.

Правила вызова:

  • Вам разрешено использовать заглавные VIBGYORбуквы вместо строчных
  • Между отдельными радугами должно быть пространство
  • Допускается любое количество начальных и / или конечных пробелов / новых строк, если только правильная радуга (где бы она ни находилась на экране)
  • На входе всегда будет положительное целое число ( >= 1). Следовательно, поведение когда n=0не определено, и программа / функция может делать все что угодно (ничего не выводить; выводить радугу n=1; случайный вывод; ошибка с ошибкой и т. Д.)
  • Вы можете вывести список / массив строк или двумерный массив / список символов, если хотите (вы можете добавить действительный код красивой печати в нижний колонтитул TIO).
  • Не обращайте внимания на тот факт, что результаты больше похожи на храмы майя, чем на радугу. XD

Основные правила:

  • Это , поэтому выигрывает самый короткий ответ в байтах.
    Не позволяйте языкам кода-гольфа отговаривать вас от публикации ответов на языках, не относящихся к кодексу. Попробуйте найти как можно более короткий ответ для «любого» языка программирования.
  • К вашему ответу применяются стандартные правила , поэтому вы можете использовать STDIN / STDOUT, функции / метод с правильными параметрами и типом возврата, полные программы. Ваш звонок.
  • По умолчанию лазейки запрещены.
  • Если возможно, добавьте ссылку с тестом для вашего кода.
  • Кроме того, добавление объяснения для вашего ответа настоятельно рекомендуется.

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

1
@ChrisM Ах, ты действительно прав. С двумя радугами вторая действительно перевернута , но с тремя только внешняя перевернута , а с четырьмя обе противоположны. Ну, слишком поздно, чтобы изменить это сейчас. Возможно, я подумаю о третьей проблеме, связанной с этим позже. :)
Кевин Круйссен


О, круто, приятно: ¬)
Крис М

Ответы:




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:ð«можно сыграть в гольф 'v„v .:. Итак, 28 байтов . Хороший ответ, хотя +1 от меня.
Кевин Круйссен

2
@KevinCruijssen О, я знаю все о сжатии строк - я только что понял (как это обычно бывает с очень маленькими строками), что 3-байтовое раздувание .••не сохранит байт. Показывает, что один раз, когда я на самом деле не проверяю, это время, когда он будет сохранять байты xD. Хороший улов
Волшебная Урна Осьминога


1
@ Adnan достаточно справедливо, отсутствие зеркала делает это значительным рефактором в моих глазах (хотя, и я сомневаюсь, что я бы туда попал самостоятельно: P).
Волшебная Урна Осьминога

1
@ Аднан тоже ¬ýгениален ... Боже ... Ты так думаешь по-другому, и это круто.
Волшебная Урна Осьминога

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


Из любопытства почему vбоком ( <)? Является ли vуже зарезервированное ключевое слово в Canvas, если так, почему бы не использовать <вместо этого обратное ключевое слово?
Кевин Круйссен

1
символы используются вертикально, а затем повернуты, и Canvas достаточно умен, чтобы выяснить, что <повернутые на 90 ° против часовой стрелки равны v: P Все ASCII являются частью строк в Canvas, кстати
dzaima

Ах, хорошо, так что, если бы вы использовали vздесь, а затем поверните его на 90 градусов против часовой стрелки, он становится >вместо этого. Понимаю. : D
Кевин Круйссен

@KevinCruijssen Что бы другие последствия тоже
dzaima

Ах, у вас тоже есть зеркало где-нибудь? Я не могу читать Canvas tbh, поэтому я с нетерпением жду объяснения кода. ;)
Кевин Круйссен


3

Dyalog APL , 41 39 38 байт

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

Попробуйте онлайн!

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

A⍴' vibgyor'генерирует «половину строки» и ⍵↑выбирает подстроку правильной длины. (⌽,⊃,A↑⊢)генерирует полную строку в обратном порядке (для этого требуется меньше символов), начиная с перевернутой половины строки ( ), затем центральный символ, взятый из начала строки в половину строки ( ), и, наконец, правостороннюю версию половины строки ( A↑⊢). Финал переворачивает строку в правильную ориентацию и превращает вектор строк в двумерный массив.

Изменить: -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

R , 130 байт

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

Попробуйте онлайн!

  • -6 байт благодаря @JayCe

Вы можете сохранить 6 байтов . Также заставьте вас поддержать номинацию R за язык месяца :)
JayCe

@JayCe: спасибо! обновлено и проголосовало!
digEmAll

2

Haskell , 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 от меня.
Кевин Круйссен

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

2

PowerShell , 108 98 89 85 байт

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

Попробуйте онлайн!

С этим сейчас все в порядке. Банковское округление - все еще дьявол, и я разобрался, как сделать не тупое соединение. Я попытался поиграть в обезьяны с небольшим успехом. Говоря о, результаты без объединений выглядят довольно хорошо, немного плавно:

         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 Это не для х = 25. Вы должны урезать, но приведение к int раундам
Веска

Да. И усечение это работает
mazzy

1
@ mazzy Я знаю, что я знаю только способы усекания - это либо [math] :: truncate (), либо трюк с регулярными выражениями, использованный выше. [int] $ x округляет число. Если вы знаете лучший способ, я весь слух.
Веска

1

Python 2 , 132 131 байт

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)

Попробуйте онлайн!


Добавлено:

  • -1 байт, благодаря Джонатану Фреху

Почему //в Python 2?
Джонатан Фрех

@JonathanFrech, потому что я тупой: P
TFeld

@dzaima, да. Должно быть исправлено сейчас
TFeld

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
floorcat

1

Stax , 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.