Phát âm


24

Chúng ta đều biết các thuật toán sắp xếp lạ mắt khác nhau, nhưng không có thuật toán nào trong số chúng cung cấp cho chúng ta những con số theo cách dễ phát âm. Để khắc phục điều này, tôi đề xuất sử dụng Phát âm, cách tự nhiên nhất để sắp xếp danh sách các số.

Cách phát âm

Các quy tắc chính thức để phát âm số (trong thử thách này) là các chữ số được phát âm từng cái một và chuỗi kết quả được sắp xếp theo thứ tự từ điển. Ví dụ, điều này có nghĩa là số 845được phát âm "eight four five"và nên được sắp xếp tương ứng.

Số âm

Số âm được phát âm bằng cách thêm từ "minus". Do đó, -23được phát âm là "minus two three". Lưu ý rằng điều này làm cho các số âm kết thúc ở giữa đầu ra, ngay giữa các số bắt đầu bằng 4(bốn) và 9(chín).

Theo hướng dẫn, thứ tự chính thức của WordsSort ™ là:

  • tám
  • số năm
  • bốn
  • dấu trừ
  • chín
  • một
  • bảy
  • sáu
  • số ba
  • hai
  • số không

Đó là,

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

Đầu vào

Danh sách các số nguyên trong phạm vi , chứa tối đa 100 phần tử. Đầu vào dưới dạng danh sách các chuỗi không được phép. Nếu ngôn ngữ của bạn không hỗ trợ đầu vào dưới dạng danh sách, được phép cung cấp đầu vào dưới dạng số nguyên riêng biệt.[-999,999]

Đầu vào sẽ không chứa bất kỳ số không hợp lệ hoặc bất kỳ số nào bắt đầu bằng 0 (ngoại trừ chính số 0). Đầu vào nói chung sẽ không được sắp xếp, nó có thể được đưa ra theo bất kỳ thứ tự nào.

Đầu ra

Các số nguyên tương tự, theo thứ tự Phát âm. Lưu ý rằng các số chỉ nên được chuyển đổi thành cách phát âm của chúng để có được sự sắp xếp, đầu ra không được chứa bất kỳ chuỗi nào.

Ví dụ

Đối với các ví dụ, bước giữa (được gói trong ngoặc đơn) chỉ đóng vai trò là một hướng dẫn và không phải là một phần của đầu ra.

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

Ngoài ra còn có một kịch bản để xác minh kết quả của bạn .


5
Tại sao không "một" (phát âm là "thắng") đến sau hai và trước 0?
Ben Miller - Tái lập Monica

3
@BenMiller Tôi không thể nhớ lại nếu đó là bạn đã bình luận trong hộp cát, nhưng bình luận đó đã cho tôi deja vu. Để trả lời nó ở đây, tôi đã suy ngẫm về nó, nhưng tôi đã đi bằng cách đánh vần để tránh các cuộc thảo luận chính tả (ví dụ: "hai" vs "too", "won" hoặc "wan")
maxb

17
Vì vậy, nó thực sự là "sắp xếp chính tả" hơn là "sắp xếp phát âm" :-)
Paŭlo Ebermann

3
bummer Tôi đã hy vọng họ sẽ được sắp xếp theo mức độ khó phát âm của họ ...
NH.

2
Thử thách này thực sự nên được đổi tên, vì việc sắp xếp ở đây hầu như không liên quan gì đến phát âm. Sẽ cực kỳ phức tạp hơn nếu nó dựa trên phát âm (ví dụ: bốn có thể đến trước năm nếu bạn sắp xếp monophthong ⟨ɔː⟩ trước diphthong ⟨aɪ⟩, nhưng năm trước bốn nếu bạn sắp xếp một từ có nguồn gốc a⟩ trước o - được tạo ra - theo hiểu biết của tôi, không có thứ tự sắp xếp nào được thiết lập để phát âm, trong IPA cũng như trong bất kỳ sơ đồ nào khác).
Janus Bahs Jacquet

Câu trả lời:


8

05AB1E (di sản) , 15 byte

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

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

Giải trình

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

Dường như có một lỗi trong số nguyên nén •ĆU‘•.. Nó thêm một dòng mới trong quá trình ánh xạ / sắp xếp vì bất kỳ lý do gì. Σ•ĆU‘•"54-ÿ"sSkcó thể là một giải pháp thay thế 15 byte mà tôi đang làm việc, nếu nó không phải là lỗi kỳ lạ đó .. Nếu tôi đổi •ĆU‘•thành nghĩa đen 9176320 thì nó vẫn hoạt động tốt ..
Kevin Cruijssen

1
@KevinCruijssen: Điều đó thật kỳ lạ. Bạn sẽ là 14 với …54-ìchẵn
Emigna

@KevinCruijssen: Bạn có thể làm Σ•RT‹•Á…54-ìsSktrong 15
Emigna

•t∍ýJ•'-ìÁÁcũng sẽ làm việc
Emigna


