El siguiente color

20

Desafío

Considere el arco iris como siete colores, representados por cadenas como Red Orange Yellow Green Blue Indigo Violet.
Su tarea es crear un programa que reciba uno de estos colores como entradas y salidas a continuación en el orden del color del arco iris. Esto incluye la superposiciónViolet -> Red

Entrada

Una cadena que contiene uno de los colores del arco iris.

Salida

El siguiente en orden color del arcoiris.

Reglas

  • Los nombres de los colores distinguen entre mayúsculas y minúsculas. Deben coincidir con el caso incluido en esta publicación.
  • La entrada siempre será válida. Cualquier comportamiento está permitido para entradas no válidas.
  • Este es el código de golf, por lo que gana la menor cantidad de bytes.

Ejemplo de entrada y salida

Input -> Output
Red -> Orange
Orange -> Yellow
Yellow -> Green
Green -> Blue
Blue -> Indigo
Indigo -> Violet
Violet -> Red
lolad
fuente
1
"Proporcione al menos un ejemplo de entrada y salida. Asegúrese de que coincidan con su propia descripción de cómo debería ser la entrada". ¿Estás describiendo tu propia publicación de desafío? ¿O es un requisito para las soluciones?
recursivo
66
¿Están bien los colores en minúsculas?
Emigna
44
Pero, ¿qué sucede cuando alcanzas 'gris'? ;)
AJFaraday
1
@Emigna Por la forma en que OP formuló la pregunta, supongo que puedes elegir entre mayúsculas, minúsculas o insensibles a mayúsculas y minúsculas. Provide at least one example input and output. Make sure they match your own description of what the input should look like.
sonrad10
1
¿Están bien los espacios finales?
ivzem

Respuestas:

2

SOGL V0.12 , 23 bytes

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

Pruébalo aquí!

Explicación:

...‘θ⁽,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
fuente
22

JavaScript, 68 bytes

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

Para la entrada "Red", esta función primero construye un RegExp /Red(.[a-z]*)/para que coincida con la cadena 'RedOrangeYellowGreenBlueIndigoVioletRed'y luego devuelve el primer resultado de captura.

tsh
fuente
¿Cuál es el resultado para la entrada "Violeta"? Supongo que deberías cambiar el texto 'RedOrangeYellowGreenBlueIndigoVioletRed'o algo así
Olivier Grégoire
1
@ OlivierGrégoire Ok, agregó. OP cambia esta regla después de la respuesta publicada.
tsh
No lo sabía: solo vi la versión final de la pregunta.
Olivier Grégoire
9

Perl 5 -p , 58 57 bytes

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

Pruébalo en línea!

Ahora que el desafío ha cambiado para ser cíclico, la solución regex

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

ya no es óptimo (debido al doble Red)

También 57 bytes:

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

Pruébalo en línea!

Ton Hospel
fuente
7

Python , 79 bytes

z="Red Orange Yellow Green Blue Indigo Violet".split()*2
dict(zip(z,z[1:])).get

Pruébalo en línea!

Manijas Violet -> Red. La función deseada se proporciona de forma anónima en la segunda línea.


80 bytes

lambda x:"Red Orange Yellow Green Blue Indigo Violet Red".split(x)[1].split()[0]

Pruébalo en línea!

xnor
fuente
7

Perl 6 , 56 bytes

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

Pruébalo en línea!

Explota el hecho de que los bits 2-4 de los códigos ASCII de la primera letra de cada color se asignan a 0-6.

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

Aquí hay una buena solución no competitiva que usa "púrpura" en lugar de "índigo" y "violeta" (38 caracteres, 59 bytes):

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

Pruébalo en línea!

nwellnhof
fuente
Nombres Todopoderoso Unicode
Weijun Zhou
Tan interesante como es esta solución, en última instancia no sigue las especificaciones. ¿Podría incluir una versión compatible en su respuesta y publicar esto como un apéndice?
Dennis
También hay una %12solución para el coco, pero, por supuesto, esta es más ordenada.
Weijun Zhou
5

