Lambang Beragam Warna

22

Tantangan

Diberikan daftar nama warna unik sebagai input, urutkan mereka dalam urutan yang pertama kali muncul di Amazing Technicolor Dreamcoat Joseph .


Contoh

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

Daftar lengkap warna, secara berurutan, adalah:

 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

Atau sebagai array string:

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

Aturan

  • Anda dapat mengambil input dengan cara yang masuk akal dan nyaman (misalnya, serangkaian string, string yang dibatasi, string individual) selama diizinkan oleh aturan I / O standar kami , tetapi harap tentukan metode input Anda dalam jawaban Anda.
  • Anda dapat melakukan hal yang sama untuk output Anda.
  • Input hanya akan berisi warna dari daftar di atas.
  • Solusi Anda harus dapat menangani input kosong.
  • Anda dapat memilih apakah semua kata dalam input secara konsisten adalah huruf besar, huruf kecil atau judul huruf tetapi casing output Anda harus cocok dengan input Anda.
  • Ini adalah sehingga jumlah byte terendah dalam setiap bahasa menang.
  • Seperti biasa, lubang standar dilarang.

Uji kasus

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"]
Shaggy
sumber
1
Sandbox (sulit dipercaya sudah mendekam di sana selama 18 bulan!)
Shaggy

Jawaban:

11

PowerShell , 262 155 151 127 125 95 byte

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

Cobalah online!

Pendekatan naif. PowerShell sort-objectdapat mengurutkan berdasarkan blok skrip yang dijalankan untuk setiap objek. Di sini kita hanya mendapatkan .IndexOf()warna dari string, yang akan menetapkan nilai numerik untuk setiap warna, dan kemudian mengurutkan berdasarkan angka-angka itu. String dibuat dari huruf keempat dan pertama dari setiap warna untuk memastikan keunikan. Output tersirat.

-4 byte terima kasih kepada Shaggy.
-2 byte berkat mazzy.
-30 Bytes kekalahan berkat KGlasier.

AdmBorkBork
sumber
Saya tidak tahu apakah Anda bisa melakukan ini secara efisien (byte-wise), tetapi jika Anda mengurutkan berdasarkan panjang 3 substring dan kemudian mengurutkan dengan kunci sekunder dari string asli, satu-satunya tabrakan adalah green greyyang berada dalam urutan abjad yang tepat.
HyperNeutrino
2
@ Shaggy Ya, itu berhasil karena .IndexOf()akan kembali -1jika string tidak ditemukan, yang mana redyang sesuai dengan urutan yang benar. Terima kasih!
AdmBorkBork
saya pikir Anda dapat menghapus tanda kurung di sekitar string.
mazzy
@ Mazzy Memang, terima kasih!
AdmBorkBork
1
@ KGlasier Wow, terima kasih telah menemukan string itu! Itu menghemat banyak byte.
AdmBorkBork
8

JavaScript (SpiderMonkey) ,  106 105  104 byte

"Ketika ragu, hanya perlu masukan berdarah."

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

Cobalah online!

Arnauld
sumber
Saya telah melihat (dan terkesan oleh) solusi berbasis hash seperti ini sebelumnya. Apakah ada penjelasan di mana saja tentang bagaimana nilai-nilai string / pengali / mod ajaib dihasilkan? Apakah ini hanya kekerasan sampai Anda menemukan satu set nilai yang memberikan output unik untuk masing-masing input warna yang mungkin, atau apakah ada pendekatan yang lebih pintar?
Jack Brounstein
1
@JackBrounstein Yang ini hanya pencarian brute force yang cepat dan kotor mencoba nilai acak dan meminimalkan hanya output maksimum (setelah modulo terakhir), tanpa memperhitungkan panjang rantai penuh ke akun (mis. %99%55Tidak lebih baik daripada %123%55dengan pendekatan ini). Jadi sudah pasti kurang optimal. Saya mungkin akan mencoba sesuatu yang sedikit lebih canggih nantinya.
Arnauld
6

Jelly , 28 byte

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

Cobalah online!

Bagaimana itu bekerja

µmengubah segalanya ke kiri menjadi rantai monadik, yang Þmemetakan array input dan mengurutkan input sesuai dengan nilai yang dihasilkan.

