Następny kolor

20

Wyzwanie

Rozważ tęczę jako siedem kolorów, reprezentowanych przez łańcuchy jako Red Orange Yellow Green Blue Indigo Violet.
Twoim zadaniem jest stworzenie programu, który odbiera jeden z tych kolorów jako dane wejściowe i wyjściowe w kolejności kolorów tęczy. Obejmuje to nakładanie sięViolet -> Red

Wejście

Sznurek zawierający jeden z kolorów tęczy.

Wynik

Kolejny w kolejności kolor tęczy.

Zasady

  • W nazwach kolorów rozróżniana jest wielkość liter. Muszą pasować do przypadku zawartego w tym poście.
  • Dane wejściowe zawsze będą prawidłowe. Każde zachowanie jest dozwolone w przypadku nieprawidłowych danych wejściowych.
  • To jest golf golfowy, więc wygrywa najmniejsza ilość bajtów!

Przykład wejścia i wyjścia

Input -> Output
Red -> Orange
Orange -> Yellow
Yellow -> Green
Green -> Blue
Blue -> Indigo
Indigo -> Violet
Violet -> Red
lolad
źródło
1
„Podaj co najmniej jedno przykładowe dane wejściowe i wyjściowe. Upewnij się, że odpowiadają Twojemu opisowi, jak powinno wyglądać dane wejściowe.” Opisujesz swój własny post z wyzwaniem? Czy jest to wymóg dla rozwiązań?
rekurencyjny
6
Czy kolory małych liter są w porządku?
Emigna
4
Ale co się stanie, gdy osiągniesz „szary”? ;)
AJFaraday
1
@Emigna Ze sposobu, w jaki OP sformułował pytanie, zgaduję, że możesz wybrać, czy chcesz robić wielkie, małe litery czy nie rozróżniać wielkich i małych liter. Provide at least one example input and output. Make sure they match your own description of what the input should look like.
sonrad10
1
Czy spacje końcowe są w porządku?
ivzem

Odpowiedzi:

2

SOGL V0.12 , 23 bajty

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

Wypróbuj tutaj!

Wyjaśnienie:

...‘θ⁽,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
źródło
22

JavaScript, 68 bajtów

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

Dla danych wejściowych "Red"ta funkcja najpierw konstruuje RegExp, /Red(.[a-z]*)/aby dopasować ciąg, 'RedOrangeYellowGreenBlueIndigoVioletRed'a następnie zwraca wynik pierwszego przechwytywania.

tsh
źródło
Jaki jest wynik dla wejścia „Violet”? Myślę, że powinieneś zmienić tekst na 'RedOrangeYellowGreenBlueIndigoVioletRed'czy coś
Olivier Grégoire
1
@ OlivierGrégoire Ok, dodane. Ta reguła jest zmieniana przez OP po opublikowaniu odpowiedzi.
tsh
Nie wiedziałem: widziałem tylko ostateczną wersję pytania.
Olivier Grégoire
9

Perl 5 -p , 58 57 bajtów

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

Wypróbuj online!

Teraz, gdy wyzwanie zostało zmienione na cykliczne, rozwiązanie wyrażeń regularnych

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

nie jest już optymalny (ze względu na podwójne Red)

Również 57 bajtów:

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

Wypróbuj online!

Ton Hospel
źródło
7

Python , 79 bajtów

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

Wypróbuj online!

Uchwyty Violet -> Red. Pożądana funkcja jest podana anonimowo w drugim wierszu.


80 bajtów

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

Wypróbuj online!

xnor
źródło
7

Perl 6 , 56 bajtów

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

Wypróbuj online!

Wykorzystuje fakt, że bity 2-4 kodów ASCII pierwszej litery każdego koloru są mapowane na 0-6.

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

Oto fajne, niekonkurujące rozwiązanie, które używa „fioletowego” zamiast „indygo” i „fioletowego” (38 znaków, 59 bajtów):

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

Wypróbuj online!

nwellnhof
źródło
Wszechmocne nazwy Unicode
Weijun Zhou
Choć to rozwiązanie jest interesujące, ostatecznie nie odpowiada specyfikacji. Czy możesz podać w odpowiedzi zgodną wersję i opublikować ją jako załącznik?
Dennis
Istnieje również %12rozwiązanie dla Coconut, ale oczywiście jest to fajniejsze.
Weijun Zhou
5

Rubin -n , 62 60 bajtów

-2 autorstwa Asone Tuhid.

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

