Наступний колір


20

Виклик

Розглянемо веселку як сім кольорів, представлених рядками як Red Orange Yellow Green Blue Indigo Violet.
Ваше завдання - створити програму, яка отримує один із цих кольорів у якості вхідних та вихідних даних наступного порядку для кольору веселки. Це включає перекриттяViolet -> Red

Вхідні дані

Рядок, що містить один з кольорів веселки.

Вихідні дані

Наступний по порядку колір веселки.

Правила

  • Назви кольорів залежать від регістру. Вони повинні відповідати випадку, включеному в цю посаду.
  • Вхід завжди буде дійсним. Будь-яка поведінка дозволена для недійсного введення.
  • Це кодовий гольф, тому найменша кількість байтів виграє!

Приклад введення та виведення

Input -> Output
Red -> Orange
Orange -> Yellow
Yellow -> Green
Green -> Blue
Blue -> Indigo
Indigo -> Violet
Violet -> Red

1
"Надайте принаймні один приклад введення та виводу. Переконайтеся, що вони відповідають вашому власному опису того, як має виглядати вхід." Ви описуєте свій власний виклик? Або це вимога до рішень?
рекурсивна

6
Чи добре нормально кольори?
Емінья

4
Але що відбувається, коли ви досягнете "сірого"? ;)
AJFaraday

1
@Emigna З того, як ОП сформулював це питання, я б припустив, що ви можете вибрати, чи робити це великі регістри, малі регістри чи регістри, що не враховують регістр. Provide at least one example input and output. Make sure they match your own description of what the input should look like.
sonrad10

1
Чи добре все проміжні місця?
ivzem

Відповіді:


2

SOGL V0.12 , 23 байти

k‰³d∆|ΝμHō↑≥░δ÷f‘θ⁽,WIw

Спробуйте тут!

Пояснення:

...‘θ⁽,WIw  
...‘        push "red orange yellow green blue indigo violet"
    θ       split on spaces
     ⁽      uppercase the 1st letter of every item (SOGLs dictionary only has lowercase words)
      ,W    get the inputs index in the array
        I   increment
         w  and get that item in the array, wrapping if necessary

22

JavaScript, 68 байт

s=>'RedOrangeYellowGreenBlueIndigoVioletRed'.match(s+'(.[a-z]*)')[1]

Для введення "Red"ця функція спочатку побудує RegExp /Red(.[a-z]*)/для відповідності рядку, 'RedOrangeYellowGreenBlueIndigoVioletRed'а потім поверне перший результат захоплення.


Який результат для введення "Фіолет"? Я думаю, ви повинні змінити текст на 'RedOrangeYellowGreenBlueIndigoVioletRed'щось чи інше
Олів'є Грегоар

1
@ OlivierGrégoire Добре, додано. Це правило змінюється ОП після опублікованої відповіді.
tsh

Я не знав: я бачив лише остаточну версію питання.
Олів'є Ґреґуар

9

Perl 5 -p , 58 57 байт

#!/usr/bin/perl -p
$_={(Red,Orange,Yellow,Green,Blue,Indigo,Violet)x2}->{$_}

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

Тепер, коли завдання було змінено на циклічне рішення регулярного виразка

say RedOrangeYellowGreenBlueIndigoVioletRed=~/$_(.[a-z]+)/

вже не є оптимальним (через подвійне Red)

Також 57 байт:

#!/usr/bin/perl -p
$_=(Indigo,Blue,Violet,Yellow,Orange,Red,Green)[ord>>2&7]

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



7

Perl 6 , 56 байт

{<Indigo Blue Violet Yellow Orange Red Green>[.ord/4%8]}

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

Експлуатує той факт, що біти 2-4 коду ASCII першої літери кожного кольору трапляються на 0-6.

say map (*.ord +> 2) % 8, <R O Y G B I V>
# (4 3 6 1 0 2 5)

