Płaszcz w wielu kolorach

22

Wyzwanie

Biorąc pod uwagę listę unikalnych nazw kolorów jako danych wejściowych, posortuj je w kolejności, w jakiej pojawiają się w Amazing Amazing Technicolor Dreamcoat Josepha .


Przykład

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

Pełna lista kolorów, w kolejności, to:

 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

Lub jako tablica ciągów:

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

Zasady

  • Możesz przyjmować dane wejściowe za pomocą dowolnych rozsądnych i dogodnych środków (np. Tablica ciągów, łańcuch rozdzielany, pojedyncze łańcuchy), o ile jest to dozwolone przez nasze standardowe reguły We / Wy , ale proszę podać metodę wprowadzania w odpowiedzi.
  • Możesz zrobić to samo dla swoich wyników.
  • Dane wejściowe zawsze będą zawierały tylko kolory z powyższej listy.
  • Twoje rozwiązanie powinno obsługiwać puste dane wejściowe.
  • Możesz wybrać, czy wszystkie słowa na wejściu mają być konsekwentnie pisane wielkimi, małymi lub tytułowymi literami, ale obudowa twojego wyjścia musi pasować do twoich danych wejściowych.
  • To jest więc wygrywa najniższa liczba bajtów w każdym języku.
  • Jak zawsze standardowe luki są zabronione.

Przypadki testowe

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"]
Kudłaty
źródło
1
Piaskownica (trudno uwierzyć, że leżał tam już od 18 miesięcy!)
Kudłaty

Odpowiedzi:

11

PowerShell , 262 155 151 127 125 95 bajtów

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

Wypróbuj online!

Naiwne podejście. PowerShell sort-objectmoże sortować na podstawie bloku skryptu, który jest wykonywany dla każdego obiektu. Tutaj po prostu pobieramy .IndexOf()kolor z łańcucha, który przypisze wartość liczbową do każdego koloru, a następnie sortuje na podstawie tych liczb. Ciąg składa się z czwartej i pierwszej litery każdego koloru, aby zapewnić wyjątkowość. Wynik jest niejawny.

-4 bajty dzięki Shaggy.
-2 bajty dzięki mazzy.
Ogromne -30 bajtów dzięki KGlasier.

AdmBorkBork
źródło
Nie wiem, czy można to zrobić efektywnie (bajtowo), ale jeśli sortujesz według długości 3 podciągów, a następnie sortujesz kluczem wtórnym oryginalnego łańcucha, jedyną kolizją jest green grey odpowiednia kolejność alfabetyczna.
HyperNeutrino,
2
@Shaggy Tak, to działa, ponieważ .IndexOf()zwróci, -1jeśli ciąg nie zostanie znaleziony, co posortuje redsię w odpowiedniej kolejności. Dzięki!
AdmBorkBork,
myślę, że możesz usunąć nawiasy wokół łańcucha.
mazzy
@mazzy Rzeczywiście, dzięki!
AdmBorkBork,
1
@KGlasier Wow, dzięki za znalezienie tego ciągu! To oszczędza wiele bajtów.
AdmBorkBork,
8

JavaScript (SpiderMonkey) ,  106 105  104 bajtów

„W razie wątpliwości po prostu zbierz krwawe dane”.

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

Wypróbuj online!

Arnauld
źródło
Widziałem (i byłem pod wrażeniem) takie rozwiązania oparte na haszowaniu. Czy jest jakieś wyjaśnienie, w jaki sposób generowane są wartości magicznego ciągu / mnożnika / modu? Czy to tylko brutalna siła, dopóki nie znajdziesz zestawu wartości, który daje unikalny efekt wyjściowy dla każdego z możliwych kolorów, czy też jest bardziej sprytne podejście?
Jack Brounstein,
1
@JackBrounstein To było po prostu szybkie i brudne wyszukiwanie brutalnej siły, próbujące losowych wartości i minimalizujące tylko maksymalną wydajność (po ostatnim modulo), bez uwzględnienia długości pełnego łańcucha (np. %99%55Nie jest lepsze niż %123%55przy takim podejściu). To z pewnością nie jest optymalne. Jednak później mogę spróbować czegoś nieco bardziej wyrafinowanego.
Arnauld,
6

Galaretka , 28 bajtów

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

Wypróbuj online!

Jak to działa

µzamienia wszystko w lewo w monadyczny łańcuch, który Þodwzorowuje tablicę wejściową i sortuje dane wejściowe zgodnie z wygenerowanymi wartościami.

