Следующий цвет

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
lolad
источник
1
«Предоставьте хотя бы один пример ввода и вывода. Убедитесь, что они соответствуют вашему собственному описанию того, как должен выглядеть ввод». Вы описываете свой собственный контрольный пост? Или это требование к решениям?
рекурсивный
6
Цвета в нижнем регистре в порядке?
Emigna
4
Но что происходит, когда вы достигаете «серый»? ;)
AJFaraday
1
@Emigna Исходя из того, как OP сформулировал вопрос, я бы предположил, что вы можете выбрать, вводить ли регистр, регистр или регистр. 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
dzaima
источник
22

JavaScript, 68 байт

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

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

ТТГ
источник
Каков результат для ввода "Фиалка"? Я думаю, вы должны изменить текст 'RedOrangeYellowGreenBlueIndigoVioletRed'или что-то
Оливье Грегуар
1
@ OlivierGrégoire Хорошо, добавлено. Это правило изменяется ОП после опубликованного ответа.
ч. В
Я не знал: я видел только окончательный вариант вопроса.
Оливье Грегуар
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+/}

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

nwellnhof
источник
Имена Всемогущего Юникода
Вейцзюнь Чжоу,
Как бы ни было интересно это решение, оно в конечном итоге не соответствует спецификации. Не могли бы вы включить в свой ответ совместимую версию и опубликовать ее как дополнение?
Денис
Существует также %12решение для кокосового ореха, но, конечно, это аккуратнее.
Вейцзюнь Чжоу
5

Рубин -n , 62 60 байт

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

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

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

Подход Regex выглядит многообещающе и для Ruby. Тем не менее, я пришел к более короткому решению, используя прогноз и прямую печать матча, вместо того, чтобы играть с группами захвата. Список цветов в обратном направлении, так как просмотр вперед на 1 байт дешевле, чем просмотр назад.

