Số nguyên chữ cái


19

Số nguyên chữ cái

Đối với một tập hợp số đã cho, hãy đặt chúng theo thứ tự bảng chữ cái khi chúng được đánh vần (nghĩa là 1: một, 2: hai, 90: chín mươi, 19: mười chín). Mã của bạn sẽ làm việc cho phạm vi [-999999, 999999]. Đầu ra phải có một dấu phân cách giữa các số. Một khoảng trắng sẽ hoạt động, cũng như một khoảng trắng và dấu phẩy như trong các ví dụ dưới đây. Đầu vào có thể là một mảng các số nguyên, một chuỗi các số được phân tách hoặc tuy nhiên bạn thấy phù hợp. Tất cả các số nguyên được coi là duy nhất.

Các con số không được gạch nối cho mục đích của thử thách này và không gian được sắp xếp theo thứ tự chữ cái trước bất kỳ ký tự nào khác. Các số âm được giả sử được thể hiện bằng cách sử dụng từ này minus. Ví dụ, foursẽ có trước four thousandvà số -40sẽ được sắp xếp bằng chuỗi minus forty. Giả sử tất cả các số sẽ chỉ bao gồm các từ số và không có liên từ (ví dụ: sử dụng two thousand forty twothay vì two thousand and forty two).


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

Số nguyên đơn:

Đầu vào:

1, 2, 3, 4, 5

Đầu ra:

5, 4, 1, 3, 2

Số nguyên nhiều chữ số:

Đầu vào:

-1002, 5, 435012, 4, 23, 81, 82

Đầu ra:

81, 82, 5, 4, 435012, -1002, 23

Khoảng cách giữa các từ, không có dấu gạch ngang, dấu phẩy hoặc "và":

Đầu vào:

6, 16, 60, 64, 600, 6000, 60000, 60004, 60008, 60204, 60804

Đầu ra:

6, 600, 6000, 16, 60, 64, 60000, 60008, 60804, 60004, 60204

Hãy nhớ rằng, đây là , vì vậy mã có ít byte nhất sẽ thắng. Không có sơ hở cho phép!


Đây là liên kết đến bài sandbox có liên quan.
wub

Đầu vào có bao giờ chứa nhiều hơn một số nguyên không?
Sản xuất ETH

@ETHproductions Không, nó sẽ không. Tôi sẽ chỉ định rằng trong câu hỏi.
wub

8
Chào mừng đến với PPCG. Ảnh đại diện đẹp. : D Câu hỏi đầu tiên rất hay.
admBorkBork

@TimmyD Cảm ơn! Tôi đang mong chờ PowerShell-ing mọi thứ tôi có thể ở đây.
wub

Câu trả lời:


5

JavaScript (ES6), 189 179 186 byte

let f =

a=>a.sort((x,y)=>!x-!y||(X=q(x),Y=q(y),X>Y)-(X<Y),q=n=>n<0?"L"+q(-n):n>999?q(n/1e3)+"Z"+q(n%1e3):n>99?q(n/100)+"K"+q(n%100):n>19?"  cYHFVSCO"[n/10|0]+q(n%10):"0PdaIGTQAMWDbXJEURBN"[n|0])

let g = a => console.log(`[${f(a)}]`)

g([1,2,3,4,5])
g([-1002,5,435012,4,23,81,82])
g([0,1000,1100])
<input id=I value="1 2 3 4 5"><button onclick="g(I.value.match(/\d+/g)||[])">Run</button>

Ý tưởng cơ bản là chuyển đổi từng số đầu vào thành một chuỗi ngắn ở vị trí từ vựng chính xác so với tất cả các cặp chuỗi số khác. Đây là từ điển được sử dụng: (Đừng chạy đoạn trích; nó chỉ được sử dụng để ẩn danh sách dài.)

Điều này tạo ra một cách rất ngắn gọn để ánh xạ từng số vào vị trí chính xác theo từ vựng của nó. Đó là những gì qhàm đệ quy thực hiện:

