เรียงตามตัวอักษรจำนวนเต็ม


19

เรียงตามตัวอักษรจำนวนเต็ม

สำหรับชุดตัวเลขที่ระบุให้เรียงตามลำดับตัวอักษรเมื่อสะกดออกมา (เช่น 1: หนึ่ง, 2: สอง, 90: เก้าสิบ, 19: สิบเก้า) [-999999, 999999]รหัสของคุณควรจะทำงานสำหรับช่วง เอาต์พุตต้องมีตัวคั่นระหว่างตัวเลข พื้นที่จะใช้งานได้เช่นเดียวกับที่ว่างและเครื่องหมายจุลภาคดังที่แสดงในตัวอย่างด้านล่าง อินพุตอาจเป็นอาร์เรย์ของจำนวนเต็มสตริงของตัวเลขที่คั่นด้วยหรืออย่างไรก็ตามคุณเห็นว่าเหมาะสม จำนวนเต็มทั้งหมดจะถือว่าไม่ซ้ำกัน

ตัวเลขจะไม่ใส่เครื่องหมายขีดคั่นสำหรับจุดประสงค์ของการท้าทายนี้และมีการเว้นวรรคตามตัวอักษรก่อนอักขระอื่นใด จำนวนลบจะถือว่าแสดงโดยใช้คำminusนั้น ยกตัวอย่างเช่นfourจะนำหน้าfour thousandและจำนวนจะถูกจัดเรียงโดยใช้สตริง-40 minus fortyสมมติว่าตัวเลขทั้งหมดจะประกอบด้วยคำจำนวน แต่เพียงผู้เดียวและไม่มีคำสันธาน (เช่นใช้two thousand forty twoแทนtwo thousand and forty two)


กรณีทดสอบ

จำนวนเต็มหลักเดียว:

การป้อนข้อมูล:

1, 2, 3, 4, 5

เอาท์พุท:

5, 4, 1, 3, 2

จำนวนเต็มจำนวนเต็ม:

การป้อนข้อมูล:

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

เอาท์พุท:

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

ช่องว่างระหว่างคำไม่มีเครื่องหมายขีดคั่นจุลภาคหรือ "และ":

การป้อนข้อมูล:

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

เอาท์พุท:

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

จำไว้ว่านี่คือดังนั้นโค้ดที่มีจำนวนไบต์น้อยที่สุดจะเป็นผู้ชนะ ไม่อนุญาตให้มีช่องโหว่!


นี่คือลิงค์ไปยังโพสต์แซนด์บ็อกซ์ที่เกี่ยวข้อง
wubs

อินพุตจะมีจำนวนเต็มมากกว่าหนึ่งค่าหรือไม่
ETHproductions

@ETHproductions ไม่มันจะไม่ ฉันจะระบุว่าในคำถาม
wubs

8
ยินดีต้อนรับสู่ PPCG อวตารที่ดี : D คำถามแรกที่ดี
AdmBorkBork

@ TimmyD ขอบคุณ! ฉันรอคอยที่จะใช้ PowerShell ทุกสิ่งที่ฉันสามารถทำได้ที่นี่
wubs

คำตอบ:


5

JavaScript (ES6), 189 179 186 ไบต์

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>

แนวคิดพื้นฐานคือการแปลงหมายเลขอินพุตแต่ละรายการให้เป็นสตริงสั้น ๆ ที่อยู่ในตำแหน่งที่ถูกต้องเมื่อเทียบกับคู่อื่น ๆ ของสตริงตัวเลข นี่คือพจนานุกรมที่ใช้: (อย่าเรียกใช้ตัวอย่างข้อมูลมันใช้เพื่อซ่อนรายการยาว ๆ )

