Màu tiếp theo


20

Thử thách

Coi cầu vồng là bảy màu, được biểu thị bằng các chuỗi như Red Orange Yellow Green Blue Indigo Violet.
Nhiệm vụ của bạn là tạo ra một chương trình nhận một trong những màu này làm đầu vào và đầu ra tiếp theo theo thứ tự màu cầu vồng. Điều này bao gồm chồng chéoViolet -> Red

Đầu vào

Một chuỗi chứa một trong những màu sắc cầu vồng.

Đầu ra

Các màu tiếp theo theo thứ tự của cầu vồng.

Quy tắc

  • Tên màu là trường hợp nhạy cảm. Họ phải phù hợp với trường hợp bao gồm trong bài này.
  • Đầu vào sẽ luôn hợp lệ. Bất kỳ hành vi được phép cho đầu vào không hợp lệ.
  • Đây là mã golf, vì vậy số byte ngắn nhất sẽ thắng!

Ví dụ đầu vào và đầu ra

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

1
"Cung cấp ít nhất một ví dụ đầu vào và đầu ra. Hãy chắc chắn rằng chúng khớp với mô tả của riêng bạn về đầu vào sẽ trông như thế nào." Bạn đang mô tả bài thách thức của riêng bạn? Hay đây là một yêu cầu cho các giải pháp?
đệ quy

6
Màu chữ thường có ổn không?
Emigna

4
Nhưng điều gì xảy ra khi bạn đạt đến 'màu xám'? ;)
AJFaraday

1
@Emigna Từ cách OP đặt câu hỏi, tôi đoán rằng bạn có thể chọn nên viết hoa, viết thường hay không phân biệt chữ hoa chữ thường. Provide at least one example input and output. Make sure they match your own description of what the input should look like.
sonrad10

1
Không gian dấu có ổn không?
ivzem

Câu trả lời:


2

SOGL V0.12 , 23 byte

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

Hãy thử nó ở đây!

Giải trình:

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

Đối với đầu vào "Red", chức năng này trước tiên xây dựng một RegExp /Red(.[a-z]*)/để khớp với chuỗi 'RedOrangeYellowGreenBlueIndigoVioletRed'và sau đó trả về kết quả chụp đầu tiên.


Kết quả cho đầu vào "Violet" là gì? Tôi đoán bạn nên thay đổi văn bản thành 'RedOrangeYellowGreenBlueIndigoVioletRed'hoặc một cái gì đó
Olivier Grégoire

1
@ OlivierGrégoire Ok, đã thêm. Quy tắc này được thay đổi bởi OP sau khi câu trả lời được đăng.
tsh

Tôi không biết: Tôi chỉ thấy phiên bản cuối cùng của câu hỏi.
Olivier Grégoire

9

Perl 5 -p , 58 57 byte

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

Hãy thử trực tuyến!

Bây giờ thách thức đã được thay đổi để tuần hoàn giải pháp regex

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

không còn tối ưu nữa (do gấp đôi Red)

Ngoài ra 57 byte:

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

Hãy thử trực tuyến!



7

Perl 6 , 56 byte

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

Hãy thử trực tuyến!

Khai thác thực tế là các bit 2-4 của mã ASCII của chữ cái đầu tiên của mỗi màu xảy ra để ánh xạ thành 0-6.

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

Đây là một giải pháp không cạnh tranh tốt đẹp sử dụng "màu tím" thay vì "màu chàm" và "màu tím" (38 ký tự, 59 byte):

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

Hãy thử trực tuyến!


Tên Unicode toàn năng
Weijun Zhou

Thú vị như giải pháp này, cuối cùng nó không tuân theo thông số kỹ thuật. Bạn có thể bao gồm một phiên bản tuân thủ trong câu trả lời của bạn và đăng này dưới dạng phụ lục không?
Dennis

Ngoài ra còn có một %12giải pháp cho Dừa, nhưng tất nhiên đây là gọn gàng hơn.
Weijun Zhou

5

Ruby -n , 62 60 byte

-2 bởi Asone Tuhid.

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

Hãy thử trực tuyến!