Wypróbuj online!

Podejście Regex również wygląda obiecująco dla Ruby. Doszedłem jednak do krótszego rozwiązania, korzystając z perspektywy i bezpośrednio drukując mecz, zamiast grać z grupami przechwytywania. Lista kolorów jest odwrócona, ponieważ lookahead jest o 1 bajt tańszy niż lookbeind.

Kirill L.
źródło
bardzo ładne, -2 bajty ( /#$_/interpoluje)
Asone Tuhid
4

Czerwony , 87 bajtów

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

Wypróbuj online!

Galen Iwanow
źródło
4
Nie mam pojęcia, czym jest ten język, czy lub jak działa Twój kod, czy w ogóle gra w golfa, ale masz +1 za użycie języka o nazwie „Czerwony” do tego wyzwania.
msh210
@ msh210 Jest ściśle związany z Rebol (język obiektowy oparty na wyrażeniach względnych). Język reprezentuje kod, dane i metadane w ten sam sposób - z blokami oznaczonymi przez []. Obecna dystrybucja Red ma tylko 1,1 MB i zawiera konsolę / interpeter, a także kompilator, który może być zgodny z różnymi platformami. Mój kod jest golfowy, ponieważ próbowałem różnych rozwiązań i usunąłem wszystkie spacje, jakie mogłem. Złe jest to, że przestrzeń jest ogranicznikiem prawie wszędzie. Wszystkie wyrażenia matematyczne muszą mieć spacje po obu stronach operatorów, takie jak a: b + c (a = b + c).
Galen Iwanow
4

05AB1E , 30 bajtów

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

Wypróbuj online!

Wyjaśnienie

“†¾›ÈŠÛˆ¨‡—ëß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
źródło
3

Excel, 85 bajtów

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

Używa małych liter.

To samo podejście, z wielkimi literami 86 bajtów:

=CHOOSE(MOD(CODE(A1),12),"Violet","Red",,,"Green","Indigo","Yellow",,,"Orange","Blue")
Wernisch
źródło
3

Haskell , 80 71 75 bajtów

Dzięki Laikoni za skrócenie 9 bajtów!

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

Wypróbuj online!


Inne rozwiązanie, nieco bardziej idiomatyczne, ale nie mogłem go skrócić:

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

Musi wyprowadzić się z Readpowodu wymogu, że dane wejściowe są łańcuchem i przynajmniej Eqalbo Showw celu przetestowania równości lub przedstawienia wyniku.

Cristian Lupascu
źródło
71 bajtów z span: Wypróbuj online!
Laikoni
@Laikoni Wow, to super, dzięki! Zapomniałem o span...
Cristian Lupascu
1
OP wyjaśnił, że Violetpowinno się to owijać Red, więc musisz dodać Redponownie na końcu łańcucha.
Laikoni
Bardzo podoba mi się pomysł drugiego! Jednak succ Violetnie będzie działać dla Enums nie
zawijaj
@BMO Dokładnie. Kiedy stworzyłem tę wersję, nie byłem świadomy wymogu zawijania.
Cristian Lupascu
3

Siatkówka , 65 58 bajtów

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

Wypróbuj online!

Wyjaśnienie

$
(.[a-z]+)

Zaczynamy od dołączenia (.[a-z]+)do danych wejściowych, zamieniając je w regex, który pasuje do koloru wejściowego, po czym następuje dokładnie jeden dodatkowy kolor (przechwytywanie tego drugiego).

L$:`RedOrangeYellowGreenBlueIndigoVioletRed
$1

Teraz :zamienia dane wejściowe stołu montażowego na własne wyrażenie regularne. Tak więc poprzedni wynik staje się wyrażeniem regularnym i jest dopasowywany do listy kolorów. Dopasowanie (pojedyncze) zostanie zastąpione pierwszą grupą przechwytującą (tj. Następnym kolorem w cyklu) i zwrócone. Wyjście na końcu programu odbywa się automatycznie.

Martin Ender
źródło
Oto kolejna 65-bajtowa alternatywa .
Kevin Cruijssen
Tak, usunąłem swój komentarz po obejrzeniu rozwiązania Kevina. \1
Konieczność
@TonHospel znalazł coś. :)
Martin Ender
1
@KevinCruijssen Dzięki twojemu i Tonowi naciskowi na rozwiązanie bez ograniczników, znalazłem 58-bajter. ;)
Martin Ender
3

Vim, 59 56 53 52 bajtów

-1 bajt dzięki tsh

2IYellow Green Blue Indigo Violet Red Orange <Esc>*wywVp
oktupol
źródło
1
2Żółty Zielony Niebieski Indygo Fioletowy Czerwony Pomarańczowy <Esc> * wywVp
tsh
3

Java (JDK 10) , 77 bajtów

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

Wypróbuj online!

Kredyty

Olivier Grégoire
źródło
@KevinCruijssen To jakieś fajne wyrażenie regularne, które masz!
Olivier Grégoire
1
Przypomniałem sobie, jak kiedyś szukałem podziału, który zachowuje separatory jako oddzielne elementy, że odpowiedź, którą znalazłem, zawierała również opcje zachowania ogranicznika w postaci części początkowej lub końcowej i pomyślałem, że przydałby się tutaj. :) Oto ta odpowiedź, w tym przewidywanie / oczekiwanie na pozostałe dwie wymienione opcje.
Kevin Cruijssen
1
Zapisz bajt:s->"Red Orange Yellow Green Blue Indigo Violet Red".split(s)[1].split(" ")[1]
Okx
2

Kokos , 79 bajtów

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

Wypróbuj online!

Laikoni
źródło
Nie znam kokosa. Ale pomyśl, że powinieneś być w stanie wyciąć 2 bajty za pomocą małych liter, ponieważ zmniejsza to maksymalną wartość modulo:s->"# green indigo yellow # # orange blue # violet red".split()[ord(s[0])%12]
Wernisch
@Wernisch Dzięki za sugestię. Chociaż poczekam, aż OP odpowie, czy małe litery są dopuszczalne przed aktualizacją.
Laikoni
2

Łuska , 28 bajtów

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

Wypróbuj online!

Być może istnieją lepsze opcje zarządzania argumentami, ale to najlepsze, co mogłem znaleźć

Wyjaśnienie

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)
Lew
źródło
2

Stax , 31 30 29 bajtów

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

Uruchom i debuguj

To używa instrukcji tłumaczenia pierścienia. Zastępuje każdy element w tablicy następującym po nim z „pierścienia dekodera”. Zwykle służy do zastępowania znaków w ciągu, ale można go również stosować do całego ciągu, jeśli jest zawinięty w tablicę singletonów.

Oto rozpakowana, nieprzygotowana, skomentowana reprezentacja ascii tego samego programu.

]   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

Uruchom ten

rekurencyjny
źródło
ok ... Uwielbiam te języki =)
lolad
3
Fails for Violet -> Red
Weijun Zhou
1
@WeijunZhou: Ten przypadek testowy został dodany po tym przesłaniu.
rekurencyjny
1
@WeijunZhou: Naprawiłem ten testowy przypadek i ogoliłem bajt.
rekurencyjny
1
@WeijunZhou: Wydaje się, że jest to niespójność między implementacjami stax w języku C # i JS. Dodam przypadek testowy i znormalizuję zachowanie do następnego wydania.
rekurencyjny
2

R , 109 93 bajtów

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

Wypróbuj online!

-16 podziękowania dla Giuseppe za skorzystanie z matchporady

DS_UNI
źródło
Witamy w PPCG! to ładna pierwsza odpowiedź. Wydaje mi się, że match(y,x)%%7+1indeksowanie jest krótsze niż twoje ifoświadczenie. Dodatkowo wbudowane colors()zawiera wiele nazw kolorów, jeśli znajdziesz indeksy :)
Giuseppe
Ups, wygląda na to, colors()że nie zawiera indigo! No cóż, nadal +1!
Giuseppe
dzięki! matchjest lepiej tutaj
DS_UNI
91 bajtów
Giuseppe
i tak, najpierw próbowałem użyć colors(): /
DS_UNI
1

Partia, 97 bajtów

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

Objaśnienie: W calldrugim wierszu efekt set s=%s:Red =%polega na podstawieniu parametru do polecenia i jego ocenie, zamieniając go na np. , Który usuwa przedrostek ciągu zawierającego parametr. Podstawienie w trzecim wierszu zastępuje następnie wszystkie spacje separatorami instrukcji i komentarzami. Działa to, ponieważ podstawianie ciągu następuje przed analizą.

Neil
źródło
1

Rubinowy -n , 75 69 bajtów

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

Wypróbuj online!

Asone Tuhid
źródło
1
Skąd ta i&&rzecz? Nie trzeba tego sprawdzać nil, ponieważ „Ignoruj ​​błędy, jeśli nie jest to kolor”.
manatwork
@manatwork Zrozumiałem to jako „łap i ignoruj ​​błędy”, ale w porządku.
Asone Tuhid
1

Julia 0.6 , 76 bajtów

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

Wypróbuj online!

To obsługuje Violet-> Red poprzez recykling sznurka z ^operatorem mocy .

Oto nieco dłuższe rozwiązanie bez wyrażeń regularnych:

g(s,l=split("Red Orange Yellow Green Blue Indigo Violet"," "))=l[(findin(l,[s])[1])%7+1]
niczky12
źródło
1

PowerShell , 74 bajty

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

Wypróbuj online!

Wyciąga ciąg "Red ... Violet "i mnoży go przez dwa, aby poprawnie obsłużyć Violet -> Redprzypadek testowy. Następnie -splitten ciąg wejściowy $argsdaje nam tablicę dwóch ciągów. Bierzemy drugi jego ciąg [1], a następnie -splitten biały znak, aby dać nam tablicę ciągów i wziąć pierwszy[0] .

Na przykład w przypadku wprowadzania "Yellow"pierwszy krok spowoduje @("Red Orange ", " Green Blue Indigo ... Indigo Violet "). Bierzemy drugi z nich, dzielimy go na białą spację (która usuwa białą spację), w rezultacie @("Green", "Blue", ... "Violet"), więc biorąc [0]jedną z nich daje właściwy następny ciąg.

AdmBorkBork
źródło
1

Język formuły IBM / Lotus Notes, 79 74 bajty

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

Poprzednia wersja 79:

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

Pobiera dane wejściowe z edytowalnego pola tekstowego o nazwie a.

Nie ma TIO dla języka formuł, więc oto kilka zrzutów ekranu.

wprowadź opis zdjęcia tutaj

wprowadź opis zdjęcia tutaj

wprowadź opis zdjęcia tutaj

ElPedro
źródło
1

PHP, 92 bajty

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

Wypróbuj online!

Dave
źródło
1

Kotlin , 73 bajty

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

Wypróbuj online!

Korzystając z faktu, że wiele kolorów ma 6 znaków, te, które nie są poprzedzone spacjami, mają długość 6 znaków. Mamy nadzieję, że dopuszczalne jest, aby niektóre kolory były drukowane ze spacjami przed nimi.
np. czerwony jest " Red", niebieski jest" Blue"

Makotosan
źródło
1

SmileBASIC, 94 84 bajtów

C$="Red   OrangeYellowGreen Blue  IndigoViolet
INPUT I$?MID$(C$*2,INSTR(C$,I$)+6,6)
12Me21
źródło
1

Gema , 67 znaków

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

Przykładowy przebieg:

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 znaków

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

Nudny. Najgłupsze podejście w historii, ale dość krótkie.

Przykładowy przebieg:

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
człowiek w pracy
źródło
1

q / kdb + , 59 55 bajtów

Rozwiązanie:

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

Przykłady:

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"

Wyjaśnienie:

Utwórz słownik koloru => następny kolor, wejście jest kluczem do słownika:

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

Premia:

Ma 53 bajty w K4:

.[!;2 8#$`Red`Violet`Indigo`Blue`Green`Yellow`Orange]
streetster
źródło
1

Japt , 45 43 bajtów

-2 bajty dzięki Shaggy

`R‚sOÎÁƒYÁMwsGÎ9sBluƒI˜igosVio¤t`qs
g1+UbNg

Wypróbuj online!

Oliver
źródło
43 bajty
Kudłaty
@Shaggy Thanks! Zapomniałem oN
Oliver
1

sed, 72 bajty

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

Wypróbuj online

Przykład 1:

Wkład:

Red
Orange
Yellow
Green
Blue
Indigo
Violet

Wynik:

Orange
Yellow
Green
Blue
Indigo
Violet
Red

Przykład 2:

Wkład:

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

Wynik:

Violet
Green
Orange
Orange
Indigo
Blue
Yellow
Red
Blue
Blue
Blue
Indigo
Indigo
Red
Lucucas
źródło
Witamy na stronie! Czy możesz podać link do tłumacza online, takiego jak Wypróbuj online! gdzie możemy przetestować to rozwiązanie?
caird coinheringaahing
@cairdcoinheringaahing: Cześć, dziękuję bardzo za powitanie i rekomendację witryny! Zaktualizowałem swoją odpowiedź linkiem do strony, na której możesz przetestować kod online.
Lucucas