多くの色のコート


22

チャレンジ

入力として一意の色名のリストを指定し、JosephのAmazing Technicolor Dreamcoatに最初に表示される順序で並べ替えます。


Input:  green, blue, red, brown
Output: red, green, brown, blue

色の完全なリストは、順番に次のとおりです。

 1. red
 2. yellow
 3. green
 4. brown
 5. scarlet
 6. black
 7. ochre
 8. peach
 9. ruby
10. olive
11. violet
12. fawn
13. lilac
14. gold
15. chocolate
16. mauve
17. cream
18. crimson
19. silver
20. rose
21. azure
22. lemon
23. russet
24. grey
25. purple
26. white
27. pink
28. orange
29. blue

または、文字列の配列として:

["red","yellow","green","brown","scarlet","black","ochre","peach","ruby","olive","violet","fawn","lilac","gold","chocolate","mauve","cream","crimson","silver","rose","azure","lemon","russet","grey","purple","white","pink","orange","blue"]

ルール

  • 標準のI / Oルールで許可されている限り、合理的で便利な手段(たとえば、文字列の配列、区切り文字列、個々の文字列)で入力を受け付けますが、回答で入力方法を指定してください。
  • 出力に対しても同じことができます。
  • 入力には、上記のリストの色のみが含まれます。
  • ソリューションは空の入力を処理できる必要があります。
  • 入力内のすべての単語が常に大文字、小文字、またはタイトルケースであるかどうかを選択できますが、出力の大文字と小文字は入力の大文字と一致する必要があります。
  • これはため、各言語で最も少ないバイト数が優先されます。
  • いつものように、標準的な抜け穴は禁止されています。

テストケース

Input:  []
Output: []

Input:  ["green", "blue", "red", "brown"]
Output: ["red", "green", "brown", "blue"]

Input:  ["gold", "grey", "green"]
Output: ["green", "gold", "grey"]

Input:  ["ruby","yellow","red","grey"]
Output: ["red", "yellow", "ruby", "grey"]

Input:  ["gold", "green", "fawn", "white", "azure", "rose", "black", "purple", "orange", "silver", "ruby", "blue", "lilac", "crimson", "pink", "cream", "lemon", "russet", "grey", "olive", "violet", "mauve", "chocolate", "yellow", "peach", "brown", "ochre", "scarlet", "red"]
Output: ["red", "yellow", "green", "brown", "scarlet", "black", "ochre", "peach", "ruby", "olive", "violet", "fawn", "lilac", "gold", "chocolate", "mauve", "cream", "crimson", "silver", "rose", "azure", "lemon", "russet", "grey", "purple", "white", "pink", "orange", "blue"]

1
サンドボックス(18か月間そこにあったとは信じ難い!)
シャギー

回答:


11

PowerShellの262の 155 151 127 125 95バイト

$args|sort{"rlyegwbrscbrocpyrvo lvnfaldgccvmacmcvseraolsrygpptwkpnoeb".indexof((-join$_[3,0]))}

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

素朴なアプローチ。PowerShell sort-objectは、すべてのオブジェクトに対して実行されるスクリプトブロックに基づいてソートできます。ここでは.IndexOf()、文字列から色を取得するだけです。これにより、各色に数値が割り当てられ、それらの数値に基づいて並べ替えられます。文字列は、一意性を確保するために、各色の4番目と1番目の文字から構成されます。出力は暗黙的です。

シャギーのおかげで-4バイト。
-2バイトはmazzyのおかげです。
KGlasierのおかげで、なんと-30バイトにもなります。


これを効率的に(バイト単位で)実行できるかどうかはわかりませんが、長さ3のサブストリングでソートし、元のストリングの2次キーでソートすると、唯一の衝突はgreen grey正しいアルファベット順です。
HyperNeutrino

2
@Shaggyはい、それは機能します。文字列が見つからない場合.IndexOf()に戻り、正しい順序に-1ソートredされるためです。ありがとう!
AdmBorkBork

