Sắp xếp các số sê-ri đánh vần


17

Đưa ra một danh sách gồm hai hoặc nhiều số sê-ri được đánh vần có độ dài bằng nhau lớn hơn hai, vd

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

sắp xếp danh sách theo các số mà các từ đại diện:

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

Bạn có thể yêu cầu các số được đánh vần ở dưới hoặc trên, nhưng không trộn lẫn.

Các trường hợp thử nghiệm

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

[["two","seven"],["one","eight"],["two","eight"],["one","eight"],["two","eight"],["four","five"]]
cho
[["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"]]
cho
[["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"]]
cho
[["zero","six","one"],["three","nine","eight"],["four","eight","four"],["eight","zero","three"],["eight","seven","four"],["nine","eight","nine"]]


Không chắc chắn nếu tôi nhận được điều này một cách chính xác, phải không ["three","one","four"] === 314?
Nit

@Nit Vâng, đúng vậy.
Adám

@Nit Bằng những con số họ đánh vần. Ví dụ [314,159,265,358][159,265,314,358].
Adám

Chúng ta có thể giả định một chữ viết hoa tùy ý của các con số không?
dylnan

@dylnanYou may require the numbers to be spelled in lower or upper, but not mixed, case.
hoàn toàn là

Câu trả lời:


14

Husk , 9 8 byte

Ö†€¨tfṡn

Hãy thử trực tuyến!

Thuật toán "lấy cảm hứng" từ câu trả lời Stax của đệ quy (Tôi vừa thay đổi chuỗi tra cứu một chút), hãy nâng cấp anh ta!

Thủ thuật là ánh xạ từng chữ cái đến vị trí của nó trong chuỗi tfsen(được nén ở cuối chương trình này). Danh sách Husks dựa trên 1 và các mục bị thiếu trả về 0, vì vậy chúng tôi có được ánh xạ này:

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

Như bạn có thể thấy, các danh sách được sắp xếp hoàn hảo.


Để rõ ràng, đây là cách so sánh danh sách hoạt động trong Husk (và trong nhiều ngôn ngữ khác):

  1. Nếu một trong hai danh sách trống, thì đó là danh sách nhỏ hơn.
  2. Nếu các phần tử đầu tiên của hai danh sách khác nhau, thì phần tử có phần tử đầu tiên nhỏ hơn là danh sách nhỏ hơn.
  3. Nếu không, hãy loại bỏ phần tử đầu tiên khỏi cả hai danh sách và quay lại điểm 1.

Nếu tôi không nhầm, "w" cũng có thể bị loại bỏ, vì nó chỉ hữu ích khi so sánh "hai" với "ba", nhưng bạn đã có "h". Không chắc chắn nếu điều đó giúp bạn. Tôi chưa tìm ra cách tích hợp thực tế này vào một chương trình cứng mà thực sự nhỏ hơn.
đệ quy

... Nếu đó chỉ là những chữ cái có thể tfrsennhưng tôi đoán có những từ như withsentrong đó giúp nén.
Jonathan Allan

Cảm ơn các bạn, bạn đã truyền cảm hứng cho tôi để tìm ra một chuỗi thậm chí còn ngắn hơn: D
Leo

Vì vậy, nó giống như thay thế dấu phẩy bằng dấu thập phân sau dấu phẩy đầu tiên?
Dâu

@Strawberry Không thực sự, [1,0,0]được coi là nhỏ hơn [1,0,0,0](nhưng đối với chương trình này, nó sẽ không tạo ra sự khác biệt)
Leo

10

Stax , 24 22 17 16 14 byte

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

Chạy và gỡ lỗi nó

Chương trình này lấy mảng các chữ số đánh vần chữ thường cho đầu vào. Đầu ra được phân tách dòng mới như vậy.

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

Chương trình này sắp xếp các đầu vào bằng cách sử dụng thứ tự thu được theo một chuyển đổi cụ thể. Mỗi ký tự trong mỗi từ được thay thế bằng chỉ mục của nó trong chuỗi"wo thif sen" . Các mảng ban đầu được sắp xếp theo thứ tự này. Sau đó, kết quả được in sau khi tham gia với một khoảng trắng.

