Wszyscy znamy różne fantazyjne algorytmy sortowania, ale żaden z nich nie podaje liczb w sposób łatwy do wymówienia. Aby temu zaradzić, proponuję użycie WymowaSort ™, najbardziej naturalnego sposobu sortowania list liczb.
Wymowa
Oficjalne zasady wymawiania liczb (w tym wyzwaniu) są takie, że cyfry wymawiane są jeden po drugim, a powstały ciąg jest sortowany w kolejności leksykograficznej. Jako przykład oznacza to, że liczba 845
jest wymawiana "eight four five"
i powinna być odpowiednio posortowana.
Liczby ujemne
Liczby ujemne wymawia się, dodając słowo "minus"
. Dlatego -23
wymawia się jako "minus two three"
. Zauważ, że powoduje to, że liczby ujemne kończą się na środku wyniku, dokładnie między liczbami zaczynającymi się od 4
(czterech) i 9
(dziewięciu).
Tytułem przewodnika, oficjalna kolejność słów dla WymowaSort ™ to:
- osiem
- pięć
- cztery
- minus
- dziewięć
- jeden
- siedem
- sześć
- trzy
- dwa
- zero
To jest,
8, 5, 4, -, 9, 1, 7, 6, 3, 2, 0
Wkład
Lista liczb całkowitych z zakresu , zawierająca maksymalnie 100 elementów. Wprowadzanie jako lista ciągów jest niedozwolone. Jeśli twój język nie obsługuje wprowadzania jako listy, dozwolone jest podawanie danych jako oddzielnych liczb całkowitych.
Dane wejściowe nie będą zawierać żadnych nieprawidłowych liczb ani żadnej liczby rozpoczynającej się od 0 (z wyjątkiem samej liczby 0). Dane wejściowe na ogół nie będą sortowane, można je podać w dowolnej kolejności.
Wydajność
Te same liczby całkowite, w kolejności WymowaSort ™. Zauważ, że liczby powinny być konwertowane tylko na ich wymowy, aby uzyskać sortowanie, dane wyjściowe nie powinny zawierać żadnych ciągów.
Przykłady
W przykładach środkowy krok (owinięty w nawiasy) służy jedynie jako wskazówka i nie jest częścią wyniku.
[1, 2, 3] -> (['one', 'two', 'three']) -> [1, 3, 2]
[-1, 0, 1, 2] -> (['minus one', 'zero', 'one', 'two']) -> [-1, 1, 2, 0]
[-100, 45, 96] -> (['minus one zero zero', 'four five', 'nine six']) -> [45, -100, 96]
[11, 12, 13, 134, 135] -> (['one one', 'one two', 'one three', 'one three four', 'one three five']) -> [11, 13, 135, 134, 12]
Istnieje również skrypt do weryfikacji wyników .
Odpowiedzi:
05AB1E (starsza wersja) , 15 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
•ĆU‘•
. Dodaje nowy wiersz podczas mapowania / sortowania z dowolnego powodu.Σ•ĆU‘•"54-ÿ"sSk
mogłabym być 15-bajtową alternatywą, nad którą pracowałem, gdyby nie ten dziwny błąd. Gdybym zmienił•ĆU‘•
literał9176320
,…54-ì
parzystymΣ•RT‹•Á…54-ìsSk
za 15•t∍ýJ•'-ìÁÁ
działałoby równieżHaskell , 57 bajtów
Wypróbuj online!
źródło
Galaretka ,
1513 bajtówWypróbuj online!
Łącze monadyczne akceptujące listę liczb całkowitych, która daje listę liczb całkowitych.
W jaki sposób?
Sortuje według wartości porządkowych cyfr liczb całkowitych (gdzie
-
jest „cyfrą” -1) przekonwertowanych na ciągi znaków przy użyciu znaków o ich 1-modułowym indeksie w magicznym ciągu „murgeon lix”.Sortowanie jest efektywnie alfabetyczne, gdy spacja jest uważana za mniejszą niż dowolną literę.
Magiczny sznur „murgeon lix” został znaleziony poprzez sprawdzenie słowników Jelly używanych do kompresji. Nie ma słów składających się z 11 liter, które spełniają wymagania (i żadne z nich nie byłyby w przypadku duplikacji). ponieważ spacja sortuje się przed literami, następnym najbardziej oczywistym wyborem jest słowo o długości siedem, po którym następuje spacja, a po nim słowo o długości trzy. „murgeon” i „lix” to jedyna satysfakcjonująca kombinacja, chociaż bez spacji mogą być możliwe inne (np.
“£Py:ƥ»
„murgeonalix”, który działa dla tej samej liczby bajtów)Poprzednie @ 15 bajtów :
Tutaj
“¡Zo⁶’Œ?¤
znajduje się pierwsza permutacja liczb naturalnych, która znajdowałaby się w indeksie 21 340 640, gdy wszystkie permutacje liczb są sortowane leksykograficznie - co jest[6,10,9,3,2,8,7,1,5,4,11]
. (“¡Zo⁶’
jest podstawową reprezentacją 250 21340635, podczasŒ?
gdy obliczenia i grupują¤
te instrukcje razem)źródło
Perl 6 , 30 bajtów
Wypróbuj online!
Rozwiązanie portu Ruby dla GB.
Oryginalna 35-bajtowa wersja
Wypróbuj online!
Konwertuj każdą liczbę na ciąg, uzyskaj nazwę Unicode każdego znaku, usuń pierwsze słowo („DIGIT” lub „HYPHEN”), a następnie posortuj.
źródło
JavaScript (SpiderMonkey) , 69 bajtów
Wypróbuj online!
źródło
+''
, że pobierasz dane jako tablicę ciągów.K (ngn / k) ,
2120 bajtówWypróbuj online!
{
}
funkcja z argumentemx
$
sformatuj jako ciągi znaków"
"?
"8"
<
obliczyć permutację sortującą rosnącox@
argument przy tych indeksachźródło
Python 3,
68 bajtów67 bajtów64 bajtówUżywa wbudowanej
sorted
funkcji z anonimową lambda dla klucza. Zakoduj porządek sortowania i porównaj każdą cyfrę w każdej wartości na liście wprowadzania z jej pozycją na liście porządkowania.Edycja: Zapisano 1 bajt, usuwając
8
z listy sortowania, aby skorzystać zestr.find
zwrotu,-1
gdy parametr nie zostanie znaleziony. Dzięki maxb.Edycja2: Zapisano 3 bajty, używając składni rozpakowywania oznaczonej gwiazdką w
list
dosłownym miejscu zamiastlist
konstruktoraWypróbuj online!
źródło
lambda x:sorted(x,key=lambda y:map('54-9176320'.find,`y`))
Pyth,
1716 bajtówSpróbuj go online tutaj , lub sprawdzić wszystkie przypadki testowe od razu tutaj .
Zapisano 1 bajt dzięki @ngn i ich odpowiedzi K , pomijając 8 na początku łańcucha słownika
źródło
Japt, 19 bajtów
Spróbuj
źródło
S.n(s)
:ñ_s ®n"54-9176320
(podobnoS.n(s)
jest dokładnie taki sam jak ws.b(S)
przypadkuS
długości 1, z tym że zwraca0
zamiast-1
)Retina 0.8.2 , 36 bajtów
Wypróbuj online! Link zawiera pakiet testowy. Wyjaśnienie:
Przetłumacz znak minus i cyfry na ich pozycję w kolejności wymowy, używając
:
dla 10. pozycji.Sortuj w kolejności wymowy.
Przetłumacz zamówienie z powrotem na oryginalny znak minus i cyfry.
źródło
Rubinowy , 50 bajtów
Wypróbuj online!
źródło
R , 58 bajtów
Wypróbuj online!
Dane wejściowe to lista liczb, która domyślnie jest konwertowana jako ciąg znaków
chartr
.order
następnie używa kolejności leksykograficznej, aby pobrać kolejność sortowania oryginalnej listy.źródło
Java (JDK 10) , 123 bajty
Wypróbuj online!
To naiwna implementacja Java. Powinno być dużo gry w golfa.
Kredyty
źródło
.chars
-IntStream i.reduce
do zwykłego obiegu pozwala zaoszczędzić 2 bajty:n->{var r="";for(var c:(""+n).split(""))r+=10+"854-9176320".indexOf(c);return r;}
. Ponadto, można zapisać jeszcze jeden bajt, zmieniając10+"85
na20+"5
, ponieważ.indexOf
cyfra for8
spowodowałaby wówczas -1. Wypróbuj online 123 bajtyJavaScript (SpiderMonkey) ,
8773 bajtówWypróbuj online!
Dzięki @Arnauld za informację, że sortowanie w SpiderMonkey jest stabilne, więc
||-(F(q)>F(p))
część można w końcu usunąć.źródło
Czerwony , 114 bajtów
Wypróbuj online!
Bardziej czytelny:
źródło
C ++, 353 bajty
Jest to rodzaj komediowego wpisu, ale marnowałem czas i napisałem go, więc nie mogę tego nie opublikować ... Ciesz się z chichotu i daj mi znać, czy brakuje mi jakichś oszczędnych przestrzeni!
Wydajność:
źródło
Mathematica, 68 bajtów
Funkcjonować. Pobiera na wejściu listę liczb całkowitych i zwraca posortowaną listę jako wynik. Po prostu oddziela cyfry każdej liczby za pomocą
IntegerDigits
, konwertuje każdą cyfrę na"zero"
,"one"
itp., Za pomocąIntegerName
, konwertuje listę na ciąg znaków oddzielony spacjamiStringRiffle
, wstawia znak ,"m "
jeśli liczba jest ujemna, i sortuje na podstawie tego ciągu. Rzeczywiście, było to najkrótsze podejście, jakie udało mi się znaleźć, ponieważ Mathematica natywnie używa sortowania leksykograficznego do list o tej samej długości; dlatego podejście oparte na tym, że854-9176320
zajmuje więcej bajtów, ponieważ funkcje łańcuchowe są tak drogie.źródło
05AB1E ,
1514 bajtów-1 bajt dzięki @Emigna .
Wypróbuj online lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie:
Zobacz moją wskazówkę 05AB1E (rozdział Jak kompresować duże liczby całkowite ), aby zrozumieć, dlaczego tak
•ĆU‘•
jest9176320
.źródło