Cách tiếp cận Regex có vẻ hứa hẹn cho Ruby quá. Tuy nhiên, tôi đã đi đến một giải pháp ngắn hơn bằng cách sử dụng một cái nhìn và trực tiếp in trận đấu, thay vì chơi với các nhóm bắt. Danh sách các màu theo hướng ngược lại vì lookahead rẻ hơn 1 byte so với lookbehind.


rất hay, -2 byte ( /#$_/nội suy)
Asone Tuhid

4

Màu đỏ , 87 byte

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

Hãy thử trực tuyến!


4
Không biết ngôn ngữ này là gì, liệu mã của bạn hoạt động như thế nào, hoặc liệu nó có bị đánh golf không, nhưng có +1 chỉ để sử dụng ngôn ngữ có tên "Red" cho thử thách này.
msh210

@ msh210 Nó liên quan chặt chẽ với Rebol (Ngôn ngữ đối tượng dựa trên biểu thức tương đối). Ngôn ngữ đại diện cho mã, dữ liệu và siêu dữ liệu theo cùng một cách - với các khối được ký hiệu là []. Bản phân phối Red hiện tại chỉ có 1,1 MB và bao gồm một bàn điều khiển / bộ giao thoa, cũng như trình biên dịch có thể giao tiếp với các nền tảng khác nhau. Mã của tôi được chơi trong trường hợp tôi đã thử các giải pháp khác nhau và loại bỏ tất cả các không gian tôi có thể. Điều tồi tệ là không gian là dấu phân cách hầu như ở khắp mọi nơi. Tất cả các biểu thức toán học cần phải có khoảng trắng ở cả hai phía của các toán tử như a: b + c (a = b + c).
Galen Ivanov

4

05AB1E , 30 byte

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

Hãy thử trực tuyến!

Giải trình

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

Sử dụng tên viết thường.

Cách tiếp cận tương tự, với các chữ cái Uppercase 86 byte:

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

3

Haskell , 80 71 75 byte

Cảm ơn Laikoni đã rút ngắn 9 byte!

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

Hãy thử trực tuyến!


Một giải pháp khác, hơi thành ngữ hơn, nhưng tôi không thể rút ngắn nó:

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

Nó cần phải xuất phát Readvì yêu cầu đầu vào là một chuỗi và ít nhất Eqhoặc Showđể kiểm tra sự bằng nhau hoặc hiển thị kết quả.


71 byte với span: Hãy thử trực tuyến!
Laikoni

@Laikoni Wow, thật tuyệt, cảm ơn! Tôi quên mất span...
Cristian Lupascu

1
OP đã làm rõ rằng Violetnên bao quanh Red, vì vậy bạn cần thêm Redlại vào cuối chuỗi.
Laikoni

Tôi thích ý tưởng của cái thứ hai rất nhiều! Tuy nhiên succ Violetsẽ không làm việc cho Enums không quấn quanh :(
ბიმო

@BMO Chính xác. Khi tôi thực hiện phiên bản đó, tôi không nhận thức được yêu cầu bao quanh.
Cristian Lupascu

3

Võng mạc , 65 58 byte

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

Hãy thử trực tuyến!

Giải trình

$
(.[a-z]+)

Chúng tôi bắt đầu bằng cách nối thêm (.[a-z]+)vào đầu vào, từ đó biến nó thành một biểu thức chính phù hợp với màu đầu vào, ngay sau đó là chính xác thêm một màu nữa (chụp cái sau).

L$:`RedOrangeYellowGreenBlueIndigoVioletRed
$1

Bây giờ :hoán đổi đầu vào của giai đoạn với biểu thức chính của nó. Vì vậy, kết quả trước đó trở thành biểu thức chính quy và nó phù hợp với danh sách các màu. Trận đấu (đơn) được thay thế bằng nhóm chụp đầu tiên (nghĩa là màu tiếp theo trong chu kỳ) và được trả về. Đầu ra ở cuối chương trình diễn ra tự động.



Vâng, tôi đã xóa nhận xét của mình sau khi thấy giải pháp của Kevin. Việc phải thiết lập \1và nhảy tới mục tiêu sẽ làm lãng phí nhiều byte :-)
TonMedel 21/03/18

@TonH Phúc tìm thấy một cái gì đó. :)
Martin Ender

1
@KevinCruijssen Nhờ nỗ lực của bạn và Ton cho một giải pháp không phân định, cuối cùng tôi đã tìm thấy một 58 -ter. ;)
Martin Ender

3

Vim, 59 56 53 52 byte

-1 byte nhờ tsh

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

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

3

Java (JDK 10) , 77 byte

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

Hãy thử trực tuyến!

Tín dụng



@KevinCruijssen Đó là một số regex fu đẹp mà bạn đã có!
Olivier Grégoire

1
Tôi nhớ khi tôi đang tìm kiếm một phân tách giữ các dấu phân cách là các mục riêng biệt mà câu trả lời tôi tìm thấy cũng chứa các tùy chọn để giữ dấu phân cách được ẩn trong phần đầu hoặc phần cuối và cho rằng nó sẽ hữu ích ở đây. :) Đây là câu trả lời bao gồm cả nhìn về phía trước / nhìn phía sau cho hai tùy chọn khác được đề cập.
Kevin Cruijssen

1
Lưu một byte:s->"Red Orange Yellow Green Blue Indigo Violet Red".split(s)[1].split(" ")[1]
Okx 21/03/18

2

Dừa , 79 byte

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

Hãy thử trực tuyến!


Đừng biết dừa. Nhưng nghĩ rằng bạn sẽ có thể cắt 2 byte bằng cách sử dụng các chữ cái viết thường, vì điều này làm giảm giá trị modulo tối đa:s->"# green indigo yellow # # orange blue # violet red".split()[ord(s[0])%12]
Wernisch

@Wernisch Cảm ơn bạn đã gợi ý. Mặc dù tôi sẽ đợi cho đến khi OP trả lời liệu các chữ cái viết thường có được chấp nhận hay không trước khi cập nhật.
Laikoni

2

Husk , 28 byte

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

Hãy thử trực tuyến!

Có thể có các tùy chọn tốt hơn để quản lý các đối số, nhưng đây là cách tốt nhất tôi có thể tìm thấy

Giải trình

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

Chạy và gỡ lỗi nó

Điều này sử dụng hướng dẫn dịch vòng. Nó thay thế từng phần tử trong một mảng bằng phần tử sau từ "vòng giải mã". Thông thường, nó được sử dụng để thay thế ký tự trong một chuỗi, nhưng nó cũng có thể được sử dụng trên toàn bộ chuỗi, nếu nó được gói trong một mảng đơn.

Đây là đại diện ascii đã giải nén, không được chỉnh sửa, nhận xét của cùng một chương trình.

]   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

Chạy cái này


ok ... tôi yêu những ngôn ngữ này =)
lolad 21/03/18

3
Thất bại cho Violet -> Đỏ
Weijun Zhou

1
@ WeijunZhou: Trường hợp thử nghiệm đó đã được thêm vào sau khi đệ trình này.
đệ quy

1
@ WEijunZhou: Tôi đã sửa trường hợp kiểm tra đó và cạo một byte.
đệ quy

1
@ WeijunZhou: Có vẻ như là một sự không nhất quán giữa các triển khai C # và JS của stax. Tôi sẽ thêm một trường hợp thử nghiệm và bình thường hóa hành vi cho phiên bản tiếp theo.
đệ quy


2

R , 109 93 byte

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

Hãy thử trực tuyến!

-16 cảm ơn Giuseppe đã sử dụng matchlời khuyên


Chào mừng đến với PPCG! đây là một câu trả lời đầu tiên tốt đẹp Tôi nghĩ match(y,x)%%7+1là ngắn hơn để lập chỉ mục hơn iftuyên bố của bạn . Ngoài ra, phần dựng sẵn colors()chứa rất nhiều tên màu, nếu bạn tìm thấy các chỉ mục :)
Giuseppe

Rất tiếc, có vẻ như colors()không chứa indigo! À, vẫn, +1!
Giuseppe

cảm ơn! matchở đây tốt hơn
DS_UNI 23/03/18


và vâng, lần đầu tiên tôi đã thử sử dụng colors(): /
DS_UNI

1

Mẻ, 97 byte

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

Giải thích: Dòng calltrên dòng thứ hai có tác dụng thay thế tham số vào lệnh và đánh giá nó, biến nó thành ví dụ set s=%s:Red =%, xóa tiền tố của chuỗi bao gồm tham số. Sự thay thế trên dòng thứ ba sau đó thay thế tất cả các khoảng trắng bằng dấu phân cách câu lệnh và nhận xét. Điều này hoạt động vì sự thay thế chuỗi xảy ra trước khi phân tích cú pháp.


1

Ruby -n , 75 69 byte

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

Hãy thử trực tuyến!


1
Tại sao i&&điều đó? Không cần phải kiểm tra nil, như “Bỏ qua bất kỳ lỗi nếu điều này không phải là một màu.”
manatwork

@manatwork Tôi hiểu nó là "bắt và bỏ qua mọi lỗi" nhưng không sao.
Asone Tuhid

1

Julia 0,6 , 76 byte

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

Hãy thử trực tuyến!

Thao tác này xử lý Violet-> Red bằng cách tái chế chuỗi bằng ^toán tử nguồn .

Đây là một giải pháp dài hơn một chút mà không có regexes:

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]

Hãy thử trực tuyến!

Lấy chuỗi "Red ... Violet "và nhân chuỗi đó ra hai để xử lý đúng Violet -> Redtrường hợp kiểm thử. Chúng tôi sau -splitđó chuỗi đó vào đầu vào $argsđể cung cấp cho chúng tôi một mảng gồm hai chuỗi. Chúng tôi lấy chuỗi thứ hai [1], sau -splitđó vào khoảng trắng để cung cấp cho chúng tôi một chuỗi các chuỗi và lấy chuỗi đầu tiên [0].

Ví dụ, đối với đầu vào "Yellow", bước đầu tiên sẽ dẫn đến @("Red Orange ", " Green Blue Indigo ... Indigo Violet "). Chúng tôi lấy cái thứ hai trong số đó, chia nó trên khoảng trắng (loại bỏ khoảng trắng), do @("Green", "Blue", ... "Violet")đó, lấy [0]kết quả của nó trong chuỗi tiếp theo thích hợp.


1

Ngôn ngữ công thức ghi chú của IBM / Lotus, 79 74 byte

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

Phiên bản trước cho 79:

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

Lấy đầu vào từ một trường văn bản có thể chỉnh sửa được gọi là a.

Không có TIO cho ngôn ngữ công thức, vì vậy đây là một vài ảnh chụp màn hình.

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây



1

Kotlin , 73 byte

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

Hãy thử trực tuyến!

Lợi dụng thực tế là nhiều màu sắc là 6 ký tự, những màu không được thêm tiền tố vào khoảng trắng để làm cho chúng dài 6 ký tự. Hy vọng rằng có thể chấp nhận được rằng một số màu sắc được xuất ra với khoảng trắng trước chúng.
ví dụ: màu đỏ là " Red"màu xanh" Blue"


1

SmileBASIC, 94 84 byte

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

1

Gema , 67 ký tự

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

Chạy mẫu:

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 ký tự

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

Chán một cái. Cách tiếp cận ngu ngốc nhất, nhưng khá ngắn.

Chạy mẫu:

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

Dung dịch:

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

Ví dụ:

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"

Giải trình:

Tạo một từ điển màu => màu tiếp theo, đầu vào là chìa khóa cho từ điển:

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

Tiền thưởng:

Đó là 53 byte trong K4:

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


1

sed, 72 byte

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

Dùng thử trực tuyến

Ví dụ 1:

Đầu vào:

Red
Orange
Yellow
Green
Blue
Indigo
Violet

Đầu ra:

Orange
Yellow
Green
Blue
Indigo
Violet
Red

Ví dụ 2:

Đầu vào:

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

Đầu ra:

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

Chào mừng đến với trang web! Bạn có thể cung cấp một liên kết đến một thông dịch viên trực tuyến, chẳng hạn như Dùng thử trực tuyến! chúng ta có thể thử nghiệm giải pháp này ở đâu?
caird coinheringaahing

@cairdcoinheringaahing: Xin chào, cảm ơn bạn rất nhiều vì sự chào đón và giới thiệu trang web! Tôi đã cập nhật câu trả lời của mình với một liên kết đến trang nơi bạn có thể kiểm tra mã trực tuyến.
lucasb
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.