Ось приємне неконкурентне рішення, яке використовує "фіолетове" замість "індиго" та "фіолетове" (38 символів, 59 байт):

{'🍎🧡💛💚💙💜🍎'.uninames~~m/$^a.\S+.<(\S+/}

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


Імена Всемогутнього Юнікоду
Вейджун Чжоу

Настільки ж цікавим, як це рішення, воно в кінцевому підсумку не відповідає специфікації. Чи можете ви включити у відповідь відповідну версію і опублікувати це як додаток?
Денніс

Також є %12рішення для кокосового горіха, але, звичайно, це акуратніше.
Вейджун Чжоу

5

Рубі -n , 62 60 байт

-2 Асоне Тухід.

p"RedVioletIndigoBlueGreenYellowOrangeRed"[/.[a-z]+(?=#$_)/]

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

Підхід Regex виглядає перспективним і для Ruby. Однак я прийшов до більш короткого рішення, використовуючи підказку і безпосередньо друкуючи матч, а не граючи із захопленням груп. Список кольорів знаходиться в зворотному напрямку, оскільки lookahead на 1 байт дешевший, ніж позаду.


дуже приємно, -2 байти ( /#$_/інтерполяти)
Асона Тухід

4

Червоний , 87 байт

func[c][print first find/tail[Red Orange Yellow Green Blue Indigo Violet Red]to-word c]

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


4
Поняття не маєте, що це за мова, чи працює ваш код, чи він взагалі гольф, але майте +1 лише для використання мови під назвою "Червона" для цього завдання.
msh210

@ msh210 Це тісно пов'язане з Rebol (відносно вираженою мовою об'єкта). Мова представляє код, дані та метадані однаково - з блоками, позначеними []. Поточний дистрибутив Red складає всього 1,1 Мб і включає консоль / інтерпетер, а також компілятор, який може перетинатись на різних платформах. Мій код улюблений в те, що я спробував різні рішення і видалив усі можливі місця. Погано те, що простір є роздільником майже скрізь. Усі математичні вирази повинні мати пробіли з обох сторін операторів, такі як: b + c (a = b + c).
Гален Іванов

4

05AB1E , 30 байт

“†¾›ÈŠÛˆ¨‡—ëßigo°Íolet“#™DIk>è

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

Пояснення

“†¾›ÈŠÛˆ¨‡—ëßigo°Íolet“          # push a string of colours
                       #         # split on spaces
                        ™        # title-case each
                         D       # duplicate
                          Ik     # get the index of the input
                            >    # increment
                             è   # get the element at that index

3

Excel, 85 байт

=CHOOSE(MOD(CODE(A1),12),"green","indigo","yellow",,,"orange","blue",,"violet","red")

Використовує малі імена.

Аналогічний підхід із великими літерами 86 байт:

=CHOOSE(MOD(CODE(A1),12),"Violet","Red",,,"Green","Indigo","Yellow",,,"Orange","Blue")

3

Haskell , 80 71 75 байт

Дякуємо Лайконі за скорочення 9 байт!

g x=snd(span(/=x)$words"Red Orange Yellow Green Blue Indigo Violet Red")!!1

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


Ще одне рішення, трохи більш ідіоматичне, але я не міг його коротше:

data R=Red|Orange|Yellow|Green|Blue|Indigo|Violet deriving(Enum,Read,Eq)
succ.read

Це потрібно отримати Readчерез вимогу, що вхід є рядком і хоча б Eqабо Showдля того, щоб або перевірити рівність, або показати результат.



@Laikoni Ого, це круто, дякую! Я забув про span...
Крістіан Лупаску

1
OP уточнив, що Violetслід завернути до Red, тому вам потрібно додати Redще раз до кінця рядка.
Лайконі

Дуже подобається ідея другого! Однак succ Violetне вийде, бо Enumне загортайте :(
ბიბ

@BMO Рівно. Коли я зробив цю версію, я не знав вимоги про завершення роботи.
Крістіан Лупаску

3

Сітківка , 65 58 байт

$
(.[a-z]+)
L$:`RedOrangeYellowGreenBlueIndigoVioletRed
$1

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

Пояснення

$
(.[a-z]+)

Почнемо з додавання (.[a-z]+)до вводу, тим самим перетворивши його на регулярний вираз, який відповідає вхідному кольорові, одразу після цього точно ще один колір (захоплюючи останній).

L$:`RedOrangeYellowGreenBlueIndigoVioletRed
$1

Тепер :поміняє вхід сцени власним регулярним виразом. Таким чином, попередній результат стає регулярним виразом і відповідає зі списком кольорів. (Одиничний) збіг замінюється його першою групою захоплення (тобто наступним кольором у циклі) та повертається. Вихід у кінці програми відбувається автоматично.



Так, я видалив свій коментар, побачивши рішення Кевіна. \1
Потрібно

@TonHospel щось знайшов. :)
Мартін Ендер

1
@KevinCruijssen Завдяки вашому та Тоновому наповненню на рішення, що не має обмеження, я знайшов 58-байт. ;)
Мартін Ендер

3

Вим, 59 56 53 52 байт

-1 байт завдяки tsh

2IYellow Green Blue Indigo Violet Red Orange <Esc>*wywVp

1
2IYellow Зелений Синій Індіго Фіолетовий Червоний Помаранчевий <Esc> * wywVp
TSH

3

Java (JDK 10) , 77 байт

s->"Red Orange Yellow Green Blue Indigo Violet Red".split(s)[1].split(" ")[1]

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

Кредити



@KevinCruijssen Якийсь гарний виразний фу, який у вас є!
Олів'є Грегоар

1
Я згадав, коли одного разу шукав розщеплення, яке зберігає розділові знаки як окремі пункти, і відповідь, яку я знайшов, містила також варіанти, щоб роздільник був скреслений як провідна або задні частина, і вважав, що це буде корисно тут. :) Ось така відповідь, включаючи погляд наперед / огляд на два інших згаданих варіанти.
Кевін Круїссен

1
Збережіть байт:s->"Red Orange Yellow Green Blue Indigo Violet Red".split(s)[1].split(" ")[1]
жовтня

2

Кокосовий горіх , 79 байт

s->"# Violet Red # # Green Indigo Yellow # # Orange Blue".split()[ord(s[0])%12]

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


Не знаю кокосового горіха. Але подумайте, ви повинні мати можливість скоротити 2 байти, використовуючи малі літери, оскільки це зменшує максимальне значення модуля:s->"# green indigo yellow # # orange blue # violet red".split()[ord(s[0])%12]
Wernisch

@Wernisch Дякую за пропозицію. Хоча я зачекаю, поки ОП відповість, чи допустимі малі літери перед оновленням.
Лайконі

2

Лушпиння , 28 байт

S!o→€⁰w¨ṙ}ΘΞĠ«ẇ₇G²€ḃλBżḃIÿö⌉

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