Ruby -n , 62 60 bytes

-2 por Asone Tuhid.

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

Pruébalo en línea!

El enfoque de Regex también parece prometedor para Ruby. Sin embargo, llegué a una solución más corta usando una búsqueda anticipada e imprimiendo directamente el partido, en lugar de jugar con grupos de captura. La lista de colores está en dirección inversa, ya que la búsqueda anticipada es 1 byte más barata que la búsqueda anticipada.

Kirill L.
fuente
muy agradable, -2 bytes ( /#$_/interpola)
Asone Tuhid
4

Rojo , 87 bytes

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

Pruébalo en línea!

Galen Ivanov
fuente
44
No tengo idea de qué es este lenguaje, si funciona o cómo funciona su código, o si es un juego de golf, pero tenga un +1 solo por usar un lenguaje llamado "Rojo" para este desafío.
msh210
@ msh210 Está estrechamente relacionado con Rebol (lenguaje de objetos basado en expresiones relativas). El lenguaje representa código, datos y metadatos de la misma manera, con bloques denotados por []. La distribución actual de Red es de solo 1.1 MB e incluye una consola / intérprete, así como un compilador que puede realizar una compilación cruzada a diferentes plataformas. Mi código se juega en el sentido de que probé diferentes soluciones y eliminé todos los espacios que puedo. Lo malo es que el espacio es el delimitador en casi todas partes. Todas las expresiones matemáticas deben tener espacios en ambos lados de los operadores como a: b + c (a = b + c).
Galen Ivanov
4

05AB1E , 30 bytes

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

Pruébalo en línea!

Explicación

“†¾›ÈŠÛˆ¨‡—ëß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
fuente
3

Excel, 85 bytes

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

Utiliza nombres en minúsculas.

Mismo enfoque, con letras mayúsculas 86 bytes:

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

Haskell , 80 71 75 bytes

¡Gracias a Laikoni por acortar 9 bytes!

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

Pruébalo en línea!


Otra solución, un poco más idiomática, pero no pude acortarla:

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

Debe derivar Readdebido al requisito de que la entrada es una cadena y al menos Eqo Showpara probar la igualdad o mostrar el resultado.

Cristian Lupascu
fuente
71 bytes con span: ¡ Pruébelo en línea!
Laikoni
@Laikoni Wow, eso es genial, ¡gracias! Me olvidé de span...
Cristian Lupascu
1
OP aclaró que Violetdebería ajustarse a Red, por lo que debe agregar Rednuevamente al final de la cadena.
Laikoni
¡Me gusta mucho la idea del segundo! Sin embargo succ Violet, no funcionará para Enums, no se envuelva :(
ბიმო
@BMO Exactamente. Cuando hice esa versión no estaba al tanto del requisito de envoltura.
Cristian Lupascu
3

Retina , 65 58 bytes

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

Pruébalo en línea!

Explicación

$
(.[a-z]+)

Comenzamos agregando (.[a-z]+)a la entrada, convirtiéndola en una expresión regular que coincida con el color de entrada, seguido inmediatamente por un color más (capturando el último).

L$:`RedOrangeYellowGreenBlueIndigoVioletRed
$1

Ahora :intercambia la entrada del escenario con su propia expresión regular. Entonces, el resultado anterior se convierte en la expresión regular y se compara con la lista de colores. La coincidencia (única) se reemplaza con su primer grupo de captura (es decir, el siguiente color en el ciclo) y se devuelve. La salida al final del programa ocurre automáticamente.

Martin Ender
fuente
Aquí hay otra alternativa de 65 bytes .
Kevin Cruijssen
Sí, eliminé mi comentario después de ver la solución de Kevin. Tener que configurar \1y saltar al objetivo desperdicia muchos bytes: :-)
Ton Hospel
@TonHospel encontró algo. :)
Martin Ender
1
@KevinCruijssen Gracias a que tú y Ton presionaron por una solución sin delimitador, terminé encontrando un 58-byter. ;)
Martin Ender
3

Vim, 59 56 53 52 Bytes

-1 byte gracias a tsh

2IYellow Green Blue Indigo Violet Red Orange <Esc>*wywVp
oktupol
fuente
1
2IYellow Verde Azul Indigo Violeta Rojo Naranja <Esc> * wywVp
TSH
3

Java (JDK 10) , 77 bytes

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

Pruébalo en línea!

Créditos

Olivier Grégoire
fuente
@KevinCruijssen ¡Qué bonito regex fu que tienes!
Olivier Grégoire
1
Recordé cuando una vez estaba buscando una división que mantiene los delimitadores como elementos separados, la respuesta que encontré también contenía opciones para mantener el delimitador concat como parte inicial o posterior, y pensé que sería útil aquí. :) Aquí está esa respuesta que incluye el mirar hacia adelante / mirar hacia atrás para las otras dos opciones mencionadas.
Kevin Cruijssen
1
Guardar un byte:s->"Red Orange Yellow Green Blue Indigo Violet Red".split(s)[1].split(" ")[1]
Okx
2

Coco , 79 bytes

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

Pruébalo en línea!

Laikoni
fuente
No sé coco. Pero piense que debería poder cortar 2 bytes usando letras minúsculas, ya que esto reduce el valor máximo del módulo:s->"# green indigo yellow # # orange blue # violet red".split()[ord(s[0])%12]
Wernisch
@ Wernisch Gracias por la sugerencia. Aunque esperaré hasta que OP haya respondido si las letras minúsculas son aceptables antes de actualizar.
Laikoni
2

Casco , 28 bytes

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

Pruébalo en línea!

Quizás haya mejores opciones para manejar los argumentos, pero esto es lo mejor que pude encontrar

Explicación

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)
Leo
fuente
2

Stax , 31 30 29 bytes

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

Ejecutar y depurarlo

Esto usa la instrucción de traducción de anillo. Reemplaza cada elemento en una matriz con el siguiente del "anillo decodificador". Por lo general, se usa para reemplazar caracteres en una cadena, pero también se puede usar en una cadena completa, si está envuelta en una matriz singleton.

Aquí está la representación ascii desempaquetada, sin golf y comentada del mismo programa.

]   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

Ejecute este

recursivo
fuente
ok ... Me encantan estos idiomas =)
lolad
3
Falla para Violeta -> Rojo
Weijun Zhou
1
@WeijunZhou: Ese caso de prueba se agregó después de este envío.
recursivo
1
@WeijunZhou: arreglé ese caso de prueba y me afeité un byte.
recursivo
1
@WeijunZhou: Parece ser una inconsistencia entre las implementaciones C # y JS de stax. Agregaré un caso de prueba y normalizaré el comportamiento para la próxima versión.
recursivo
2

R , 109 93 bytes

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

Pruébalo en línea!

-16 gracias a Giuseppe por el uso de matchconsejos

DS_UNI
fuente
bienvenido a PPCG! Esta es una buena primera respuesta. Creo que match(y,x)%%7+1es más corto para indexar que su ifdeclaración. Además, el incorporado colors()contiene muchos nombres de colores, si encuentra los índices :)
Giuseppe
¡Uy, parece colors()que no contiene indigo! Ah bueno, todavía, +1!
Giuseppe
¡Gracias! matches mejor aquí
DS_UNI
91 bytes
Giuseppe
y sí, primero traté de usar colors(): /
DS_UNI
1

Lote, 97 bytes

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

Explicación: El callen la segunda línea tiene el efecto de sustituir el parámetro en el comando y evaluarlo, convirtiéndolo en set s=%s:Red =%, por ejemplo , lo que elimina el prefijo de la cadena que incluye el parámetro. La sustitución en la tercera línea reemplaza todos los espacios con separadores de declaraciones y comentarios. Esto funciona porque la sustitución de cadenas ocurre antes del análisis.

Neil
fuente
1

Ruby -n , 75 69 bytes

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

Pruébalo en línea!

Asone Tuhid
fuente
1
¿Por qué la i&&cosa? No hay necesidad de comprobar si nil, como “Ignorar cualquier error si esto no es un color.”
manatwork
@manatwork Lo entendí como "atrapar e ignorar cualquier error" pero está bien.
Asone Tuhid
1

Julia 0.6 , 76 bytes

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

Pruébalo en línea!

Esto maneja el Violet-> Red reciclando la cadena con el poder ^ operador de .

Aquí hay una solución un poco más larga sin expresiones regulares:

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

PowerShell , 74 bytes

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

Pruébalo en línea!

Toma la cuerda "Red ... Violet "y la cadena la multiplica por dos para manejar adecuadamente el Violet -> Redcaso de prueba. Luego -splitcolocamos esa cadena en la entrada $argspara darnos una matriz de dos cadenas. Tomamos la segunda cuerda del mismo[1] , luego -spliten el espacio en blanco para darnos una serie de cadenas y tomar la primera [0].

Por ejemplo, para la entrada "Yellow", el primer paso dará como resultado @("Red Orange ", " Green Blue Indigo ... Indigo Violet "). Tomamos el segundo de eso, lo dividimos en espacios en blanco (que elimina el espacio en blanco), lo que da como resultado @("Green", "Blue", ... "Violet"), por lo que tomar [0]uno de los mismos da como resultado la siguiente cadena adecuada.

AdmBorkBork
fuente
1

Lenguaje de fórmulas IBM / Lotus Notes, 79 74 bytes

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

Versión anterior para 79:

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

Toma datos de un campo de texto editable llamado a .

No hay TIO para el lenguaje de fórmulas, así que aquí hay un par de capturas de pantalla.

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

ElPedro
fuente
1

PHP, 92 bytes

$a=" Red   OrangeYellowGreen Blue  IndigoVioletRed";echo substr($a,strpos($a,$argv[1])+6,6)

Pruébalo en línea!

Dave
fuente
1

Kotlin , 73 bytes

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

Pruébalo en línea!

Aprovechando el hecho de que muchos colores son de 6 caracteres, los que no lo son tienen prefijos de espacios para que tengan 6 caracteres de longitud. Con suerte, es aceptable que algunos de los colores se emitan con espacios antes de ellos.
por ejemplo, rojo es " Red", azul es" Blue"

Makotosan
fuente
1

SmileBASIC, 94 84 bytes

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

Gema , 67 personajes

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

Ejecución de muestra:

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 caracteres

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

Aburrido uno. El enfoque más tonto de todos los tiempos, pero bastante corto.

Ejecución de muestra:

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
hombre trabajando
fuente
1

q / kdb + , 59 55 bytes

Solución:

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

Ejemplos:

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"

Explicación:

Cree un diccionario de color => siguiente color, la entrada es la clave del diccionario:

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

Prima:

Son 53 bytes en K4:

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

sed, 72 bytes

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

Pruébalo en línea

Ejemplo 1:

Entrada:

Red
Orange
Yellow
Green
Blue
Indigo
Violet

Salida:

Orange
Yellow
Green
Blue
Indigo
Violet
Red

Ejemplo 2

Entrada:

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

Salida:

Violet
Green
Orange
Orange
Indigo
Blue
Yellow
Red
Blue
Blue
Blue
Indigo
Indigo
Red
lucasb
fuente
Bienvenido al sitio! ¿Podría proporcionar un enlace a un intérprete en línea, como Pruébelo en línea! ¿Dónde podemos probar esta solución?
caird coinheringaahing
@cairdcoinheringaahing: Hola, muchas gracias por la bienvenida y la recomendación del sitio web. He actualizado mi respuesta con un enlace a la página donde puede probar el código en línea.
lucasb