La couleur suivante

20

Défi

Considérez l'arc-en-ciel comme sept couleurs, représentées par des chaînes comme Red Orange Yellow Green Blue Indigo Violet.
Votre tâche consiste à créer un programme qui reçoit l'une de ces couleurs en entrée et qui sort ensuite dans l'ordre couleur arc-en-ciel. Cela inclut le chevauchementViolet -> Red

Contribution

Une chaîne contenant l'une des couleurs de l'arc-en-ciel.

Production

Le suivant dans l'ordre couleur de l'arc-en-ciel.

Règles

  • Les noms de couleur sont sensibles à la casse. Ils doivent correspondre à l'étui inclus dans cet article.
  • L'entrée sera toujours valide. Tout comportement est autorisé pour une entrée non valide.
  • C'est le golf de code, donc le plus petit nombre d'octets gagne!

Exemple d'entrée et de sortie

Input -> Output
Red -> Orange
Orange -> Yellow
Yellow -> Green
Green -> Blue
Blue -> Indigo
Indigo -> Violet
Violet -> Red
lolade
la source
1
"Fournissez au moins un exemple d'entrée et de sortie. Assurez-vous qu'ils correspondent à votre propre description de ce à quoi l'entrée devrait ressembler." Décrivez-vous votre propre message de défi? Ou s'agit-il d'une exigence de solutions?
récursif
6
Les couleurs minuscules sont-elles correctes?
Emigna
4
Mais que se passe-t-il lorsque vous atteignez le «gris»? ;)
AJFaraday
1
@Emigna D'après la façon dont OP a formulé la question, je suppose que vous pouvez choisir de faire des majuscules, des minuscules ou insensibles à la casse. Provide at least one example input and output. Make sure they match your own description of what the input should look like.
sonrad10
1
Les espaces de fuite sont-ils corrects?
ivzem

Réponses:

2

SOGL V0.12 , 23 octets

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

Essayez-le ici!

Explication:

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

JavaScript, 68 octets

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

Pour l'entrée "Red", cette fonction construit d'abord un RegExp /Red(.[a-z]*)/pour correspondre à la chaîne 'RedOrangeYellowGreenBlueIndigoVioletRed', puis renvoie le premier résultat de capture.

tsh
la source
Quel est le résultat pour l'entrée "Violet"? Je suppose que vous devriez changer le texte en 'RedOrangeYellowGreenBlueIndigoVioletRed'ou quelque chose
Olivier Grégoire
1
@ OlivierGrégoire Ok, ajouté. Cette règle est modifiée par OP après la réponse publiée.
tsh
Je ne savais pas: je n'ai vu que la version finale de la question.
Olivier Grégoire
9

Perl 5 -p , 58 57 octets

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

Essayez-le en ligne!

Maintenant que le défi a été changé pour être cyclique, la solution d'expression régulière

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

n'est plus optimal (en raison du double Red)

Aussi 57 octets:

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

Essayez-le en ligne!

Ton Hospel
la source
7

Python , 79 octets

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

Essayez-le en ligne!

Poignées Violet -> Red. La fonction souhaitée est donnée de manière anonyme dans la deuxième ligne.


80 octets

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

Essayez-le en ligne!

xnor
la source
7

Perl 6 , 56 octets

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

Essayez-le en ligne!

Exploite le fait que les bits 2-4 des codes ASCII de la première lettre de chaque couleur correspondent à 0-6.

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

Voici une belle solution non concurrente qui utilise "violet" au lieu de "indigo" et "violet" (38 caractères, 59 octets):

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

Essayez-le en ligne!

nwellnhof
la source
Noms Unicode tout-puissants
Weijun Zhou
Aussi intéressante que soit cette solution, elle ne suit finalement pas la spécification. Pourriez-vous inclure une version conforme dans votre réponse et l'afficher en tant qu'addendum?
Dennis
Il existe également une %12solution pour la noix de coco, mais bien sûr, c'est plus propre.
Weijun Zhou
5