Кирилл Л.
источник
очень хорошо, -2 байта ( /#$_/интерполирует)
Asone Tuhid
4

Красный , 87 байт

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

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

Гален Иванов
источник
4
Понятия не имею, что это за язык, работает ли ваш код или вообще используется в нем, но имейте +1 только за использование языка «Red» для этой задачи.
msh210
@ msh210 Это тесно связано с Rebol (язык объектов, основанный на относительном выражении). Язык представляет код, данные и метаданные одинаковым образом - с блоками, обозначенными []. Текущий дистрибутив Red составляет всего 1,1 МБ и включает консоль / интерпретатор, а также компилятор, который может перекрестно компилировать на разных платформах. Мой код отлажен в том смысле, что я попробовал разные решения и удалил все пробелы, которые могу. Плохо то, что пространство - это разделитель почти везде. Все математические выражения должны иметь пробелы по обе стороны от операторов, например, a: 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
Emigna
источник
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")
Wernisch
источник
3

Haskell , 80 71 75 байт

Спасибо Laikoni за сокращение 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для того, чтобы либо проверить на равенство, либо показать результат.

Кристиан Лупаску
источник
71 байт с span: Попробуйте онлайн!
Laikoni
@Laikoni Вау, это круто, спасибо! Я забыл о span...
Кристиан Лупаску
1
ОП уточнил, что Violetдолжен обернуться Red, поэтому нужно Redснова добавить в конец строки.
Laikoni
Мне очень нравится идея второго! Однако succ Violetне будет работать для Enums, не оборачивайтесь :(
მოიმო
@ БМО Точно. Когда я сделал эту версию, я не знал о требовании обертывания.
Кристиан Лупаску,
3

Сетчатка , 65 58 байт

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

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

объяснение

$
(.[a-z]+)

Мы начинаем с добавления (.[a-z]+)ввода, тем самым превращая его в регулярное выражение, соответствующее входному цвету, за которым сразу следует ровно еще один цвет (захватывая последний).

L$:`RedOrangeYellowGreenBlueIndigoVioletRed
$1

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

Мартин Эндер
источник
Вот еще одна 65-байтовая альтернатива .
Кевин Круйссен
Да, я удалил свой комментарий, увидев решение Кевина. Необходимость настройки \1и прыжок к цели приводит к потере многих байтов: :-)
Тон Хоспел
@TonHospel нашел что-то. :)
Мартин Эндер
1
@KevinCruijssen Благодаря тому, что вы и Тон настаивали на решении без разделителя, я в итоге нашел 58-байтовый код. ;)
Мартин Эндер
3

Vim, 59 56 53 52 байт

-1 байт благодаря tsh

2IYellow Green Blue Indigo Violet Red Orange <Esc>*wywVp
oktupol
источник
1
2Желтый Зеленый Синий Индиго Фиолетовый Красный Оранжевый <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]
Okx
2

Кокос , 79 байт

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

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

Laikoni
источник
Не знаю, кокос. Но подумайте, что вы должны быть в состоянии сократить 2 байта, используя строчные буквы, так как это уменьшает максимальное значение по модулю:s->"# green indigo yellow # # orange blue # violet red".split()[ord(s[0])%12]
Wernisch
@Wernisch Спасибо за предложение. Хотя я подожду, пока OP ответит, допустимы ли строчные буквы перед обновлением.
Laikoni
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

Stax , 31 30 29 байт

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

Запустите и отладьте его

Это использует инструкцию перевода кольца. Он заменяет каждый элемент в массиве следующим из «кольца декодера». Обычно он используется для замены символов в строке, но также может использоваться и для всей строки, если он заключен в одноэлементный массив.

Вот распакованное, ungolfed, прокомментированное представление 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
Fails for Violet -> Red
Вейцзюнь Чжоу,
1
@WeijunZhou: этот тестовый пример был добавлен после этого представления.
рекурсивный
1
@WeijunZhou: я исправил этот тестовый пример и побрил байт.
рекурсивный
1
@ WeijunZhou: Кажется, это несоответствие между реализациями stax в C # и JS. Я добавлю тестовый пример и нормализую поведение для следующего выпуска.
рекурсивный
2

R , 109 93 байта

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

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

-16 спасибо Джузеппе за matchсоветы

DS_UNI
источник
Добро пожаловать в PPCG! это хороший первый ответ. Я думаю, что match(y,x)%%7+1короче для индексации, чем ваше ifзаявление. Кроме того, встроенный файл colors()содержит много названий цветов, если вы найдете индексы :)
Giuseppe
Ой, похоже colors(), не содержит indigo! Ах, ну все равно +1!
Джузеппе
Благодарность! matchлучше здесь
DS_UNI
91 байт
Джузеппе
и да, я впервые попытался использовать colors(): /
DS_UNI
1

Пакетный, 97 байт

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

Объяснение: Операция callво второй строке заменяет параметр в команде и оценивает его, превращая его в, например set s=%s:Red =%, удаляя префикс строки, содержащей параметр. Подстановка в третьей строке заменяет все пробелы разделителями операторов и комментариями. Это работает, потому что замена строки происходит перед анализом.

Нил
источник
1

Рубин -n , 75 69 байт

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

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

Асоне Тухид
источник
1
Почему i&&вещь? Не нужно проверять nil, так как «Игнорируйте любые ошибки, если это не цвет».
manatwork
@manatwork Я понял это как «лови и игнорируй любые ошибки», но все в порядке.
Asone Tuhid
1

Юлия 0,6 , 76 байт

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

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

Это обрабатывает Violet-> Red путем переработки струны с ^оператором питания .

Вот немного более длинное решение без регулярных выражений:

g(s,l=split("Red Orange Yellow Green Blue Indigo Violet"," "))=l[(findin(l,[s])[1])%7+1]
niczky12
источник
1

PowerShell , 74 байта

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

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

Принимает строку "Red ... Violet "и умножает ее на два, чтобы правильно обработать Violet -> Redконтрольный пример. Затем мы вводим -splitэту строку для ввода $argsмассива из двух строк. Мы берем вторую его строку [1], затем -splitна пустом месте, чтобы получить массив строк, и берем первую [0].

Например, для ввода "Yellow"первый шаг приведет к @("Red Orange ", " Green Blue Indigo ... Indigo Violet "). Мы берем второе из этого, разбиваем его на пустое пространство (которое удаляет пустое пространство), в результате чего @("Green", "Blue", ... "Violet"), взятие [0]одного из них приводит к правильной следующей строке.

AdmBorkBork
источник
1

Язык формул IBM / Lotus Notes, 79 74 байта

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

Предыдущая версия для 79:

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

Принимает ввод из редактируемого текстового поля с именем a.

Для языка формул TIO не существует, так что вот пара скриншотов.

введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь

ElPedro
источник
1

Котлин , 73 байта

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

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

Воспользовавшись тем фактом, что многие цвета имеют 6 символов, к тем, которые не имеют префикса, добавляются пробелы, чтобы сделать их длиной 6 символов. Надеюсь, что некоторые цвета выводятся с пробелами перед ними.
Например, красный " Red", синий" Blue"

Makotosan
источник
1

SmileBASIC, 94 84 байта

C$="Red   OrangeYellowGreen Blue  IndigoViolet
INPUT I$?MID$(C$*2,INSTR(C$,I$)+6,6)
12Me21
источник
1

Гема , 67 знаков

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

Образец прогона:

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

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

Гема , 59 знаков

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

Скучный Самый тупой подход, но довольно короткий.

Образец прогона:

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
manatwork
источник
1

q / kdb + , 59 55 байт

Решение:

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

Примеры:

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"

Объяснение:

Создайте словарь цвета => следующий цвет, вход является ключом к словарю:

.[!;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

Бонус:

Это 53 байта в K4:

.[!;2 8#$`Red`Violet`Indigo`Blue`Green`Yellow`Orange]
streetster
источник
1

sed, 72 байта

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

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

Пример 1:

Входные данные:

Red
Orange
Yellow
Green
Blue
Indigo
Violet

Выход:

Orange
Yellow
Green
Blue
Indigo
Violet
Red

Пример 2:

Входные данные:

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

Выход:

Violet
Green
Orange
Orange
Indigo
Blue
Yellow
Red
Blue
Blue
Blue
Indigo
Indigo
Red
lucasb
источник
Добро пожаловать на сайт! Не могли бы вы предоставить ссылку на онлайн-переводчика, например, Try It Online! где мы можем проверить это решение?
Caird Coinheringaahing
@cairdcoinheringaahing: Привет, большое спасибо за привет и рекомендацию на сайте! Я обновил свой ответ ссылкой на страницу, где вы можете проверить код онлайн.
Lucasb