Birçok renk palto


22

Meydan okuma

Girdi olarak benzersiz renk adlarının bir listesi verildiğinde , onları ilk olarak Joseph'in Amazing Technicolor Dreamcoat'ta göründükleri sıraya göre sıralayın .


Örnek

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

Renklerin tam listesi, sırasıyla:

 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

Veya bir dizi dizge olarak:

["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"]

kurallar

  • Standart G / Ç kurallarımızın izin verdiği sürece herhangi bir makul, uygun yoldan (örneğin, bir dizi dize, ayrılmış bir dize, ayrı dizeler) girdi alabilirsiniz, ancak lütfen cevabınıza giriş yönteminizi belirtin.
  • Çıktınız için aynısını yapabilirsiniz.
  • Giriş yalnızca yukarıdaki listedeki renkleri içerecektir.
  • Çözümünüz boş girdilerle başa çıkabilmelidir.
  • Sen girdi tüm kelimeler büyük harf tutarlı olup olmadığını tercih edebilir, küçük harf veya harfler büyük ama çıktının muhafaza edilmelidir Girişinin maç.
  • Bu yani her dilde en düşük bayt sayısı kazanır.
  • Her zaman olduğu gibi standart boşluklar yasaktır.

Test durumları

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
Sandbox (18 aydır orada can sıkıcı olduğuna inanmak zor!)
Shaggy

Yanıtlar:


11

PowerShell , 262 155 151 127 125 95 bayt

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

Çevrimiçi deneyin!

Saf yaklaşım. PowerShell sort-object, her nesne için yürütülen bir komut dosyası bloğuna göre sıralama yapabilir. Burada .IndexOf()rengi sadece bir dizgeden alıyoruz , ki bu her renge sayısal bir değer atayacak ve sonra bu sayıları temel alarak sıralayacaktır. Dize, benzersizliği sağlamak için her rengin dördüncü ve ilk harflerinden yapılmıştır. Çıktı kapalı.

Shaggy sayesinde -4 bayt.
Mazzy sayesinde -2 bayt.
KGlasier sayesinde bir kuyruklu -30 bayt.


Bunu verimli bir şekilde yapabilir misiniz (baytlı), bilmiyorum, ancak uzunluğu 3 alt dizgiye göre sıralarsanız ve ardından orijinal dizginin ikincil anahtarıyla sıralarsanız, tek çarpışma green greydoğru alfabetik sıraya sahip olandır.
HyperNeutrino,

2
@Shaggy Evet, işler çünkü .IndexOf()dönecektir -1dize bulunmazsa, hangi tür reddoğru sipariş içine. Teşekkürler!
AdmBorkBork

Bir dize etrafında parantez kaldırabilirsiniz düşünüyorum.
mazzy

@mazzy Gerçekten de, teşekkürler!
AdmBorkBork

1
@KGlasier Vay, bu dizeyi bulduğun için teşekkürler! Bu çok fazla bayt kazandırır.
AdmBorkBork

8

JavaScript (SpiderMonkey) ,  106 105  104 bayt

"Şüphe duyduğunda, kanlı girişe sahip ol."

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

Çevrimiçi deneyin!


Daha önce de böyle karma tabanlı çözümler gördüm (ve etkilendim). Sihirli string / multiplier / mod değerlerinin nasıl üretildiğine dair bir açıklama var mı? Olası renk girişlerinin her biri için benzersiz bir çıktı veren bir değer kümesi bulana kadar kaba kuvvet mi yoksa daha zekice bir yaklaşım var mı?
Jack Brounstein

1
@JackBrounstein Bu, rastgele değerleri deneyen ve sadece maksimum çıktının en aza indirildiği (son modülodan sonra), tam zincirin uzunluğunu hesaba katmadan (örneğin bu yaklaşımdan %99%55daha iyi değil ) sadece hızlı ve kirli kaba kuvvet araştırmasıydı %123%55. Bu yüzden kesinlikle alt optimal. Yine de biraz daha karmaşık bir şey deneyebilirim.
Arnauld

6

Jöle , 28 bayt

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

Çevrimiçi deneyin!

Nasıl çalışır

µher şeyi soluna çevirir, bu Þgirdi dizisi üzerinde eşlenen ve girdiyi üretilen değerlere göre sıralayan monadik bir zincire dönüştürür .

