เรียงลำดับหมายเลขที่สะกดออก


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]
อดัม

เราสามารถสันนิษฐานการใช้ตัวพิมพ์ใหญ่ของตัวเลขโดยอำเภอใจได้หรือไม่?
dylnan

@dylnanYou may require the numbers to be spelled in lower or upper, but not mixed, case.
สิ้นเชิงมนุษย์

คำตอบ:


14

Husk , 9 8 ไบต์

Ö†€¨tfṡn

ลองออนไลน์!

อัลกอริทึม "เป็นแรงบันดาลใจ" โดยคำตอบ Stax ของ recursive (ฉันเพิ่งเปลี่ยนสตริงการค้นหาเล็กน้อย), ขึ้นไปโหวตเขา!

เคล็ดลับคือการจับคู่แต่ละตัวอักษรกับตำแหน่งในสตริง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" อยู่แล้ว ไม่แน่ใจว่าจะช่วยคุณได้ไหม ฉันไม่ได้หาวิธีรวมความจริงนี้เข้ากับโปรแกรม stax ที่เล็กลงจริง ๆ
เรียกซ้ำ

... ถ้ามันเป็นแค่ตัวอักษรมันอาจเป็นไปได้tfrsenแต่ฉันคาดเดาว่าจะมีคำเช่นนี้withและsenช่วยในการบีบอัด
Jonathan Allan

ขอบคุณพวกคุณเป็นแรงบันดาลใจให้ฉันหาสตริงที่สั้นกว่านี้: D
Leo

ดังนั้นก็เหมือนกับการแทนที่เครื่องหมายจุลภาคด้วยจุดทศนิยมหลังเครื่องหมายจุลภาคแรก?
สตรอเบอร์รี่

@ สตรอเบอร์รี่ไม่จริง[1,0,0]ถูกพิจารณาว่าเล็กกว่า[1,0,0,0](แต่สำหรับโปรแกรมนี้มันจะไม่สร้างความแตกต่าง)
Leo

10

สแตกซ์ , 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

@ Itai: ดูเหมือนว่ามันจะ แต่ฉันไม่ทราบว่ามันคืออะไร
เรียกซ้ำ

6

เยลลี่ 12 ไบต์

OḌ%⁽Т%147µÞ

ลิงค์ monadic

ลองออนไลน์! ... หรือดูทดสอบ

อย่างไร?

การแปลงตัวเลขเป็นเลขฐานสิบจากฐาน 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

นั่นคือ modulos ที่ยอดเยี่ยมที่คุณได้พบที่นั่นฉันคิดว่านั่นช่างอุตสาหะ
Erik the Outgolfer

ไม่ใช่ทุกความอุตสาหะ - ฉันดูไบนารี่ก่อน
Jonathan Allan

คุณชอบโมดูโลที่บังคับคุณใช่ไหม?
Erik the Outgolfer

ใช่ แต่มันรวดเร็ว
Jonathan Allan

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
เพียงแค่การตรวจสอบลูปซ้อนสำหรับการเพิ่มที่เข้มงวดกว่าผลลัพธ์ แม้ว่าฉันอาจจำกัดความยาวของดิจิตัลของด้านในให้ด้านนอก
Jonathan Allan

5

APL (Dyalog Classic)ขนาด 12 ไบต์

'nesft'∘⍒⌷¨⊂

ลองออนไลน์!

นี่คือวิธีที่ฉันพบอาร์กิวเมนต์ด้านซ้ายที่เหมาะสมสำหรับ dyadic (ฉันลองและความยาว 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}

ลองมัน

ขยาย:

*\     # 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
@JanathanAllan ฉันแก้ไขเครดิตในระหว่างการเปลี่ยนแปลงครั้งแรก .. ฉันไม่รู้ว่าทำไมมันถึงไม่เปลี่ยนแปลง แก้ไขแล้ว
Uriel

1
31: ⊂⌷¨⍨∘⍋(531⊥531|6779|36⊥9+⎕A⍳⊢)¨แต่คุณสามารถทำได้ง่ายกว่าน้อยกว่าครึ่งหนึ่งของจำนวนไบต์ปัจจุบันของคุณ
อะดา

@ ใช่แล้วคุณยอมรับอินพุตและเอาต์พุตในรูปแบบต่าง ๆ (ผสมกับไม่ผสม)?
นิก

@ngn แน่นอน แต่ทางออกที่ฉันมีอยู่ในใจได้ผสม I / O อย่างสมบูรณ์
อดัม

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 ไบต์ขอบคุณJonathan Allan