Các không gian phục vụ không có mục đích, nhưng thực sự cho phép nén lớn hơn trong chuỗi ký tự.


Stax sử dụng mã hóa gì? Đây là 32 byte trong UTF-8.
OldBunny2800

5
CP437 đã sửa đổi, như siêu liên kết "byte" giải thích.
đệ quy

Có một số thuật toán / phương pháp tiêu chuẩn sắp tới với một chuỗi như vậy không? Liệu khái niệm này có một cái tên?
Itai

@Itai: Có vẻ như nó sẽ như vậy, nhưng tôi không biết nó là gì.
đệ quy

6

Thạch , 12 byte

OḌ%⁽Т%147µÞ

Một liên kết đơn âm.

Hãy thử trực tuyến! ... hoặc xem bộ thử nghiệm

Làm sao?

Chuyển đổi các chữ số thành số thứ tự và sau đó từ cơ sở 10, sau đó lấy modul bằng 4752, sau đó 147 đưa ra thứ tự tăng dần:

 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

Điều này sau đó có thể được sử dụng như một chức năng chính để sắp xếp:

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

Đó là một số mod tuyệt vời mà bạn đã tìm thấy ngay tại đó, tôi cho rằng đó là công việc khó khăn.
Erik the Outgolfer

Không phải tất cả những gì khó khăn - mặc dù tôi đã nhìn vào nhị phân đầu tiên.
Jonathan Allan

Giống như, bạn vũ phu buộc các modul, không?
Erik người vượt trội

Vâng, nhưng nó đã nhanh chóng.
Jonathan Allan

6

Python , 62 byte

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

Hãy thử trực tuyến! ... hoặc xem bộ thử nghiệm

Ghi chú:

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

hoạt động trong Python 2 (nhưng không phải 3) dài hơn hai byte.


1
Làm thế nào bạn phát hiện ra những con số ma thuật?
mbomb007

1
Chỉ cần kiểm tra vòng lặp lồng nhau để tăng nghiêm ngặt các kết quả. Mặc dù tôi có thể hạn chế độ dài chữ số của bên trong cho bên ngoài.
Jonathan Allan

5

APL (Dyalog Classic) , 12 byte

'nesft'∘⍒⌷¨⊂

Hãy thử trực tuyến!

Đây là cách tôi tìm thấy một đối số bên trái phù hợp cho dyadic (tôi đã thử và dài 6 trước):

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

3

Perl 6 , 37 byte

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

Thử nó

Mở rộng:

*\     # 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
}

Khối mã sẽ lấy một giá trị của biểu mẫu ("three","one","four")và dịch nó thành ("3","1","4")một giá trị .sortcó thể dễ dàng sử dụng.


3

APL (Dyalog) , 38 byte

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

Hãy thử trực tuyến!

Dựa trên giải pháp tuyệt vời của Jonathan Allan .


1
@Jonathan ALLan Tôi đã chỉnh sửa tín dụng trong thời gian thay đổi ban đầu .. Tôi không biết tại sao nó không thay đổi. cố định ngay bây giờ
Uriel

1
31 : ⊂⌷¨⍨∘⍋(531⊥531|6779|36⊥9+⎕A⍳⊢)¨, nhưng bạn có thể làm điều này đơn giản hơn nhiều với chưa đến một nửa số byte hiện tại của bạn.
Adám

@ Adám vì vậy, bạn chấp nhận đầu vào và đầu ra ở các định dạng khác nhau (hỗn hợp so với không trộn lẫn)?
ngn

@ngn Chắc chắn rồi. Nhưng giải pháp tôi có trong đầu đã trộn lẫn hoàn toàn I / O.
Adám

3

Ruby, 48 byte

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

Lạm dụng thực tế "zero".to_i(35)là 0 (vì 'z' không phải là một chữ số hợp lệ trong cơ sở 35), do đó, việc tạo ra một công thức cho chín chữ số còn lại sẽ dễ dàng hơn nhiều.





2

Con trăn 2 , 85 81 80 byte