สิ่งนี้สร้างวิธีรัดกุมมากในการจับคู่แต่ละหมายเลขกับตำแหน่งที่ถูกต้องของพจนานุกรม นั่นคือสิ่งที่qฟังก์ชั่นวนซ้ำทำ:

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ที่จุดเริ่มต้นของสตริงคือการจัดให้เช่นที่ 100 ( one hundredแปลงPK0) จะถูกจัดเรียงก่อน101( one hundred oneแปลงPKP) สิ่งนี้จะสร้างสถานการณ์แปลก ๆ ที่ 0 ( zero) ถูกจัดเรียงไว้ที่ด้านหน้าของอาเรย์ดังนั้นเพื่อหลีกเลี่ยงปัญหานี้ในฟังก์ชั่นการเรียงลำดับเราจะจัดเรียงเลขศูนย์ไปทางขวา!x-!y||(...ก่อน


[1100, 1000]ดูเหมือนว่ามันไม่ทำงานสำหรับ ฉันคาดหวังว่าเอาต์พุตจะเป็น1000 (one thousand), 1100 (one thousand one hundred)เช่นนั้น แต่เอาต์พุตจะเรียงตามลำดับเดียวกับอินพุต
นม

@milk อืม ... ฉันไม่แน่ใจว่าทำไมถึงเกิดเหตุการณ์นี้ขึ้น แต่ฉันจะตรวจสอบมัน
ETHproductions

@milk อา1000จะถูกแยกวิเคราะห์เป็นone thousand zero; ฉันจะแก้ไขในไม่ช้า เราต้องสนับสนุน0ด้วยตัวมันเองเหรอ? เป็นกรณีพิเศษที่จะเพิ่ม 15 ไบต์หรือมากกว่านั้นในรหัสของฉัน
ETHproductions

11

แจ้ง 7, 214 201 118 ไบต์

ข้อมูล 7เป็นภาษาที่แย่มากสำหรับการเล่นกอล์ฟดังนั้นฉันจึงต้องการให้โอกาสกับที่นี่

การเยื้องควรใช้\tอักขระแท็บ ( ) แต่ HTML ไม่เหมือนกับสิ่งเหล่านั้น ตรงกันข้ามแจ้งไม่ชอบช่องว่างสำหรับการเยื้องดังนั้นคุณจะต้องแทนที่ช่องว่างด้วยแท็บถ้าคุณคัดลอกวางรหัสจากที่นี่เพื่อทดสอบ หรือเพียงแค่คัดลอกวางจากแหล่งมาร์กดาวน์แทน

แข็งแรงเล่นกอล์ฟ:

ถึง X:
    ทำซ้ำผ่านตารางที่ 1:
        ตอนนี้รายการ Q คือ "[รายการ R ในคำ]";
    จัดเรียงตารางที่ 1 ในการสั่งซื้อ Q;
    พูดว่า "[R ในตารางที่ 1]"

ข้อมูลที่ป้อนเข้าควรเป็นตารางแจ้งข้อมูลเช่น ( \tระหว่างคอลัมน์):

ตารางที่ 1
R (จำนวน) Q (ข้อความ)
-1002
5
435012
4
23
81
82

เอาท์พุท:

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

ฟังก์ชั่นนี้วิ่งผ่านตารางหนึ่งครั้งเพิ่มการแสดงข้อความของแต่ละหมายเลขในคอลัมน์ใหม่ จากนั้นเรียงลำดับแถวของตารางตามคอลัมน์ข้อความ ในแจ้งสตริงจะเรียงตามพจนานุกรม ในที่สุดมันจะพิมพ์คอลัมน์ต้นฉบับในคำสั่งซื้อใหม่ สะดวกสบายแจ้งรูปแบบ"หยาบ แต่บางครั้งก็มีประโยชน์"สำหรับการพิมพ์คอลัมน์ของตาราง 7 เป็นการแยกด้วยเครื่องหมายจุลภาคตามที่ร้องขอ

Ungolfed พร้อมแผ่นสำเร็จรูปแสดงวิธีเรียกใช้ฟังก์ชัน:

หากต้องการพิมพ์ตัวเลขตามลำดับตัวอักษร:
    ทำซ้ำผ่านตารางตัวเลขที่เรียงได้:
        ตอนนี้รายการชื่อคือ "[รายการดัชนีในคำ]";
    จัดเรียงตารางของตัวเลขเรียงได้ในลำดับชื่อ;
    พูดว่า "[คอลัมน์ดัชนีในสารบัญเรียงลำดับ]"

ตารางของตัวเลขที่เรียงได้
ดัชนี (หมายเลข) ชื่อ (ข้อความ)
-1002
5
435012
4
23
81
82

มีห้องพัก
เมื่อเริ่มเล่น: พิมพ์ตัวเลขตามลำดับตัวอักษร

1
ฉันสับสนเล็กน้อยในเรื่องนี้ มีการwordsอ้างอิงของสะกดออกรุ่นของตัวเลขที่สร้างขึ้นในแจ้ง 7?
พาเวล

1
@Pavel แน่นอน! "(ตัวเลข) ในคำว่า" ส่งคืนสตริงที่มีการแสดงข้อความของตัวเลข มันใช้ "ลบ" เพื่อลบจำนวนอย่างสะดวกและในขณะที่ใส่เครื่องหมายยัติภังค์ระหว่างคำมันจะทำอย่างสม่ำเสมอและเรียงตามตัวอักษรยัติภังค์ก่อนตัวอักษรทั้งหมด (ดังนั้นผลลัพธ์ที่ได้จะเหมือนกัน)
Draconis

2
+1 สำหรับตัวเลือกภาษา ฉันต้องตรวจสอบ แต่ฉันสงสัยว่ามีโอกาสในการเล่นกอล์ฟเหลืออยู่ ตัวอย่างเช่น parser ต้องการบทความ "the" ทั้งหมดหรือไม่ และคุณต้องถาม OP แต่ฉันไม่เห็นเหตุผลที่ชัดเจนว่าทำไม "และ" จะไม่เป็นตัวคั่นที่ถูกต้อง แม้ว่าจะไม่อนุญาตให้เว้นวรรคเดียวก็say "[R entry] "ควรจะพอเพียง
Ilmari Karonen

ฉันจะบอกว่า "และ" ในตอนท้ายก็ไม่เป็นไร ฉันไม่ได้บอกว่าตัวคั่นต้องเหมือนกันดังนั้นนี่จึงเป็นคำตอบที่ยอมรับได้อย่างสมบูรณ์ ถ้าฉันสามารถให้คะแนนสำหรับคำตอบที่น่าสนใจที่สุดฉันจะให้คุณ ฉันสนุกกับการอ่านภาษานี้มากแม้เล่นกอล์ฟ งานที่ดี!
wubs

ในที่สุดฉันก็มีโอกาสเล่นกับ Inform7 สักหน่อยและจัดการเล่นกอล์ฟรายการของคุณอีกครั้งให้เหลือเพียง 118 ไบต์ เนื่องจากการโพสต์รหัสแจ้งในความคิดเห็นทำงานได้ไม่ดีฉันจึงดำเนินการต่อและแก้ไขมันเป็นคำตอบของคุณโดยตรง ฉันหวังว่าคุณจะไม่รังเกียจรู้สึกฟรีเพื่อยกเลิกและ / หรือปรับแต่งการแก้ไขของฉันในแบบที่คุณชอบถ้าคุณทำ
Ilmari Karonen

4

Mathematica, 67 ไบต์

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

ฟังก์ชั่นที่ไม่ได้ตั้งชื่อใช้รายการของจำนวนเต็มเป็นอาร์กิวเมนต์และส่งคืนรายการจำนวนเต็มเป็นค่า #~IntegerName~"Words"เป็นตัวในที่เปลี่ยนจำนวนเต็มเป็นชื่อในภาษาอังกฤษ IntegerNameบางครั้งมีเครื่องหมายจุลภาคและยัติภังค์ในเอาท์พุทดังนั้นการStringReplaceโทรกำจัดเหล่านั้น (น่าเสียดายที่เครื่องหมายขีดคั่นนั้นเป็นอักขระ 3 ไบต์ 8208 ใน UTF-8) จากนั้นSortByเรียงลำดับรายการตามตัวอักษรตามค่าของชื่อจำนวนเต็มที่ถูกปรับเปลี่ยน

เป็นเรื่องบังเอิญที่ดี: IntegerNameใช้negativeแทนminusผลลัพธ์ - แต่ไม่มีคำใดปรากฏในชื่อของหมายเลขที่อนุญาตใด ๆ ที่เรียงตามตัวอักษรระหว่างสองคำเหล่านั้นดังนั้นจึงไม่จำเป็นต้องเปลี่ยนใหม่!

(หมวกปลายถึง ngenisis เพื่อเตือนฉันSortby)


รุ่งโรจน์! ฉันเข้ามาใกล้มากเพื่อแก้ปัญหานี้ แต่ประนั่นทำให้ฉันปวดหัว!
ngenisis

คำตอบของคุณที่นี่ใช้เครื่องหมายขีดคั่นที่ถูกต้องจริงหรือ ถ้าผมคัดลอกสิ่งที่คุณได้ที่นี่เข้า Mathematica IntegerNameมันไม่ได้แทนยัติภังค์จาก เอกสารวุลแฟรมบอกว่ามันเป็นอักขระ Unicode 2010
ngenisis

อาจไม่ใช่ - ฉันพยายามใช้ยัติภังค์ที่ถูกต้องในคำตอบนี้ แต่ดูเหมือนว่าฉันจะไม่ประสบความสำเร็จ
Greg Martin

ฉันตัดคำตอบของคุณครึ่ง)
เจ. อันโตนิโอเปเรซ