文字列を囲む角かっこを削除できると思います。
mazzy

@mazzy確かに、ありがとう!
AdmBorkBork

1
@KGlasierうわー、その文字列を見つけてくれてありがとう!それは多くのバイトを節約します。
AdmBorkBork

8

JavaScript(SpiderMonkeyの) 106の105  104バイト

「疑わしいときは、流血の入力をハッシュするだけです。」

a=>a.sort((a,b)=>(g=s=>'i0008bar5dj60007f3001p09mseqg0hk40cnl2o'[parseInt(s,36)*50%257%170%40])(a)>g(b))

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


私はこのようなハッシュベースのソリューションを見てきました(そして感銘を受けました)。マジックストリング/乗数/ MOD値の生成方法についての説明はどこにありますか?可能なカラー入力のそれぞれに固有の出力を与える値のセットを見つけるまで、それは単に総当たり攻撃ですか、それとももっと賢いアプローチがありますか?
ジャックブラウンスタイン

1
@JackBrounsteinこれは、完全なチェーンの長さを考慮せずに、ランダム値を試し、(最後のモジュロの後の)最大出力のみを最小化する、迅速でダーティなブルートフォース検索でした(たとえば、このアプローチ%99%55よりも良くありません%123%55)。したがって、それは確かに次善の策です。ただし、後で少し洗練されたものを試すこともできます。
アルノー

6

ゼリー、28バイト

“½Ṗ©cƘʂẒẹMMỤẓHP’Œ?“ðÑþQ’,ḥµÞ

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

使い方

µ左側のすべてをモナド連鎖にÞ変換します。これは入力配列をマッピングし、生成された値に従って入力をソートします。

“½Ṗ©cƘʂẒẹMMỤẓHP’ 戻り値を176073885534954276199526358143331に設定します。

Œ?[20,28,15,3,5,26,18,16,8,30,4,25,2,21,22,11,24,1,23,10,29,12,17,27,14,9,6,13,7,19]

“ðÑþQ’391695582が得られます。,順列に追加します。次に、Jellyの391695582 番目のハッシュ関数を計算し、結果のバケットを置換の整数にマッピングします。

魔法の定数391695582はJellyのユーティリティによって発見されました。

dennis-home:utils$ time ./findhash 30 29 <<< '["red","yellow","green","brown","scarlet","black","ochre","peach","ruby","olive","violet","fawn","lilac","gold","chocolate","mauve","cream","crimson","silver","rose","azure","lemon","russet","grey","purple","white","pink","orange","blue"]'
391695582

real    0m2.058s
user    0m15.077s
sys     0m0.023s

1
353690280752は29個のバケットの29色をハッシュしますが、エンコードにもう1バイト必要です。大文字(332849952364)またはタイトルケース(862442225888)を使用しても28バイトで出力されます。
デニス

5

Python 3、93バイト

lambda r:sorted(r,key=lambda s:'iV^ZzwnFM@pYuOobXGAKyf[tUR]E'.find(chr(int(s,36)%127%60+64)))

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

各色をbase-36として読み取りますint。モジュラスをブルートフォースし、エスケープを必要としない19の中から任意のオフセットを選択しました。


4

PowerShellの、124の 120 124 119 118 102バイト

$args|sort{$c=$_
'bluOrPiWPuG*yRusLeARoSiCriCrMCGoLFVOlRuPOBlSBGYR'-csplit'(?=[A-Z])'|%{$c-like"$_*"}}

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

説明:

  1. データ文字列には、カラーラベルの最初の重要な文字が降順で含まれます。Greyラベルを除いて- G*y短いです。

  2. -csplit'(?=[A-Z])' データ文字列を配列に分割します (blu,Or,Pi,W,Pu,G*y,Rus,Le,A,Ro,Si,Cri,Cr,M,C,Go,L,F,V,Ol,Ru,P,O,Bl,S,B,G,Y,R)

  3. |%{$c-like"$_*"}文字列配列をブール値の配列にマップします。Where Trueは、「この文字列から始まる色ラベル」を意味します(大文字と小文字を区別しない演算子、csplit-大文字と小文字を区別します。docを参照)。

  4. sort{}ブール値の配列を昇順で並べて色ラベルを並べ替えます。