Chỉ cần sử dụng hai chữ cái đầu tiên của mỗi từ để xác định số, sau đó sắp xếp từng danh sách bằng cách sử dụng chức năng lập chỉ mục đó làm khóa.

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

Hãy thử trực tuyến!

Đã lưu 4 byte, nhờ Jonathan Allan


Một sự hiểu biết danh sách vòng lặp trong chức năng chính là ngắn hơn 4 byte.
Jonathan Allan


1

05AB1E , 27 byte

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

Hãy thử trực tuyến!


Σ                           # 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 ah ... mã hóa 2 chữ cái bắt đầu của mỗi chữ cái? Tôi cảm thấy như đó nên là câu trả lời của riêng mình.
Bạch tuộc ma thuật Urn

1

Haskell , 133 122 109 107 106 byte

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

Ung dung:

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

Võng mạc 0.8.2 , 38 byte

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

Hãy thử trực tuyến! Liên kết bao gồm bộ kiểm tra. Hoạt động bằng cách tạm thời thay thế các chữ cái zowithfsenvới vị trí của chúng trong chuỗi đó, cho phép các số được sắp xếp theo từ vựng.


0

Thạch , 30 28 27 byte

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

Hãy thử trực tuyến!

-1 cảm ơn Jonathan Allan.

Tìm chỉ mục của từng chữ số trong chuỗi 'onetwo ... chín' sau đó sắp xếp sử dụng hàm này làm hàm chính với Þ. Không cần bao gồm 'zero'ngay từ đầu vì việc tìm kiếm hai ký tự đầu tiên 'zero'sẽ thất bại và 0sẽ được trả về thay vì chỉ mục, làm cho 'zero'từ vựng "sớm".


Sử dụng nén 'một hai ... chín' ít hơn một byte
Jonathan Allan

@Jonathan ALLan Ah, cảm ơn. Tôi đã không nghĩ rằng để kiểm tra điều đó. Nén 'zeontw...ni'cuối cùng là dài hơn.
dylnan

... không còn "... hai chữ cái đầu tiên".
Jonathan Allan


0

C (tiếng kêu) , 229 byte

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);}

Hãy thử trực tuyến!

Không có cách nào đơn giản để gửi mảng các chuỗi của chuỗi đến các hàm C, vì vậy theo tinh thần của môn đánh gôn, tôi đã có một sự tự do nhỏ trong định dạng đầu vào.

f()chấp nhận một mảng các con trỏ tới các chuỗi, trong đó mỗi chuỗi là một số, được biểu thị bằng các chữ số đánh vần được phân tách bằng dấu phẩy trong chữ thường. Ngoài ra, nó cần số chuỗi trong mảng trong tham số thứ hai. Tôi hy vọng điều này được chấp nhận.

f()thay thế các con trỏ tại chỗ theo thứ tự được sắp xếp bằng cách sử dụng qsort().
r()đọc số đầu vào từ chuỗi số được phân tách bằng dấu phẩy. Nó chỉ so sánh hai ký tự đầu tiên để xác định số.
c()là chức năng so sánh



@ceilingcat Bạn có thể giải thích strstr("i"-19,t)-"zeontwthfofisiseeini"? Nó là trình biên dịch cụ thể hoặc tiêu chuẩn?
GPS

Điều đó phụ thuộc vào việc không có mẫu nào khác .rodatatrông giống như vậy 0x69 0x00và trình biên dịch đặt địa chỉ "i"ở cuối"zeo..."
trần

nghĩ vậy .. có cách nào để đảm bảo trình biên dịch không? Tôi biết các quy tắc ở đây sẽ cho phép điều này nhưng, tôi có thể phụ thuộc vào điều này trong thực tế không?
GPS

Bản năng của tôi là tránh điều này trong "thế giới thực" nhưng điều này có thể sẽ hoạt động tốt nếu các đoạn chuỗi của bạn đủ độc đáo. Thực tế có thể có một số trường hợp sử dụng hợp pháp có lẽ liên quan đến chim hoàng yến nhưng tôi cũng có thể bị ảo giác.
trần mèo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.