Можливо, є кращі варіанти управління аргументами, але це найкраще, що я міг знайти

Пояснення

S!o→€⁰w¨ṙ}ΘΞĠ«ẇ₇G²€ḃλBżḃIÿö⌉
       ¨ṙ}ΘΞĠ«ẇ₇G²€ḃλBżḃIÿö⌉    Compressed string with all the colors
                                "Red Orange Yellow Green Blue Indigo Violet"
      w                         Split on spaces
S                               Pass the list to both the following functions:
    €⁰                          1) Find the index of the input in the list
  o→                                  and increase it by one
 !                              2) Get the element of the list at the
                                   resulting position (indexing is cyclical)

2

Стакс , 31 30 29 байт

ÇôF┘≡▓ƒ◄╙>┘☼░⌂╪B<U[ÇQ╒eöΣQ╔÷n

Запустіть і налагоджуйте його

Для цього використовується інструкція з перекладу кільця. Він замінює кожен елемент у масиві наступним із "кільця декодера". Зазвичай він використовується для заміни символів у рядку, але він може бути використаний і для цілого рядка, якщо він загорнутий у однотонний масив.

Ось розпаковане, нерозроблене, прокоментуване представлення ascii тієї самої програми.

]   wrap input in singleton array
`5^bZ_9G*h]h%oM~X9e-0ZQJkb2`    compressed string literal with color names
:.j title case and split on spaces
:t  do ring translation