配列による並べ替えは、Powershellの非常に興味深い機能です。このスクリプトでは、すべての配列の長さが同じであり、ブール値のみが含まれています。このソートは、ブール配列の辞書順で実行されます。

したがって、文字列には最後のラベルの1文字の省略形を含めることができます。配列の先頭に一致がある場合、末尾の一致は効果がありません。

       blu Or Pi W Pu G*y Rus Le A Ro Si Cri Cr M C Go L F V Ol Ru P O Bl S B G Y R
green: -   -  -  - -  -   -   -  - -  -  -   -  - - -  - - - -  -  - - -  - - T - -
gold : -   -  -  - -  -   -   -  - -  -  -   -  - - T  - - - -  -  - - -  - - T - -
grey : -   -  -  - -  T   -   -  - -  -  -   -  - - -  - - - -  -  - - -  - - T - -

     : green < gold < grey

どこTtrueあり-ますかfalse


テストスクリプト:

$f = {

$args|sort{$c=$_
'bluOrPiWPuG*yRusLeARoSiCriCrMCGoLFVOlRuPOBlSBGYR'-csplit'(?=[A-Z])'|%{$c-like"$_*"}}

}

@(
    ,( @(), @() )
    ,( ('green', 'blue', 'red', 'brown'), ('red', 'green', 'brown', 'blue') )
    ,( ("gold", "grey", "green"), ("green", "gold", "grey") )
    ,( ("ruby","yellow","red","grey"), ("red", "yellow", "ruby", "grey") )
    ,( ("gold", "green", "fawn", "white", "azure", "rose", "black", "purple", "orange", "silver", "ruby", "blue", "lilac", "crimson", "pink", "cream", "lemon", "russet", "grey", "olive", "violet", "mauve", "chocolate", "yellow", "peach", "brown", "ochre", "scarlet", "red"),
       ("red", "yellow", "green", "brown", "scarlet", "black", "ochre", "peach", "ruby", "olive", "violet", "fawn", "lilac", "gold", "chocolate", "mauve", "cream", "crimson", "silver", "rose", "azure", "lemon", "russet", "grey", "purple", "white", "pink", "orange", "blue") )
) | % {
    $inp,$expected = $_
    $result = &$f @inp  # splatting
    "$("$result"-eq"$expected"): $result"
}

出力:

True:
True: red green brown blue
True: green gold grey
True: red yellow ruby grey
True: red yellow green brown scarlet black ochre peach ruby olive violet fawn lilac gold chocolate mauve cream crimson silver rose azure lemon
russet grey purple white pink orange blue

This site can’t be reachedエラーがあります。ごめんなさい。
mazzy

1
修正されたTIOが追加されました。
シャギー

1
今日、TIOの新しいIPを取得することができました。まだブロックされていますか?
デニス

生きてる!!!クール!ありがとう!
mazzy

3

しばらくして文字列の圧縮を改善します

Japt88 78 71バイト

ñ@`䊐âwrÒ.cÖ¨acru½ivo¤faØngoÒqauvœamsolv€osz¨e¶s gœrpl–tpˆ„g½u`bXé4 ¯3

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


試してみたい場合は、ここにある他のソリューションの1つの簡単な移植版が46バイトになります。
シャギー

@Shaggy私は彼らがもうそれを試みているとは思わない:P
ASCIIのみ

3

ウォルフラム言語255 213 199バイト

文字列の代わりに記号を使用して、 "マークを避けたデニスによって保存された14バイト。

