Il prossimo colore


20

Sfida

Considera l'arcobaleno come sette colori, rappresentato da stringhe come Red Orange Yellow Green Blue Indigo Violet.
Il tuo compito è quello di creare un programma che riceva uno di questi colori come input e output nell'ordine del colore arcobaleno. Ciò include la sovrapposizioneViolet -> Red

Ingresso

Una stringa contenente uno dei colori dell'arcobaleno.

Produzione

Il prossimo in ordine di colore dell'arcobaleno.

Regole

  • I nomi dei colori fanno distinzione tra maiuscole e minuscole. Devono corrispondere al caso incluso in questo post.
  • L'input sarà sempre valido. È consentito qualsiasi comportamento per input non valido.
  • Questo è il golf del codice, quindi vince il minor numero di byte!

Esempio di input e output

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

1
"Fornisci almeno un esempio di input e output. Assicurati che corrispondano alla tua descrizione di come dovrebbe essere l'input." Stai descrivendo il tuo post sfida? O è un requisito per le soluzioni?
ricorsivo il

6
I colori delle lettere minuscole sono a posto?
Emigna,

4
Ma cosa succede quando raggiungi il "grigio"? ;)
AJFaraday

1
@Emigna Dal modo in cui OP ha formulato la domanda, immagino che tu possa scegliere se fare maiuscole, minuscole o insensibili alle maiuscole. Provide at least one example input and output. Make sure they match your own description of what the input should look like.
sonrad10

1
Gli spazi finali sono a posto?
Ivzem,

Risposte:


2

SOGL V0.12 , 23 byte

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

Provalo qui!

Spiegazione:

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

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

Per l'input "Red", questa funzione crea innanzitutto un RegExp /Red(.[a-z]*)/in modo che corrisponda alla stringa 'RedOrangeYellowGreenBlueIndigoVioletRed'e quindi restituisca il primo risultato di acquisizione.


Qual è il risultato per l'ingresso "Violet"? Immagino che dovresti cambiare il testo 'RedOrangeYellowGreenBlueIndigoVioletRed'o qualcosa del genere
Olivier Grégoire il

1
@ OlivierGrégoire Ok, aggiunto. Questa regola viene modificata dall'OP dopo la risposta postata.
TSH

Non lo sapevo: ho visto solo la versione finale della domanda.
Olivier Grégoire,

9

Perl 5 -p , 58 57 byte

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

Provalo online!

Ora che la sfida è stata cambiata per diventare ciclica la soluzione regex

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

non è più ottimale (a causa del doppio Red)

Anche 57 byte:

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

Provalo online!


7

Python , 79 byte

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

Provalo online!

Maniglie Violet -> Red. La funzione desiderata viene data in modo anonimo nella seconda riga.


80 byte

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

Provalo online!


7

Perl 6 , 56 byte

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

Provalo online!

Sfrutta il fatto che i bit 2-4 dei codici ASCII della prima lettera di ciascun colore corrispondono a 0-6.

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

Ecco una bella soluzione non competitiva che utilizza "viola" invece di "indaco" e "viola" (38 caratteri, 59 byte):

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

Provalo online!


Nomi onnipotenti Unicode
Weijun Zhou

Per quanto interessante sia questa soluzione, alla fine non segue le specifiche. Potresti includere una versione conforme nella tua risposta e pubblicarla come addendum?
Dennis,

C'è anche una %12soluzione per Coconut, ma ovviamente questa è più ordinata.
Weijun Zhou

5

Ruby -n , 62 60 byte

-2 di Asone Tuhid.

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

Provalo online!

L'approccio Regex sembra promettente anche per Ruby. Tuttavia, sono arrivato a una soluzione più breve usando un lookahead e stampando direttamente la partita, piuttosto che giocare con i gruppi di acquisizione. L'elenco dei colori è nella direzione opposta poiché lookahead costa 1 byte in meno rispetto a lookbehind.


