Áo khoác nhiều màu


22

Thử thách

Đưa ra một danh sách các tên màu độc đáo làm đầu vào, sắp xếp chúng theo thứ tự xuất hiện lần đầu tiên trong Áo choàng công nghệ tuyệt vời của Joseph .


Thí dụ

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

Danh sách đầy đủ các màu, theo thứ tự, là:

 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

Hoặc như một chuỗi các chuỗi:

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

Quy tắc

  • Bạn có thể nhận đầu vào bằng bất kỳ phương tiện hợp lý, thuận tiện nào (ví dụ: một chuỗi các chuỗi, một chuỗi được phân tách, các chuỗi riêng lẻ) miễn là được phép theo quy tắc I / O tiêu chuẩn của chúng tôi , nhưng vui lòng chỉ định phương thức nhập của bạn trong câu trả lời của bạn.
  • Bạn có thể làm tương tự cho đầu ra của bạn.
  • Đầu vào sẽ chỉ bao gồm các màu từ danh sách trên.
  • Giải pháp của bạn sẽ có thể xử lý đầu vào trống.
  • Bạn có thể chọn xem tất cả các từ trong đầu vào có phải là chữ hoa, chữ thường hoặc trường hợp tiêu đề hay không nhưng vỏ của đầu ra phải khớp với đầu vào của bạn.
  • Đây là vì vậy số byte thấp nhất trong mỗi ngôn ngữ sẽ thắng.
  • Như mọi khi, sơ hở tiêu chuẩn bị cấm.

Các trường hợp thử nghiệm

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 (khó có thể tin rằng nó đã mòn mỏi ở đó trong 18 tháng!)
Shaggy

Câu trả lời:


11

PowerShell , 262 155 151 127 125 95 byte

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

Hãy thử trực tuyến!

Cách tiếp cận ngây thơ. PowerShell sort-objectcó thể sắp xếp dựa trên một khối tập lệnh được thực thi cho mọi đối tượng. Ở đây chúng ta chỉ cần lấy .IndexOf()màu từ một chuỗi, sẽ gán giá trị bằng số cho mỗi màu, sau đó sắp xếp dựa trên các số đó. Chuỗi được xây dựng từ các chữ cái thứ tư và đầu tiên của mỗi màu để đảm bảo tính duy nhất. Đầu ra là ẩn.

-4 byte nhờ Shaggy.
-2 byte nhờ mazzy.
Một con số khổng lồ -30 byte nhờ KGlasier.


Tôi không biết liệu bạn có thể làm điều này một cách hiệu quả không (byte-khôn ngoan), nhưng nếu bạn sắp xếp theo chiều dài 3 chuỗi con và sau đó sắp xếp với khóa phụ của chuỗi gốc, thì xung đột duy nhất green greylà theo đúng thứ tự bảng chữ cái.
HyperNeutrino

2
@Shaggy Có, điều đó hoạt động vì .IndexOf()sẽ trả về -1nếu chuỗi không được tìm thấy, sắp xếp redtheo thứ tự đúng. Cảm ơn!
admBorkBork 19/12/18

tôi nghĩ rằng bạn có thể loại bỏ dấu ngoặc quanh một chuỗi.
mê mẩn

@mazzy Thật vậy, cảm ơn!
admBorkBork

1
@KGlasier Wow, cảm ơn vì đã tìm ra chuỗi đó! Điều đó tiết kiệm rất nhiều byte.
admBorkBork

8

JavaScript (SpiderMonkey) ,  106 105  104 byte

"Khi nghi ngờ, chỉ cần băm đầu vào đẫm máu."

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

Hãy thử trực tuyến!


Tôi đã thấy (và bị ấn tượng bởi) các giải pháp dựa trên hàm băm như thế này trước đây. Có một lời giải thích ở bất cứ nơi nào về cách tạo ra các giá trị chuỗi / số nhân / mod ma thuật không? Có phải nó chỉ là vũ lực cho đến khi bạn tìm thấy một tập hợp các giá trị cung cấp một đầu ra duy nhất cho mỗi đầu vào màu có thể, hoặc có một cách tiếp cận thông minh hơn?
Jack Brounstein

1
@JackBrounstein Đây chỉ là một tìm kiếm vũ phu nhanh và bẩn khi thử các giá trị ngẫu nhiên và chỉ giảm thiểu sản lượng tối đa (sau modulo cuối cùng), mà không tính đến độ dài của chuỗi đầy đủ (ví dụ: %99%55không tốt hơn so %123%55với phương pháp này). Vì vậy, nó chắc chắn là tối ưu phụ. Tôi có thể thử một cái gì đó tinh vi hơn một chút sau đó, mặc dù.
Arnauld

6

Thạch , 28 byte

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

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