“½Ṗ©cƘʂẒẹMMỤẓHP’ dönüş değerini 176073885534954276199526358143331 olarak ayarlar.

Œ?[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’verimler 391695582; ,onu permütasyona hazırlar. Daha sonra, Jelly'in 391695582 inci hash fonksiyonunu açın, ortaya çıkan kovaları permütasyonun tam sayılarına eşleyin .

Sihirli sabiti 391695582 tarafından bulundu Jelly utils .

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 rengi 29 kovada birleştiriyor, ancak kodlaması için bir bayt daha alıyor. Büyük harf (332849952364) veya titlecase (862442225888) kullanılması da 28 baytta çıkar.
Dennis,

5

Python 3 , 93 bayt

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

Çevrimiçi deneyin!

Her rengi bir baz-36 olarak okur int. Modulleri Kaba Zorla zorladı ve kaçmayı gerektirmeyen 19 arasında keyfi bir denge seçti.


4

Powershell, 124 120 124 119 118 102 bayt

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

Çevrimiçi Deneyin!

Açıklama:

  1. Veri dizgisi, renk etiketlerinin ilk önemli harflerini azalan sırayla içerir. GreyEtiket hariç - G*ydaha kısa.

  2. -csplit'(?=[A-Z])' veri dizesini diziye böler (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"$_*"}string dizisini boolean dizisine eşler. Nerede Truevasıta "Bu dize bir renk etiket başlar" (gibidir harf duyarsız operatörü, csplit -. Harfe duyarlı belgeye bakın ).

  4. sort{}Boole dizilerine göre artan sırayla renk etiketlerini sıralar .

Diziye göre sıralama, Powershell'de çok ilginç bir özelliktir. Bu komut dosyasında tüm diziler aynı uzunluktadır ve yalnızca Boolean değerleri içerir. Bu sıralama, boolean dizilerinin lenografik düzeninde yapılır.

Bu nedenle, dize son etiketler için tek harfli kısaltmalar içerebilir. Dizinin başında bir eşleşme varsa, sondaki eşleşmelerin hiçbir etkisi olmaz.

       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

Nerede Tolduğunu trueve -bir false.


Test komut dosyası:

$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"
}

Çıktı:

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

Ben This site can’t be reachedhata. Üzgünüm.
mazzy

1
Sizin için gözden geçirilmiş bir TIO eklendi.
Shaggy

1
Bugün TIO için yeni bir IP almayı başardım. Hala senin için engellenmiş mi?
Dennis,

Yaşıyor!!! Güzel! Ve teşekkürler!
mazzy

3

Bir süre sonra string sıkıştırmayı geliştiririm

Japt , 88 78 71 bayt

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

Çevrimiçi deneyin!


Denemek istiyorsanız, buradaki diğer çözümlerden birinin hızlı bir bağlantı noktası 46 baytta geliyor.
Shaggy

@Shaggy Artık bunun için çabaladıklarını sanmıyorum: P
ASCII-yalnızca

3

Wolfram Dili 255 213 199 bayt

Dennis tarafından kaydedilen on dört bayt, "işaretlerden ziyade, işaretler yerine semboller kullanarak.

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~#&]&

Çevrimiçi Deneyin!


2

Python 2 , 186 bayt

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

Çevrimiçi deneyin!

İlerici karakter alt dizgileri için tüm eşleşmeleri bulur (Ör: "yeşil", "g", "gr", "gre", "gree" ve "yeşil" öğelerini tanımlayıcı dizgide kontrol eder) ve maksimum dizini tutar. "kırmızı" her zaman önce, anf find () eksik eşleşmeler için -1 döndürür, bu nedenle özellikle kırmızı için tanımlayıcı yoktur.

Renkler (dizin, renk) çiftlere dönüştürüldüğünde, diziyi ilk çiftin öğesinde sıralar ve ardından her çiftin ilk öğesini atar.


2

Python 3 , 130 bayt

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

Çevrimiçi deneyin!


@Shaggy Sanmıyorum? Bana bir girdi ve amaçlanan çıktı verebilir misiniz
HyperNeutrino

@AdmBorkBork Teşekkürler, Shaggy’nin ne anlama geldiğini anladım. Sadece yeşil ve griyi birbirleriyle lol karşılaştırıyordum
HyperNeutrino

Shaggy ve AdmBorkBork'un yorumlarına eklemek için "yeşil" ve "gri" her ikisi de "gre" ile başlar.
DavidC