8

Thạch ,  15  13 byte

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

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

Một liên kết đơn được chấp nhận một danh sách các số nguyên mang lại một danh sách các số nguyên.

Làm sao?

Sắp xếp theo các giá trị thứ tự của các chữ số của các số nguyên (trong đó -"chữ số" -1) được chuyển đổi thành các chuỗi bằng các ký tự ở chỉ số 1 và mô đun của chúng trong chuỗi ma thuật "murgeon lix".

Sắp xếp là chữ cái hiệu quả trong đó một không gian được coi là ít hơn bất kỳ chữ cái nào.

Chuỗi ma thuật "murgeon lix" đã được tìm thấy bằng cách kiểm tra từ điển của Jelly được sử dụng trong nén. Không có từ nào trong 11 chữ cái thỏa mãn các yêu cầu (và không có từ nào trong số đó sẽ bị sao chép lại). vì một không gian sắp xếp trước các chữ cái, lựa chọn rõ ràng nhất tiếp theo là một từ có độ dài bảy, theo sau là khoảng trắng theo sau là một từ có độ dài ba. "murgeon" và "lix" là sự kết hợp thỏa mãn duy nhất, mặc dù không có khoảng “£Py:ƥ»trắng, những người khác có thể có thể (ví dụ: "murgeonalix" hoạt động cho cùng một số byte)

Ṿ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 byte trước :

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

Ở đây “¡Zo⁶’Œ?¤tìm thấy hoán vị đầu tiên của các số tự nhiên sẽ nằm ở chỉ số 21.340.635 khi tất cả các hoán vị của các số được sắp xếp theo từ vựng - đó là [6,10,9,3,2,8,7,1,5,4,11]. ( “¡Zo⁶’là đại diện cơ sở 250 của 21340635, trong khi Œ?tính toán và ¤nhóm các hướng dẫn này lại với nhau)


Ngay cả với lời giải thích, tôi không cảm thấy rất thông minh. Giải pháp tuyệt vời!
maxb

Phiên bản ngắn hơn có lẽ cũng dễ hiểu hơn!
Jonathan Allan

7

Perl 6 , 30 byte

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

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

Giải pháp Ruby của GB.

Phiên bản 35 byte gốc

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

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

Chuyển đổi từng số thành một chuỗi, lấy tên Unicode của từng ký tự, tách từ đầu tiên ("DIGIT" hoặc "HYPHEN"), sau đó sắp xếp.


6

JavaScript (SpiderMonkey) , 69 byte

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

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


Có vẻ như bạn có thể loại bỏ +'', xem như bạn đang nhập dữ liệu dưới dạng một chuỗi các chuỗi.
Xù xì

@Shaggy Tôi không lấy chuỗi nữa, vì tôi không chắc điều đó có được phép ở đây không.
Arnauld

À ... Bạn nói đúng. Điều đó sẽ thêm một vài byte vào giải pháp của tôi.
Xù xì

6

K (ngn / k) , 21 20 byte

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

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

{ } chức năng với đối số x

$ định dạng dưới dạng chuỗi

""?-263"8"

< tính toán hoán vị tăng dần

x@ lập luận tại các chỉ số đó


6

Python 3, 68 byte 67 byte 64 byte

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

Sử dụng sortedchức năng tích hợp với lambda ẩn danh cho khóa. Mã cứng thứ tự sắp xếp và so sánh từng chữ số trong mỗi giá trị trong danh sách đầu vào với vị trí của nó trong danh sách thứ tự sắp xếp.

Chỉnh sửa: Đã lưu 1 byte bằng cách xóa 8khỏi danh sách sắp xếp để tận dụng lợi thế của việc str.findtrả về -1khi không tìm thấy tham số. Nhờ maxb.

Edit2: Đã lưu 3 byte bằng cách sử dụng cú pháp giải nén được gắn dấu sao listtheo nghĩa đen thay vì hàm listtạo

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


1
Bạn có thể loại bỏ 8 đầu tiên trong chuỗi? Vì Python trả về -1 nếu không tìm thấy chuỗi con.
maxb

@maxb Bắt tốt. Đã chỉnh sửa.
mypetlion


5

Bình thường, 17 16 byte

oxL"54-9176320"`

Dùng thử trực tuyến tại đây hoặc xác minh tất cả các trường hợp thử nghiệm cùng một lúc tại đây .

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)

Đã lưu 1 byte nhờ @ngn và câu trả lời K của họ , bằng cách bỏ qua 8 từ đầu chuỗi từ điển


4

Japt, 19 byte

ñ_s ®n"54-9176320

Thử nó


Giải pháp tốt đẹp! Không may cho phép nhập vào danh sách các chuỗi.
maxb

Bạn có thể tiết kiệm một số bằng cách lạm dụng S.n(s): ñ_s ®n"54-9176320(rõ ràng S.n(s)là hoàn toàn giống s.b(S)với Sđộ dài 1, ngoại trừ nó trả về 0vị trí -1)
ETHproductions

Thủ thuật hay, @ETHproductions, cảm ơn :) Tôi sẽ phải nhớ cái đó cho tương lai.
Xù xì

3

Võng mạc 0.8.2 , 36 byte

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

Hãy thử trực tuyến! Liên kết bao gồm bộ kiểm tra. Giải trình:

T`-d`3:598217604

Dịch dấu trừ và chữ số sang vị trí của chúng theo thứ tự phát âm, sử dụng :cho vị trí thứ 10.

O`

