下一个颜色


20

挑战

将彩虹视为七种颜色,以字符串表示Red Orange Yellow Green Blue Indigo Violet
您的任务是创建一个程序,以接收这些颜色之一作为输入,然后依次输出彩虹色。这包括重叠Violet -> Red

输入值

包含一种彩虹色的字符串。

输出量

接下来是彩虹的颜色。

规则

  • 颜色名称区分大小写。它们必须匹配此帖子中包含的大小写。
  • 输入将始终有效。对于无效输入,允许任何行为。
  • 这是代码高尔夫球,因此最短的字节数将获胜!

输入和输出示例

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

1
“至少提供一个示例输入和输出。确保它们与您对输入外观的描述相符。” 您是在描述自己的挑战帖子吗?还是这是解决方案的要求?
递归

6
小写的颜色可以吗?
Emigna

4
但是,当您达到“灰色”时会发生什么?;)
AJFaraday

1
@Emigna从OP表达问题的方式来看,我猜您可以选择是大写,小写还是不区分大小写。Provide at least one example input and output. Make sure they match your own description of what the input should look like.
sonrad10年

1
尾随行吗?
ivzem

Answers:


2

SOGL V0.12,23个字节

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

在这里尝试!

说明:

...‘θ⁽,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个字节

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

对于input "Red",此函数首先构造一个RegExp /Red(.[a-z]*)/以匹配字符串'RedOrangeYellowGreenBlueIndigoVioletRed',然后返回第一个捕获结果。


输入“紫罗兰”的结果是什么?我猜你应该改变的文字'RedOrangeYellowGreenBlueIndigoVioletRed'或东西
奥利维尔·格雷瓜尔

1
@OlivierGrégoire好,添加。答案发布后,OP会更改此规则。
tsh

我不知道:我只看到了问题的最终版本。
奥利维尔·格雷戈尔

9

Perl 5中 -p58 57个字节

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

在线尝试!

现在,挑战已变成周期性的正则表达式解决方案

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