“½Ṗ©cƘʂẒẹMMỤẓHP’ ustawia wartość zwracaną na 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’daje 391695582; ,dodaje to do permutacji. Następnie oblicz 39- funkcję hashową Jelly 391695582 , mapując powstałe wiadra na liczby całkowite permutacji.

Stała magiczna 391695582 została znaleziona przez narzędzia 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
źródło
1
353690280752 miesza 29 kolorów w 29 segmentach, ale kodowanie wymaga jeszcze jednego bajtu. Używanie wielkich liter (332849952364) lub titlecase (862442225888) również pojawia się przy 28 bajtach.
Dennis,
5

Python 3 , 93 bajty

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

Wypróbuj online!

Czyta każdy kolor jako bazę-36 int. Brute zmusił moduły i wybrał dowolne przesunięcie spośród 19, które nie wymagało ucieczek.

attinat
źródło
4

PowerShell, 124 120 124 119 118 102 bajtów

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

Wypróbuj online!

Wyjaśnienie:

  1. Ciąg danych zawiera pierwsze znaczące litery kolorowych etykiet w porządku malejącym. Z wyjątkiem Greyetykiety - G*yjest krótszy.

  2. -csplit'(?=[A-Z])' dzieli ciąg danych na tablicę (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"$_*"}odwzorowuje tablicę ciągów na tablicę boolean. Gdzie Trueoznacza „etykieta koloru zaczyna się od tego ciągu” (podobnie jak operator bez rozróżniania wielkości liter, csplit - rozróżnia małe i wielkie litery. Patrz dokument ).

  4. sort{}sortuje kolor lables według tablic boolean w porządku rosnącym .

Sortowanie według tablicy jest bardzo interesującą funkcją Powershell. W tym skrypcie wszystkie tablice mają tę samą długość i zawierają tylko wartości logiczne. Sortowanie odbywa się w porządku leksykograficznym tablic boolowskich.

Dlatego ciąg może zawierać jednoliterowe skróty dla ostatnich etykiet. Jeśli istnieje dopasowanie na początku tablicy, dopasowania na końcu nie mają wpływu.

       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

Gdzie Tjest truei -jest false.


Skrypt testowy:

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

Wydajność:

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
źródło
Mam This site can’t be reachedbłąd Przepraszam.
mazzy
1
Dodano dla Ciebie poprawione TIO.
Kudłaty
1
Udało mi się dzisiaj uzyskać nowe IP dla TIO. Czy nadal jest dla ciebie zablokowany?
Dennis
To żyje!!! Fajne! I dzięki!
mazzy
3

Za chwilę poprawię kompresję łańcucha

Japt , 88 78 71 bajtów

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

Wypróbuj online!

Luis Felipe De Jesus Munoz
źródło
Szybki port jednego z pozostałych rozwiązań ma 46 bajtów, jeśli chcesz spróbować.
Shaggy,
@Shaggy Nie sądzę, żeby już próbowali: P
tylko ASCII
3

Wolfram Language 255 213 199 bajtów

Czternaście bajtów zapisanych przez Dennisa, który unikał znaków „, używając symboli zamiast ciągów.

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

Wypróbuj online!

DavidC
źródło
2

Python 2 , 186 bajtów

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

Wypróbuj online!

Znajduje wszystkie dopasowania dla ciągów znaków progresywnych (np. „Zielony” sprawdzi, czy „g”, „gr”, „gre”, „gree” i „zielony”) w ciągu identyfikatora i zachowuje maksymalny indeks. „czerwony” jest zawsze pierwszy, anf find () zwraca -1 dla brakujących dopasowań, więc nie ma specjalnie identyfikatora dla czerwonego.

Po przekształceniu kolorów w pary (indeks, kolor) sortuje tablicę na pierwszym elemencie pary, a następnie odrzuca pierwszy element każdej pary.

Triggernometria
źródło
2

Python 3 , 130 bajtów

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

Wypróbuj online!

HyperNeutrino
źródło
@Shaggy Nie sądzę? czy możesz podać mi dane wejściowe i zamierzone dane wyjściowe
HyperNeutrino,
@AdmBorkBork Dzięki, właśnie zrozumiałem, co Kudłaty miał na myśli. Porównywałem tylko zielony i szary lol
HyperNeutrino,
Aby dodać do komentarzy Shaggy i AdmBorkBork, zarówno „zielony”, jak i „szary” zaczynają się od „gre”.
DavidC
@Shaggy naprawiono chyba
HyperNeutrino
1
@Shaggy Naprawiłem to, dzięki. Wymagało trochę włamania do śmietany, ponieważ cajest to podłoże ccado czekolady.
HyperNeutrino,
2

