Bir sonraki renk


20

Meydan okuma

Gökkuşağını, dizelerle temsil edilen yedi renk olarak düşünün Red Orange Yellow Green Blue Indigo Violet.
Senin görevin bu renklerden birini gökkuşağı renk sırayla sonraki giriş ve çıkış olarak alan bir program oluşturmaktır. Bu örtüşmeyi de içerirViolet -> Red

Giriş

Gökkuşağı renklerinden birini içeren bir dize.

Çıktı

Sırayla gökkuşağının rengi.

kurallar

  • Renk adları büyük / küçük harfe duyarlıdır. Bu yayında yer alan dava ile eşleşmelidirler.
  • Giriş her zaman geçerli olacaktır. Geçersiz girdi için herhangi bir davranışa izin verilir.
  • Bu kod golf, yani en kısa bayt miktarı kazanır!

Örnek Giriş ve Çıkış

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

1
"En az bir örnek giriş ve çıkış sağlayın. Girişin nasıl görünmesi gerektiği konusunda kendi açıklamanızla eşleştiğinden emin olun." Kendi meydan okuma yayınınızı mı tanımlıyorsunuz? Yoksa bu çözümler için bir gereklilik mi?
özyinelemeli

6
Küçük renkler iyi mi?
Emigna

4
Fakat 'gri'ye ulaştığınızda ne olur? ;)
AJFaraday

1
@Emigna OP soruyu cümle biçiminden, büyük harf, küçük harf veya büyük / küçük harfe duyarlı olmayacağınızı seçebilirsiniz. Provide at least one example input and output. Make sure they match your own description of what the input should look like.
sonrad10

1
Sondaki boşluklar iyi mi?
ivzem

Yanıtlar:


2

SOGL V0.12 , 23 bayt

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

Buradan Deneyin!

Açıklama:

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

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

Girdi için "Red", bu işlev önce /Red(.[a-z]*)/dizeyle eşleşecek bir RegExp oluşturur 'RedOrangeYellowGreenBlueIndigoVioletRed've ardından ilk yakalama sonucunu döndürür.


"Violet" girişinin sonucu nedir? Sanırım metni 'RedOrangeYellowGreenBlueIndigoVioletRed'başka bir şeye değiştirmelisin
Olivier Grégoire

1
@ OlivierGrégoire Tamam, ekledi. Bu kural, yanıt gönderildikten sonra OP tarafından değiştirilir.
tsh

Bilmiyordum: Sorunun sadece son halini gördüm.
Olivier Grégoire

9

Perl 5 -p , 58 57 bayt

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

Çevrimiçi deneyin!

Artık meydan okuma, regex çözümü döngüsel olacak şekilde değiştirildi

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

artık optimal değil (çiftli nedeniyle Red)

Ayrıca 57 bayt:

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

Çevrimiçi deneyin!


7

piton , 79 bayt

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

Çevrimiçi deneyin!

Kolları Violet -> Red . İstenen işlev ikinci satırda anonim olarak verilir.


80 bayt

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

Çevrimiçi deneyin!


7

Perl 6 , 56 bayt

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

Çevrimiçi deneyin!

Her rengin ilk harfinin ASCII kodlarının 2-4 bitlerinin 0-6 ile eşleşmesi gerçeğini kullanır.

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

İşte "çivit mavisi" ve "menekşe" yerine "mor" kullanan güzel bir rakip olmayan çözüm (38 karakter, 59 bayt):

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

Çevrimiçi deneyin!


Yüce Unicode İsimleri
Weijun Zhou

Bu çözüm kadar ilginç, sonuçta spesifikasyonu takip etmiyor. Yanıtınıza uyumlu bir sürüm ekleyebilir ve bunu ek olarak gönderebilir misiniz?
Dennis

%12Hindistan cevizi için de bir çözüm var, ama elbette bu daha temiz.
Weijun Zhou

5

Yakut -n , 62 60 bayt

-2 Asone Tuhid tarafından.

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

Çevrimiçi deneyin!

Regex yaklaşımı Ruby için de umut verici görünüyor. Ancak, yakalama gruplarıyla oynamak yerine, bir ileriye doğru ve maçı doğrudan basmak için daha kısa bir çözüme ulaştım. Renklerin listesi ters yöndedir, çünkü ileriye bakıştan 1 bayt daha ucuzdur.