และบางส่วน ... คุณได้ทำการดัดแปลงสตริงโดยไม่จำเป็น
J. Antonio Perez

4

Bash + GNU ใช้ + bsdgames, 52

  • บันทึกได้ 4 ไบต์ด้วย @izabera
sed 's/.*/echo `echo &|number`:&/e'|sort|sed s/.*://

I / O เป็นบรรทัดที่คั่นด้วย newline

  • นิพจน์แรกที่เข้ามาแทนที่ตัวเลขแต่ละตัวด้วยคำสั่งเชลล์ที่ส่งออกรูปแบบคำของตัวเลข (ตามที่กำหนดโดยยูทิลิตีbsdgamesnumber ) ตามด้วย:รูปแบบตัวเลขของตัวเลขนั้น
  • นี่คือsortเอ็ด
  • จากนั้นsedแถบที่สองจะนำอักขระที่มีความยาวสูงสุดและรวมถึง:โดยปล่อยให้เรียงลำดับตัวเลขตามที่ต้องการ

numberจัดการ "ลบ" อย่างถูกต้องและเอาต์พุตอยู่ใกล้กับรูปแบบเฉพาะที่sortทำงานตามที่ต้องการ มันจะเอาท์พุท "สี่สิบสี่" แทนที่จะเป็น "สี่สิบสี่" แต่สิ่งนี้ไม่สำคัญสำหรับมุมมองการเรียงลำดับ