Sắp xếp theo thứ tự phát âm.

T`3:598217604`-d

Dịch thứ tự trở lại dấu trừ ban đầu và chữ số.



3

R , 58 byte

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

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

Đầu vào là danh sách các số được chuyển đổi ngầm định thành chuỗi sử dụng chartr. ordersau đó sử dụng thứ tự từ vựng để lấy thứ tự mà theo đó danh sách gốc sẽ được sắp xếp.


3

Java (JDK 10) , 123 byte

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

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

Đây là một triển khai Java ngây thơ. Nên chơi golf nhiều.

Tín dụng


1
Thay đổi .chars-IntStream và.reduce thành một vòng lặp thông thường sẽ tiết kiệm được 2 byte : n->{var r="";for(var c:(""+n).split(""))r+=10+"854-9176320".indexOf(c);return r;}. Ngoài ra, có thể lưu thêm một byte bằng cách thay đổi 10+"85thành 20+"5, vì .indexOfchữ số 8sau đó sẽ dẫn đến -1. Dùng thử trực tuyến 123 byte
Kevin Cruijssen


2

Màu đỏ , 114 byte

func[n][g: func[a][collect[foreach c form a[keep index? find"854-9176320"c]]]sort/compare n func[x y][(g x)< g y]]

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

Dễ đọc hơn:

f: func [ n ] [
    g: func [ a ] [
        collect [ 
            foreach c form a [ 
                keep index? find "854-9176320" c
            ]
        ]
    ]
    sort/compare n func [ x y ] [ (g x) < g y ]
]

2

C ++, 353 byte

Đây là một mục hài kịch, nhưng tôi đã lãng phí thời gian và viết nó, vì vậy tôi không thể đăng nó ... Thưởng thức một tiếng cười và cho tôi biết nếu có bất kỳ trình tiết kiệm không gian nào tôi bỏ lỡ!

#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," "));}

Đầu ra:

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


Tôi thấy bạn cũng sống theo phương châm "nếu tôi không nhấn enter thì sẽ có ít dòng hơn để gỡ lỗi"
maxb

1
Này, tôi không thể có được khoảng trắng phù phiếm trong ngôn ngữ này! Thật buồn cười khi phải làm điều này, khi thấy phần còn lại của thời gian, có vài điều khiến tôi tức giận như mở mã của người khác, những người dường như nghĩ rằng viết một bức tường nguyên khối khủng khiếp sẽ khiến họ có vẻ thông minh hơn, và / hoặc được trả tiền tích cực cho mỗi dòng mới họ gõ.
gạch dưới

1
Xin chào! Ép giải pháp của bạn lên 195 ký tự
Max Yekhlakov

@MaxYekhlakov Tuyệt, cảm ơn vì đã suy ngẫm về nó! Tôi nhận ra sau khi đọc thêm một chút; có vẻ như tôi không nhất thiết phải cung cấp một chương trình có thể biên dịch đầy đủ, mà thay vào đó chỉ có các chức năng sẽ xử lý đầu vào và đầu ra được chỉ định. Ôi!
gạch dưới

2

Toán học, 68 byte

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

Chức năng. Lấy danh sách các số nguyên làm đầu vào và trả về danh sách đã sắp xếp làm đầu ra. Chỉ cần tách các chữ số của mỗi số với IntegerDigits, chuyển đổi từng chữ số thành "zero", "one"v.v., với IntegerName, chuyển đổi danh sách thành một chuỗi được phân tách bằng dấu cách StringRiffle, thêm vào một số "m "nếu âm và sắp xếp dựa trên chuỗi này. Thật vậy, đây là cách tiếp cận ngắn nhất mà tôi có thể tìm thấy, vì Mathicala chỉ sử dụng cách sắp xếp từ điển cho các danh sách có cùng độ dài; do đó, một cách tiếp cận dựa trên việc 854-9176320kết thúc việc lấy nhiều byte hơn vì các hàm chuỗi rất tốn kém.


Luôn tin tưởng toán học để có sự kết hợp của các nội dung. Giải pháp thông minh!
maxb

1

05AB1E , 15 14 byte

Σ•ĆU‘•…54-ìsSk

-1 byte nhờ @Emigna .

Hãy thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình:

Σ                 # 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')

Xem mẹo 05AB1E này của tôi (phần Làm thế nào để nén các số nguyên lớn ) để hiểu tại sao •ĆU‘•9176320.

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.