Rubis -n , 62 60 octets

-2 par Asone Tuhid.

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

Essayez-le en ligne!

L'approche Regex semble également prometteuse pour Ruby. Cependant, je suis arrivé à une solution plus courte en utilisant une anticipation et en imprimant directement le match, plutôt que de jouer avec des groupes de capture. La liste des couleurs est en sens inverse car l'anticipation est 1 octet moins chère que l'anticipation.

Kirill L.
la source
très agréable, -2 octets ( /#$_/interpole)
Asone Tuhid
4

rouge , 87 octets

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

Essayez-le en ligne!

Galen Ivanov
la source
4
Aucune idée de ce qu'est cette langue, si ou comment fonctionne votre code, ou s'il est joué du tout, mais ayez un +1 juste pour utiliser une langue appelée "Rouge" pour ce défi.
msh210
@ msh210 Il est étroitement lié à Rebol (Relative Expression-Based Object Language). Le langage représente le code, les données et les métadonnées de la même manière - avec des blocs notés par []. La distribution Red actuelle ne fait que 1,1 Mo et comprend une console / interpeter, ainsi qu'un compilateur qui peut être compatible avec différentes plateformes. Mon code est joué au golf dans le sens où j'ai essayé différentes solutions et supprimé tous les espaces que je peux. La mauvaise chose est que l'espace est le délimiteur presque partout. Toutes les expressions mathématiques doivent avoir des espaces des deux côtés des opérateurs comme a: b + c (a = b + c).
Galen Ivanov
4

05AB1E , 30 octets

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

Essayez-le en ligne!

Explication

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

Excel, 85 octets

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

Utilise des noms en minuscules.

Même approche, avec des lettres majuscules 86 octets:

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

Haskell , 80 71 75 octets

Merci à Laikoni d'avoir raccourci 9 octets!

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

Essayez-le en ligne!


Une autre solution, un peu plus idiomatique, mais je n'ai pas pu la raccourcir:

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

Il doit dériver en Readraison de l'exigence que l'entrée soit une chaîne et au moins Eqou Showafin de tester l'égalité ou d'afficher le résultat.

Cristian Lupascu
la source
71 octets avec span: Essayez-le en ligne!
Laikoni
@Laikoni Wow, c'est cool, merci! J'ai oublié span...
Cristian Lupascu
1
OP a précisé que cela Violetdevrait se terminer Red, vous devez donc ajouter à Rednouveau à la fin de la chaîne.
Laikoni
J'aime beaucoup l'idée du second! Cependant succ Violetne fonctionnera pas pour Enums ne bouclent pas :(
ბიმო
@BMO Exactement. Quand j'ai fait cette version, je n'étais pas au courant de l'exigence de bouclage.
Cristian Lupascu
3

Rétine , 65 58 octets

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

Essayez-le en ligne!

Explication

$
(.[a-z]+)

Nous commençons par ajouter (.[a-z]+)à l'entrée, la transformant ainsi en une expression régulière qui correspond à la couleur d'entrée, immédiatement suivie par exactement une autre couleur (capturant cette dernière).

L$:`RedOrangeYellowGreenBlueIndigoVioletRed
$1

Maintenant, les :échanges de l'entrée de la scène avec son propre regex. Ainsi, le résultat précédent devient l'expression régulière et il est comparé à la liste des couleurs. La correspondance (unique) est remplacée par son premier groupe de capture (c'est-à-dire la couleur suivante du cycle) et renvoyée. La sortie à la fin du programme se produit automatiquement.

Martin Ender
la source
Voici une autre alternative de 65 octets .
Kevin Cruijssen
Oui, j'ai supprimé mon commentaire après avoir vu la solution de Kevin. La configuration \1et le saut vers la cible gaspillent de nombreux octets: :-)
Ton Hospel
@TonHospel a trouvé quelque chose. :)
Martin Ender
1
@KevinCruijssen Merci à vous et Ton de faire pression pour une solution sans délimiteur, j'ai fini par trouver un 58 octets. ;)
Martin Ender
3

Vim, 59 56 53 52 octets

-1 octet grâce à tsh

2IYellow Green Blue Indigo Violet Red Orange <Esc>*wywVp
oktupol
la source
1
2IJaune Vert Bleu Indigo Violet Rouge Orange <Esc> * wywVp
tsh
3

Java (JDK 10) , 77 octets

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

Essayez-le en ligne!

Crédits

Olivier Grégoire
la source
@KevinCruijssen Que de jolies fu regex que vous avez!
Olivier Grégoire
1
Je me suis souvenu que lorsque je cherchais une fois un fractionnement qui conserve les délimiteurs en tant qu'éléments séparés, la réponse que j'ai trouvée contenait également des options pour garder le délimiteur concaténé en tant que partie avant ou arrière, et j'ai pensé que ce serait utile ici. :) Voici cette réponse, y compris le regard en avant / en arrière pour les deux autres options mentionnées.
Kevin Cruijssen
1
Enregistrer un octet:s->"Red Orange Yellow Green Blue Indigo Violet Red".split(s)[1].split(" ")[1]
Okx
2

Noix de coco , 79 octets

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

Essayez-le en ligne!

Laikoni
la source
Je ne connais pas la noix de coco. Mais pensez que vous devriez pouvoir couper 2 octets en utilisant des lettres minuscules, car cela réduit la valeur max modulo:s->"# green indigo yellow # # orange blue # violet red".split()[ord(s[0])%12]
Wernisch
@Wernisch Merci pour la suggestion. Bien que j'attende que OP ait répondu si les lettres minuscules sont acceptables avant la mise à jour.
Laikoni
2

Husk , 28 octets

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

Essayez-le en ligne!

Il y a peut-être de meilleures options pour gérer les arguments, mais c'est la meilleure que j'ai pu trouver

Explication

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
la source
2

Stax , 31 30 29 octets

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

Exécuter et déboguer

Cela utilise l'instruction de traduction en anneau. Il remplace chaque élément d'un tableau par le suivant de "l'anneau du décodeur". Habituellement, il est utilisé pour remplacer les caractères dans une chaîne, mais il peut également être utilisé sur une chaîne entière, s'il est enveloppé dans un tableau singleton.

Voici la représentation ascii non emballée, non golfée et commentée du même programme.

]   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

Exécutez celui-ci

récursif
la source
ok ... j'adore ces langues =)
lolad
3
Échoue pour Violet -> Red
Weijun Zhou
1
@WeijunZhou: Ce cas de test a été ajouté après cette soumission.
récursif
1
@WeijunZhou: J'ai corrigé ce cas de test et rasé un octet.
récursif
1
@WeijunZhou: Cela semble être une incohérence entre les implémentations C # et JS de stax. Je vais ajouter un cas de test et normaliser le comportement pour la prochaine version.
récursif
2

R , 109 93 octets

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

Essayez-le en ligne!

-16 merci à Giuseppe pour l'utilisation des matchconseils

DS_UNI
la source
bienvenue chez PPCG! c'est une belle première réponse. Je pense match(y,x)%%7+1que l'indexation est plus courte que votre ifdéclaration. De plus, le builtin colors()contient beaucoup de noms de couleurs, si vous trouvez les indices :)
Giuseppe
oups, on dirait que colors()ça ne contient pas indigo! Ah bien, toujours, +1!
Giuseppe
Merci! matchc'est mieux ici
DS_UNI
91 octets
Giuseppe
et ouais j'ai d'abord essayé d'utiliser colors(): /
DS_UNI
1

Lot, 97 octets

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

Explication: Le callsur la deuxième ligne a pour effet de remplacer le paramètre dans la commande et de l'évaluer, en le transformant par exemple set s=%s:Red =%en ce qui supprime le préfixe de la chaîne qui inclut le paramètre. La substitution sur la troisième ligne remplace alors tous les espaces par des séparateurs d'instructions et des commentaires. Cela fonctionne car la substitution de chaîne se produit avant l'analyse.

Neil
la source
1

Rubis -n , 75 69 octets

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

Essayez-le en ligne!

Asone Tuhid
la source
1
Pourquoi la i&&chose? Pas besoin de vérifier nil, car "Ignorez les erreurs si ce n'est pas une couleur".
Manatwork
@manatwork Je l'ai compris comme "attraper et ignorer les erreurs" mais d'accord.
Asone Tuhid
1

Julia 0,6 , 76 octets

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

Essayez-le en ligne!

Cela gère le Violet-> Rouge en recyclant la chaîne avec l' ^opérateur de puissance .

Voici une solution légèrement plus longue sans regex:

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

PowerShell , 74 octets

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

Essayez-le en ligne!

Prend la chaîne "Red ... Violet "et la multiplie par deux pour gérer correctement le Violet -> Redcas de test. Nous avons ensuite -splitcette chaîne en entrée $argspour nous donner un tableau de deux chaînes. Nous prenons la deuxième chaîne de celui [1]- ci , puis -splitcelle sur les espaces blancs pour nous donner un tableau de chaînes et prendre la première[0] .

Par exemple, pour la saisie "Yellow", la première étape se traduira par @("Red Orange ", " Green Blue Indigo ... Indigo Violet "). Nous prenons le second de celui-ci, le divisons sur un espace blanc (qui supprime l'espace blanc), ce qui entraîne @("Green", "Blue", ... "Violet"), donc la prise de [0]celui-ci entraîne la chaîne suivante appropriée.

AdmBorkBork
la source
1

Langage de formule IBM / Lotus Notes, 79 74 octets

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

Version précédente pour 79:

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

Prend la saisie d'un champ de texte modifiable appelé a .

Il n'y a pas de TIO pour le langage des formules, voici donc quelques captures d'écran.

entrez la description de l'image ici

entrez la description de l'image ici

entrez la description de l'image ici

ElPedro
la source
1

Kotlin , 73 octets

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

Essayez-le en ligne!

Profitant du fait que de nombreuses couleurs sont à 6 caractères, celles qui ne le sont pas sont préfixées par des espaces pour leur faire 6 caractères. J'espère qu'il est acceptable que certaines des couleurs soient sorties avec des espaces devant elles.
Par exemple, le rouge est " Red", le bleu est" Blue"

Makotosan
la source
1

SmileBASIC, 94 84 octets

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

Gema , 67 caractères

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

Exemple d'exécution:

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 personnages

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

Un ennuyeux. Approche la plus stupide jamais, mais assez courte.

Exemple d'exécution:

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
homme au travail
la source
1

q / kdb + , 59 55 octets

Solution:

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

Exemples:

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"

Explication:

Créez un dictionnaire de couleur => couleur suivante, l'entrée est la clé du dictionnaire:

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

Prime:

C'est 53 octets en K4:

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

sed, 72 octets

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

Essayez-le en ligne

Exemple 1:

Contribution:

Red
Orange
Yellow
Green
Blue
Indigo
Violet

Production:

Orange
Yellow
Green
Blue
Indigo
Violet
Red

Exemple 2:

Contribution:

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

Production:

Violet
Green
Orange
Orange
Indigo
Blue
Yellow
Red
Blue
Blue
Blue
Indigo
Indigo
Red
lucasb
la source
Bienvenue sur le site! Pourriez-vous fournir un lien vers un interprète en ligne, tel que Try It Online! où pouvons-nous tester cette solution?
caird coinheringaahing
@cairdcoinheringaahing: Salut, merci beaucoup pour l'accueil et la recommandation du site! J'ai mis à jour ma réponse avec un lien vers la page où vous pouvez tester le code en ligne.
lucasb