q(-X)        => "L" + q(X)
q(XYYY)      => q(X) + "Z" + q(YYY)
q(XYY)       => q(X) + "K" + q(YY)
q(XY >= 20)` => "  cYHFVSCO"[X] + q(Y)
q(X)         => "0PdaIGTQAMWDbXJEURBN"[X]

0đầu chuỗi là để đảm bảo rằng ví dụ 100 ( one hundred, được chuyển đổi thành PK0) được sắp xếp trước 101( one hundred one, được chuyển đổi thành PKP). Điều này tạo ra một kịch bản kỳ lạ trong đó 0 ( zero) được sắp xếp ở phía trước của mảng, vì vậy để giải quyết vấn đề này, trong hàm sắp xếp, trước tiên chúng ta sắp xếp bất kỳ số 0 nào ở bên phải !x-!y||(....


Có vẻ như nó không hoạt động [1100, 1000]. Tôi hy vọng đầu ra sẽ được 1000 (one thousand), 1100 (one thousand one hundred), nhưng đầu ra là thứ tự giống như đầu vào.
sữa

@milk Hmm ... Tôi không chắc tại sao điều này xảy ra, nhưng tôi sẽ xem xét nó.
Sản xuất ETH

@milk Ah, 1000đang được phân tích cú pháp như one thousand zero; Tôi sẽ sửa nó trong giây lát. Chúng ta phải tự hỗ trợ 0chứ? Đó là một trường hợp duy nhất sẽ thêm 15 byte hoặc hơn vào mã của tôi.
Sản xuất ETH

11

Thông báo 7, 214 201 118 byte

Thông báo 7 là một ngôn ngữ hoàn toàn khủng khiếp để chơi golf, vì vậy tôi muốn cho nó một cơ hội ở đây.

Việc thụt lề nên sử dụng các \tký tự tab ( ), nhưng HTML không giống như các ký tự đó. Ngược lại, Inform không thích khoảng trắng để thụt lề, vì vậy bạn sẽ phải thay thế khoảng trắng bằng các tab nếu bạn sao chép-dán mã từ đây để kiểm tra nó. Hoặc chỉ cần sao chép-dán từ nguồn Markdown thay thế.

Chơi gôn

Đến X:
    lặp lại thông qua Bảng 1:
        bây giờ mục Q là "[mục R trong từ]";
    sắp xếp Bảng 1 theo thứ tự Q;
    nói "[R trong Bảng 1]".

Đầu vào phải là một bảng Thông tin, giống như vậy (với \tgiữa các cột):

Bảng 1
R (số) Q (văn bản)
-1002
5
435012
4
23
81
82

Đầu ra:

81, 82, 5, 4, 435012, -1002, 23

Hàm này chạy qua bảng một lần, thêm một biểu diễn văn bản của mỗi số trong một cột mới. Sau đó, nó sắp xếp các hàng của bảng theo cột văn bản; trong Thông tin, các chuỗi được sắp xếp theo từ vựng. Cuối cùng, nó in ra cột ban đầu theo thứ tự mới. Thuận tiện, thông báo định dạng "thô nhưng đôi khi hữu ích" của 7 để in ra các cột trong bảng hóa ra được phân tách bằng dấu phẩy, chính xác như được yêu cầu.

Ungolfed, với cái nồi hơi chỉ ra cách gọi hàm:

Để in các số theo thứ tự bảng chữ cái:
    lặp lại thông qua Bảng các số có thể sắp xếp:
        bây giờ mục nhập tên là "[mục nhập chỉ mục bằng từ]";
    sắp xếp Bảng các số có thể sắp xếp theo thứ tự tên;
    nói "[cột chỉ mục trong Bảng số có thể sắp xếp]".

Bảng số có thể sắp xếp
chỉ mục (số) tên (văn bản)
-1002
5
435012
4
23
81
82

Có một căn phòng.
Khi chơi bắt đầu: in các số theo thứ tự bảng chữ cái.

1
Tôi hơi bối rối vì điều này. Là wordsmột tài liệu tham khảo về các phiên bản chính tả của các số, được tích hợp trong Thông tin 7?
Pavel

1
@Pavel Thật vậy! "(số) trong từ" trả về một chuỗi có biểu thị bằng văn bản của số đó. Nó thuận tiện sử dụng "trừ" cho các số âm, và trong khi nó đặt dấu gạch nối giữa các từ, nó thực hiện một cách nhất quán và bảng chữ cái dấu gạch nối trước tất cả các chữ cái (vì vậy kết quả cuối cùng là như nhau).
Draconis

2
+1 cho lựa chọn ngôn ngữ. Tôi phải kiểm tra, nhưng tôi nghi ngờ vẫn còn một số cơ hội chơi gôn; ví dụ, trình phân tích cú pháp có thực sự yêu cầu tất cả các bài viết "đó" không? Và bạn sẽ phải hỏi OP, nhưng tôi không thấy bất kỳ lý do rõ ràng nào tại sao "và" sẽ không phải là một dấu phân cách hợp lệ. Ngay cả khi không, một không gian duy nhất được cho phép rõ ràng, vì vậy chỉ say "[R entry] "nên đủ.
Ilmari Karonen

Tôi muốn nói "và" ở cuối là tốt. Tôi không nói rằng các dấu phân cách phải đồng nhất, vì vậy đây là một câu trả lời hoàn toàn chấp nhận được. Nếu tôi có thể cho điểm cho câu trả lời thú vị nhất, tôi sẽ đưa nó cho bạn. Tôi thực sự thích sự dễ đọc của ngôn ngữ này, thậm chí là chơi gôn. Công việc tốt!
wub

Cuối cùng tôi cũng có cơ hội chơi với Inform7 một chút và quản lý để đánh gôn lại mục nhập của bạn xuống chỉ còn 118 byte. Vì đăng thông tin Mã trong các bình luận không hoạt động tốt, tôi đã tiếp tục và chỉnh sửa nó thành câu trả lời của bạn. Tôi hy vọng bạn không phiền, cứ thoải mái hoàn nguyên và / hoặc điều chỉnh các chỉnh sửa của tôi theo bất kỳ cách nào bạn muốn nếu bạn làm như vậy.
Ilmari Karonen

4

Toán học, 67 byte

SortBy[#,#~IntegerName~"Words"~StringReplace~{","->"","-"->""}&]&

Hàm không tên lấy danh sách các số nguyên làm đối số của nó và trả về danh sách các số nguyên làm giá trị của nó. #~IntegerName~"Words"là một tích hợp thay đổi một số nguyên thành tên của nó bằng tiếng Anh. IntegerNameđôi khi có dấu phẩy và dấu gạch nối trong đầu ra của nó, vì vậy StringReplacecuộc gọi sẽ loại bỏ chúng. (Đáng buồn là dấu gạch nối thực sự là ký tự 3 byte, 8208, trong UTF-8.) Sau đó SortBysắp xếp danh sách gốc theo thứ tự bảng chữ cái theo giá trị của tên nguyên được sửa đổi.

Một sự trùng hợp thú vị: IntegerNamesử dụng negativethay vì minustrong đầu ra của nó nhưng không có từ nào xuất hiện trong tên của bất kỳ số nào được phép là theo thứ tự abc giữa hai từ đó, vì vậy không cần thay thế!

(Mũ cho ngenisis để nhắc nhở tôi Sortby.)


Thanh danh! Tôi đã đến rất gần để có được giải pháp này, nhưng dấu gạch ngang đó đang khiến tôi đau đầu!
ngenisis

Có câu trả lời của bạn ở đây thực sự sử dụng dấu gạch nối chính xác? Nếu tôi sao chép những gì bạn có ở đây vào Mathematica thì nó không thay thế các dấu gạch nối từ đó IntegerName. Tài liệu của Wolfram nói rằng đó là ký tự unicode 2010 .
ngenisis

Có lẽ là không, sau đó tôi đã cố gắng để có được dấu gạch nối chính xác trong câu trả lời này, nhưng có vẻ như tôi đã không thành công.
Greg Martin

Tôi cắt câu trả lời của bạn xuống một nửa;)
J. Antonio Perez

Và sau đó một số ... bạn thực hiện các sửa đổi không cần thiết cho chuỗi.
J. Antonio Perez

4

Bash + GNU utils + bsdgames, 52

  • 4 byte được lưu nhờ @izabera.
sed 's/.*/echo `echo &|number`:&/e'|sort|sed s/.*://

I / O là các dòng phân cách dòng mới.

  • Biểu thức sed đầu tiên thay thế mỗi số bằng một lệnh shell xuất ra dạng từ của số (như được đưa ra bởi tiện ích bsdgamesnumber ), theo :sau là dạng số của số đó.
  • Đây là sorted.
  • Sau đó, seddải thứ hai dẫn các ký tự lên đến và bao gồm :, để lại dạng số được sắp xếp theo yêu cầu.

numberxử lý chính xác "trừ" và đầu ra của nó đủ gần với định dạng cụ thể mà sortcông việc theo yêu cầu. Nó tạo ra "bốn mươi bốn" thay vì "bốn mươi bốn", nhưng điều này không quan trọng từ góc độ sắp xếp.

Gói bsdgames có thể cần cài đặt:

sudo apt-get install bsdgames

Các tiện ích sedsortgần như chắc chắn đã có trong bản phân phối của bạn.


-t:là vô dụng và bạn có thể sử dụngnumber<<<&
izabera

@izabera Có - cảm ơn - Tôi đã xóa -t:. Tuy nhiên, etính năng val của sed chạy các lệnh bằng cách sử dụng sh, vì vậy các tính năng bash như <<<sẽ không hoạt động.
Chấn thương kỹ thuật số

nó hoạt động tốt miễn là sh của bạn là bash: P
izabera

@izabera Không, nếu bash bắt đầu khi shnó cố gắng giả lập Posix sh càng nhiều càng tốt, điều đó có nghĩa là các bashism như <<<bị tắt. Tính năng val sedcủa GNU ebắt đầu các lệnh có /bin/sh -c ...và không /bin/bash -c .... Bạn đã thử điều này?
Chấn thương kỹ thuật số

bash không bao giờ tắt <<<, ngay cả trong chế độ posix
izabera

1

Python + lạm phát, 97 91 89 byte

from inflect import*
a={x:engine().number_to_words(x)for x in words}
sorted(a,key=a.get)

Đã sử dụng inflectthư viện để biến đổi các wordssố nguyên thành biểu diễn ngữ âm / chuỗi của chúng. Được lưu trữ trong một từ điển các cặp k / v trong đó các khóa là biểu diễn số và giá trị là biểu diễn chuỗi. Trả về danh sách các khóa như được sắp xếp theo các giá trị.

EDIT: Đã lưu 5 và 3 byte, nhờ vào ETHproductions và Alex.S!


Chào mừng đến với PPCG! Bạn có thể chơi golf này bằng cách loại bỏ không gian ; ví dụ, dòng thứ hai có thể a={x:inflect.engine().number_to_words(x)for x in words}.
Sản xuất ETH

Bạn có thể lưu hai byte bằng cách sử dụng from inflect import*và ném ra inflect.trong dòng thứ hai.
Alex.S

Than ôi, có vẻ như điều này cũng không sắp xếp chính xác danh sách 40, 44, 40000, 40804, 40004, 40204 (nên giữ theo thứ tự đó).
Ilmari Karonen

0

Toán học, 30 byte

Câu trả lời dưới đây đưa ra một hàm thuần sẽ lấy danh sách các số nguyên làm đầu vào và sắp xếp chúng theo tên chữ cái của chúng. Chỉ cần những gì bác sĩ đã ra lệnh ;)

SortBy[#~IntegerName~"Words"&]

Đây là phiên bản chưa được chỉnh sửa:

SortBy[IntegerName[#, "Words"]&]

Và đây là một ví dụ sử dụng:

SortBy[#~IntegerName~"Words"&][{0,1,2,3,4,5,6,7,8,9,10}]

Mà cũng có thể được viết là

SortBy[#~IntegerName~"Words"&]@{0,1,2,3,4,5,6,7,8,9,10}

Họ tạo ra kết quả đầu ra giống hệt nhau - trong f[x]mathicala, tương đương với f@x.

Outputs: {8, 5, 4, 9, 1, 7, 6, 10, 3, 2}

Có một câu trả lời dài hơn nhiều mà một người dùng khác đã đăng trong Mathematica. Câu trả lời đó cố gắng sửa cho một số khác biệt nhỏ giữa cách toán học các chữ số hóa để phù hợp hơn với cách các số OP đã nêu nên được sắp xếp theo thứ tự chữ cái, tuy nhiên những điều chúng sửa không ảnh hưởng đến thứ tự sắp xếp và câu trả lời của tôi cho kết quả giống hệt với chúng:

MyF = SortBy[#~IntegerName~"Words"&];
TheirF = SortBy[#, #~IntegerName~"Words"~ StringReplace~{"," -> "", "-" -> ""} &] &;
MyF[Range[-999999, 999999]] == TheirF[Range[-999999, 999999]]
(*Outputs True*)

Một cuộc điều tra tuyệt vời! Thật không may, họ thực sự không đưa ra thứ tự tương tự. TheirFsắp xếp chính xác 888 trước 880.000, trong khi MyFkhông. Có lẽ vấn đề là với việc sao chép của dấu gạch nối lạ: phiên bản của bạn TheirFcó thể thay thế các dấu gạch nối thông thường (trong đó không có dấu gạch ngang), trong khi phiên bản thực tế thay thế dấu gạch nối Unicode 3 byte lạ. (Sẽ vẫn rất thú vị để xem liệu có cần xóa dấu phẩy hay không.)
Greg Martin

Tôi đã thử nó trên Phạm vi [999999]. Có vẻ như việc loại bỏ dấu phẩy là không cần thiết, nhưng thay thế "[Dấu gạch nối]" bằng "" là điều chắc chắn cần thiết.
ngenisis

0

Lisp thông thường, 113 byte

Không có thư viện bên ngoài cần thiết.

(print(mapcar #'cdr(sort(loop for i in x collect(cons(format()"~r"i)i))(lambda(y z)(string-lessp(car y)(car z))))))

Đầu ra nếu x'(1 2 3 4 5):

(5 4 1 3 2)
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.