ПроизношениеSort ™


24

Ми всі знаємо про різні фантазійні алгоритми сортування, але жоден з них не дає нам чисел таким чином, щоб їх було легко вимовити. Для усунення цього я пропоную використовувати Pron ProvenceSort ™, найбільш природний спосіб сортування списків чисел.

Вимова

Офіційні правила вимови чисел (у цьому виклику) полягають у тому, що цифри вимовляються одна за одною, а отриманий рядок сортується у лексикографічному порядку. Як приклад, це означає, що число 845вимовляється "eight four five", і його слід сортувати відповідно.

Негативні числа

Від’ємні числа вимовляються заздалегідь слово "minus". Таким чином, -23вимовляється як "minus two three". Зауважте, що це призводить до того, що від'ємні числа закінчуються посередині виводу, прямо між числами, що починаються з 4(чотири) та 9(дев'ять).

Як посібник, офіційний порядок слів для Pron ProvenceSort ™:

  • вісім
  • п’ять
  • чотири
  • мінус
  • дев'ять
  • один
  • сім
  • шість
  • три
  • два
  • нуль

Це є,

8, 5, 4, -, 9, 1, 7, 6, 3, 2, 0

Вхідні дані

Список цілих чисел у діапазоні [999,999] , що містить щонайбільше 100 елементів. Введення як список рядків не дозволяється. Якщо ваша мова не підтримує введення як список, вводити дані можна як окремі цілі числа.

Вхід не буде містити недійсних чисел або будь-яке число, що починається з 0 (крім самого числа 0). Вхід, як правило, не буде сортований, він може бути наданий у будь-якому порядку.

Вихідні дані

Ці самі цілі числа, в порядку Pron ProViewSort ™. Зауважте, що номери повинні бути перетворені лише на їх вимови для сортування, вихід не повинен містити жодних рядків.

Приклади

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

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

Існує також сценарій для підтвердження результатів .


5
Чому "один" (вимовляється "виграв") не настає після двох і до нуля?
Бен Міллер - Відновити Моніку

3
@BenMiller Я не можу згадати, чи це ви коментували в пісочниці, але цей коментар дав мені дежавю. Щоб відповісти на це, я роздумував над цим, але я пішов із написанням правопису, щоб уникнути правописних дискусій (наприклад, "два" проти "занадто", "виграв" або "
відмовити

17
Тож насправді це більше "орфографічний сорт", ніж "сортування вимови" :-)
Paŭlo Ebermann

3
облом. Я сподівався, що вони будуть відсортовані за тим, як їх складно вимовити ...
NH.