µbiến mọi thứ sang trái của nó thành một chuỗi đơn sắc, Þánh xạ qua mảng đầu vào và sắp xếp đầu vào theo các giá trị được tạo.

“½Ṗ©cƘʂẒẹMMỤẓHP’ đặt giá trị trả về là 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’sản lượng 391695582; ,chuẩn bị nó cho hoán vị. Sau đó, 391695582 c ompute Jelly của thứ hàm băm, lập bản đồ xô dẫn đến các số nguyên của hoán vị.

Hằng số ma thuật 391695582 được tìm thấy bởi các dụng cụ của 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 băm 29 màu trong 29 thùng, nhưng mất thêm một byte để mã hóa. Sử dụng chữ hoa (332849952364) hoặc titlecase (862442225888) cũng xuất hiện ở mức 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)))

Hãy thử trực tuyến!

Đọc từng màu như một cơ sở-36 int. Brute buộc các mô-đun và chọn một phần bù tùy ý trong số 19 không yêu cầu thoát.


4

Powershell, 124 120 124 119 118 102 byte

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

Dùng thử trực tuyến!

Giải trình:

  1. Chuỗi dữ liệu chứa các chữ cái có nghĩa đầu tiên của nhãn màu theo thứ tự giảm dần. Ngoại trừ Greynhãn - G*yngắn hơn.

  2. -csplit'(?=[A-Z])' chia chuỗi dữ liệu thành mảng (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"$_*"}ánh xạ mảng chuỗi sang mảng boolean. Trong đó Truecó nghĩa là "nhãn màu bắt đầu từ chuỗi này" (giống như toán tử không phân biệt chữ hoa chữ thường, csplit - phân biệt chữ hoa chữ thường. Xem tài liệu ).

  4. sort{} sắp xếp một lables màu bằng các mảng boolean trong theo thứ tự tăng dần .

Sắp xếp theo mảng là một tính năng rất thú vị trong Powershell. Trong kịch bản này, tất cả các mảng có cùng độ dài và chỉ chứa các giá trị Boolean. Sự sắp xếp này được thực hiện theo thứ tự từ vựng của mảng boolean.

Do đó, chuỗi có thể chứa các chữ viết tắt một chữ cái cho các nhãn cuối cùng. Nếu có một trận đấu ở đầu mảng, các trận đấu ở cuối không có hiệu lực.

       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

Trong trường hợp Ttrue-false .


Kịch bản thử nghiệm:

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

Đầu ra:

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

Tôi có This site can’t be reachedlỗi Lấy làm tiếc.
mê mẩn

1
Đã thêm một TIO sửa đổi cho bạn.
Xù xì

1
Tôi đã quản lý để có được một IP mới cho TIO ngày hôm nay. Nó vẫn bị chặn cho bạn?
Dennis

Nó còn sống!!! Mát mẻ! Và cảm ơn!
mê mẩn

3

Tôi sẽ cải thiện việc nén chuỗi trong một thời gian

Japt , 88 78 71 byte

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

Hãy thử trực tuyến!


Một cổng nhanh của một trong những giải pháp khác ở đây có 46 byte, nếu bạn muốn thử.
Xù xì

@Shaggy Tôi không nghĩ họ đang cố gắng nữa: P
ASCII - chỉ

3

Ngôn ngữ Wolfram 255 213 199 byte

Mười bốn byte được lưu bởi Dennis, người đã tránh các dấu ", sử dụng các ký hiệu thay vì các chuỗi.

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

Dùng thử trực tuyến!


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

Hãy thử trực tuyến!

Tìm tất cả các kết quả khớp cho các chuỗi ký tự lũy tiến (Ví dụ: "xanh" sẽ kiểm tra "g", "gr", "gre", "gree" và "xanh") trong chuỗi định danh và giữ chỉ số tối đa. "đỏ" luôn là đầu tiên, anf find () trả về -1 cho các kết quả bị thiếu, do đó không có định danh cụ thể cho màu đỏ.

Khi các màu được chuyển thành các cặp (chỉ mục, màu), sắp xếp mảng trên mục đầu tiên của cặp và sau đó loại bỏ mục đầu tiên của mỗi cặp.


2

Python 3 , 130 byte

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

Hãy thử trực tuyến!


@Shaggy Tôi không nghĩ vậy sao? bạn có thể cho tôi đầu vào và đầu ra dự định không
HyperNeutrino 19/12/18

@AdmBorkBork Cảm ơn, chỉ cần nhận ra Shaggy có nghĩa là gì. Tôi chỉ so sánh màu xanh lá cây và màu xám với nhau lol
HyperNeutrino

Để thêm vào nhận xét của Shaggy và admBorkBork, "xanh" và "xám" đều bắt đầu bằng "gre".
DavidC

@ Shaggy đã sửa tôi nghĩ
HyperNeutrino 19/12/18