不再是最佳选择了(由于double Red

同样是57个字节:

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

在线尝试!


7

Python,79字节

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

在线尝试!

处理Violet -> Red。所需功能在第二行中匿名给出。


80字节

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

在线尝试!


7

Perl 6、56个字节

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

在线尝试!

利用了以下事实:每种颜色的第一个字母的ASCII码的2-4位恰好映射到0-6。

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

这是一个不错的非竞争解决方案,它使用“紫色”代替“靛蓝”和“紫罗兰”(38个字符,59个字节):

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

在线尝试!


全能的Unicode名称
Weijun Zhou

尽管这种解决方案很有趣,但最终还是不符合规范。您能否在回答中包含兼容版本并将其发布为附录?
丹尼斯

也有%12椰子的解决方案,但当然更整洁了。

5

红宝石 -n62 60字节

-2由Asone Tuhid。

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

在线尝试!

Regex方法对于Ruby也很有希望。但是,我提出了一个使用前瞻性的较短解决方案,直接打印比赛,而不是与捕获小组进行比赛。颜色列表是反向的,因为先行比先行便宜1个字节。


非常好,-2个字节/#$_/插值)
Asone Tuhid

4

红色,87字节

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

在线尝试!


4
不知道这种语言是什么,代码的工作方式或方式,或者代码是否经过精心设计,只为使用一种名为“红色”的语言来应对这一挑战就设置了+1。
msh210 '18

@ msh210它与Rebol(基于相对表达式的对象语言)密切相关。该语言以相同的方式表示代码,数据和元数据-用[]表示块。当前的Red发行版只有1.1 MB,包括一个控制台/网络插件以及可以交叉兼容到不同平台的编译器。我尝试了不同的解决方案并删除了所有可能的空间,因此我的代码被广泛使用。不好的是,空间几乎到处都是分隔符。所有数学表达式都需要在运算符的两侧都留有空格,例如a:b + c(a = b + c)。
Galen Ivanov '18

4

05AB1E,30个字节

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

在线尝试!

说明

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

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

使用小写名称。

同样的方法,大写字母为86个字节:

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

3

Haskell80 71 75字节

感谢Laikoni缩短了9个字节!

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

在线尝试!


另一个解决方案,稍微有些惯用,但我不能说得更短:

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

Read由于需要输入是一个字符串并且至少EqShow为了测试是否相等或显示结果而需要导出。


71字节,带span在线尝试!
Laikoni

@Laikoni Wow,太好了,谢谢!我忘记了span……
Cristian Lupascu

1
OP阐明Violet应该环绕到Red,因此您需要Red再次在字符串末尾添加。
Laikoni

我非常喜欢第二个的想法!但是succ Violet不会为工作Enum■不要环绕:(
ბიმო

@BMO确实如此。当我制作该版本时,我并不了解环绕要求。
克里斯蒂安·卢帕斯库

3

视网膜65 58字节

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

在线尝试!

说明

$
(.[a-z]+)

我们从附加(.[a-z]+)到输入开始,从而将其变成与输入颜色匹配的正则表达式,然后紧接着又是另一种颜色(捕获后者)。

L$:`RedOrangeYellowGreenBlueIndigoVioletRed
$1

现在,:用其自己的正则表达式交换舞台的输入。因此,先前的结果成为正则表达式,并且与颜色列表匹配。(单个)匹配项将替换为其第一个捕获组(即循环中的下一个颜色)并返回。程序末尾的输出自动发生。



是的,看到凯文的解决方案后,我删除了我的评论。必须设置\1并跳到目标浪费很多字节::-)
Ton Hospel

@TonHospel发现了一些东西。:)
Martin Ender '18

1
@KevinCruijssen多亏您和Ton努力寻求无分隔符解决方案,我最终找到了58轮。;)
马丁·恩德

3

Vim,59 56 53 52字节

-1字节感谢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字节

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

在线尝试!

学分



@KevinCruijssen你有一些不错的正则表达式fu!
奥利维尔·格雷戈雷(OlivierGrégoire),

1
我记得当我曾经在寻找一个将分隔符保持为分隔项的拆分时,我发现的答案还包含一些选项,可以将分隔符统一化为开头或结尾部分,并认为在此很有用。:) 这是答案,其中包括提到的其他两个选项的先行/后向。
凯文·克鲁伊森

1
保存一个字节:s->"Red Orange Yellow Green Blue Indigo Violet Red".split(s)[1].split(" ")[1]
Okx

2

椰子,79字节

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

在线尝试!


不认识椰子。但是,您应该可以使用小写字母减少2个字节,因为这会降低最大模值:s->"# green indigo yellow # # orange blue # violet red".split()[ord(s[0])%12]
Wernisch

@Wernisch感谢您的建议。尽管我将等到OP响应后再更新,否则小写字母是否可以接受。
Laikoni '18

2

外壳,28字节

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

在线尝试!

也许有更好的方法来管理参数,但这是我能找到的最好的方法

说明

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

Stax31 30 29 字节

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

运行并调试

这使用了环翻译指令。它用“解码器环”中的下一个替换数组中的每个元素。通常,它用于在字符串中进行字符替换,但如果将其包装在单例数组中,则也可以在整个字符串中使用。

这是同一程序的未打包,未打包,带注释的ascii表示形式。

]   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

运行这个


好的...我喜欢这些语言=)
lolad

3
紫罗兰色失败->红色

1
@WeijunZhou:该测试用例是此提交之后添加的。
递归

1
@WeijunZhou:我修复了该测试用例,并剃了一个字节。
递归

1
@WeijunZhou:stax的C#和JS实现之间似乎不一致。我将添加一个测试用例并规范下一个版本的行为。
递归


2

R109 93字节

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

在线尝试!

-16感谢Giuseppe的使用match建议


欢迎来到PPCG!这是一个不错的第一答案。我认为match(y,x)%%7+1索引比您的if陈述要短。此外,colors()如果找到索引,则内置函数包含许多颜色名称:)
Giuseppe

糟糕,看起来colors()不包含indigo!嗯,还是+1!
朱塞佩

谢谢!match在这里更好
DS_UNI


是的,我首先尝试使用colors():/
DS_UNI

1

批次,97个字节

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

说明:call在第二行上的效果是将参数替换为命令并对其进行评估,然后将其转换为eg set s=%s:Red =%,这将删除包含该参数的字符串的前缀。然后,第三行的替换用语句分隔符和注释替换所有空格。之所以可行,是因为字符串替换发生在解析之前。


1

红宝石 -n75 69字节

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

在线尝试!


1
为什么会这样i&&?无需检查nil,因为“如果这不是一种颜色,请忽略任何错误。”
manatwork

@manatwork我将其理解为“捕获并忽略任何错误”,但是可以。
Asone Tuhid

1

朱莉娅0.6,76字节

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

在线尝试!

这通过使用电源^操作员回收字符串来处理Violet-> Red 。

这是一个没有正则表达式的更长的解决方案:

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

1

PowerShell,74个字节

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

在线尝试!

"Red ... Violet "取出字符串,然后将字符串乘以2以正确处理Violet -> Red测试用例。然后-split,我们在输入时使用该字符串$args以提供两个字符串的数组。我们取第二个字符串[1],然后取-split空白,给我们一个字符串数组,取第一个[0]

例如,对于输入"Yellow",第一步将产生@("Red Orange ", " Green Blue Indigo ... Indigo Violet ")。我们采用其中的第二个,将其拆分为空白(这将删除空白),结果为@("Green", "Blue", ... "Violet"),因此采用其中[0]一个将得到正确的下一个字符串。


1

IBM / Lotus Notes公式语言,79 74字节

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

79的先前版本:

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

从名为的可编辑文本字段中获取输入a

公式语言没有TIO,因此有几个屏幕截图。

在此处输入图片说明

在此处输入图片说明

在此处输入图片说明



1

Kotlin,73个字节

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

在线尝试!

利用许多颜色都是6个字符这一事实,没有颜色的字符前面会带有空格以使它们长6个字符。希望可以接受的是,某些颜色在其前面带有空格的情况下输出。
例如红色是" Red",蓝色是" Blue"


1

SmileBASIC,94 84字节

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

1

Gema,67个字符

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

样品运行:

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个字符

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

无聊的。有史以来最笨拙的方法,但是很短。

样品运行:

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字节

解:

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

例子:

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"

说明:

创建一个颜色字典=>下一个颜色,输入是字典的键:

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

奖金:

这是53个字节的K4:

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


1

sed,72个字节

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

在线尝试

范例1:

输入:

Red
Orange
Yellow
Green
Blue
Indigo
Violet

输出:

Orange
Yellow
Green
Blue
Indigo
Violet
Red

范例2:

输入:

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

输出:

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

欢迎光临本站!您能否提供一个在线解释器的链接,例如“ 在线试用”!在哪里可以测试此解决方案?
Caird coinheringaahing

@cairdcoinheringaahing:嗨,非常感谢您的欢迎和网站推荐!我已经通过指向页面的链接更新了我的答案,您可以在该页面上在线测试代码。
lucasb
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.