“½Ṗ©cƘʂẒẹMMỤẓHP’ menetapkan nilai kembali ke 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’hasil 391695582; ,menambahkannya ke permutasi. Kemudian, komputasi fungsi hash Jelly 391695582 ke-3 , memetakan ember yang dihasilkan ke bilangan bulat permutasi.

Konstanta ajaib 391695582 ditemukan oleh utilitas 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
Dennis
sumber
1
353690280752 hash 29 warna dalam 29 ember, tetapi membutuhkan satu byte lagi untuk menyandikan. Menggunakan huruf besar (332849952364) atau titlecase (862442225888) juga keluar pada 28 byte.
Dennis
5

Python 3 , 93 byte

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

Cobalah online!

Membaca setiap warna sebagai basis-36 int. Brute memaksa moduli dan memilih offset acak di antara 19 yang tidak membutuhkan pelarian.

attinat
sumber
4

Powershell, 124 120 124 119 118 102 byte

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

Cobalah secara Online!

Penjelasan:

  1. String data berisi huruf signifikan pertama dari label warna dalam urutan menurun. Kecuali untuk Greylabel - G*ylebih pendek.

  2. -csplit'(?=[A-Z])' memisahkan string data ke array (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"$_*"}memetakan array string ke array boolean. Di mana Trueberarti "label warna dimulai dari string ini" (seperti operator yang case-sensitive, csplit - case-sensitive. Lihat doc ).

  4. sort{}mengurutkan tabel warna dengan array boolean dalam urutan menaik .

Penyortiran menurut array adalah fitur yang sangat menarik di Powershell. Dalam skrip ini semua array memiliki panjang yang sama dan hanya berisi nilai Boolean. Penyortiran ini dilakukan dalam urutan leksografis dari array boolean.

Oleh karena itu, string dapat berisi singkatan satu huruf untuk label terakhir. Jika ada kecocokan di awal array, kecocokan di akhir tidak berpengaruh.

       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

Di mana Tadalah truedan -adalah false.


Skrip uji:

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

Keluaran:

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
mazzy
sumber
Saya memiliki This site can’t be reachedkesalahan. Maaf.
mazzy
1
Menambahkan TIO yang direvisi untuk Anda.
Shaggy
1
Saya sudah berhasil mendapatkan IP baru untuk TIO hari ini. Apakah masih diblokir untuk Anda?
Dennis
Ini hidup!!! Keren! Dan terimakasih!
mazzy
3

Saya akan meningkatkan kompresi string dalam beberapa saat

Japt , 88 78 71 byte

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

Cobalah online!

Luis felipe De jesus Munoz
sumber
Port cepat dari salah satu solusi lain di sini datang pada 46 byte, jika Anda ingin mencobanya.
Shaggy
@ Shaggy Saya tidak berpikir mereka sedang mencoba untuk itu lagi: P
ASCII-satunya
3

Bahasa Wolfram 255 213 199 byte

Empat belas byte disimpan oleh Dennis, yang menghindari tanda "", menggunakan simbol bukan string.

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

Cobalah secara Online!

DavidC
sumber
2

Python 2 , 186 byte

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

Cobalah online!

Temukan semua kecocokan untuk substring karakter progresif (Contoh: "hijau" akan memeriksa "g", "gr", "gre", "gree", dan "green") dalam string pengidentifikasi, dan menyimpan indeks maksimum. "red" selalu yang pertama, dan jika menemukan () mengembalikan -1 untuk pertandingan yang hilang, jadi tidak ada pengidentifikasi untuk merah secara khusus.

Setelah warna berubah menjadi pasangan (indeks, warna), susun array pada item pertama dari pasangan dan kemudian buang item pertama dari setiap pasangan.

Triggernometri
sumber
2

Python 3 , 130 byte

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

Cobalah online!

HyperNeutrino
sumber
@ Shaggy, kurasa tidak? dapatkah Anda memberi saya input dan output yang diinginkan
HyperNeutrino
@ AdmBorkBork Terima kasih, baru menyadari apa yang dimaksud Shaggy dengan itu. Saya hanya membandingkan hijau dan abu-abu satu sama lain lol
HyperNeutrino
Untuk menambahkan komentar Shaggy dan AdmBorkBork, "hijau" dan "abu-abu" dimulai dengan "gre".
DavidC
@Shaggy memperbaiki saya pikir
HyperNeutrino
1
@ Shaggy Memperbaikinya, terima kasih. Diperlukan sedikit hack untuk krim karena camerupakan substrat ccauntuk cokelat.
HyperNeutrino
2

