Пальто багатьох кольорів


22

Виклик

Давши список унікальних назв кольорів як вхідних даних, відсортуйте їх у тому порядку, в якому вони вперше з’являються у «Дивовижному технічному кольорі сонника Джозефа» .


Приклад

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

Правила

  • Ви можете брати інформацію будь-яким розумним, зручним способом (наприклад, масивом рядків, розділеною рядком, окремими рядками), якщо це дозволено нашими стандартними правилами вводу / виводу. , але, будь ласка, вкажіть у своїй відповіді спосіб введення.
  • Ви можете зробити те ж саме для свого результату.
  • Вхід буде містити лише кольори з наведеного вище списку.
  • Ваше рішення повинно мати можливість обробляти порожні входи.
  • Ви можете вибрати, чи всі слова на вході послідовно великими, малими чи титульними літерами, але корпус виводу повинен бути відповідати вводу.
  • Це тому найнижча кількість байтів у кожній мові виграє.
  • Як завжди, стандартні лазівки заборонені.

Тестові кейси

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 місяців!)
Shaggy

Відповіді:


11

PowerShell , 262 155 151 127 125 95 байт

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

Спробуйте в Інтернеті!

Наївний підхід. PowerShell sort-objectможе сортувати на основі блоку скриптів, який виконується для кожного об'єкта. Тут ми просто отримуємо .IndexOf()колір із рядка, який присвоює числове значення кожному кольорові, а потім сортує на основі цих чисел. Рядок побудований з четвертої та першої літер кожного кольору, щоб забезпечити унікальність. Вихід неявний.

-4 байти завдяки Шаггі.
-2 байти завдяки маззі.
Цілих -30 байт завдяки KGlasier.


Я не знаю, чи можна було б це зробити ефективно (у байтах), але якщо ви сортуєте по 3 підрядках і потім сортуєте за вторинним ключем початкового рядка, єдине зіткнення green greyполягає в правильному алфавітному порядку.
HyperNeutrino

2
@Shaggy Так, це працює, тому що .IndexOf()повернеться, -1якщо рядок не буде знайдено, що redвпорядкує правильне впорядкування. Спасибі!
AdmBorkBork

Я думаю, ви можете зняти дужки навколо рядка.
маззи

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

Спробуйте в Інтернеті!


Я вже бачив (і був вражений) такими рішеннями на основі хешу. Чи є де-небудь пояснення, як створюються магічні значення рядка / множника / мода? Це просто груба сила, поки ви не знайдете набір значень, який дає унікальний вихід для кожного з можливих кольорових вводів, або є більш розумний підхід?
Джек Браунштейн

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; ,попереджує його до перестановки. Тоді, c ompute Jelly's 391695582- го хеш-функцію , відображаючи отримані на цілі числа перестановки.

Чарівну константу 391695582 знайшли утиліти Джеллі .

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 відрах, але для кодування потрібен ще один байт. Використання верхнього регістру (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)))

Спробуйте в Інтернеті!

Кожен колір читається як базовий-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"$_*"}відображає масив рядків в масив булевих. Де Trueозначає, що "кольорова мітка починається з цього рядка" (наприклад, нечутливий до регістру оператор, csplit - чутливий до регістру. Див. Doc ).

  4. sort{}сортує кольорові позначки за масивами булевих у порядку зростання .

Сортування за масивом - дуже цікава особливість у Powershell. У цьому сценарії всі масиви мають однакову довжину і містять лише булеві значення. Це сортування проводиться в лексографічному порядку булевих масивів.

Тому рядок може містити однолітерні абревіатури для останніх міток. Якщо на початку масиву є відповідність, збіги в кінці не мають ефекту.

       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

Де Tє trueі -є 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помилка. Вибачте.
маззи

1
Додано переглянуте TIO для вас.
Кудлатий

1
Сьогодні мені вдалося отримати новий IP для TIO. Це все ще заблоковано для вас?
Денніс

Воно живе!!! Класно! І спасибі!
маззи

3

Я покращую стиснення струни через деякий час

Japt , 88 78 71 байт

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

Спробуйте в Інтернеті!


Швидкий порт одного з інших рішень тут входить в 46 байт, якщо ви хочете спробувати його.
Кудлатий