çok güzel, -2 bayt ( /#$_/interpolates)
Asone Tuhid

4

Kırmızı , 87 bayt

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

Çevrimiçi deneyin!


4
Bu dilin ne olduğu, kodunuzun işe yarayıp yaramadığı ya da hiç golf sahası olup olmadığı hakkında bir fikriniz yok, ancak bu meydan okuma için yalnızca "Kırmızı" adlı bir dili kullandığınız için + 1'leyin.
msh210

@ msh210 Rebol (Göreceli İfade Tabanlı Nesne Dili) ile yakından ilgilidir. Dil kodu, verileri ve meta verileri aynı şekilde temsil eder - bloklar [] ile gösterilir. Mevcut Kırmızı dağıtımı yalnızca 1,1 MB'dir ve bir konsol / yorumlayıcı ile farklı platformlara çapraz uyum sağlayabilen bir derleyici içerir. Kodum, farklı çözümler denedim ve yapabileceğim tüm alanları kaldırdım. Kötü olan şey, mekanın neredeyse her yerde sınırlayıcı olmasıdır. Tüm matematik ifadelerinin operatörlerin her iki tarafında a: b + c (a = b + c) gibi boşluklar olması gerekir.
Galen Ivanov

4

05AB1E , 30 bayt

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

Çevrimiçi deneyin!

açıklama

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

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

Küçük harf adları kullanır.

Aynı yaklaşım, büyük harflerle 86 bayt:

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

3

Haskell , 80 71 75 bayt

9 baytı kısalttığı için Laikoni'ye teşekkürler!

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

Çevrimiçi deneyin!


Başka bir çözüm, biraz daha deyimsel, ama daha kısa yapamadım:

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

Girdinin Readbir dize olması ve en azından Eqveya Showeşitliği test etmek veya sonucu göstermek için türetilmesi gerekir .


71 bayt ile span: Çevrimiçi deneyin!
Laikoni

@ Laikoni Wow, bu harika, teşekkürler! Unuttum span...
Cristian Lupascu

1
OP , Violetetrafına sarılması gerektiğini açıkladı Red, bu nedenle Reddizenin sonuna tekrar eklemeniz gerekiyor .
Laikoni

İkincisi fikrini çok seviyorum! Ancak succ Violetiçin çalışmaz Enum:( etrafında sarmak yok s
ბიმო

@BMO Kesinlikle. Bu sürümü hazırladığımda etrafı saran gereksinimin farkında değildim.
Cristian Lupascu

3

Retina , 65 58 bayt

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

Çevrimiçi deneyin!

açıklama

$
(.[a-z]+)

(.[a-z]+)Girişe ekleyerek başlıyoruz , böylece giriş rengiyle eşleşen bir regex'e dönüştürüyoruz, hemen ardından tam olarak bir renk daha (ikincisini yakalayarak).

L$:`RedOrangeYellowGreenBlueIndigoVioletRed
$1

Şimdi :sahnenin girdisini kendi normal ifadesiyle değiştirir. Böylece önceki sonuç normal ifade olur ve renk listesiyle eşleşir. (Tekli) maç ilk yakalama grubuyla (yani döngüdeki bir sonraki renkle) değiştirilir ve geri döner. Programın sonunda çıktı otomatik olarak gerçekleşir.



Evet, Kevin'in çözümünü gördükten sonra yorumumu kaldırdım. Kurmak zorunda \1ve hedef atıklar sayıda bayt atlama: :-)
Ton Hospel

@TonHospel bir şey buldu. :)
Martin Ender

1
@KevinCruijssen Sizin ve Ton'unuzun sınırlayıcı olmayan bir çözüm arayışı sayesinde 58 bayt buldum. ;)
Martin Ender

3

Vim, 59 56 53 52 Bayt

Tsh sayesinde -1 bayt

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

1
Sarı Yeşil Mavi Çivit Menekşe Kırmızı Turuncu <Esc> * wywVp
tsh

3

Java (JDK 10) , 77 bayt

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

Çevrimiçi deneyin!

Kredi



@KevinCruijssen Sahip olduğunuz güzel regex fu!
Olivier Grégoire

1
Bir zamanlar, ayırıcıları ayrılmış öğeler olarak tutan bir bölme ararken, bulduğum cevabın, sınırlayıcıyı önde gelen ya da arka kısım olarak bir arada tutmak için seçenekler içerdiğini ve burada yararlı olacağını düşündüm. :) İşte bu iki seçenek için ileriye bakma / geriye bakma dahil cevap.
Kevin Cruijssen

1
Bir bayt kaydet:s->"Red Orange Yellow Green Blue Indigo Violet Red".split(s)[1].split(" ")[1]
Okx

2

Hindistan cevizi , 79 bayt

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

Çevrimiçi deneyin!


Hindistancevizi bilmiyorum. Ancak, maksimum modulo değerini düşürdüğü için küçük harfleri kullanarak 2 bayt s->"# green indigo yellow # # orange blue # violet red".split()[ord(s[0])%12]
kesebildiğinizi düşünün

@Wernisch Öneri için teşekkürler. Yine de OP yanıt vermeden önce küçük harflerin kabul edilebilir olup olmadığını bekleyene kadar bekleyeceğim.
Laikoni

2

Kabuk , 28 bayt

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

Çevrimiçi deneyin!

Belki argümanları yönetmek için daha iyi seçenekler var, ama bulabildiğim en iyisi bu

açıklama

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 bayt

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

Çalıştır ve hata ayıkla

Bu, halka çeviri talimatını kullanır. Bir dizideki her öğeyi "kod çözücü halkasından" aşağıdakilerle değiştirir. Genellikle, bir dizede karakter değiştirme yapmak için kullanılır, ancak tek bir dizide sarılmışsa, tüm dizede de kullanılabilir.

İşte aynı programın ambalajsız, ungolfed, yorumlanmış ascii temsili.

]   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

Bunu çalıştır


Tamam ... Bu dilleri seviyorum =)
lolad

3
Violet için başarısız -> Kırmızı
Weijun Zhou

1
@ WeijunZhou: Bu test davası bu sunumdan sonra eklendi .
özyinelemeli

1
@ WeijunZhou: Bu test vakasını düzelttim ve bir bayt traş ettim.
özyinelemeli

1
@ WeijunZhou: Stax'ın C # ve JS uygulamaları arasında bir tutarsızlık var gibi görünüyor. Bir test durumu ekleyeceğim ve bir sonraki sürüm için davranışı normalleştireceğim.
özyinelemeli


2

R , 109 93 bayt

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

Çevrimiçi deneyin!

-16 tavsiye kullanımı için Giuseppe teşekkürlermatch


PPCG'ye hoş geldiniz! bu güzel bir ilk cevap. match(y,x)%%7+1Endeksleme için ifadenizden daha kısa olduğunu düşünüyorum if. Ayrıca, colors()indeksleri bulursanız , yerleşik bir sürü renk adı içerir :)
Giuseppe

Üzgünüz, colors()içermiyor gibi görünüyor indigo! Ah, yine de +1!
Giuseppe

Teşekkürler! matchburada daha iyi
DS_UNI


ve evet ilk kullanmaya çalıştım colors(): /
DS_UNI

1

Toplu, 97 bayt

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

Açıklama: callİkinci satırda, parametreyi komutun yerine koyma ve değerlendirme, örn set s=%s:Red =%., Parametreyi içeren dizenin önekini silme biçimine dönüştürme etkisi vardır . Üçüncü satırdaki ikame, daha sonra tüm boşlukları ifade ayraçları ve yorumlarla değiştirir. Ayrıştırmadan önce dize değiştirme gerçekleştiği için bu çalışır.


1

Yakut -n , 75 69 bayt

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

Çevrimiçi deneyin!


1
Neden böyle i&&? nil“Bu bir renk değilse herhangi bir hatayı yoksay” olarak kontrol etmeye gerek yoktur.
manatwork

@manatwork Ben "herhangi bir hata yakalamak ve yoksay" olarak anladım ama tamam.
Asone Tuhid

1

Julia 0.6 , 76 bayt

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

Çevrimiçi deneyin!

Bu, dize gücü ile geri dönüştürerek Menekşe-> Kırmızı ^ operatörü .

Normal ifadeler olmadan biraz daha uzun bir çözüm:

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

1

PowerShell , 74 bayt

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

Çevrimiçi deneyin!

Dizeyi alır "Red ... Violet "ve Violet -> Redtest durumunu doğru şekilde işlemek için dizeyi iki ile çarpar . Daha sonra -splitgirişte bu dizeyi $argsbize iki dizeden oluşan bir dizi veririz . İkinci dizesini alıyoruz [1], o zaman -splitboşlukta bize bir dizi dizgi vermek ve ilk diziyi almak[0] .

Örneğin, giriş "Yellow"için ilk adım ortaya çıkacaktır @("Red Orange ", " Green Blue Indigo ... Indigo Violet "). Biz sonuçlanan (boşluk kaldırılır) boşluk üzerine bölmek, yani ikinci birini almak @("Green", "Blue", ... "Violet")böylece alarak [0]doğru bir sonraki dizede birini bunların sonuçları.


1

IBM / Lotus Notes Formül Dili, 79 74 bayt

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

79 için önceki sürüm:

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

Adlı düzenlenebilir bir metin alanından girdi alır a.

Formül dili için TIO yoktur, bu yüzden birkaç ekran görüntüsü.

enter image description here

enter image description here

enter image description here



1

Kotlin , 73 bayt

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

Çevrimiçi deneyin!

Birçok rengin 6 karakter olduğu gerçeğinden yararlanarak, önekleri 6 karakter uzunluğunda olacak şekilde boşluklarla ön eklenir. Umarım bazı renklerin önlerinde boşluklarla çıkması kabul edilebilir.
örneğin Kırmızı " Red", Mavi" Blue"


1

SmileBASIC, 94 84 bayt

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

1

Gema , 67 karakter

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

Örnek çalışma:

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 karakter

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

Sıkıcı biri. Şimdiye kadarki en saçma yaklaşım, ama oldukça kısa.

Örnek çalışma:

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 bayt

Çözüm:

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

Örnekler:

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"

Açıklama:

Bir renk => sonraki renk sözlüğü oluşturun, giriş sözlüğün anahtarıdır:

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

Bu var 53 bayt K4:

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


1

sed, 72 bayt

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

Çevrimiçi Deneyin

Örnek 1:

Giriş:

Red
Orange
Yellow
Green
Blue
Indigo
Violet

Çıktı:

Orange
Yellow
Green
Blue
Indigo
Violet
Red

Örnek 2:

Giriş:

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

Çıktı:

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.