Die nächste Farbe


20

Herausforderung

Betrachten Sie den Regenbogen als sieben Farben, dargestellt durch Zeichenfolgen als Red Orange Yellow Green Blue Indigo Violet.
Ihre Aufgabe ist es, ein Programm zu erstellen, das eine dieser Farben als Ein- und Ausgabe in der Reihenfolge der Regenbogenfarben erhält. Dies schließt Überlappungen einViolet -> Red

Eingang

Eine Zeichenfolge, die eine der Regenbogenfarben enthält.

Ausgabe

Die nächste in der Bestellfarbe des Regenbogens.

Regeln

  • Farbnamen unterscheiden zwischen Groß- und Kleinschreibung. Sie müssen mit dem in diesem Beitrag enthaltenen Fall übereinstimmen.
  • Die Eingabe ist immer gültig. Jedes Verhalten ist für ungültige Eingaben zulässig.
  • Dies ist Codegolf, also gewinnt die kürzeste Anzahl von Bytes!

Beispiel für Ein- und Ausgabe

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

1
"Geben Sie mindestens ein Beispiel für die Eingabe und Ausgabe an. Stellen Sie sicher, dass sie mit Ihrer eigenen Beschreibung der Eingabe übereinstimmen." Beschreibst du deinen eigenen Herausforderungsposten? Oder ist das eine Voraussetzung für Lösungen?
rekursive

6
Sind Farben in Kleinbuchstaben in Ordnung?
Emigna

4
Aber was passiert, wenn Sie grau werden? ;)
AJFaraday

1
@Emigna Aus der Art und Weise, wie OP die Frage formuliert hat, würde ich vermuten, dass Sie wählen können, ob Sie Groß-, Klein- oder Kleinschreibung ignorieren möchten. Provide at least one example input and output. Make sure they match your own description of what the input should look like.
sonrad10

1
Sind Leerzeichen in Ordnung?
Ivzem

Antworten:


2

SOGL V0.12 , 23 Bytes

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

Probieren Sie es hier aus!

Erläuterung:

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

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

Für die Eingabe erstellt "Red"diese Funktion zuerst ein RegExp /Red(.[a-z]*)/, das mit der Zeichenfolge übereinstimmt, 'RedOrangeYellowGreenBlueIndigoVioletRed'und gibt dann das erste Erfassungsergebnis zurück.


Was ist das Ergebnis für die Eingabe "Violett"? Ich denke, Sie sollten den Text in 'RedOrangeYellowGreenBlueIndigoVioletRed'oder etwas ändern
Olivier Grégoire

1
@ OlivierGrégoire Ok, hinzugefügt. Diese Regel wird von OP nach dem Posten der Antwort geändert.
tsh

Ich wusste nicht: Ich habe nur die endgültige Version der Frage gesehen.
Olivier Grégoire

9

Perl 5 -p , 58 57 Bytes

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

Probieren Sie es online!

Jetzt, da die Herausforderung geändert wurde, um zyklisch zu sein, ist die Regex-Lösung

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

ist nicht mehr optimal (wegen des doppelten Red)

Auch 57 Bytes:

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

Probieren Sie es online!


7

Python , 79 Bytes

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

Probieren Sie es online!

Griffe Violet -> Red. Die gewünschte Funktion wird anonym in der zweiten Zeile angegeben.


80 Bytes

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

Probieren Sie es online!


7

Perl 6 , 56 Bytes

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

Probieren Sie es online!

Nutzt die Tatsache aus, dass Bits 2-4 der ASCII-Codes des ersten Buchstabens jeder Farbe zufällig auf 0-6 abgebildet werden.

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

Hier ist eine nette, nicht konkurrierende Lösung, die "lila" anstelle von "indigo" und "violett" verwendet (38 Zeichen, 59 Bytes):

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

Probieren Sie es online!


Allmächtige Unicode-Namen
Weijun Zhou

So interessant diese Lösung auch ist, sie entspricht letztendlich nicht der Spezifikation. Könnten Sie Ihrer Antwort eine kompatible Version hinzufügen und diese als Nachtrag hinzufügen?
Dennis

Es gibt auch eine %12Lösung für Kokosnuss, aber das ist natürlich ordentlicher.
Weijun Zhou

