Warna selanjutnya

20

Tantangan

Pertimbangkan pelangi sebagai tujuh warna, diwakili oleh string sebagai Red Orange Yellow Green Blue Indigo Violet.
Tugas Anda adalah membuat program yang menerima salah satu dari warna-warna ini sebagai input dan output selanjutnya dalam warna pelangi. Ini termasuk tumpang tindihViolet -> Red

Memasukkan

Tali berisi salah satu warna pelangi.

Keluaran

Selanjutnya agar warna pelangi.

Aturan

  • Nama warna peka huruf besar-kecil. Mereka harus cocok dengan kasing yang termasuk dalam pos ini.
  • Masukan akan selalu valid. Perilaku apa pun diizinkan untuk input yang tidak valid.
  • Ini adalah kode golf, sehingga jumlah byte terpendek menang!

Contoh Input dan Output

Input -> Output
Red -> Orange
Orange -> Yellow
Yellow -> Green
Green -> Blue
Blue -> Indigo
Indigo -> Violet
Violet -> Red
lolad
sumber
1
"Berikan setidaknya satu contoh input dan output. Pastikan mereka cocok dengan deskripsi Anda sendiri tentang seperti apa input itu." Apakah Anda menggambarkan pos tantangan Anda sendiri? Atau apakah ini persyaratan untuk solusi?
rekursif
6
Apakah warna huruf kecil oke?
Emigna
4
Tetapi apa yang terjadi ketika Anda mencapai 'abu-abu'? ;)
AJFaraday
1
@ Emigna Dari cara OP mengutarakan pertanyaannya, saya kira Anda dapat memilih apakah akan menggunakan huruf besar, huruf kecil, atau tidak sensitif huruf. Provide at least one example input and output. Make sure they match your own description of what the input should look like.
sonrad10
1
Apakah spasi tambahan oke?
ivzem

Jawaban:

2

SOGL V0.12 , 23 byte

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

Coba Di Sini!

Penjelasan:

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

JavaScript, 68 byte

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

Untuk input "Red", fungsi ini pertama-tama membuat RegExp /Red(.[a-z]*)/untuk mencocokkan string 'RedOrangeYellowGreenBlueIndigoVioletRed'dan kemudian mengembalikan hasil tangkapan pertama.

tsh
sumber
Apa hasil untuk input "Violet"? Saya kira Anda harus mengubah teks ke 'RedOrangeYellowGreenBlueIndigoVioletRed'atau sesuatu
Olivier Grégoire
1
@ OlivierGrégoire Ok, ditambahkan. Aturan ini diubah oleh OP setelah jawaban diposting.
tsh
Saya tidak tahu: Saya hanya melihat versi final dari pertanyaan itu.
Olivier Grégoire
9

Perl 5 -p , 58 57 byte

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

Cobalah online!

Sekarang tantangan telah diubah menjadi siklus solusi regex

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

tidak optimal lagi (karena dua kali lipat Red )

Juga 57 byte:

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

Cobalah online!

Ton Hospel
sumber
7

Python , 79 byte

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

Cobalah online!

Pegangan Violet -> Red. Fungsi yang diinginkan diberikan secara anonim di baris kedua.


80 byte

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

Cobalah online!

Tidak
sumber
7

Perl 6 , 56 byte

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

Cobalah online!

Mengeksploitasi fakta bahwa bit 2-4 dari kode ASCII dari setiap huruf pertama warna memetakan ke 0-6.

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

Berikut ini adalah solusi non-bersaing yang bagus yang menggunakan "ungu" alih-alih "indigo" dan "violet" (38 karakter, 59 byte):

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

Cobalah online!

nwellnhof
sumber
Nama Unicode Mahakuasa
Weijun Zhou
Yang semenarik solusi ini, akhirnya tidak mengikuti spesifikasi. Bisakah Anda memasukkan versi yang sesuai dalam jawaban Anda dan memposting ini sebagai tambahan?
Dennis
Ada juga %12solusi untuk Kelapa, tetapi tentu saja ini lebih rapi.
Weijun Zhou
5

Ruby -n , 62 60 byte

-2 oleh Asone Tuhid.

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

Cobalah online!

