次の色


20

チャレンジ

虹をの文字列で表される7色として考えてください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
「少なくとも1つのサンプルの入力と出力を提供します。入力がどのように見えるべきかについてのあなた自身の説明と一致することを確認してください。」自分のチャレンジポストについて説明していますか?または、これはソリューションの要件ですか?
再帰的

6
小文字の色は大丈夫ですか?
エミグナ

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

回答:


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"場合、この関数はまず/Red(.[a-z]*)/文字列に一致するRegExp を構築し'RedOrangeYellowGreenBlueIndigoVioletRed'、最初のキャプチャ結果を返します。


入力「バイオレット」の結果はどうなりますか?私はあなたがテキストに変更する必要がありますね'RedOrangeYellowGreenBlueIndigoVioletRed'か何か
オリヴィエ・グレゴワール

1
@OlivierGrégoireOK、追加されました。このルールは、回答が投稿された後に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

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周

このソリューションは興味深いのですが、最終的に仕様に準拠していません。回答に準拠バージョンを含めて、これを補遺として投稿してください。
デニス

%12ココナッツの解決策もありますが、もちろんこれはすてきです。
Weijun周

5

ルビー -n62 60バイト

-2 by Asone Tuhid。

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

オンラインでお試しください!

正規表現アプローチは、Rubyでも有望に見えます。しかし、グループをキャプチャして遊ぶのではなく、先読みを使用してマッチを直接印刷する短いソリューションに到達しました。先読みは後読みよりも1バイト安いため、色のリストは逆方向です。


非常に良い、-2バイト/#$_/補間)
アゾントゥヒド

4

、87バイト

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

オンラインでお試しください!


4
この言語が何であるか、コードがどのように機能するか、あるいはまったくコード化されているかどうかはわかりませんが、この課題に「赤」と呼ばれる言語を使用するためだけに+1があります。
msh210

@ msh210 Rebol(相対式ベースのオブジェクト言語)と密接に関連しています。言語は、コード、データ、およびメタデータを同じ方法で表します-ブロックは[]で示されます。現在のRedディストリビューションはわずか1.1 MBであり、コンソール/インターピーター、および異なるプラットフォームにクロスコンプライアできるコンパイラーが含まれています。私のコードは、さまざまな解決策を試して、できる限りすべてのスペースを削除したという意味でゴルフをしています。悪いことは、スペースがほぼどこでも区切り文字であるということです。すべての数式では、a:b + c(a = b + c)のように演算子の両側にスペースが必要です。
ガレンイワノフ

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バイト

9バイトを短縮してくれたLaikoniに感謝します!

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入力が文字列であるという要件のために、少なくとも、EqまたはShow同等性をテストするか、結果を表示するために導出する必要があります。



@ライコニうわー、それはクールだ、ありがとう!忘れたspan
クリスチャンルパスク

1
OPはにVioletラップRedする必要があることを明確にしたためRed、文字列の最後に再度追加する必要があります。
ライコニ

私は2番目のアイデアがとても好きです!しかし、succ Violet動作しませんEnum:(ラップアラウンドしないでくださいS
ბიმოを

@BMOまさに。そのバージョンを作成したとき、ラップアラウンドの要件を知りませんでした。
クリスチャンルパスク

3

網膜65 58バイト

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

オンラインでお試しください!

説明

$
(.[a-z]+)

(.[a-z]+)入力に追加することから始めて、入力色に一致する正規表現に変換し、直後にもう1色を正確に入力します(後者をキャプチャします)。

L$:`RedOrangeYellowGreenBlueIndigoVioletRed
$1

ここで:、ステージの入力を独自の正規表現と交換します。したがって、前の結果は正規表現になり、色のリストと照合されます。(単一の)一致は、最初のキャプチャグループ(つまり、サイクルの次の色)に置き換えられて返されます。プログラムの最後の出力は自動的に行われます。



ええ、ケビンの解決策を見た後、コメントを削除しました。セットアップし\1てターゲットにジャンプすることは多くのバイトを浪費します::-)
Ton Hospel

@TonHospelは何かを見つけました。:)
マーティン・エンダー

1
@KevinCruijssenデリミタなしのソリューションを求めているあなたとトンのおかげで、私は結局58バイトを見つけました。;)
マーティン・エンダー

3

Vim、59 56 53 52バイト

tshのおかげで-1バイト

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

1
2Iイエローグリーンブルーインディゴバイオレットレッドオレンジ<Esc> * wywVp
tsh

3

Java(JDK 10)、77バイト

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

オンラインでお試しください!

クレジット



@KevinCruijssenあなたが持っている素敵な正規表現のフー!
オリビエグレゴワール

1
区切り文字を個別の項目として保持する分割を探していたときに思い出しましたが、答えには区切り文字を先頭または末尾の部分として連結するオプションが含まれていたので、ここで役立つと思いました。:) ここに、先ほど説明した他の2つのオプションの先読み/後読みを含む回答があります。
ケビンクルーッセン

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が応答するまで待ちますが。
ライコニ

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

スタックス31 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

これを実行する


OK ...これらの言語が大好き=)
lolad

3
バイオレットの失敗->赤
Weijun Zhou

1
@WeijunZhou:このテストケースはこの送信に追加されまし
再帰的

1
@WeijunZhou:そのテストケースを修正し、1バイト削りました。
再帰的

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()インデックスが見つかった場合、組み込みには多くの色の名前が含まれています:)
ジュゼッペ

おっと、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 %

説明:call2番目の行には、パラメーターをコマンドに置き換えて評価し、set s=%s:Red =%パラメーターを含む文字列のプレフィックスを削除するなどの効果があります。3行目の置換により、すべてのスペースがステートメントの区切り文字とコメントに置き換えられます。これは、文字列置換が解析前に発生するため機能します。



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にその文字列を使用して、2つの文字列の配列を取得します。その2番目の文字列を取得し[1]、次に-split空白文字列を取得して文字列の配列を取得し、最初の[0].

たとえば、inputの"Yellow"場合、最初のステップの結果はになり@("Red Orange ", " Green Blue Indigo ... Indigo Violet ")ます。2番目のものを取得し、それを空白で分割し(空白を削除します)、その結果@("Green", "Blue", ... "Violet")[0]1つを取得すると、適切な次の文字列になります。


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.

There is no TIO for formula language so here's a couple of screenshots.

enter image description here

enter image description here

enter image description here



1

Kotlin, 73 bytes

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

Try it online!

Taking advantage of the fact that many colors are 6 characters, the ones that are not are prefixed with spaces to make them 6 characters long. Hopefully it's acceptable that some of the colors are outputted with spaces before them.
e.g. Red is " Red", Blue is " Blue"


1

SmileBASIC, 94 84 bytes

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

1

Gema, 67 characters

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

Sample run:

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 characters

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

Boring one. Dumbest approach ever, but quite short.

Sample run:

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 bytes

Solution:

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

Examples:

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"

Explanation:

Create a dictionary of colour => next colour, the input is the key to the dictionary:

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

It's 53 bytes in K4:

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


1

sed, 72 bytes

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

Try it Online

Example 1:

Input:

Red
Orange
Yellow
Green
Blue
Indigo
Violet

Output:

Orange
Yellow
Green
Blue
Indigo
Violet
Red

Example 2:

Input:

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

Output:

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.