5

Rubin -n , 62 60 Bytes

-2 von Asone Tuhid.

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

Probieren Sie es online!

Der Regex-Ansatz sieht auch für Ruby vielversprechend aus. Ich bin jedoch zu einer kürzeren Lösung gekommen, indem ich einen Lookahead verwendet und das Match direkt gedruckt habe, anstatt mit Erfassungsgruppen zu spielen. Die Liste der Farben ist in umgekehrter Richtung, da lookahead 1 Byte billiger ist als lookbehind.


sehr schön, -2 Bytes ( /#$_/interpoliert)
Asone Tuhid

4

Rot , 87 Bytes

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

Probieren Sie es online!


4
Keine Ahnung, was diese Sprache ist, ob oder wie Ihr Code funktioniert oder ob überhaupt Golf gespielt wird, aber haben Sie eine +1 nur für die Verwendung einer Sprache namens "Rot" für diese Herausforderung.
msh210

@ msh210 Es ist eng verwandt mit Rebol (Relative Expression-Based Object Language). Die Sprache repräsentiert Code, Daten und Metadaten auf dieselbe Weise - mit Blöcken, die mit [] gekennzeichnet sind. Die aktuelle Red-Distribution ist nur 1,1 MB groß und enthält eine Konsole / einen Interpeter sowie einen Compiler, der Cross-Compliance für verschiedene Plattformen ermöglicht. Mein Code spielt in dem Sinne Golf, dass ich verschiedene Lösungen ausprobiert und alle verfügbaren Leerzeichen entfernt habe. Das Schlimme ist, dass der Raum fast überall der Begrenzer ist. Alle mathematischen Ausdrücke müssen auf beiden Seiten der Operatoren Leerzeichen enthalten, z. B. a: b + c (a = b + c).
Galen Ivanov

4

05AB1E , 30 Bytes

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

Probieren Sie es online!

Erläuterung

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

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

Verwendet Kleinbuchstaben.

Gleicher Ansatz mit 86 Bytes in Großbuchstaben:

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

3

Haskell , 80 71 75 Bytes

Danke an Laikoni für die Kürzung von 9 Bytes!

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

Probieren Sie es online!


Eine andere Lösung, etwas idiomatischer, aber ich könnte es nicht kürzer machen:

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

Es muss abgeleitet werden, Readweil die Eingabe eine Zeichenfolge ist und mindestens Eqoder Showum entweder auf Gleichheit zu testen oder das Ergebnis anzuzeigen.


71 Bytes mit span: Online ausprobieren!
Laikoni

@Laikoni Wow, das ist cool, danke! Ich habe vergessen span...
Cristian Lupascu

1
OP hat klargestellt, dass es Violetsich um einen Umbruch handeln soll Red, sodass Sie Reddas Ende der Zeichenfolge erneut hinzufügen müssen .
Laikoni

Die Idee des zweiten gefällt mir sehr gut! Allerdings succ Violetfunktioniert nicht für Enums nicht
umbrechen

@ BMO Genau. Als ich diese Version erstellte, war mir die Wrap-Around-Anforderung nicht bewusst.
Cristian Lupascu

3

Retina , 65 58 Bytes

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

Probieren Sie es online!

Erläuterung

$
(.[a-z]+)

Wir beginnen mit dem Anhängen (.[a-z]+)an die Eingabe und verwandeln sie in eine Regex, die der Eingabefarbe entspricht, unmittelbar gefolgt von genau einer weiteren Farbe (Erfassung der letzteren).

L$:`RedOrangeYellowGreenBlueIndigoVioletRed
$1

Jetzt wird der :Bühneneingang durch einen eigenen regulären Ausdruck ersetzt. Das vorherige Ergebnis wird zum regulären Ausdruck und mit der Liste der Farben abgeglichen. Die (einzelne) Übereinstimmung wird durch die erste Erfassungsgruppe (dh die nächste Farbe im Zyklus) ersetzt und zurückgegeben. Die Ausgabe am Programmende erfolgt automatisch.



Ja, ich habe meinen Kommentar entfernt, nachdem ich Kevins Lösung gesehen hatte. Sich aufstellen \1und zum Ziel springen zu müssen, verschwendet viele Bytes: :-)
Ton Hospel

@TonHospel hat etwas gefunden. :)
Martin Ender

1
@KevinCruijssen Dank der Bemühungen von Ihnen und Ton, eine Lösung ohne Trennzeichen zu finden, fand ich einen 58-Byte-Wert. ;)
Martin Ender

3

Vim, 59 56 53 52 Bytes

-1 Byte dank tsh

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

1
2Gelb Grün Blau Indigo Violett Rot Orange <Esc> * wywVp
tsh

3

Java (JDK 10) , 77 Byte

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

Probieren Sie es online!

Credits



@ KevinCruijssen Das einige nette Regex Fu, die Sie haben!
Olivier Grégoire

1
Ich erinnerte mich, als ich einmal nach einer Aufteilung suchte, die Trennzeichen als getrennte Elemente enthält, dass die Antwort, die ich fand, auch Optionen enthielt, um das Trennzeichen als führenden oder nachfolgenden Teil zu kennzeichnen, und dachte, dass dies hier nützlich wäre. :) Hier ist diese Antwort einschließlich des Vorausschauens / Zurückschauens für die anderen beiden genannten Optionen.
Kevin Cruijssen

1
Speichern Sie ein Byte:s->"Red Orange Yellow Green Blue Indigo Violet Red".split(s)[1].split(" ")[1]
Okx

2

Kokosnuss , 79 Bytes

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

Probieren Sie es online!


Ich kenne Coconut nicht. Aber denken Sie, Sie sollten in der Lage sein, 2 Bytes mit Kleinbuchstaben zu schneiden, da dies den maximalen Modulo-Wert reduziert:s->"# green indigo yellow # # orange blue # violet red".split()[ord(s[0])%12]
Wernisch

@Wernisch Danke für den Vorschlag. Ich werde allerdings warten, bis OP geantwortet hat, ob Kleinbuchstaben zulässig sind, bevor ich aktualisiere.
Laikoni

2

Schale , 28 Bytes

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

Probieren Sie es online!

Vielleicht gibt es bessere Optionen für die Verwaltung der Argumente, aber dies ist das Beste, was ich finden konnte

Erläuterung

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 Bytes

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

Führen Sie es aus und debuggen Sie es

Dies verwendet den Ringübersetzungsbefehl. Es ersetzt jedes Element in einem Array durch das folgende Element aus dem "Decoder-Ring". Normalerweise wird die Zeichenersetzung in einer Zeichenfolge verwendet, sie kann jedoch auch für eine gesamte Zeichenfolge verwendet werden, wenn sie in ein Singleton-Array eingeschlossen ist.

Hier ist die entpackte, ungolfierte, kommentierte ASCII-Darstellung desselben Programms.

]   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

Führen Sie dieses aus


ok ... ich liebe diese Sprachen =)
lolad

3
Fails for Violet -> Red
Weijun Zhou

1
@WeijunZhou: Dieser Testfall wurde nach dieser Einreichung hinzugefügt .
rekursiven

1
@WeijunZhou: Ich habe diesen Testfall behoben und ein Byte rasiert.
rekursive

1
@ WeijunZhou: Es scheint eine Inkonsistenz zwischen den C # - und JS-Implementierungen von stax zu sein. Ich werde einen Testfall hinzufügen und das Verhalten für die nächste Version normalisieren.
rekursiven


2

R , 109 93 Bytes

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

Probieren Sie es online!

-16 Dank an Giuseppe für die Verwendung von matchRatschlägen


Willkommen bei PPCG! Das ist eine schöne erste Antwort. Ich denke, match(y,x)%%7+1ist kürzer für die Indizierung als Ihre ifAussage. Darüber hinaus colors()enthält das Builtin viele Farbnamen, wenn Sie die Indizes finden :)
Giuseppe

oops, sieht aus wie colors()nicht enthalten indigo! Na ja, trotzdem +1!
Giuseppe

Vielen Dank! matchist besser hier
DS_UNI


und ja, ich habe zuerst versucht zu verwenden 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 %

Erläuterung: In callder zweiten Zeile wird der Parameter durch den Befehl ersetzt und ausgewertet. set s=%s:Red =%Dadurch wird beispielsweise das Präfix der Zeichenfolge gelöscht, die den Parameter enthält. Die Ersetzung in der dritten Zeile ersetzt dann alle Leerzeichen durch Anweisungstrennzeichen und Kommentare. Dies funktioniert, weil die Zeichenfolge vor dem Parsen ersetzt wird.


1

Ruby -n , 75 69 Bytes

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

Probieren Sie es online!


1
Warum das i&&Ding? Keine Notwendigkeit zu überprüfen nil, wie "Ignorieren Sie Fehler, wenn dies keine Farbe ist."
Manatwork

@manatwork Ich verstand es als "Fehler abfangen und ignorieren", aber in Ordnung.
Asone Tuhid

1

Julia 0,6 , 76 Bytes

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

Probieren Sie es online!

Dies behandelt das Violett-> Rot, indem die Saite mit Strom versorgt wird ^ Netzbetreiber .

Hier ist eine etwas längere Lösung ohne reguläre Ausdrücke:

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

1

PowerShell , 74 Byte

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

Probieren Sie es online!

Nimmt den String "Red ... Violet "und multipliziert ihn mit zwei, um den Violet -> RedTestfall richtig zu behandeln . Wir haben dann -splitdiese Zeichenfolge bei der Eingabe$args , um uns ein Array von zwei Zeichenfolgen zu geben. Wir nehmen die zweite Zeichenkette [1], dann -splitdie Whitespace- Zeichenkette , um uns eine Reihe von Zeichenketten zu geben und die erste zu nehmen[0] .

Bei der Eingabe "Yellow"führt der erste Schritt beispielsweise zu @("Red Orange ", " Green Blue Indigo ... Indigo Violet "). Wir nehmen die zweite davon, teilen sie in Leerzeichen auf (wodurch das Leerzeichen entfernt wird), was dazu führt @("Green", "Blue", ... "Violet"), dass die [0]nächste richtige Zeichenfolge entsteht.


1

IBM / Lotus Notes Formula Language, 79 74 Byte

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

Vorgängerversion für 79:

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

Übernimmt Eingaben aus einem bearbeitbaren Textfeld namens a.

Es gibt kein TIO für die Formelsprache. Hier sind ein paar Screenshots.

Bildbeschreibung hier eingeben

Bildbeschreibung hier eingeben

Bildbeschreibung hier eingeben



1

Kotlin , 73 Bytes

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

Probieren Sie es online!

Unter Ausnutzung der Tatsache, dass viele Farben aus 6 Zeichen bestehen, wird den Farben, denen keine Leerzeichen vorangestellt sind, eine Länge von 6 Zeichen vorangestellt. Es ist hoffentlich akzeptabel, dass einige der Farben mit Leerzeichen vor ihnen ausgegeben werden.
zB ist Rot, ist " Red"Blau" Blue"


1

SmileBASIC, 94 84 Bytes

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

1

Gema , 67 Zeichen

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

Probelauf:

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 Zeichen

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

Langweilig. Dümmster Ansatz aller Zeiten, aber ziemlich kurz.

Probelauf:

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

Lösung:

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

Beispiele:

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"

Erläuterung:

Erstellen Sie ein Wörterbuch der Farbe => nächste Farbe, die Eingabe ist der Schlüssel zum Wörterbuch:

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

Es ist 53 Bytes in K4:

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


1

sed, 72 bytes

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

Probieren Sie es online

Beispiel 1:

Eingang:

Red
Orange
Yellow
Green
Blue
Indigo
Violet

Ausgabe:

Orange
Yellow
Green
Blue
Indigo
Violet
Red

Beispiel 2:

Eingang:

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

Ausgabe:

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

Willkommen auf der Seite! Können Sie einen Link zu einem Online-Dolmetscher wie Try It Online! Wo können wir diese Lösung testen?
Caird Coinheringaahing

@cairdcoinheringaahing: Hallo, vielen Dank für die Begrüßung und die Website-Empfehlung! Ich habe meine Antwort mit einem Link zu der Seite aktualisiert, auf der Sie den Code online testen können.
Lucasb
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.