Alfabetyczne liczby całkowite
Dla danego zestawu liczb ułóż je w kolejności alfabetycznej, gdy zostaną przeliterowane (tj. 1: jeden, 2: dwa, 90: dziewięćdziesiąt, 19: dziewiętnaście). Twój kod powinien działać dla zakresu [-999999, 999999]
. Dane wyjściowe muszą mieć ogranicznik między liczbami. Spacja będzie działać, podobnie jak spacja i przecinek, jak pokazano w poniższych przykładach. Dane wejściowe mogą być tablicą liczb całkowitych, ciągiem liczb rozdzielanych lub w zależności od potrzeb. Zakłada się, że wszystkie liczby całkowite są unikalne.
Liczby nie są dzielone według celów tego wyzwania, a spacje są alfabetycznie przed innymi znakami. Przyjmuje się, że liczby ujemne są wyrażane za pomocą słowa minus
. Na przykład four
poprzedza, four thousand
a liczba -40
jest sortowana za pomocą łańcucha minus forty
. Załóżmy, że wszystkie liczby będą się składać wyłącznie ze słów liczbowych i bez spójników (np. Użyj two thousand forty two
zamiast two thousand and forty two
).
Przypadki testowe
Liczby całkowite jednocyfrowe:
Wejście:
1, 2, 3, 4, 5
Wynik:
5, 4, 1, 3, 2
Wielocyfrowe liczby całkowite:
Wejście:
-1002, 5, 435012, 4, 23, 81, 82
Wynik:
81, 82, 5, 4, 435012, -1002, 23
Odstępy między słowami, bez myślników, przecinków lub „i”:
Wejście:
6, 16, 60, 64, 600, 6000, 60000, 60004, 60008, 60204, 60804
Wynik:
6, 600, 6000, 16, 60, 64, 60000, 60008, 60804, 60004, 60204
Pamiętaj, to jest kodowanie w golfa , więc wygrywa kod z najmniejszą liczbą bajtów. Niedozwolone są luki!
Odpowiedzi:
JavaScript (ES6),
189179186 bajtówPodstawową ideą jest konwersja każdej liczby wejściowej na krótki ciąg znaków, który ma prawidłową pozycję leksykalną w porównaniu do wszystkich innych par ciągów liczbowych. Oto użyty słownik: (Nie uruchamiaj fragmentu; służy on tylko do ukrywania długiej listy).
Pokaż fragment kodu
Stwarza to bardzo zwięzły sposób przyporządkowania każdej liczby do jej poprawnej leksykograficznie pozycji. Tak właśnie
q
działa funkcja rekurencyjna :Na
0
początku łańcucha ma zapewnić, że np. 100 (one hundred
przekonwertowane naPK0
) zostanie posortowane przed101
(one hundred one
przekonwertowane naPKP
). Stwarza to dziwny scenariusz, w którym 0 (zero
) jest sortowane na początku tablicy, więc aby to obejść, w funkcji sortowania najpierw sortujemy zera za pomocą!x-!y||(...
.źródło
[1100, 1000]
. Oczekiwałbym, że dane wyjściowe będą1000 (one thousand), 1100 (one thousand one hundred)
, ale dane wyjściowe są tej samej kolejności co dane wejściowe.1000
jest analizowane jakoone thousand zero
; Zaraz to naprawię. Czy jednak musimy wspierać0
samodzielnie? To wyjątkowy przypadek, który doda około 15 bajtów do mojego kodu.Poinformuj 7,
214201118 bajtówInform 7 to absolutnie okropny język do gry w golfa, więc chciałem dać temu szansę.
Wcięcie powinno używać
\t
znaków tab ( ), ale HTML ich nie lubi. I odwrotnie, Inform nie lubi spacji dla wcięć, więc będziesz musiał zastąpić spacje tabulatorami, jeśli skopiujesz i wkleisz kod z tego miejsca, aby go przetestować. Lub po prostu skopiuj i wklej ze źródła Markdown.Gra w golfa:
Dane wejściowe powinny być tabelą Inform, taką jak (
\t
między kolumnami):Wynik:
Ta funkcja jest uruchamiana raz w tabeli, dodając tekstową reprezentację każdej liczby w nowej kolumnie. Następnie sortuje wiersze tabeli zgodnie z kolumną tekstową; w Inform, ciągi są sortowane leksykograficznie. Na koniec drukuje oryginalną kolumnę w nowej kolejności. Dogodnie, „surowy, ale czasem użyteczny” format Inform 7 do drukowania kolumn tabeli okazuje się być oddzielony przecinkami, dokładnie zgodnie z żądaniem.
Nie golfowany, z płytą grzewczą pokazującą, jak wywołać funkcję:
źródło
words
odniesienie do przeliterowanych wersji liczb jest wbudowane w Inform 7?say "[R entry] "
powinno wystarczyć.Mathematica, 67 bajtów
Nienazwana funkcja przyjmująca listę liczb całkowitych jako argument i zwracająca listę liczb całkowitych jako wartość.
#~IntegerName~"Words"
jest wbudowanym, który zmienia liczbę całkowitą na nazwę w języku angielskim.IntegerName
czasami ma w przecinku przecinki i myślniki, więcStringReplace
połączenie się ich pozbywa. (Niestety, myślnik jest w rzeczywistości 3-bajtowym znakiem 8208 w UTF-8). NastępnieSortBy
sortuje oryginalną listę alfabetycznie według wartości zmodyfikowanej nazwy całkowitej.Niezły zbieg okoliczności:
IntegerName
używanegative
zamiastminus
w danych wyjściowych - ale żadne słowo pojawiające się w nazwach dowolnych dozwolonych liczb nie występuje alfabetycznie między tymi dwoma słowami, więc nie jest wymagana zamiana!(Czapka dla ngenisis za przypomnienie mi
Sortby
.)źródło
IntegerName
. Dokumentacja Wolfram mówi, że jest to znak Unicode 2010 .Bash + GNU utils + bsdgames, 52
I / O to linie rozdzielane znakiem nowej linii.
number
), a:
następnie następującą po niej postać liczbową liczby.sort
ed.sed
paski prowadzą znaki do znaku włącznie:
, pozostawiając postać numeryczną posortowaną według potrzeb.number
poprawnie obsługuje „minus”, a jego wynik jest wystarczająco zbliżony do określonego formatu, którysort
działa zgodnie z wymaganiami. Wyprowadza „czterdzieści cztery” zamiast „czterdzieści cztery”, ale z punktu widzenia sortowania nie powinno to mieć znaczenia.Pakiet bsdgames może wymagać instalacji:
Narzędzia
sed
isort
prawie na pewno są już w twojej dystrybucji.źródło
-t:
jest bezużyteczny i możesz użyćnumber<<<&
-t:
. Jednake
funkcja val seda uruchamia polecenia za pomocąsh
, więc takie funkcje bash jak<<<
nie będą działać.sh
to tylko możliwe, aby emulować Posix sh, co oznacza, że bashizmy takie jak<<<
są wyłączone. GNUsed
„se
val funkcja uruchamia polecenia ze/bin/sh -c ...
nie/bin/bash -c ...
. Próbowałeś tego?<<<
, nawet w trybie posixPython + odmiana,
979189 bajtówWykorzystano
inflect
bibliotekę do przekształceniawords
tablicy liczb całkowitych w ich reprezentację fonetyczną / łańcuchową. Przechowywane w słowniku par k / v, gdzie klucze były reprezentacją liczbową, a wartości reprezentowały ciąg znaków. Zwrócono listę kluczy posortowaną według wartości.EDYCJA: Zaoszczędź 5 i 3 bajty dzięki ETHproductions i Alex.S!
źródło
a={x:inflect.engine().number_to_words(x)for x in words}
.from inflect import*
i wyrzucającinflect.
w drugim wierszu.Mathematica, 30 bajtów
Poniższa odpowiedź generuje czystą funkcję, która pobierze listę liczb całkowitych jako dane wejściowe i posortuje je według nazwy alfabetycznej. Właśnie to, co zamówił lekarz;)
Oto wersja bez golfa:
A oto przykładowe użycie:
Które można również zapisać jako
Wytwarzają identyczne wyniki - w matematyce
f[x]
jest równoważnef@x
.Istnieje znacznie dłuższa odpowiedź, którą inny użytkownik opublikował w Mathematica. Ta odpowiedź próbuje poprawić niewielkie różnice między sposobem, w jaki matematyka alphebatuje liczby, aby lepiej dostosować się do sposobu, w jaki podane liczby OP powinny być alphebatowane, jednak rzeczy, dla których poprawiają, nie wpływają na porządek sortowania, a moja odpowiedź wychodzi identycznie do ich:
źródło
TheirF
poprawnie sortuje 888 przed 880 000, podczas gdyMyF
nie. Prawdopodobnie problem dotyczy kopiowania i wklejania dziwnego łącznika: Twoja wersjaTheirF
prawdopodobnie zastępuje zwykłe łączniki (których nie ma), podczas gdy rzeczywista wersja zastępuje dziwny 3-bajtowy łącznik Unicode. (Ciekawe byłoby, czy usunięcie przecinków jest konieczne.)Common Lisp, 113 bajtów
Nie są potrzebne biblioteki zewnętrzne.
Wyjście, jeżeli
x
jest'(1 2 3 4 5)
:źródło