SortBy[#,{yellow,green,brown,scarlet,black,ochre,peach,ruby,olive,violet,fawn,lilac,gold,chocolate,mauve,cream,crimson,silver,rose,azure,lemon,russet,grey,purple,white,pink,orange,blue}~Position~#&]&

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


2

Python 2、186バイト

lambda a:[y for x,y in sorted((max(" y gree br sc bla oc pe rub ol v f li go ch m cre cri si ro a le rus grey pu w pi or blu ".find(" %s "%c[:i+1])for i,j in enumerate(c)),c)for c in a)]

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

識別子文字列内のプログレッシブ文字の部分文字列(例: "green"は "g"、 "gr"、 "gre"、 "gree"、および "green"をチェックします)のすべての一致を検索し、最大インデックスを保持します。「red」は常に最初であり、anf find()は一致しない場合に-1を返すため、特にredの識別子はありません。

色が(インデックス、色)のペアに変換されると、ペアの最初のアイテムで配列をソートし、各ペアの最初のアイテムを破棄します。


2

Python 3、130バイト

lambda*a:sorted(a,key=lambda c:("r,ylgebwsrtbcorpcryovvlfnlagdccamvca cmnsvrearlorsgyppwtpkonbe".find(c[::3]+" "*(c=="cream")),c))

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


@Shaggyそうは思わない?あなたは私の入力と出力意図与えることができます
HyperNeutrino

@AdmBorkBorkありがとう、Shaggyの意味がわかりました。私は緑とグレーを互いに比較するだけでしたlol
HyperNeutrino

ShaggyとAdmBorkBorkのコメントに追加するには、「green」と「grey」は両方とも「gre」で始まります。
DavidC

@Shaggyが修正したと思う
HyperNeutrino

1
@Shaggy修正、ありがとう。チョコレートオブのcaサブストリングであるccaため、クリームのハックが少し必要です。
ハイパーニュートリノ

2

C#の(ビジュアルC#インタラクティブコンパイラ)321の 219 210 161 159 138バイト

n=>n.OrderBy(a=>a!="grey"?"yelgrebroscablaochperuboliviofawlilgolchomaucrecrisilrosazulemruspurwhipinorablu".IndexOf(a.Substring(0,3)):65)

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

シャギーのおかげで-3バイト、TheLethalCoderのおかげで-18

入力をaとして受け取りList<string>IOrderedEnumerable<string>

これがどのように機能するかは、元の文字列内の各文字列のインデックスでリストを並べ替えることです。元の文字列には、グレーを除くすべての色が最初の3文字になっています。緑と灰色はあいまいさを引き起こすため、灰色はありません。IndexOf文字列が表示されない場合は-1が返されるため、赤も存在しません。

入力としてIOrderedEnumerableを使用する短いバージョン、137バイト

n=>n.ThenBy(a=>a!="grey"?"yelgrebroscablaochperuboliviofawlilgolchomaucrecrisilrosazulemruspurwhipinorablu".IndexOf(a.Substring(0,3)):65)

事実を利用するThenByよりも1バイト短いですOrderByが、ThenByのみで動作しIOrderedEnumerableても、S。

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


ルックアップ文字列から削除してに置き換えて3バイト節約できると思います。私の電話では完全にテストしていません。red6865
シャギー

文字列をインラインで使用して、142バイトの暗黙的な戻り値を使用できます。n=>n.OrderBy(a=>a!="grey"?"redyelgrebroscablaochperuboliviofawlilgolchomaucrecrisilrosazulemruspurwhipinorablu".IndexOf(a.Substring(0,3)):68);ただし、実行に必要なため、usingバイトカウントにs を含める必要があります。ただし、名前空間のトリックを使用して、必要なカウントを短縮できます。
TheLethalCoder

名前空間のトリックを使用する場合、名前空間をバイト数に追加する必要がありますか?
無知の

私はただのVisual C#コンパイラインタラクティブにコンパイラを変更することができ、その後、私はusingsを追加する必要はありません
無知の実施の形態

インタラクティブに変更することをお勧めしますが、名前空間のトリックを行った場合は、バイトカウントに含める必要があります。基本的に追加するnamespace System.Linq{}か、選択したものは何でも。
TheLethalCoder

1

69 68 63 56バイト

F⪪”E$↥l∧_∧K⁰RY⸿h⊕ψVG⌕gbW⟧⁼″5/²H✳<◨A³?ω↗⊘‴⭆1”²Φθ№κ⎇Σιlilι

オンラインでお試しください!リンクは、コードの詳細バージョンです。説明:

F⪪”E$↥l∧_∧K⁰RY⸿h⊕ψVG⌕gbW⟧⁼″5/²H✳<◨A³?ω↗⊘‴⭆1”²

圧縮された文字列edyeeebrscckhrpeubivvifa99gohomaamrisiosazemuseypuwhpiorluを取得し、長さ2の各部分文字列をループします。

Φθ№κ⎇Σιlilι

部分文字列が99である場合を除き、部分文字列ごとに、その部分文字列を含む入力文字列を出力しますlil。(lilac独自の二文字はサブストリングがないだけの色であり、olive含まれlisilver含まilblackが含まlacfawnそしてazureただ一つの文字を使用して検出することができるが、それはここでは役に立ちません。)


1

Pyth、66 バイト

oxc."ayÇæ£ðÐ¥~@iF[2BÍÐ:Yë)^ksTTã"2s@LN,03

ここでオンライン試すか、ここですべてのテストケースを一度に確認してください

リスト中の色は、一意のインデックスで文字を取ることによって識別することができます03、モジュール式のインデックスを想定し。これにより、次のマッピングが行われます。

rr -> red
yl -> yellow
ge -> green
bw -> brown
sr -> scarlet
bc -> black
or -> ochre
pc -> peach
ry -> ruby
ov -> olive
vl -> violet
fn -> fawn
la -> lilac
gd -> gold
cc -> chocolate
mv -> mauve
ca -> cream
cm -> crimson
sv -> silver
re -> rose
ar -> azure
lo -> lemon
rs -> russet
gy -> grey
pp -> purple
wt -> white
pk -> pink
on -> orange
be -> blue

完全な説明:

oxc."..."2s@LN,03Q   Implicit: Q=eval(input())
                     Trailing Q inferred, dictionary string replaced with ... for brevity
o                Q   Order the elements of Q, as N, using:
              ,03      [0,3]
           @LN         Get the characters at the above indices in N
          s            Concatenate into a string
                         The above is result {1}
   ."..."              The compressed dictionary string
  c      2             Split into chunks of length 2
 x                     Get the index of {1} in the above
                       Implicit print of sorted list

1

05AB1E、48 バイト

Σ.•Aå₂мÕh∊þèmvƶ\kΛ1YŠíJ>J#θ₁2©€,Ù{η¦ù-•2ôy¬s3è«k

他のほとんどの回答と同じソリューション。後でここからゴルフをしようとします。

オンラインそれを試してみたり、すべてのテストケースを確認してください

説明:

Σ          # Sort the (implicit) input-list by:
 .•Aå₂мÕh∊þèmvƶ\kΛ1YŠíJ>J#θ₁2©€,Ù{η¦ù-•
           #  Push compressed string "rrylgebwsrbcorpcryovvlfnlagdccmvcacmsvrearlorsgyppwtpkonbe"
  2ô       #  Split into parts of size 2
 y         #  Push the current string of the list we're sorting
  ¬        #  Push its head (without popping)
   s       #  Swap so the string is at the top of the stack again
    3è     #  Get the character at index 3 (with automatic wraparound)
      «    #  Merge both characters together
       k   #  And get the index in the compressed string to sort on

方法を理解するに.•Aå₂мÕh∊þèmvƶ\kΛ1YŠíJ>J#θ₁2©€,Ù{η¦ù-•この05AB1Eのヒント(辞書の一部ではない文字列を圧縮する方法参照してください"rrylgebwsrbcorpcryovvlfnlagdccmvcacmsvrearlorsgyppwtpkonbe"

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