สำหรับความเข้าใจในรายการลูปในฟังก์ชั่นคีย์จะสั้นลง 4 ไบต์
Jonathan Allan


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.


@Kaldo อ่า ... การเข้ารหัสตัวอักษรเริ่มต้นของแต่ละตัว ฉันรู้สึกว่าควรเป็นคำตอบของตัวเอง
Magic Octopus Urn

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

Ruby , 64 ไบต์

->a{a.sort_by{|b|b.map{|n|"zeontwthfofisiseeini".index n[0,2]}}}

ลองออนไลน์!

แลมบ์ดายอมรับอาร์เรย์ของสตริงแบบสองมิติและส่งกลับอาร์เรย์แบบสตริงสองมิติ

การ Piggybacking ออกจากPbm 2ของmbomb007 ให้คำตอบสำหรับ -26 ไบต์จากสิ่งที่ฉันกำลังโพสต์



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 ต้องขอบคุณ Jonathan Allan

พบว่าดัชนีของแต่ละหลักในสตริง 'เพลส ... เก้า' Þจากนั้นประเภทใช้นี้เป็นฟังก์ชั่นที่สำคัญด้วย ไม่จำเป็นต้องรวม'zero'ไว้ที่จุดเริ่มต้นเนื่องจากการค้นหาอักขระสองตัวแรกของ'zero'จะล้มเหลวและ0จะถูกส่งกลับแทนดัชนีซึ่งทำให้'zero'พจนานุกรม "ต้น"


การใช้การบีบอัดของ 'หนึ่งสอง ... เก้า' นั้นน้อยกว่าหนึ่งไบต์
Jonathan Allan

@JonathanAllan Ah ขอบคุณ ฉันไม่ได้คิดที่จะตรวจสอบสิ่งนั้น การบีบอัด'zeontw...ni'จบลงด้วยความยาว
dylnan

... ไม่ "... ตัวอักษรสองตัวแรก"
Jonathan Allan


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 ดังนั้นในจิตวิญญาณของโค้ด - กอล์ฟฉันมีเสรีภาพเล็กน้อยในรูปแบบอินพุต

f()ยอมรับอาร์เรย์ของตัวชี้ไปยังสตริงโดยที่แต่ละสตริงเป็นตัวเลขแสดงด้วยเครื่องหมายจุลภาคที่คั่นด้วยตัวสะกดออกเป็นตัวพิมพ์เล็ก นอกจากนี้ยังต้องการจำนวนสตริงในอาร์เรย์ในพารามิเตอร์ที่สอง ฉันหวังว่านี่จะเป็นที่ยอมรับ

f()qsort()แทนที่ตัวชี้ในสถานที่ในเรียงลำดับโดยใช้
r()อ่านหมายเลขอินพุตจากสตริงตัวเลขคั่นด้วยเครื่องหมายจุลภาค เพียงเปรียบเทียบอักขระสองตัวแรกเพื่อระบุหมายเลข
c()เป็นฟังก์ชั่นการเปรียบเทียบ



@ceilingcat คุณช่วยอธิบายได้strstr("i"-19,t)-"zeontwthfofisiseeini"ไหม? มันเป็นคอมไพเลอร์เฉพาะหรือมาตรฐาน?
GPS

ที่อาศัยไม่มีรูปแบบอื่น ๆ ใน.rodataลักษณะที่0x69 0x00และคอมไพเลอร์วางที่อยู่ของ"i"ที่ส่วนท้ายของ"zeo..."
เพดาน cat

คิดอย่างนั้น .. มีวิธีที่จะทำให้แน่ใจว่าคอมไพเลอร์ทำอย่างนั้นหรือไม่? ฉันรู้ว่ากฎที่นี่จะอนุญาตให้นี้ แต่ฉันจะขึ้นอยู่กับสิ่งนี้ในทุ่งจริงหรือไม่
GPS

สัญชาตญาณของฉันคือการหลีกเลี่ยงสิ่งนี้ใน "โลกแห่งความจริง" แต่สิ่งนี้อาจใช้ได้ดีถ้าชิ้นส่วนของสตริงของคุณมีความเป็นเอกลักษณ์อย่างเพียงพอ อาจมีกรณีการใช้งานที่ถูกต้องตามกฎหมายซึ่งอาจเกี่ยวข้องกับนกคีรีบูน แต่ฉันก็อาจเป็นภาพหลอน
ceilingcat
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.