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

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

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.


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!


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!


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!


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.


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!


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

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")

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.


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.



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

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



@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!


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)

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


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

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


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


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.


1

Ruby -n , 75 69 byte

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

Cobalah online!


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]

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.


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


1

PHP, 92 byte

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

Cobalah online!


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"


1

SmileBASIC, 94 84 byte

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

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

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]


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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.