แพ็คเกจ bsdgames อาจต้องติดตั้ง:

sudo apt-get install bsdgames

sedและsortสาธารณูปโภคเกือบจะแน่นอนแล้วใน distro ของคุณ


-t:ไม่มีประโยชน์และคุณสามารถใช้number<<<&
izabera

@izabera ใช่ - ขอบคุณ - -t:ฉันออก อย่างไรก็ตามeคุณสมบัติ val ของ sed เรียกใช้คำสั่งโดยใช้shดังนั้นคุณลักษณะทุบตีเช่น<<<ไม่ทำงาน
Digital Trauma

มันทำงานได้ดีตราบใดที่คุณดวลจุดโทษ: P
izabera

@izabera Nope - ถ้า bash เริ่มต้นในขณะที่shพยายามเลียนแบบ Posix sh ให้มากที่สุดซึ่งหมายความว่า bashisms เช่น<<<นั้นจะถูกปิด GNU sed's eคุณลักษณะ Val เริ่มต้นคำสั่งด้วยและไม่/bin/sh -c ... /bin/bash -c ...คุณเคยลองสิ่งนี้หรือไม่?
Digital Trauma

bash ไม่เคยปิด<<<แม้แต่ในโหมด posix
izabera

1

Python + การเบี่ยงเบน, 97 91 89 ไบต์

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