1
@Shaggy Đã sửa nó, cảm ơn. Yêu cầu một chút hack cho kem kể từ khica là một chuỗi con của ccasô cô la oof.
HyperNeutrino

2

C # (Trình biên dịch tương tác Visual C #) , 321 219 210 161 159 138 byte

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

Hãy thử trực tuyến!

-3 byte nhờ Shaggy, -18 nhờ TheLethalCoder

Lấy đầu vào là một List<string> , trả về mộtIOrderedEnumerable<string>

Cách thức hoạt động này là nó sắp xếp danh sách theo từng chỉ mục của chuỗi trong chuỗi gốc. Chuỗi ban đầu có mọi màu ngoại trừ màu xám chuyển sang ba chữ cái đầu tiên. Màu xám không có ở đó, vì màu xanh lá cây và màu xám sẽ gây ra sự mơ hồ. Màu đỏ cũng không có, vìIndexOf trả về -1 nếu chuỗi không xuất hiện.

Phiên bản ngắn hơn lấy IOrderedEnumerable làm đầu vào, 137 byte

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

Tận dụng lợi thế của thực tế ThenBylà ngắn hơn 1 byte OrderBy, nhưng ThenBychỉ hoạt động trênIOrderedEnumerable s mặc dù.

Hãy thử trực tuyến!


Tôi nghĩ bạn có thể xóa redkhỏi chuỗi tra cứu của mình và thay thế 68bằng 65để lưu 3 byte. Trên điện thoại của tôi vì vậy chưa kiểm tra đầy đủ.
Xù xì

Bạn có thể sử dụng chuỗi nội tuyến với trả về ẩn cho 142 byte n=>n.OrderBy(a=>a!="grey"?"redyelgrebroscablaochperuboliviofawlilgolchomaucrecrisilrosazulemruspurwhipinorablu".IndexOf(a.Substring(0,3)):68);Tuy nhiên, bạn cần bao gồm usings trong số byte của mình vì chúng được yêu cầu để chạy. Bạn có thể sử dụng thủ thuật không gian tên để rút ngắn số lượng yêu cầu mặc dù.
TheLethalCoder

Nếu tôi sử dụng thủ thuật không gian tên, tôi có phải thêm không gian tên vào số byte của mình không?
Hiện thân của sự thiếu hiểu biết

Tôi chỉ có thể thay đổi trình biên dịch thành Trình biên dịch tương tác Visual C #, và sau đó tôi sẽ không phải thêm các ứng dụng
Hiện thân của sự thiếu hiểu biết

Ý tưởng hay về việc thay đổi thành Tương tác nhưng có nếu bạn đã thực hiện thủ thuật không gian tên mà bạn phải đưa nó vào số byte của mình. Chủ yếu thêm namespace System.Linq{}hoặc bất cứ điều gì bạn sẽ chọn.
TheLethalCoder

1

Than , 69 68 63 56 byte

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

Hãy thử trực tuyến!Liên kết là phiên bản dài dòng của mã. Giải trình:

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

Lấy chuỗi nén edyeeebrscckhrpeubivvifa99gohomaamrisiosazemuseypuwhpiorlu và lặp trên mỗi chuỗi con có độ dài 2.

Φθ№κ⎇Σιlilι

Đối với mỗi chuỗi con in các chuỗi đầu vào có chứa chuỗi con đó, trừ khi chuỗi con là 99, trong trường hợp đó hãy tìm lilthay thế. ( lilaclà màu duy nhất không có chuỗi con hai chữ cái duy nhất; olivebao gồm li;silver bao gồm ilblackbao gồm lac. fawnazurecó thể được phát hiện chỉ bằng một chữ cái duy nhất, nhưng điều đó không giúp ích ở đây.)


1

Bình thường, 66 byte

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

Dùng thử trực tuyến tại đây hoặc xác minh tất cả các trường hợp thử nghiệm cùng một lúc tại đây .

Màu sắc trong danh sách có thể được xác định duy nhất bằng cách lấy các ký tự ở chỉ mục 03giả sử lập chỉ mục mô-đun. Điều này dẫn đến ánh xạ sau:

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

Giải thích đầy đủ:

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 byte

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

Giải pháp tương tự như hầu hết các câu trả lời khác. Sẽ cố gắng đánh golf nó xuống từ đây sau.

Dùng thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình:

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

Xem mẹo 05AB1E này (phần Làm thế nào để chuỗi nén không nằm trong từ điển? ) Để hiểu thế nào .•Aå₂мÕh∊þèmvƶ\kΛ1YŠíJ>J#θ₁2©€,Ù{η¦ù-•"rrylgebwsrbcorpcryovvlfnlagdccmvcacmsvrearlorsgyppwtpkonbe".

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.