2
Цей виклик справді слід перейменувати, оскільки сортування тут практично не має нічого спільного з вимовою. Це було б надзвичайно складніше, якби воно було на основі вимови (наприклад, чотири можуть прийти до п'яти, якщо ви сортуєте монофтон ⟨ɔː⟩ перед дифтонгом ⟨aɪ⟩, але п’ять до чотирьох, якщо сортувати похідне ⟨a⟩ перед o -похідне ⟨ɔ⟩ - наскільки мені відомо, немає встановленого порядку сортування вимови, ні в IPA, ні в будь-якій іншій схемі).
Жакус Бахс Жак

Відповіді:


8

05AB1E (спадщина) , 15 байт

Σε•Koéa₃•'-3ǝsk

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

Пояснення

Σ                 # sort by
 ε                # apply to each
             sk   # index of the element in
  •Koéa₃•         # "85409176320"
         '-3ǝ     # with "-" inserted at index 3

Здається, що в стислому цілому цілі є помилка •ĆU‘•. Він додає новий рядок під час картографування / сортування з будь-якої причини. Σ•ĆU‘•"54-ÿ"sSkмогла б бути 15-байтовою альтернативою, над якою я працював, якби не ця дивна помилка .. Якщо я •ĆU‘•9176320
перейду

1
@KevinCruijssen: Це дивно. Вашим було б 14 с…54-ì
Вашим

@KevinCruijssen: Ви могли б зробити Σ•RT‹•Á…54-ìsSk за 15
Емінья,

•t∍ýJ•'-ìÁÁтакож працюватиме
Емінья,


8

Желе ,  15  13 байт

ṾV€ị“Þ⁽3Z6»µÞ

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

Монадична посилання, що приймає список цілих чисел, що дає список цілих чисел.

Як?

Сортувати за порядковими значеннями цифр цілих чисел (де - "цифра" -1), перетворених у рядки, використовуючи символи за їх 1-базисним та модульним індексом у магічному рядку "murgeon lix".

Сорт є ефективно алфавітним, де пробіл вважається меншим, ніж будь-яка літера.

Чарівний рядок "murgeon lix" був знайдений шляхом огляду словників Jelly, що використовуються при стисненні. Немає слів із 11 листів, які б відповідали цим вимогам (і більше того, що було б при дедублюванні). оскільки сортування пробілів перед літерами наступним найбільш очевидним вибором є слово довжиною сім, за яким слід пробіл, а за ним слово довжиною три. "murgeon" та "lix" є єдиною задовольняючою комбінацією, хоча без пробілу можливі інші (наприклад “£Py:ƥ», "murgeonalix", який працює на одне число байтів)

ṾV€ị“Þ⁽3Z6»µÞ - Link: list of integers
            Þ - sort by:
           µ  -   the monadic link: -- i.e. do this for each integer, then sort by that
Ṿ             -     unevaluate  (e.g. -803 -> ['-','8','0','3'])
 V€           -     evaluate each as Jelly code  (e.g. ['-','8','0','3'] -> [-1,8,0,3])
    “Þ⁽3Z6»   -     "murgeon lix" (compression of words in Jelly's dictionary plus a space)
   ị          -     index into (1-indexed & modular) (e.g. [-1,8,0,3] -> "i xr")

Попередній @ 15 байт :

ṾV€ị“¡Zo⁶’Œ?¤µÞ

Тут “¡Zo⁶’Œ?¤знайдено першу перестановку натуральних чисел, яка знаходилася б у індексі 21,340,635, коли всі перестановки чисел сортуються лексикографічно - що є [6,10,9,3,2,8,7,1,5,4,11]. ( “¡Zo⁶’являє собою базове представлення 250 21340635, тоді Œ?як обчислення і групують ¤ці інструкції разом)


Навіть з поясненням, я не дуже розумний. Дивовижне рішення!
maxb

Скорочена версія, ймовірно, також простіша для розуміння!
Джонатан Аллан

7

Perl 6 , 30 байт

*.sort:{TR/0..9-/a5982176043/}

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

Порт GB-рішення Ruby.

Оригінальна версія 35 байт

*.sort: (~*).uninames».&{S/\w*.//}

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

Перетворіть кожне число у рядок, отримайте ім'я Unicode кожного символу, зніміть перше слово ("DIGIT" або "HYPHEN"), а потім сортуйте.


6

JavaScript (SpiderMonkey) , 69 байт

a=>a.sort((a,b)=>(g=n=>[...n+''].map(c=>':598217604'[c]||3))(a)>g(b))

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


Схоже, ви можете видалити +'', бачачи, як ви приймаєте введення як масив рядків.
Кудлатий

@Shaggy Я більше не беру струн, тому що я не впевнений, що це тут дозволено.
Арнольд

Ах ... Ти маєш рацію. Це додасть пару байтів до мого рішення.
Кудлатий

6

K (нг / к) , 21 20 байт

{x@<"54-9176320"?$x}

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

{ } функція з аргументом x

$ формат у вигляді рядків

""?263"8"

< обчислити перестановку сортування за сортуванням

x@ аргумент за тими показниками


6

Python 3, 68 байт 67 байт 64 байт

lambda x:sorted(x,key=lambda y:[*map('54-9176320'.find,str(y))])

Використовує вбудований sortedДля ключа функція з анонімною лямбда. Жорстко кодуйте порядок сортування та порівнюйте кожну цифру кожного значення у списку введення з його положенням у списку порядку сортування.

Редагувати: Збережено 1 байт, видаливши 8зі списку сортування, щоб скористатися str.findповерненням, -1коли параметр не знайдено. Завдяки maxb.

Edit2: збережено 3 байти, використовуючи синтаксис розпакування зірочок у listбуквальному, а не в listконструкторі

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


1
Чи можете ви видалити перші 8 у рядку? Оскільки Python повертає -1, якщо підрядка не знайдена.
maxb

@maxb Хороший улов. Відредаговано.
mypetlion


5

Pyth, 17 16 байт

oxL"54-9176320"`

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

oxL"54-9176320"`NQ   Implicit: Q=eval(input())
                     Trailing N, Q inferred
o                Q   Order the elements of Q, as N, using...
               `N      Convert N to string
 xL                    Get the index of each character of that string...
   "54-9176320"        ... in the lookup ordering
                       (if character missing, returns -1, so 8 is still sorted before 5)

Збережено 1 байт завдяки @ngn та їхній відповіді K , опустивши 8 із початку рядка словника


4

Japt, 19 байт

ñ_s ®n"54-9176320

Спробуй це


Приємне рішення! На жаль, введення списку рядків заборонено.
maxb

Ви можете зберегти деякі, зловживаючи S.n(s): ñ_s ®n"54-9176320(мабуть S.n(s), точно такий же, як s.b(S)для Sдовжини 1, за винятком того, що він повертається 0замість -1)
ETHproductions

Хороший трюк, @ETHproductions, дякую :) Я мушу запам’ятати це на майбутнє.
Кудлатий

3

Сітківка 0,8,2 , 36 байт

T`-d`3:598217604
O`
T`3:598217604`-d

Спробуйте в Інтернеті! Посилання включає тестовий набір. Пояснення:

T`-d`3:598217604

Перекладіть знак мінус і цифри на їх позицію в порядку вимови, використовуючи :для 10-ї позиції.

O`

Сортувати в порядку вимови.

T`3:598217604`-d

Перекладіть замовлення назад до початкового знаку мінус та цифр.



3

R , 58 байт

function(x)x[order(mapply(chartr,"-0-9","dkfjicbhgae",x))]

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

Введення - це список чисел, який неявно перетворюється у вигляді рядка за допомогою chartr. orderпотім використовує лексигографічний порядок для отримання порядку, за яким слід сортувати вихідний список.


3

Java (JDK 10) , 123 байти

l->l.sort(java.util.Comparator.comparing(n->{var r="";for(var c:(""+n).split(""))r+=11+"54-9176320".indexOf(c);return r;}))

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

Це наївна реалізація Java. Повинно бути набагато гольфуючим.

Кредити


1
Зміна .chars-IntStream і .reduceна регулярній петлі економить 2 байта: n->{var r="";for(var c:(""+n).split(""))r+=10+"854-9176320".indexOf(c);return r;}. Крім того, ще один байт можна зберегти, змінивши 10+"85на 20+"5, оскільки .indexOfцифра для цифри 8призведе до -1. Спробуйте в Інтернеті 123 байти
Kevin Cruijssen



2

C ++, 353 байти

Це свого роду комедійний запис, але я витрачав час і писав його, тому не можу його опублікувати ... Насолоджуйтесь посмішкою, і дайте мені знати, чи є якісь заставки, які я пропустив!

#include<algorithm>
#include<iostream>
#include<iterator>
#include<numeric>
#include<string>
using namespace std;auto f(int i){auto s=to_string(i);for(auto&c:s)c='A'+"854-9176320"s.find(c);return s;}int main(){int a[100];auto b=begin(a);auto e=end(a);iota(b,e,-50);sort(b,e,[](int l,int r){return f(l)<f(r);});copy(b,e,ostream_iterator<int>(cout," "));}

Вихід:

8 5 4 48 45 44 49 41 47 46 43 42 40 -8 -5 -50 -4 -48 -45 -44 -49 -41 -47 -46 -43 -42 -40 -9 -1 -18 -15 - 14 -19 -11 -17 -16 -13 -12 -10 -7 -6 -3 -38 -35 -34 -39 -31 -37 -36 -33 -32 -30 -2 -28 -25 -24 - 29 -21 -27 -26 -23 -22 -20 9 1 18 15 14 19 11 17 16 13 12 10 7 6 3 38 35 34 39 31 37 36 33 32 30 2 28 25 24 29 21 27 26 23 22 20 0


Я бачу, що ви також живете під девізом "якщо я не натискаю Enter, є менше рядків для налагодження"
maxb

1
Гей, я не можу дозволити собі легковажних пробілів цією мовою! Це смішно робити це, оскільки, як і решту часу, мало речей мене злить, як відкриття коду інших людей, які, мабуть, думають, що написання жахливої ​​монолітної стіни зробить їх здаватись розумнішими та / або активно стикується заробітну плату для кожного нового рядка, який вони вводять.
підкреслюй_30

1
Привіт! Вичав своє рішення до 195 символів
Макс Єхлаков

@MaxYekhlakov Класно, дякую за те, що розмірковував! Я усвідомлюю, прочитавши трохи більше; видається, що мені не обов’язково було б забезпечити повну програму, що компілюється, а натомість лише ті функції, які обробляли б вказаний вхід і вихід. D'oh!
підкреслюй_d

2

Математика, 68 байт

SortBy[If[# < 0,"m ",""]<>StringRiffle@IntegerName@IntegerDigits@#&]

Функція. Приймає список цілих чисел як вхідне і повертає відсортований список як вихід. Просто розділяє цифри кожного числа IntegerDigits, перетворює кожну цифру в "zero","one" і т. Д., IntegerNameПеретворює список у розділений пробілом рядок з StringRiffle, попередньо, "m "якщо число є негативним, і сортує на основі цього рядка. Дійсно, це був найкоротший підхід, який я можу знайти, оскільки Mathematica використовує лише лексикографічне сортування для списків однакової довжини; Таким чином, підхід, заснований на 854-9176320завершенні, займає більше байтів, оскільки рядкові функції такі дорогі.


Завжди довіряйте математиці, щоб мати поєднання вбудованих. Розумне рішення!
maxb

1

05AB1E , 15 14 байт

Σ•ĆU‘•…54-ìsSk

-1 байт завдяки @Emigna .

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

Пояснення:

Σ                 # Sort by:
 •ĆU‘•            #  Push the compressed integer 9176320
      54-        #  Push the string "54-"
          ì       #  Prepend this string before the integer: "54-9176320"
           s      #  Swap so the current number to sort is at the top of the stack
            S     #  Convert it to a list of characters
             k    #  Check for each its index in the string (resulting in -1 for '8')

Дивіться цю мінку 05AB1E (розділ Як стискати великі цілі числа ), щоб зрозуміти, чому •ĆU‘•це так 9176320.

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