ใช้inflectไลบรารีเพื่อแปลงwordsอาร์เรย์ของจำนวนเต็มเป็นการแสดงการออกเสียง / สตริง เก็บไว้ในพจนานุกรมของคู่ k / v ที่คีย์คือการแสดงตัวเลขและค่าคือการแสดงสตริง ส่งคืนรายการของคีย์ที่เรียงลำดับตามค่า

แก้ไข: บันทึก 5 และ 3 ไบต์ขอบคุณ ETHproductions และ Alex.S!


ยินดีต้อนรับสู่ PPCG! คุณสามารถกอล์ฟนี้โดยการลบช่องว่าง ; a={x:inflect.engine().number_to_words(x)for x in words}ตัวอย่างเช่นบรรทัดที่สองสามารถ
ETHproductions

คุณสามารถบันทึกสองไบต์โดยใช้from inflect import*และโยนออกinflect.ในบรรทัดที่สอง
Alex.S

อนิจจาดูเหมือนว่าจะไม่สามารถเรียงลำดับรายการ 40, 44, 40000, 40804, 40004, 40204 ได้อย่างถูกต้อง (ซึ่งควรอยู่ในลำดับนั้น)
Ilmari Karonen

0

Mathematica ขนาด 30 ไบต์

คำตอบด้านล่างจะแสดงฟังก์ชั่น pure ซึ่งจะรับรายการจำนวนเต็มเป็นอินพุตและเรียงลำดับตามชื่อตัวอักษร สิ่งที่แพทย์สั่ง;)

SortBy[#~IntegerName~"Words"&]

นี่คือรุ่นที่ไม่ได้แต่งแต้ม:

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

และนี่คือตัวอย่างการใช้งาน:

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

ซึ่งอาจจะเขียนเป็น

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

พวกเขาผลิตออกเหมือนกัน - ในมาติกาf[x]เป็น equivilant f@xไป

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

มีคำตอบอีกต่อไปที่ผู้ใช้รายอื่นโพสต์ใน Mathematica คำตอบนั้นพยายามแก้ไขความแตกต่างเล็ก ๆ น้อย ๆ ระหว่างวิธี mathematica alphebatizes ตัวเลขเพื่อให้สอดคล้องกับวิธีที่ตัวเลขที่ระบุไว้ใน OP ควรจะเป็นตัวอักษร แต่สิ่งที่พวกเขาแก้ไขไม่ส่งผลกระทบต่อการเรียงลำดับและคำตอบของฉัน

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

การสอบสวนที่ยอดเยี่ยม! - โชคไม่ดีที่พวกเขาไม่ได้มีคำสั่งเดียวกัน TheirFเรียงลำดับ 888 อย่างถูกต้องก่อน 880,000 ในขณะที่MyFไม่ ปัญหาอาจเกิดจากการคัดลอกยัติภังค์แปลก ๆ : เวอร์ชั่นของคุณTheirFอาจแทนที่ยัติภังค์ปกติ (ซึ่งไม่มีเลย) ในขณะที่รุ่นจริงจะแทนที่ยัติภังค์ Unicode 3 ไบต์ที่แปลก (มันจะยังคงน่าสนใจที่จะดูว่าการเอาเครื่องหมายจุลภาคเป็นสิ่งที่จำเป็น.)
เกร็กมาร์ติน

ฉันทดสอบมันใน Range [999999] ดูเหมือนว่าการกำจัดเครื่องหมายจุลภาคนั้นไม่จำเป็น แต่การแทนที่ "[ยัติภังค์]" ด้วย "" เป็นสิ่งที่จำเป็นอย่างยิ่ง
ngenisis

0

Lisp สามัญ, 113 ไบต์

ไม่จำเป็นต้องใช้ไลบรารีภายนอก

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

เอาท์พุทถ้าxเป็น'(1 2 3 4 5):

(5 4 1 3 2)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.