Powrót do sezonu szkolnego! W przypadku pracy w niepełnym wymiarze godzin pomagasz w szkolnej bibliotece. Problem polega na tym, że główny bibliotekarz nigdy nie słyszał słowa „Dewey Decimal”, nie mówiąc już o wdrożeniu tego systemu. Zamiast tego używany system sortowania urósł „organicznie”, ponieważ biblioteka się rozszerzyła ...
Aby zachować zdrowie psychiczne, postanowiłeś napisać program, który pomoże ci sortować książki po ich zwróceniu, bo biada ci, jeśli źle posortujesz książki. (Główny bibliotekarz jest BARDZO surowy).
Wejście wyjście
- Wprowadzana będzie lista (hipotetycznych) tytułów książek, po jednym w wierszu, z STDIN / odpowiednika językowego.
- Jednocześnie możesz założyć, że wkładanych jest nie więcej niż 100 książek (możesz jednocześnie nosić tylko tyle książek w bibliotece).
- Książki mogą zawierać wiele słów w swoich tytułach, które mogą być oddzielone spacjami lub innymi znakami interpunkcyjnymi (np. Dwukropek
:
, myślnik-
itp.). - Dla ułatwienia obliczeń załóż, że wszystkie tytuły to UTF-8.
Dane wyjściowe to te same tytuły, posortowane zgodnie z poniższymi zasadami, ponownie po jednym w wierszu, do STDOUT / odpowiednika językowego.
Zasady sortowania
Książki są sortowane numerycznie na podstawie ich średniej wartości znaków (tj. Skumulowanej wartości znaku podzielonej liczby znaków w tytule książki), zliczonej według następujących reguł:
- Wszystkie znaki liczą się do określenia liczby znaków w tytule.
- Małe litery są liczone według ich pozycji w alfabecie. (a = 1, b = 2, ... z = 26)
- Jeśli tytuł zawiera wielkie litery, liczą one 1,5 wartości małej litery (A = 1,5, B = 3, ... Z = 39). („Ważne są wielkie litery!”, Mówi bibliotekarz).
- Każdy znak interpunkcyjny / symbol na tej liście
!@#$%^&*()-=_+[]\{}|;':",./<>?~
liczy -1 od wartości skumulowanej przed uśrednieniem. („Wielkie tytuły nie są!”) - Jeśli tytuł zawiera liczbę zapisaną cyframi arabskimi , liczba ta jest odejmowana od średniej wartości przed sortowaniem. Wiele kolejnych cyfr jest traktowanych jako jedna liczba (np.
42
Odejmuje 42, a nie odejmuje 4, a następnie odejmuje 2). Poszczególne cyfry nie liczą się do wartości skumulowanej (tj. Każda cyfra odpowiada 0), ale DO liczą się liczby znaków. Należy pamiętać, że może to spowodować ujemną wartość i powinno być odpowiednio traktowane. (Plotka głosi, że bibliotekarz zakochał się w instruktorze matematyki od kilku lat). - Jeśli tytuł zawiera dwa osobne słowa rozpoczynające się od
R
, książka otrzymuje wynik „nieskończoności” i jest zrzucana na stos w rogu (tj. Losowo ułożona na końcu listy). (Bibliotekarz został kiedyś porzucony przez osobę z tymi inicjałami, a przynajmniej tak słyszeliście). - Spacje nie liczą się do skumulowanej wartości znaku (tj. Przyczyniają się do 0), ale DO przyczyniają się do liczby znaków w tytule.
- Znaki, które nie pasują do powyższych zasad (np. A
ÿ
), nie liczą się do skumulowanej wartości postaci (tj. Mają wartość 0), ale DOKŁADNIE przyczyniają się do liczby znaków w tytule. - Na przykład hipotetyczna książka
ÿÿÿÿÿ
miałaby „partyturę”(0+0+0+0+0) / 5 = 0
, ale hipotetyczna książkaÿÿyÿÿ
miałaby „partyturę”(0+0+25+0+0) / 5 = 5
. - Dwie książki, które tak samo „zdobywają punkty”, mogą zostać wydrukowane w wybranym porządku. (W każdym razie są na tej samej półce)
Przykład danych wejściowych 1
War and Peace
Reading Rainbow: The Best Unicorn Ever
Maus
Home for a Bunny
Przykład Wyjście 1 (z „wynikami” w nawiasach, aby pokazać uzasadnienie - nie trzeba ich drukować)
War and Peace (8.5)
Home for a Bunny (10.125)
Maus (15.125)
Reading Rainbow: The Best Unicorn Ever (infinity)
Przykład danych wejściowych 2
Matthew
Mark
Luke
John
Revelations
Przykład Wyjście 2 (z „wynikami” w nawiasach, aby pokazać uzasadnienie - nie trzeba ich drukować)
Mark (12.375)
John (13)
Revelations (13.545454...)
Luke (13.75)
Matthew (~13.786)
Przykład danych wejściowych 3
42
9 Kings
1:8
7th
Przykład Wyjście 3 (z „wynikami” w nawiasach, aby pokazać uzasadnienie - nie trzeba ich drukować)
42 (-42)
1:8 (-9.3333...)
9 Kings (~0.36)
7th (2.3333...)
Inne ograniczenia
- To jest Code-Golf, ponieważ musisz trzymać program w tajemnicy przed wiecznie obserwującymi oczami bibliotekarza, a im mniejszy program, tym łatwiej jest go ukryć.
- Obowiązują standardowe ograniczenia dotyczące luk
- Nie pozwól, aby bibliotekarz złapał cię na luzie, spędzając cały swój czas na PPCG.
Odpowiedzi:
APL (132)
Ponieważ wszyscy robią to samo, również ta funkcja pobiera tablicę tytułów i zwraca ją posortowaną, np .:
Wyjaśnienie:
⎕ML←3
: ustaw⎕ML
na3
(dla⊂
)⍵[⍋{
...}¨⍵]
: sortuj dane wejściowe według wartości zwróconych z funkcji wewnętrznej↑¨⍵⊂⍨⍵≠' '
: uzyskaj pierwszy znak każdego słowa2='R'+.=
: sprawdź, czy dwa z nich są'R'
.:!99
: jeśli tak, zwróć 99! (≈ 9,3 × 10 155 ). To nie jest nieskończona nieskończoność, ale tak się stanie: tytuł nigdy nie będzie miał wyniku większego niż 38-krotność jego długości (ZZZZ ...), więc dopóki żaden tytuł nie jest większy niż około 2 × 10 130 yottabajtów, gwarantuje się, że będą na końcu.⋄
: Inaczej:(
...)÷⍴⍵
: podziel wynik przez długość⍵
po obliczeniu:G←(⊂⎕A),(⎕UCS 96+⍳26)
: przechowujG
wielkie i małe litery(⎕UCS 32+⍳94)~'`',⎕D,∊G
: drukowalne znaki ASCII, z wyjątkiem liter, cyfr, spacji i'`'
, które są znakami, za które odejmuje się punkt. (Jest to krótsze niż wypisanie ich wszystkich, ponieważG
jest używane później).+/⍵∊
: policz liczbę tych znaków⍵
-
: odejmij to od:+/∊1.5 1×(⍳×∊⍨)∘⍵¨G
: suma 1,5 × wyników dla wielkich liter i 1 × wyników dla małych liter.-⍨
: następnie odejmij sumę liczb w⍵
:⍵⊂⍨⍵∊⎕D
: znajdź grupy cyfr w⍵
'0',
: dodaj'0'
, aby lista nie była pusta⍎¨
: oceń każdy ciąg+/
: znajdź sumęźródło
!99
ciebie możesz skorzystać⌊/⍬
Lua 5.3,
366364 bajtówTen kod działa tylko w Lua 5.3, ponieważ musi obsługiwać znaki Unicode. Jeśli nie zależy ci na Unicode, zamień „utf8” na „string” i będzie działać poprawnie z Lua 5.2 lub 5.1.
Bierze dane wejściowe z argumentów wiersza poleceń, więc albo uruchom go z wiersza poleceń, albo umieść ten kod nad moją odpowiedzią:
źródło
utf8
zstring
dnia Ideone i dostał żadnego wyjścia.(arg)
siedzi tam, wpatrując się we mnie w twarz. To pytanie najwyraźniej usmażyło mi mózg. Masz +1.Mathematica,
253216 bajtów (214 znaków)Wywołaj funkcję jak
f[{"42", "9 Kings", "1:8", "7th"}]
; zwróci posortowaną listę danych wejściowych.Ledwo się udało! Dopasowywanie wzorców Mathematiki nie jest tak zwięzłe, gdy zaangażowane są łańcuchy, i po prostu zabijają mnie te długie nazwy. Dodatkowe dwa bajty dotyczą
Infinity
znaku Unicode.(Daj mi znać, jeśli popełniłem jakieś standardowe luki).
Aktualizacja
Przyglądając się nieco bliżej odpowiedzi edc65, wygląda na to, że OP zaakceptuje funkcję sortującą listę ciągów. Mając to na uwadze, możemy użyć formy curry
SortBy
(którą Mathematica nazywa „formą operatora”); z jednym argumentem (funkcja zastosowana do elementów listy w celu ustalenia ich kolejności) zachowuje się jak funkcja, która przyjmuje jeden argument, zwracając posortowaną formę danych wejściowych; to znaczySortBy[list, f]
jest równoważne z(SortBy[f])[list]
.Nie golfił
źródło
JavaScript (ES6), 210
218 251Jako funkcja z argumentem tablicowym zwróciła posortowane.
źródło
O.innerHTML
sięthis.InnerHTML
w konsoli Firefoksa.C #,
352349 bajtówZe względu na magię linq:
Mógłbym zapisać kolejne 6 bajtów, gdyby backtick znalazł się na liście interpunkcyjnej!
źródło
Idź, 755 bajtów
Sformatowana wersja:
Wdrożenie niestandardowego interfejsu sortowania sprawiło, że był on dłuższy niż oczekiwano. Program odczytuje ze STDIN do końca wprowadzania pustej linii.
źródło
PHP, 362
367BajtówWersja sformatowana:
Ciekawe linie:
Konwertuje pojedynczy znak UTF-8 na jego wartości bajtowe i sumuje je, dzięki czemu otrzymujemy rzeczywistą wartość znaków ASCII i wartość wyższą niż 127 dla znaków wielobajtowych.
Wykorzystuje niski priorytet operatora
and
ior
przypisuje wartość znaku w pojedynczej instrukcji bezif
.źródło
Perl 5 , 190 bajtów
Wypróbuj online!
źródło