C # (Visual C # Interactive Compiler) , 321 219 210 161 159 138 byte

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

Cobalah online!

-3 byte terima kasih kepada Shaggy, -18 terima kasih kepada TheLethalCoder

Mengambil input sebagai List<string>, mengembalikan sebuahIOrderedEnumerable<string>

Cara kerjanya adalah bahwa ia memesan daftar dengan indeks masing-masing string di string asli. String asli memiliki setiap warna kecuali abu-abu berubah menjadi tiga huruf pertama. Abu-abu tidak ada di sana, karena hijau dan abu-abu akan menyebabkan ambiguitas. Merah juga tidak ada, karena IndexOfmengembalikan -1 jika string tidak muncul.

Versi lebih pendek mengambil IOrderedEnumerable sebagai input, 137 byte

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

Mengambil keuntungan dari fakta bahwa ThenBy1 byte lebih pendek dari OrderBy, tetapi ThenByhanya beroperasi pada IOrderedEnumerables.

Cobalah online!

Perwujudan Ketidaktahuan
sumber
Saya pikir Anda dapat menghapus reddari string pencarian Anda dan ganti 68dengan 65untuk menghemat 3 byte. Di ponsel saya jadi belum sepenuhnya mengujinya.
Shaggy
Anda dapat menggunakan string sebaris dengan pengembalian implisit untuk 142 byte n=>n.OrderBy(a=>a!="grey"?"redyelgrebroscablaochperuboliviofawlilgolchomaucrecrisilrosazulemruspurwhipinorablu".IndexOf(a.Substring(0,3)):68);Namun, Anda harus memasukkan usings dalam jumlah byte Anda karena mereka harus dijalankan. Anda dapat menggunakan trik namespace untuk mempersingkat penghitungan yang diperlukan.
TheLethalCoder
Jika saya menggunakan trik namespace, apakah saya harus menambahkan namespace ke jumlah byte saya?
Perwujudan Ketidaktahuan
Aku hanya bisa mengubah compiler untuk Visual C # Interaktif Compiler, dan kemudian saya tidak perlu menambahkan usings
Perwujudan Ketidaktahuan
Ah ide bagus untuk mengubah ke Interaktif tetapi ya jika Anda melakukan trik namespace Anda harus memasukkannya dalam jumlah byte Anda. Pada dasarnya menambahkan namespace System.Linq{}atau apa pun yang Anda pilih.
TheLethalCoder
1

Arang , 69 68 63 56 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

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

Ambil string yang dikompresi edyeeebrscckhrpeubivvifa99gohomaamrisiosazemuseypuwhpiorludan lilitkan setiap substring dengan panjang 2.

Φθ№κ⎇Σιlilι

Untuk setiap substring, cetak string input yang berisi substring itu, kecuali jika substring itu 99, dalam hal ini yang dicari lil. ( lilacadalah satu-satunya warna yang tidak memiliki substring dua huruf yang unik; olivetermasuk li; silvertermasuk ildan blacktermasuk lac. fawndan azuredapat dideteksi hanya dengan menggunakan satu huruf, tetapi itu tidak membantu di sini.)

Neil
sumber
1

Pyth, 66 byte

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

Coba online di sini , atau verifikasi semua uji sekaligus di sini .

Warna dalam daftar dapat diidentifikasi secara unik dengan mengambil karakter pada indeks 0dan 3, dengan asumsi pengindeksan modular. Ini menghasilkan pemetaan berikut:

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

Penjelasan lengkap:

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
Sok
sumber
1

05AB1E , 48 byte

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

Solusi yang sama dengan sebagian besar jawaban lainnya. Akan mencoba golf turun dari sini nanti.

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

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

Lihat ini ujung 05AB1E (bagian Cara string kompres bukan bagian dari kamus? ) Untuk memahami bagaimana .•Aå₂мÕh∊þèmvƶ\kΛ1YŠíJ>J#θ₁2©€,Ù{η¦ù-•ini "rrylgebwsrbcorpcryovvlfnlagdccmvcacmsvrearlorsgyppwtpkonbe".

Kevin Cruijssen
sumber