Pendekatan regex juga menjanjikan untuk Ruby. Namun, saya tiba pada solusi yang lebih pendek menggunakan lookahead dan langsung mencetak pertandingan, daripada bermain dengan menangkap grup. Daftar warna berada dalam arah terbalik karena lookahead lebih murah 1 byte daripada lookbehind.

Kirill L.
sumber
sangat bagus, -2 byte ( /#$_/interpolasi)
Asone Tuhid
4

Merah , 87 byte

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

Cobalah online!

Galen Ivanov
sumber
4
Tidak tahu apa bahasa ini, apakah atau bagaimana kode Anda bekerja, atau apakah itu golf sama sekali, tetapi memiliki +1 hanya untuk menggunakan bahasa yang disebut "Merah" untuk tantangan ini.
msh210
@ msh210 Ini terkait erat dengan Rebol (Bahasa Objek Berbasis Ekspresi Relatif). Bahasa mewakili kode, data, dan metadata dengan cara yang sama - dengan blok dilambangkan dengan []. Distribusi Merah saat ini hanya 1,1 MB dan mencakup konsol / interpeter, serta kompiler yang dapat saling melengkapi ke berbagai platform. Kode saya golf di sela-sela bahwa saya mencoba solusi yang berbeda dan menghapus semua ruang yang saya bisa. Yang buruk adalah bahwa ruang adalah pembatas hampir di mana-mana. Semua ekspresi matematika harus memiliki spasi di kedua sisi operator seperti: b + c (a = b + c).
Galen Ivanov
4

05AB1E , 30 byte

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

Cobalah online!

Penjelasan

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

Excel, 85 byte

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

Menggunakan nama huruf kecil.

Pendekatan yang sama, dengan huruf besar 86 byte:

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

Haskell , 80 71 75 byte

Terima kasih kepada Laikoni untuk mempersingkat 9 byte!

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

Cobalah online!


Solusi lain, sedikit lebih idiomatis, tapi saya tidak bisa membuatnya lebih pendek:

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

Itu perlu diturunkan Readkarena persyaratan bahwa input adalah string dan setidaknya Eqatau Showuntuk menguji kesetaraan atau menunjukkan hasilnya.

Cristian Lupascu
sumber
71 byte dengan span: Cobalah online!
Laikoni
@Laikoni Wow, itu keren, terima kasih! Saya lupa tentang span...
Cristian Lupascu
1
OP mengklarifikasi yang Violetseharusnya membungkus Red, jadi Anda perlu menambahkan Redlagi ke akhir string.
Laikoni
Saya sangat menyukai ide yang kedua! Namun succ Violettidak akan berhasil karena Enumjangan membungkus :(
ბიმო
@BMO Tepat. Ketika saya membuat versi itu, saya tidak mengetahui persyaratan pembungkus.
Cristian Lupascu
3

Retina , 65 58 byte

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

Cobalah online!

Penjelasan

$
(.[a-z]+)

Kami mulai dengan menambahkan (.[a-z]+)ke input, dengan demikian mengubahnya menjadi regex yang cocok dengan warna input, segera diikuti oleh tepat satu warna lagi (menangkap yang terakhir).

L$:`RedOrangeYellowGreenBlueIndigoVioletRed
$1

Sekarang :swap input panggung dengan regex sendiri. Jadi hasil sebelumnya menjadi regex dan cocok dengan daftar warna. Pertandingan (tunggal) diganti dengan kelompok tangkapan pertama (yaitu warna berikutnya dalam siklus) dan dikembalikan. Output pada akhir program terjadi secara otomatis.

Martin Ender
sumber
Berikut ini adalah alternatif 65 byte lainnya .
Kevin Cruijssen
Ya, saya menghapus komentar saya setelah melihat solusi Kevin. Harus mengatur \1dan melompat ke target menghabiskan banyak byte: :-)
Ton Hospel
@TonHospel menemukan sesuatu. :)
Martin Ender
1
@KevinCruijssen Terima kasih kepada Anda dan Ton yang mendorong solusi no-delimiter, saya akhirnya menemukan 58-byter. ;)
Martin Ender
3

Vim, 59 56 53 52 Bytes

-1 byte terima kasih kepada tsh

2IYellow Green Blue Indigo Violet Red Orange <Esc>*wywVp
oktupol
sumber
1
2IYellow Hijau Biru Indigo Violet Merah Oranye <Esc> * wywVp
tsh
3

Java (JDK 10) , 77 byte

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

Cobalah online!

Kredit

Olivier Grégoire
sumber
@KevinCruijssen Itu beberapa regex fu bagus yang Anda punya!
Olivier Grégoire
1
Saya ingat ketika saya dulu mencari split yang membuat pembatas sebagai item yang terpisah bahwa jawaban yang saya temukan juga mengandung opsi untuk menjaga pembatasnya tetap sebagai bagian utama atau belakang, dan berpikir itu akan berguna di sini. :) Inilah jawaban itu termasuk melihat-lihat / melihat-belakang untuk dua opsi lain yang disebutkan.
Kevin Cruijssen
1
Simpan satu byte: s->"Red Orange Yellow Green Blue Indigo Violet Red".split(s)[1].split(" ")[1]
Okx
2

Kelapa , 79 byte

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

Cobalah online!

Laikoni
sumber
Tidak tahu Coconut. Tapi pikir Anda harus dapat memotong 2 byte dengan menggunakan huruf kecil, karena ini mengurangi nilai modulo max:s->"# green indigo yellow # # orange blue # violet red".split()[ord(s[0])%12]
Wernisch
@Wernisch Terima kasih atas sarannya. Meskipun saya akan menunggu sampai OP telah menanggapi apakah huruf kecil dapat diterima sebelum memperbarui.
Laikoni
2

Sekam , 28 byte

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

Cobalah online!

Mungkin ada opsi yang lebih baik untuk mengelola argumen, tetapi ini adalah yang terbaik yang bisa saya temukan

Penjelasan

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
sumber
2

Stax , 31 30 29 byte

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

Jalankan dan debug itu

Ini menggunakan instruksi terjemahan cincin. Ini menggantikan setiap elemen dalam array dengan yang berikut dari "decoder ring". Biasanya, ini digunakan untuk melakukan penggantian karakter dalam string, tetapi dapat digunakan pada seluruh string juga, jika itu dibungkus dengan array tunggal.

Berikut ini adalah representasi ascii yang belum dibongkar, tanpa komentar, dari program yang sama.

]   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

Jalankan yang ini

rekursif
sumber
ok ... Saya suka bahasa ini =)
lolad
3
Gagal untuk Violet -> Merah
Weijun Zhou
1
@ WeijunZhou: Test case itu ditambahkan setelah pengiriman ini.
rekursif
1
@ WeijunZhou: Saya memperbaiki test case dan mencukur satu byte.
rekursif
1
@ WeijunZhou: Tampaknya ada inkonsistensi antara implementasi C # dan JS dari stax. Saya akan menambahkan test case dan menormalkan perilaku untuk rilis berikutnya.
rekursif
2

J , 67 64 62 byte

-2 byte terima kasih kepada FrownyFrog

>:&.((cut'Red Orange Yellow Green Blue Indigo Violet Red')i.<)

Cobalah online!

Galen Ivanov
sumber
1
&.sebenarnya berfungsi untuk ini. Cobalah online
FrownyFrog
2

R , 109 93 byte

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

Cobalah online!

-16 Terima kasih kepada Giuseppe untuk penggunaan matchsarannya

DS_UNI
sumber
selamat datang di PPCG! ini jawaban pertama yang bagus. Saya pikir match(y,x)%%7+1lebih pendek untuk mengindeks daripada ifpernyataan Anda . Selain itu, builtin colors()berisi banyak nama warna, jika Anda menemukan indeks :)
Giuseppe
Ups, sepertinya colors()tidak mengandung indigo! Ah, masih, +1!
Giuseppe
Terima kasih! matchlebih baik di sini
DS_UNI
91 byte
Giuseppe
dan ya saya pertama kali mencoba menggunakan colors(): /
DS_UNI
1

Batch, 97 byte

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

Penjelasan: Baris callkedua memiliki efek menggantikan parameter ke dalam perintah dan mengevaluasinya, mengubahnya menjadi misalnya set s=%s:Red =%, yang menghapus awalan string yang menyertakan parameter. Substitusi pada baris ketiga kemudian menggantikan semua ruang dengan pemisah pernyataan dan komentar. Ini berfungsi karena pergantian string terjadi sebelum parsing.

Neil
sumber
1

Ruby -n , 75 69 byte

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

Cobalah online!

Asone Tuhid
sumber
1
Kenapa i&&? Tidak perlu memeriksa nil, karena "Abaikan kesalahan jika ini bukan warna."
manatwork
@Manatwork Saya memahaminya sebagai "menangkap dan mengabaikan kesalahan" tapi baik-baik saja
Asone Tuhid
1

Julia 0,6 , 76 byte

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

Cobalah online!

Ini menangani Violet-> Merah dengan mendaur ulang tali dengan kekuatan ^ operator .

Inilah solusi yang sedikit lebih lama tanpa regex:

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

PowerShell , 74 byte

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

Cobalah online!

Mengambil string "Red ... Violet "dan mengalikan-string dengan dua untuk menangani Violet -> Redkasus uji dengan benar . Kami kemudian -splitbahwa string pada input $argsuntuk memberi kami sebuah array dari dua string. Kami mengambil string kedua daripadanya [1], kemudian -splitpada spasi untuk memberikan kami serangkaian string dan mengambil yang pertama[0] .

Misalnya, untuk input "Yellow", langkah pertama akan menghasilkan @("Red Orange ", " Green Blue Indigo ... Indigo Violet "). Kami mengambil yang kedua dari itu, membaginya di whitespace (yang menghilangkan whitespace), menghasilkan @("Green", "Blue", ... "Violet"), jadi mengambil yang [0]hasilnya menghasilkan string berikutnya yang tepat.

AdmBorkBork
sumber
1

Bahasa Formula IBM / Lotus Notes, 79 74 byte

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

Versi sebelumnya untuk 79:

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

Mengambil input dari bidang teks yang dapat diedit yang disebut a.

Tidak ada TIO untuk bahasa formula jadi inilah beberapa tangkapan layar.

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

ElPedro
sumber
1

PHP, 92 byte

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

Cobalah online!

Dave
sumber
1

Kotlin , 73 byte

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

Cobalah online!

Mengambil keuntungan dari kenyataan bahwa banyak warna adalah 6 karakter, yang tidak diawali dengan spasi untuk membuatnya 6 karakter. Semoga bisa diterima bahwa beberapa warna dihasilkan dengan spasi di depan mereka.
misalnya Merah " Red", Biru" Blue"

Makotosan
sumber
1

SmileBASIC, 94 84 byte

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

Gema , 67 karakter

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

Contoh dijalankan:

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
*=

Membosankan satu. Pendekatan paling bodoh yang pernah ada, tapi cukup singkat.

Contoh dijalankan:

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
manatwork
sumber
1

q / kdb + , 59 55 byte

Larutan:

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

Contoh:

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"

Penjelasan:

Buat kamus warna => warna berikutnya, input adalah kunci untuk kamus:

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

Ini 53 byte dalam K4:

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

Japt , 45 43 byte

-2 byte terima kasih kepada Shaggy

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

Cobalah online!

Oliver
sumber
43 byte
Shaggy
@Shaggy Terima kasih! Saya lupa tentangN
Oliver
1

sed, 72 byte

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

Cobalah secara Online

Contoh 1:

Memasukkan:

Red
Orange
Yellow
Green
Blue
Indigo
Violet

Keluaran:

Orange
Yellow
Green
Blue
Indigo
Violet
Red

Contoh 2:

Memasukkan:

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

Keluaran:

Violet
Green
Orange
Orange
Indigo
Blue
Yellow
Red
Blue
Blue
Blue
Indigo
Indigo
Red
lucasb
sumber
Selamat datang di situs ini! Bisakah Anda memberikan tautan ke juru bahasa online, seperti Try It Online! dimana kita bisa menguji solusi ini?
caird coinheringaahing
@cairdcoinheringaahing: Hai, terima kasih banyak atas sambutan dan rekomendasi situs webnya! Saya telah memperbarui jawaban saya dengan tautan ke halaman tempat Anda dapat menguji kode secara online.
lucasb