C # (interaktywny kompilator Visual C #) , 321 219 210 161 159 138 bajtów

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

Wypróbuj online!

-3 bajty dzięki Shaggy, -18 dzięki TheLethalCoder

Pobiera dane wejściowe jako List<string>, zwraca wartość anIOrderedEnumerable<string>

Działa to tak, że porządkuje listę według indeksu każdego łańcucha w oryginalnym ciągu. Oryginalny ciąg ma każdy kolor z wyjątkiem szarego zamienionego na pierwsze trzy litery. Nie ma szarego, ponieważ zielony i szary spowodowałby niejednoznaczność. Od tamtej pory nie ma też czerwonegoIndexOf zwraca -1, jeśli ciąg nie pojawi się.

Krótsza wersja przyjmująca jako dane wejściowe IOrdersEnumerable, 137 bajtów

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

Wykorzystuje fakt, że ThenByjest o 1 bajt krótszy niż OrderBy, ale ThenBydziała tylko na IOrderedEnumerables.

Wypróbuj online!

Wcielenie ignorancji
źródło
Myślę , że możesz usunąć redciąg wyszukiwania i zastąpić 68go, 65aby zapisać 3 bajty. Na moim telefonie nie przetestowałem go w pełni.
Shaggy,
Możesz użyć ciągu wbudowanego z niejawnym zwrotem dla 142 bajtów. n=>n.OrderBy(a=>a!="grey"?"redyelgrebroscablaochperuboliviofawlilgolchomaucrecrisilrosazulemruspurwhipinorablu".IndexOf(a.Substring(0,3)):68);Musisz jednak uwzględnić usingw swojej liczbie bajtów, ponieważ są one wymagane do uruchomienia. Możesz jednak użyć sztuczki przestrzeni nazw, aby skrócić wymaganą liczbę.
TheLethalCoder,
Jeśli używam sztuczki przestrzeni nazw, czy muszę dodać przestrzeń nazw do mojej liczby bajtów?
Embodiment of Ignorance,
Mogę po prostu zmienić kompilator na interaktywny kompilator Visual C #, a następnie nie będę musiał dodawać zastosowań
of Ignorance
Ach, dobry pomysł na zmianę na Interaktywną, ale tak, jeśli wykonałeś sztuczkę przestrzeni nazw, musisz ją uwzględnić w liczbie bajtów. Zasadniczo dodając namespace System.Linq{}lub cokolwiek byś wybrał.
TheLethalCoder,
1

Węgiel drzewny , 69 68 63 56 bajtów

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

Wypróbuj online!Link jest do pełnej wersji kodu. Wyjaśnienie:

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

Weź skompresowany ciąg edyeeebrscckhrpeubivvifa99gohomaamrisiosazemuseypuwhpiorlu i zapętl nad każdym podciągiem o długości 2.

Φθ№κ⎇Σιlilι

Dla każdego podłańcucha wypisz ciągi wejściowe zawierające ten podłańcuch, chyba że podłańcuch jest 99, w takim przypadku poszukaj lilzamiast niego. ( lilacjest jedynym kolorem, który nie ma unikatowego dwuliterowego podłańcucha; olivezawierali ; silverzawiera ili blackzawiera lac. fawni azuremożna go wykryć za pomocą tylko jednej litery, ale to nie pomaga tutaj).

Neil
źródło
1

Pyth, 66 bajtów

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

Wypróbuj online tutaj lub sprawdź jednocześnie wszystkie przypadki testowe tutaj .

Kolory na liście można jednoznacznie zidentyfikować, biorąc znaki za indeks 0i 3zakładając modułowe indeksowanie. Powoduje to następujące mapowanie:

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

Pełne wyjaśnienie:

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
źródło
1

05AB1E , 48 bajtów

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

Takie samo rozwiązanie jak większość innych odpowiedzi. Spróbuję później zagrać w golfa.

Wypróbuj online lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie:

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

Zobacz poradę 05AB1E (sekcja Jak kompresować ciągi znaków nie będące częścią słownika? ), Aby zrozumieć, jak .•Aå₂мÕh∊þèmvƶ\kΛ1YŠíJ>J#θ₁2©€,Ù{η¦ù-•to jest "rrylgebwsrbcorpcryovvlfnlagdccmvcacmsvrearlorsgyppwtpkonbe".

Kevin Cruijssen
źródło