Виконати цей


добре ... я люблю ці мови =)
lolad

3
Невдача для Фіолетового -> Червоний
Вейджун Чжоу

1
@WeijunZhou: Цей тестовий випадок був доданий після цього подання.
рекурсивна

1
@WeijunZhou: Я виправив цей тестовий випадок і поголив байт.
рекурсивна

1
@WeijunZhou: Здається, це невідповідність між C # і JS реалізаціями stax. Я додам тестовий випадок і нормалізую поведінку для наступного випуску.
рекурсивна


2

R, 109 93 bytes

function(x){y=c("Red","Orange","Yellow","Green","Blue","Indigo","Violet");y[match(x,y)%%7+1]}

Try it online!

-16 thanks to Giuseppe for the use of match advice


welcome to PPCG! this is a nice first answer. I think match(y,x)%%7+1 is shorter for indexing than your if statement. Additionally, the builtin colors() contains a lot of color names, if you find the indices :)
Giuseppe

oops, looks like colors() doesn't contain indigo! Ah well, still, +1!
Giuseppe

thanks! match is better here
DS_UNI


and yeah I first tried to use colors() :/
DS_UNI

1

Batch, 97 bytes

@set s=Red Orange Yellow Green Blue Indigo Violet Red
@call set s=%%s:*%1 =%%
@echo %s: =&rem %

Explanation: The call on the second line has the effect of substituting the parameter into the command and evaluating it, turning it into e.g. set s=%s:Red =%, which deletes the prefix of the string that includes the parameter. The substitution on the third line then replaces all the spaces with statement separators and comments. This works because string substitution happens before parsing.


1

Ruby -n, 75 69 bytes

a=%w{Red Orange Yellow Green Blue Indigo Violet};p a[-~(a.index$_)%7]

Try it online!


1
Why the i&& thing? No need to check for nil, as “Ignore any errors if this is not a colour.”
manatwork

@manatwork I understood it as "catch and ignore any errors" but alright.
Asone Tuhid

1

Julia 0.6, 76 bytes

f(s)=match(Regex("$s(.[a-z]*)"),"RedOrangeYellowGreenBlueIndigoViolet"^2)[1]

Try it online!

This handles the Violet->Red by recycling the string with the power ^ operator.

Here's a slightly longer solution without regexes:

g(s,l=split("Red Orange Yellow Green Blue Indigo Violet"," "))=l[(findin(l,[s])[1])%7+1]

1

PowerShell, 74 bytes

(-split("Red Orange Yellow Green Blue Indigo Violet "*2-split$args)[1])[0]

Try it online!

Takes the string "Red ... Violet " and string-multiplies it out by two to properly handle the Violet -> Red test case. We then -split that string on input $args to give us an array of two strings. We take the second string thereof [1], then -split that on whitespace to give us an array of strings and take the first [0].

For example, for input "Yellow", the first step will result in @("Red Orange ", " Green Blue Indigo ... Indigo Violet "). We take the second one of that, split it on whitespace (which removes the whitespace), resulting in @("Green", "Blue", ... "Violet"), so taking the [0] one thereof results in the proper next string.


1

IBM/Lotus Notes Formula Language, 79 74 bytes

@Left(@Right("Red Orange Yellow Green Blue Indigo Violet Red ";a+" ");" ")

Previous version for 79:

R:=@Explode("Red,Orange,Yellow,Green,Blue,Indigo,Violet,Red");R[@Member(a;R)+1]

Takes input from an editable text field called a.