@Shaggy bence sabit
HyperNeutrino 19:18

1
@Shaggy Düzeltildi, teşekkürler. Çünkü krem için hack biraz Gerekli cade bir alt ccaçikolata oof için.
HyperNeutrino,

2

C # (Visual C # Etkileşimli Derleyici) , 321 219 210 161 159 138 bayt

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

Çevrimiçi deneyin!

Shaggy sayesinde -3 bayt, TheLethalCoder sayesinde -18

Girdiyi a olarak alır List<string>, dönerIOrderedEnumerable<string>

Bunun nasıl çalıştığı, listeyi orijinal dizedeki her dizenin indeksine göre sıralamasıdır. Orijinal dize, ilk üç harfe çevrilen gri dışındaki her renge sahiptir. Gri yoktur, çünkü yeşil ve gri belirsizliğe neden olur. Kırmızı da yok, çünkü IndexOfeğer dizge görünmezse -1 döndürür.

Giriş olarak IOrderedEnumerable alarak daha kısa sürüm, 137 bayt

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

ThenBy1 byte'tan daha kısa olan OrderBy, ancak ThenByyalnızca bunlarla çalıştığı gerçeğinden yararlanır IOrderedEnumerable.

Çevrimiçi deneyin!


Ben düşünüyorum Kaldırabileceğiniz redsizin arama dizesinden ve değiştirme 68ile 653 save bayt. Telefonumda tam olarak test etmedim.
Shaggy

Dize satır içi, 142 bayt için örtülü bir geri dönüş ile kullanabilirsiniz. n=>n.OrderBy(a=>a!="grey"?"redyelgrebroscablaochperuboliviofawlilgolchomaucrecrisilrosazulemruspurwhipinorablu".IndexOf(a.Substring(0,3)):68);Ancak, usings'leri çalıştırmak için gereken bayt sayınıza eklemeniz gerekir . Gerektiğinde sayımı kısaltmak için ad alanı numarasını kullanabilirsiniz .
TheLethalCoder

Ad alanı numarasını kullanırsam, ad alanını bayt sayısına eklemek zorunda mıyım?
Ignorance'ın

Sadece Visual C # Interactive derleyici derleyici değiştirebilir, sonra usings eklemek zorunda olmayacak
şekillenme Cahiliyye

Interactive'e geçmek için iyi bir fikir ama evet, eğer ad alanı numarasını yaptıysanız, bayt sayınıza dahil etmeniz gerekir. Temelde eklemek namespace System.Linq{}veya ne istersen.
TheLethalCoder

1

Kömür , 69 68 63 56 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Açıklama:

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

Sıkıştırılmış ipi alın ve edyeeebrscckhrpeubivvifa99gohomaamrisiosazemuseypuwhpiorluuzunluk 2'nin her bir alt halkası üzerinde döngü yapın.

Φθ№κ⎇Σιlilι

Her alt dize için, o alt diziyi içeren giriş dizgilerini, alt dizge olmadığı sürece, 99bu durumda lilbunun yerine arayın . ( lilacBenzersiz iki harfli alt dize sahip olmayan tek renktir; olivekapsamaktadır li; silveriçermektedir ilve blackkapsamaktadır lac. fawnVe azuresadece tek bir harf kullanılarak tespit edilebilir, ama bu burada yardım etmez.)


1

Pyth, 66 bayt

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

Online Deneyin burada ya bir kerede tüm test durumları doğrulamak burada .

Listedeki renkler, dizin içindeki karakterleri alarak 0ve 3modüler indeksleme varsayılarak benzersiz şekilde tanımlanabilir . Bu aşağıdaki haritalama ile sonuçlanır:

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

Tam açıklama:

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 bayt

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

Diğer cevapların çoğu ile aynı çözüm. Buradan sonra golf oynamaya çalışacağım.

Çevrimiçi deneyin veya tüm test durumlarını doğrulayın .

Açıklama:

Σ          # 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

Bunun nasıl .•Aå₂мÕh∊þèmvƶ\kΛ1YŠíJ>J#θ₁2©€,Ù{η¦ù-•olduğunu anlamak için bu 05AB1E ipucuna bakın (bölüm sözlükte olmayan dizeleri nasıl sıkıştırır? )"rrylgebwsrbcorpcryovvlfnlagdccmvcacmsvrearlorsgyppwtpkonbe" .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.