@Shaggy Я не думаю, що вони вже намагаються цього зробити: P
ASCII

3

Мова Вольфрама 255 213 199 байт

Чотирнадцять байтів врятував Денніс, який уникав знаків ", використовуючи символи замість рядків.

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

Пітон 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") у рядку ідентифікатора та зберігає максимальний індекс. "червоний" завжди є першим, anf find () повертає -1 для відсутніх матчів, тому для червоного немає ідентифікатора конкретно.

Після того, як кольори перетворяться на (вказівні, кольорові) пари, сортують масив по першому елементу пари, а потім відкидають перший елемент кожної пари.


2

Python 3 , 130 байт

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

Спробуйте в Інтернеті!


@Shaggy Я так не думаю? ви можете дати мені введення та запланований вихід
HyperNeutrino

@AdmBorkBork Спасибі, щойно зрозумів, що мав на увазі Шаггі. Я порівнював лише зелений і сірий один з одним,
хай

Щоб додати коментарі Shaggy та AdmBorkBork, "зелений" та "сірий" починаються з "gre".
DavidC

@Shaggy виправлено, я думаю
HyperNeutrino

1
@Shaggy Виправлено це, дякую. Потрібно трохи злому крему, оскільки caце підрядок ccaдля шоколадного уха.
HyperNeutrino

2

C # (Visual C # Interactive Compiler) , 321 219 210 161 159 138 байт

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

Спробуйте в Інтернеті!

-3 байти завдяки Shaggy, -18 завдяки TheLethalCoder

Приймає дані як а List<string>, повертаєIOrderedEnumerable<string>

Як це працює, це те, що він упорядковує список за індексом кожного рядка в початковому рядку. Оригінальний рядок має будь-який колір, за винятком сірого, зверненого до перших трьох літер. Сірого немає, оскільки зелений та сірий викликали б неоднозначність. Червоного також немає, оскільки IndexOfповертається -1, якщо рядок не відображається.

Коротша версія, що приймає IOrderedEnumerable як вхід, 137 байт

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

Користується тим, що ThenByна 1 байт коротше OrderBy, але ThenByпрацює лише на IOrderedEnumerables.

Спробуйте в Інтернеті!


Я думаю , ви можете видалити redз вашого пошуку рядка і замінити 68з , 65щоб зберегти 3 байта. На моєму телефоні його ще не повністю перевірили.
Кудлатий

Ви можете використовувати рядок рядка з неявним поверненням для 142 байт. n=>n.OrderBy(a=>a!="grey"?"redyelgrebroscablaochperuboliviofawlilgolchomaucrecrisilrosazulemruspurwhipinorablu".IndexOf(a.Substring(0,3)):68);Однак, вам потрібно включити usings у свій байт, оскільки вони необхідні для запуску. Ви можете скористатися хитрістю простору імен, щоб скоротити необхідну кількість.
TheLethalCoder

Якщо я використовую хитрість простору імен, чи потрібно додати простір імен до моєї кількості байтів?
Втілення Невідомості

Я можу просто змінити компілятор на Visual C # Interactive Compiler, і тоді мені не доведеться додавати вставки
Втілення Невідомості

Ну гарна ідея про зміну на Interactive, але так, якби ви зробили трюк простору імен, вам доведеться включити його до свого числа байтів. По суті додавання 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включає в себе li, silverвключає в себе ilі blackвключає в себе lac. fawnІ azureможе бути виявлений з допомогою лише одного листа, але це тут не допоможе.)


1

Піт, 66 байт

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

Спробуйте в Інтернеті тут або одразу підтвердіть усі тестові випадки тут .

Кольори у списку можна однозначно ідентифікувати, взявши символи в індексі 0та 3, припустивши модульну індексацію. Це призводить до наступного відображення:

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

Дивіться цей підказку 05AB1E (розділ Як стискати рядки, які не є частиною словника? ), Щоб зрозуміти, як .•Aå₂мÕh∊þèmvƶ\kΛ1YŠíJ>J#θ₁2©€,Ù{η¦ù-•це "rrylgebwsrbcorpcryovvlfnlagdccmvcacmsvrearlorsgyppwtpkonbe".

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.