There is no TIO for formula language so here's a couple of screenshots.

enter image description here

enter image description here

enter image description here



1

Kotlin, 73 bytes

x->"RedOrangeYellow Green  BlueIndigoVioletRed".substringAfter(x).take(6)

Try it online!

Taking advantage of the fact that many colors are 6 characters, the ones that are not are prefixed with spaces to make them 6 characters long. Hopefully it's acceptable that some of the colors are outputted with spaces before them.
e.g. Red is " Red", Blue is " Blue"


1

SmileBASIC, 94 84 bytes

C$="Red   OrangeYellowGreen Blue  IndigoViolet
INPUT I$?MID$(C$*2,INSTR(C$,I$)+6,6)

1

Gema, 67 characters

*=@subst{*\?<J>=\?\$2\;\?=;RedOrangeYellowGreenBlueIndigoVioletRed}

Sample run:

bash-4.4$ echo -n Yellow | gema '*=@subst{*\?<J>=\?\$2\;\?=;RedOrangeYellowGreenBlueIndigoVioletRed}'
Green

bash-4.4$ echo -n Violet | gema '*=@subst{*\?<J>=\?\$2\;\?=;RedOrangeYellowGreenBlueIndigoVioletRed}'
Red

Gema, 59 characters

R=Orange
O=Yellow
Y=Green
G=Blue
B=Indigo
I=Violet
V=Red
*=

Boring one. Dumbest approach ever, but quite short.

Sample run:

bash-4.4$ gema 'R=Orange;O=Yellow;Y=Green;G=Blue;B=Indigo;I=Violet;V=Red;*=' <<< 'Yellow'
Green

bash-4.4$ gema 'R=Orange;O=Yellow;Y=Green;G=Blue;B=Indigo;I=Violet;V=Red;*=' <<< 'Violet'
Red

1

q/kdb+, 59 55 bytes

Solution:

.[!;2 8#($)`Red`Violet`Indigo`Blue`Green`Yellow`Orange]

Examples:

q).[!;2 8#($)`Red`Violet`Indigo`Blue`Green`Yellow`Orange]"Red"
"Violet"
q).[!;2 8#($)`Red`Violet`Indigo`Blue`Green`Yellow`Orange]"Orange"
"Red"
q).[!;2 8#($)`Red`Violet`Indigo`Blue`Green`Yellow`Orange]"Blue"
"Green"

Explanation:

Create a dictionary of colour => next colour, the input is the key to the dictionary:

.[!;2 8#($)`Red`Violet`Indigo`Blue`Green`Yellow`Orange] / the solution
.[ ;                                                  ] / apply multiple args to function
           `Red`Violet`Indigo`Blue`Green`Yellow`Orange  / list of colours
         ($)                                            / convert to strings
    2 8#                                                / reshape into 2x8 grid
  !                                                     / create dictionary

Bonus:

It's 53 bytes in K4:

.[!;2 8#$`Red`Violet`Indigo`Blue`Green`Yellow`Orange]


1

sed, 72 bytes

s/$/%RedOrangeYellowGreenBlueIndigoVioletRed/;s/(.+)%.*\1(.[a-z]+).*/\2/

Try it Online

Example 1:

Input:

Red
Orange
Yellow
Green
Blue
Indigo
Violet

Output:

Orange
Yellow
Green
Blue
Indigo
Violet
Red

Example 2:

Input:

Indigo
Yellow
Red
Red
Blue
Green
Orange
Violet
Green
Green
Green
Blue
Blue
Violet

Output:

Violet
Green
Orange
Orange
Indigo
Blue
Yellow
Red
Blue
Blue
Blue
Indigo
Indigo
Red

Welcome to the site! Could you provide a link to an online interpreter, such as Try It Online! where we can test this solution?
caird coinheringaahing

@cairdcoinheringaahing: Hi, thank you very much for the welcome and the website recommendation! I've updated my answer with a link to the page where you can test the code online.
lucasb
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.