Сортування прописаних серійних номерів


17

Дано список двох або більше прописаних серійних номерів однакової довжини більше двох, наприклад

[[ "three" , "one"  , "four"  ],
 [ "one"   , "five" , "nine"  ],
 [ "two"   , "six"  , "five"  ],
 [ "three" , "five" , "eight" ]]

сортуйте список за числами, які представляють слова:

[[ "one"   , "five" , "nine"  ],
 [ "two"   , "six"  , "five"  ],
 [ "three" , "one"  , "four"  ],
 [ "three" , "five" , "eight" ]]

Ви можете вимагати написання цифр у нижньому або верхньому, але не змішаному регістрі.

Тестові справи

[["three","one","four"],["one","five","nine"],["two","six","five"],["three","five","eight"]]
дає
[["one","five","nine"],["two","six","five"],["three","one","four"],["three","five","eight"]]

[["two","seven"],["one","eight"],["two","eight"],["one","eight"],["two","eight"],["four","five"]]
дає
[["one","eight"],["one","eight"],["two","seven"],["two","eight"],["two","eight"],["four","five"]]

[["one","four","one","four","two"],["one","three","five","six","two"],["three","seven","three","zero","nine"]]
дає
[["one","three","five","six","two"],["one","four","one","four","two"],["three","seven","three","zero","nine"]]

[["zero","six","one"],["eight","zero","three"],["three","nine","eight"],["eight","seven","four"],["nine","eight","nine"],["four","eight","four"]]
дає
[["zero","six","one"],["three","nine","eight"],["four","eight","four"],["eight","zero","three"],["eight","seven","four"],["nine","eight","nine"]]


Не впевнений, чи правильно я це зрозумів ["three","one","four"] === 314?
Ніт

@Nit Так, саме так.
Adám

@Nit За числами, які вони викладають. Наприклад [314,159,265,358][159,265,314,358].
Адам

Чи можна припустити певну довільну величину великих літер?
ділнан

@dylnanYou may require the numbers to be spelled in lower or upper, but not mixed, case.
totalhuman

Відповіді:


14

Лушпиння , 9 8 байт

Ö†€¨tfṡn

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

Алгоритм "натхненний" рекурсивною відповіддю Стакса (я лише трохи змінив рядок пошуку).

Трюк - це зіставлення кожної літери на її місце в рядку tfsen(стиснене в кінці цієї програми). Списки лушпиння базуються на 1, а відсутні елементи повертають 0, тому ми отримуємо це зіставлення:

"one"        [0,5,4]
"two"        [1,0,0]
"three"      [1,0,0,4,4]
"four"       [2,0,0,0]
"five"       [2,0,0,4]
"six"        [3,0,0]
"seven"      [3,4,0,4,5]
"eight"      [4,0,0,0,1]
"nine"       [5,0,5,4]

Як бачите, списки ідеально впорядковані.


Щоб було зрозуміло, ось як працює порівняння списків у лушпинні (та багатьох інших мовах):

  1. Якщо один із двох списків порожній, це менший.
  2. Якщо перші елементи двох списків відрізняються, то менший перший елемент - менший.
  3. В іншому випадку відкиньте перший елемент з обох списків і поверніться до пункту 1.

Якщо я не помиляюся, "w" можна також відмовитись, оскільки корисно лише порівняти "два" з "трьома", але у вас вже є "h". Не впевнений, чи допоможе це вам. Я ще не зрозумів, як інтегрувати цей факт у програму stax, яка насправді є меншою.
рекурсивна

... якби це були лише букви, але це, мабуть, tfrsenя маю на увазі, що такі слова, як withі senтам, допомагають стиснути.
Джонатан Аллан

Дякую, хлопці, ви надихнули мене на пошук ще коротшої струни: D
Лев

Отже, це як заміна коми після коми після першої коми?
Полуниця

@Strawberry Не дуже, [1,0,0]вважається меншим [1,0,0,0](але для цієї програми це не змінило б)
Лев

10

Стакс , 24 22 17 16 14 байт

▄Ωφ▐╧Kìg▄↕ñ▼!█

Запустіть і налагоджуйте його

Ця програма бере для введення масиви малих цифр написання. Вихід відокремлений таким чином, як новий рядок.

one five nine
two six five
three one four
three five eight

Ця програма сортує вхідні дані, використовуючи впорядкування, отримані в результаті конкретного перетворення. Кожен символ у кожному слові замінюється його індексом у рядку"wo thif sen" . Оригінальні масиви сортуються за цим упорядкуванням. Потім результати друкуються після з'єднання з пробілом.

