Сортировать прописанные серийные номера


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 По номерам, которые они пишут. Например, [314,159,265,358][159,265,314,358].
Адам

Можем ли мы предположить некоторую произвольную прописную букву чисел?
Дилнан

@dylnanYou may require the numbers to be spelled in lower or upper, but not mixed, case.
полностью человек

Ответы:


14

Шелуха , 9 8 байт

Ö†€¨tfṡn

Попробуйте онлайн!

Алгоритм, "вдохновленный" ответом Stax рекурсива (я только что немного изменил строку поиска), поднимите его!

Хитрость заключается в отображении каждой буквы в ее положение в строке 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]

Как видите, списки идеально упорядочены.


Для ясности, вот как работает сравнение списков в Husk (и во многих других языках):

  1. Если один из двух списков пуст, это меньший.
  2. Если первые элементы двух списков отличаются, то тот, у которого первый элемент меньше, будет меньшим списком.
  3. В противном случае отбросьте первый элемент из обоих списков и вернитесь к пункту 1.

Если я не ошибаюсь, «w» также можно отбросить, поскольку полезно сравнивать «два» с «тремя», но у вас уже есть «h». Не уверен, поможет ли это вам. Я не понял, как интегрировать этот факт в стакс-программу, которая на самом деле еще меньше.
рекурсивный

... если бы это были только буквы, это могло бы быть, tfrsenно я предполагаю, что такие слова как withи senтам помогают сжатию.
Джонатан Аллан

Спасибо, ребята, вы вдохновили меня найти еще более короткую строку: D
Лев

Итак, это как заменить запятые на десятичную точку после первой запятой?
Клубника

@Strawberry Не совсем, [1,0,0]считается меньше, чем [1,0,0,0](но для этой программы это не будет иметь никакого значения)
Лев

10

Stax , 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

Это замечательные модули, которые вы нашли прямо здесь, я полагаю, это было кропотливо.
Эрик Outgolfer

Не все так кропотливо - сначала я посмотрел на двоичный файл.
Джонатан Аллан

Мол, ты грубо-принудительно по модулю, нет?
Эрик Outgolfer

Да, но это было быстро.
Джонатан Аллан

6

Python , 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}

Попытайся

Expanded:

*\     # 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⍳⊢)¨но вы можете сделать это намного проще, менее чем за половину вашего текущего количества байтов.
Адам

@ Итак, вы допускаете ввод и вывод в разных форматах (смешанные и несмешанные)?
нгн

@ngn Конечно. Но решение, которое я имею в виду, полностью смешало ввод / вывод.
Адам

3

Рубин, 48 байтов

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

Используется тот факт, что "zero".to_i(35)0 (поскольку «z» не является действительной цифрой в базе 35), так что намного проще использовать формулу для грубых формул для остальных девяти цифр.





2

Python 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.


@ Калдо ах ... кодирование начальных 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)

Ungolfed:

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

Сетчатка 0.8.2 , 38 байт

T`z\o\wit\hfsen`d
O`
T`d`z\o\wit\hfsen

Попробуйте онлайн! Ссылка включает тестовый набор. Работает, временно заменяя буквы zowithfsenс их положением в этой строке, что позволяет сортировать цифры лексически.


0

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

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

Попробуйте онлайн!

-1 спасибо Джонатану Аллану.

Находит индекс каждой цифры в строке 'onetwo ... nine', затем сортирует, используя это как ключевую функцию с Þ. Не нужно включать 'zero'в начале, потому что поиск первых двух символов 'zero'не удастся и 0будет возвращен вместо индекса, что делает 'zero'лексикографически «рано».


Использование сжатия «один два ... девять» на один байт меньше
Джонатан Аллан

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

... больше не "... первые две буквы".
Джонатан Аллан


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, поэтому в духе code-golf я взял небольшую свободу в формате ввода.

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

f()заменяет указатели на месте в отсортированном порядке, используя qsort().
r()читает входной номер из разделенной запятыми числовой строки. Он сравнивает только первые два символа для определения номера.
c()функция сравнения



@ceilingcat Не могли бы вы объяснить strstr("i"-19,t)-"zeontwthfofisiseeini"? Это компилятор или стандарт?
GPS

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

подумал так .. есть ли способ убедиться, что компилятор это делает? Я знаю, что правила позволили бы это, но могу ли я зависеть от этого в реальном мире?
GPS

Мой инстинкт состоит в том, чтобы избежать этого в «реальном мире», но это, вероятно, будет работать хорошо, если ваши фрагменты строки достаточно уникальны. На самом деле может быть какой-то законный вариант использования, возможно, связанный со стековыми канареками, но я также могу просто галлюцинировать.
потолок кошка
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.