molto bello, -2 byte ( /#$_/interpolati)
Asone Tuhid,

4

Rosso , 87 byte

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

Provalo online!


4
Non hai idea di cosa sia questa lingua, se o come funzioni il tuo codice, o se sia stata giocata a golf, ma hai un +1 solo per usare una lingua chiamata "Rosso" per questa sfida.
msh210

@ msh210 È strettamente correlato a Rebol (linguaggio degli oggetti basato sulle espressioni relative). La lingua rappresenta codice, dati e metadati allo stesso modo, con blocchi indicati da []. L'attuale distribuzione Red è di soli 1,1 MB e include una console / interpeter, nonché un compilatore che può eseguire il cross-compie con piattaforme diverse. Il mio codice è golfato nel senso che ho provato diverse soluzioni e rimosso tutti gli spazi che posso. La cosa brutta è che lo spazio è il delimitatore quasi ovunque. Tutte le espressioni matematiche devono avere spazi su entrambi i lati degli operatori come a: b + c (a = b + c).
Galen Ivanov,

4

05AB1E , 30 byte

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

Provalo online!

Spiegazione

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

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

Utilizza nomi minuscoli.

Stesso approccio, con lettere maiuscole 86 byte:

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

3

Haskell , 80 71 75 byte

Grazie a Laikoni per accorciare 9 byte!

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

Provalo online!


Un'altra soluzione, leggermente più idiomatica, ma non potrei accorciarla:

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

Deve derivare a Readcausa del requisito che l'input sia una stringa e almeno Eqo Showper verificare l'uguaglianza o mostrare il risultato.


71 byte con span: provalo online!
Laikoni,

@Laikoni Wow, è fantastico, grazie! Mi sono dimenticato di span...
Cristian Lupascu,

1
OP ha chiarito che Violetdovrebbe essere completato Red, quindi è necessario aggiungere Rednuovamente alla fine della stringa.
Laikoni,

Mi piace molto l'idea della seconda! Tuttavia succ Violet, non funzionerà per i Enums non concludere :(
ბიმო

@BMO Esatto. Quando ho realizzato quella versione non ero a conoscenza del requisito di avvolgimento.
Cristian Lupascu,

3

Retina , 65 58 byte

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

Provalo online!

Spiegazione

$
(.[a-z]+)

Iniziamo aggiungendo (.[a-z]+)l'input, trasformandolo in una regex che corrisponde al colore di input, immediatamente seguito da esattamente un altro colore (catturando quest'ultimo).

L$:`RedOrangeYellowGreenBlueIndigoVioletRed
$1

Ora :scambia l'ingresso dello stage con la sua regex. Quindi il risultato precedente diventa regex ed è abbinato all'elenco dei colori. La (singola) partita viene sostituita con il suo primo gruppo di acquisizione (ovvero il colore successivo nel ciclo) e restituita. L'output alla fine del programma avviene automaticamente.



Sì, ho rimosso il mio commento dopo aver visto la soluzione di Kevin. Dover schierarsi \1e saltare verso l'obiettivo spreca molti byte: :-)
Ton Hospel

@TonHospel ha trovato qualcosa. :)
Martin Ender,

1
@KevinCruijssen Grazie a te e Ton che spingono per una soluzione senza delimitatori, ho finito per trovare un 58-byter. ;)
Martin Ender,

3

Vim, 59 56 53 52 byte

-1 byte grazie a tsh

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

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

3

Java (JDK 10) , 77 byte

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

Provalo online!

Titoli di coda



@KevinCruijssen Che bel regex fu che hai!
Olivier Grégoire,

1
Mi sono ricordato quando stavo cercando una divisione che mantiene i delimitatori come elementi separati che la risposta che ho trovato conteneva anche opzioni per mantenere il delimitatore come parte iniziale o finale, e ho pensato che sarebbe stato utile qui. :) Ecco la risposta che include il look-ahead / look-behind per le altre due opzioni menzionate.
Kevin Cruijssen,

1
Salva un byte:s->"Red Orange Yellow Green Blue Indigo Violet Red".split(s)[1].split(" ")[1]
Okx

2

Cocco , 79 byte

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

Provalo online!


Non conosco il cocco. Ma pensa che dovresti essere in grado di tagliare 2 byte usando lettere minuscole, in quanto ciò riduce il valore massimo del modulo:s->"# green indigo yellow # # orange blue # violet red".split()[ord(s[0])%12]
Wernisch

@Wernisch Grazie per il suggerimento. Aspetterò fino a quando OP avrà risposto se le lettere minuscole sono accettabili prima dell'aggiornamento.
Laikoni,

2

Buccia , 28 byte

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

Provalo online!

Forse ci sono opzioni migliori per gestire gli argomenti, ma questa è la migliore che ho trovato

Spiegazione

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 byte

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

Esegui ed esegui il debug

Questo utilizza l'istruzione di traduzione suoneria. Sostituisce ogni elemento in un array con il seguente dal "decoder ring". Di solito, viene utilizzato per eseguire la sostituzione di caratteri in una stringa, ma può essere utilizzato anche su un'intera stringa, se è racchiuso in una matrice singleton.

Ecco la rappresentazione ascii scompattata, non golfata e commentata dello stesso programma.

]   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

Esegui questo


ok ... Adoro queste lingue =)
lolad

3
Non riesce per Violet -> Rosso
Weijun Zhou

1
@WeijunZhou: quel caso di prova è stato aggiunto dopo questa presentazione.
ricorsivo il

1
@WeijunZhou: ho risolto quel caso di test e ho rasato un byte.
ricorsivo il

1
@WeijunZhou: sembra essere un'incoerenza tra le implementazioni C # e JS di Stax. Aggiungerò un caso di prova e normalizzerò il comportamento per la prossima versione.
ricorsivo il


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

PHP, 92 bytes

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

Try it online!


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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.