Пробіли не виконують жодної мети, але фактично дозволяють збільшити стиснення в прямому рядку.


Яке кодування використовує Stax? Це 32 байти в UTF-8.
OldBunny2800

5
Модифікований CP437, як пояснює гіперпосилання "байт".
рекурсивна

Чи є якийсь стандартний алгоритм / метод створення такої рядки? Чи має концепція назву?
Ітаї

@Itai: Схоже, так і було, але я не знаю, що це.
рекурсивна

6

Желе , 12 байт

OḌ%⁽Т%147µÞ

Монадійне посилання.

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

Як?

Перетворення цифр у порядкові порядки, а потім з бази 10, а потім взяття модулів на 4752, тоді 147 дає порядок зростання:

 zero            , one         , two         , three               , four
[122,101,114,111],[111,110,101],[116,119,111],[116,104,114,101,101],[102,111,117,114]
 133351          , 12301       , 12901       , 1276511             , 114384
 295             , 2797        , 3397        , 2975                , 336
 1               , 4           , 16          , 35                  , 42

 five            , six         , seven               , eight               , nine
[102,105,118,101],[115,105,120],[115,101,118,101,110],[101,105,103,104,116],[110,105,110,101]
 113781          , 12670       , 1263920             , 1126456             , 121701
 4485            , 3166        , 4640                , 232                 , 2901
 75              , 79          , 83                  , 85                  , 108

Потім це може використовуватися як ключова функція, за якою сортувати:

OḌ%⁽Т%147µÞ - Link: list of lists of lists of characters
          µÞ - sort (Þ) by the mondadic chain to the left (µ):
O            -   ordinals of the characters
 Ḍ           -   convert from base 10
   ⁽Т       -   literal 4752
  %          -   modulo
      %147   -   modulo by 147

Це якісь чудові модулі, які ви знайшли саме там, я припускаю, що це було кропітко.
Ерік Аутгольфер

Не все це кропітко - я все-таки спочатку дивився на бінарне.
Джонатан Аллан

Мовляв, ви жорстоко змусили модулів, ні?
Ерік Аутгольфер

Так, але це було швидко.
Джонатан Аллан

6

Пітон , 62 байти

lambda m:sorted(m,key=lambda r:[int(s,36)%6779%531for s in r])

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

Примітка:

lambda m:sorted(m,key=lambda r:[map("trfsen".find,s)for s in r])

який працює в Python 2 (але не 3), довший на два байти.


1
Як ви виявили чарівні числа?
mbomb007

1
Просто перевірка вкладеного циклу для суворого збільшення результатів. Хоча я, можливо, обмежував розрядну внутрішню довжину з огляду на зовнішню.
Джонатан Аллан

5

APL (Dyalog Classic) , 12 байт

'nesft'∘⍒⌷¨⊂

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

Ось як я знайшов відповідний аргумент ліворуч для діадику (я спробував і довжина 6 спочатку):

A←⊖a←↑'zero' 'one' 'two' 'three' 'four' 'five' 'six' 'seven' 'eight' 'nine'
{(aa[⍵⍒a;])∧Aa[⍵⍒A;]:⎕←⍵}¨,⊃∘.,/5⍴⊂∪∊a

3

Perl 6 , 37 байт

*.sort:{('digit 'X~$_)».parse-names}

Спробуй це

Розширено:

*\     # WhateverCode lambda (this is the parameter)
.sort:
{  # block with implicit parameter 「$_」
  (
    'digit ' X~ $_  # concatenate 'digit ' to each named digit
  )».parse-names    # call .parse-names on each
}

Блок коду буде приймати значення форми ("three","one","four")і переводити його в ("3","1","4")це значення, яке .sortможна легко використовувати.


3

APL (Dyalog) , 38 байт

{⍵[⍋(531∘⊥⍤1)(531|6779|369+⎕A⍳⊢)¨↑⍵]}

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

На основі дивовижного рішення Джонатана Аллана .


1
@JonathanAllan Я редагував кредит під час початкової зміни. Я не маю поняття, чому це було незмінним. виправлено зараз
Уріель

1
31:, ⊂⌷¨⍨∘⍋(531⊥531|6779|36⊥9+⎕A⍳⊢)¨але ви можете зробити це набагато простіше, менше ніж за половину вашого поточного рахунку байтів.
Adám

@ Adám так, ви терпите термін введення та виведення в різних форматах (змішаний проти не змішаний)?
ngn

@ngn Звичайно. Але рішення, яке я маю на увазі, повністю змішало введення-виведення.
Adám

3

Рубін, 48 байт

->x{x.sort_by{|y|y.map{|s|s.to_i(35)**2%47394}}}

Зловживає тим фактом, що "zero".to_i(35)дорівнює 0 (оскільки 'z' не є дійсною цифрою в базі 35), тож набагато простіше передати формулу для інших дев'яти цифр.





2

Пітон 2 , 85 81 80 байт

Просто використовуйте перші дві літери кожного слова для визначення числа, а потім сортуйте кожен список, використовуючи цю функцію індексації як ключову.

lambda _:sorted(_,key=lambda L:['zeontwthfofisiseeini'.find(s[:2])/2for s in L])

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

Збережено 4 байти, завдяки Джонатану Аллану


Розуміння списку циклів у ключовій функції на 4 байти коротше.
Джонатан Аллан


1

05AB1E , 27 байт

Σ“¡×€µ‚•„í†ìˆÈŒšï¿Ÿ¯¥Š“#skJ

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


Σ                           # Sort input by...
 “¡×€µ‚•„í†ìˆÈŒšï¿Ÿ¯¥Š“     # "zero one two three four five size seven eight nine"
                       #    # Split on spaces.
                        sk  # Find index of each input...
                          J # Join up.


@Kaldo ах ... кодування початкових 2 букв кожної? Я відчуваю, що це має бути власна відповідь.
Чарівний восьминога Урна

1

Haskell , 133 122 109 107 106 байт

import Data.List
sortOn$abs.read.(>>=show.head.(`elemIndices`words"ze on tw th fo fi si se ei ni").take 2)

Безумовно:

import Data.List

nums = ["ze","on","tw","th","fo","fi","si","se","ei","ni"]

lookup' :: Eq a => a -> [a] -> Int
lookup' v = head . elemIndices v

wordToInt :: String -> Int
wordToInt (x:y:_) = lookup' [x,y] nums

wordsToInt :: [String] -> Int
wordsToInt = read . concatMap (show . wordToInt)

sortN :: [[String]] -> [[String]]
sortN = sortOn wordsToInt






0

Желе , 30 28 27 байт

w@€“¡¦ẇṆb~ṇjṚØ%ĖġṘḥḞṾṇJḌ»µÞ

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

-1 завдяки Джонатану Аллану.

Знаходить індекс кожної цифри у рядку 'onetwo ... nine', а потім сортує, використовуючи цю функцію як ключову функцію Þ. Не потрібно включати 'zero'на початку, тому що пошук перших двох символів 'zero'не вдасться, і 0він буде повернутий замість індексу, що робить 'zero'лексикографічно "раннім".


Використання стиснення "один два ... дев'ять" - це на один байт менше
Джонатан Аллан

@JonathanAllan Ах, спасибі Я не думав це перевірити. Стиснення 'zeontw...ni'закінчилося довше.
ділнан

... більше не "... перші дві літери".
Джонатан Аллан


0

C (стук) , 229 байт

y,j,k,t[9];char *s="zeontwthfofisiseeini";r(char **x){for(j=y=k=0;k+1<strlen(*x);k+=j,y=y*10+(strstr(s,t)-s)/2)sscanf(*x+k,"%2[^,]%*[^,]%*[,]%n",t,&j);return y;}c(*x,*y){return r(x)-r(y);}f(*x[],l){qsort(&x[0],l,sizeof(x[0]),c);}

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

Немає прямого способу надсилання масиву рядків рядків до функцій C, тому в дусі коду-гольфу я взяв незначну свободу у форматі введення.

f()приймає масив покажчиків на рядки, де кожен рядок є числом, представленим прописаними комами написаними цифрами у нижньому регістрі. Крім того, йому потрібна кількість рядків у масиві другого параметра. Я сподіваюся, що це прийнятно.

f()замінює вказівники на місці в упорядкованому порядку за допомогою qsort().
r()читає вхідний номер із рядка, розділеного комою. Він порівнює лише перші два символи, щоб визначити число.
c()є функцією порівняння



@ceilingcat Чи можете ви поясніть, будь ласка strstr("i"-19,t)-"zeontwthfofisiseeini"? Це специфічний для компілятора чи стандарт?
GPS

Це покладається на те, що в .rodataтакому вигляді немає інших шаблонів , 0x69 0x00і компілятор розміщує адресу "i"в кінці"zeo..."
roofcat

думав так .. чи є спосіб забезпечити компілятор це робити? Я знаю, що правила тут би це дозволили, але чи можу я залежати від цього в реальному волді?
GPS

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