ระบบการเรียงลำดับที่น่าตื่นตาตื่นใจของ Crazy Librarian


21

มันกลับไปฤดูกาลโรงเรียน! ดังนั้นสำหรับงานพาร์ทไทม์คุณช่วยงานที่ห้องสมุดของโรงเรียน ปัญหาคือบรรณารักษ์หัวหน้าไม่เคยแม้แต่จะได้ยินคำว่า "ดิวอี้ทศนิยม" นับประสาใช้ระบบนั้น แต่ระบบการเรียงลำดับที่ใช้งานได้เพิ่มขึ้นเป็น "อินทรีย์" เนื่องจากไลบรารีได้ขยาย ...

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

อินพุต / เอาต์พุต

  • ข้อมูลที่ป้อนจะเป็นรายการชื่อหนังสือ (สมมุติฐาน) หนึ่งรายการต่อบรรทัดจากเทียบเท่า STDIN / ภาษา
  • คุณสามารถสมมติว่าใส่หนังสือไม่เกิน 100 เล่มในแต่ละครั้ง (คุณสามารถพกหนังสือไปได้หลายรอบในคราวเดียว)
  • หนังสือสามารถมีหลายคำในชื่อหนังสือของพวกเขาและคำเหล่านี้อาจคั่นด้วยช่องว่างหรือเครื่องหมายวรรคตอนอื่น ๆ (เช่นลำไส้ใหญ่:เส้นประ-ฯลฯ )
  • เพื่อความสะดวกในการคำนวณให้สมมติว่าชื่อทั้งหมดเป็น UTF-8

เอาท์พุทเป็นชื่อเดียวกันเรียงลำดับตามกฎด้านล่างอีกครั้งหนึ่งต่อบรรทัดเพื่อ STDOUT / ภาษาเทียบเท่า

กฎการเรียงลำดับ

หนังสือจะถูกเรียงลำดับตัวเลขตามค่าอักขระเฉลี่ย (เช่นค่าอักขระสะสมหารจำนวนอักขระในชื่อหนังสือ) นับตามกฎต่อไปนี้:

  • ตัวละครทั้งหมดนับเพื่อกำหนดจำนวนตัวอักษรในชื่อเรื่อง
  • อักษรตัวพิมพ์เล็กจะถูกนับตามตำแหน่งของพวกเขาในตัวอักษร (ก = 1, B = 2, ... Z = 26)
  • หากชื่อมีตัวอักษรพิมพ์ใหญ่จะนับเป็น 1.5 ค่าตัวพิมพ์เล็ก (A = 1.5, B = 3, ... Z = 39) ("อักษรตัวใหญ่มีความสำคัญ!" บรรณารักษ์กล่าว)
  • เครื่องหมาย / สัญลักษณ์แต่ละเครื่องหมายวรรคตอนในรายการนี้!@#$%^&*()-=_+[]\{}|;':",./<>?~นับ -1 จากค่าสะสมก่อนเฉลี่ย ("ชื่อที่ยิ่งใหญ่ไม่ใช่!")
  • หากชื่อมีหมายเลขซึ่งเขียนด้วยเลขอารบิคตัวเลขนั้นจะถูกลบออกจากค่าเฉลี่ยก่อนที่จะเรียงลำดับ ตัวเลขหลายตัวที่ต่อเนื่องกันจะถือว่าเป็นหนึ่งหมายเลข (เช่น42จะลบ 42 ไม่ใช่ลบ 4 แล้วลบ 2) ตัวเลขแต่ละตัวจะไม่ถูกนับสำหรับค่าสะสม (เช่นแต่ละหลักมีส่วนเป็น 0) แต่จะนับจำนวนตัวอักษร โปรดทราบว่าสิ่งนี้อาจส่งผลให้เกิดค่าลบและควรได้รับการปฏิบัติอย่างเหมาะสม (มีข่าวลือแล้วบรรณารักษ์เคยสอนครูคณิตศาสตร์มาหลายปีแล้ว)
  • หากชื่อเรื่องมีคำสองคำแยกกันที่เริ่มต้นด้วยRหนังสือจะได้คะแนนเป็น "อนันต์" และถูกทิ้งลงในกองที่มุม (เช่นจัดเรียงแบบสุ่มในตอนท้ายของรายการ) (บรรณารักษ์เคยถูกทิ้งโดยบุคคลที่มีชื่อย่อเหล่านั้นหรือดังนั้นคุณเคยได้ยิน)
  • ช่องว่างจะไม่นับสำหรับค่าอักขระสะสม (เช่นมีส่วนร่วมเป็น 0) แต่จะมีส่วนร่วมกับจำนวนอักขระในชื่อเรื่อง
  • อักขระที่ไม่ตรงกับกฎข้างต้น (เช่น a ÿ) จะไม่นับสำหรับค่าอักขระสะสม (เช่นมีส่วนร่วม 0) แต่จะมีส่วนร่วมกับจำนวนอักขระในชื่อเรื่อง
  • ยกตัวอย่างเช่นหนังสือสมมุติÿÿÿÿÿจะมี "คะแนน" ของ(0+0+0+0+0) / 5 = 0แต่หนังสือสมมุติÿÿyÿÿจะมี "คะแนน" (0+0+25+0+0) / 5 = 5ของ
  • หนังสือสองเล่มที่เกิดขึ้นกับ "คะแนน" เดียวกันสามารถเป็นผลลัพธ์ในการเลือกของคุณ (พวกมันอยู่บนชั้นเดียวกัน)

ตัวอย่างอินพุต 1

War and Peace
Reading Rainbow: The Best Unicorn Ever
Maus
Home for a Bunny

ตัวอย่างผลลัพธ์ 1 (ที่มี "คะแนน" ในวงเล็บเพื่อแสดงเหตุผล - คุณไม่จำเป็นต้องพิมพ์)

War and Peace (8.5)
Home for a Bunny (10.125)
Maus (15.125)
Reading Rainbow: The Best Unicorn Ever (infinity)

ตัวอย่างอินพุต 2

Matthew
Mark
Luke
John
Revelations

ตัวอย่างผลลัพธ์ 2 (ด้วย "คะแนน" ในวงเล็บเพื่อแสดงเหตุผล - คุณไม่จำเป็นต้องพิมพ์)

Mark (12.375)
John (13)
Revelations (13.545454...)
Luke (13.75)
Matthew (~13.786)

ตัวอย่างอินพุต 3

42
9 Kings
1:8
7th

ตัวอย่างผลลัพธ์ 3 (พร้อม "คะแนน" ในวงเล็บเพื่อแสดงเหตุผล - คุณไม่จำเป็นต้องพิมพ์)

42 (-42)
1:8 (-9.3333...)
9 Kings (~0.36)
7th (2.3333...)

ข้อ จำกัด อื่น ๆ

  • นี่คือ Code-Golf เนื่องจากคุณจำเป็นต้องเก็บความลับของโปรแกรมจากสายตาที่บรรจบของบรรณารักษ์และยิ่งโปรแกรมเล็กลงเท่าไหร่การซ่อนก็ง่ายขึ้น
  • มีข้อ จำกัด ช่องโหว่มาตรฐาน
  • อย่าปล่อยให้บรรณารักษ์จับตาดูคุณด้วยการใช้เวลากับ PPCG

เกิดอะไรขึ้นถ้าหนังสือสองเล่มมีคะแนนเท่ากัน เช่นฉันได้อ่านเรนโบว์และ Ruby Rails
Kishan Kumar

@ KishanKumar ในกรณีเฉพาะนั้น "สุ่มจัดเรียงในตอนท้ายของรายการ" เนื่องจากพวกเขาทั้งคู่ -R กล่าวอีกนัยหนึ่งคือเลือกของคุณ ในกรณีทั่วไปหากคำสองคำให้คะแนนเท่ากันพวกเขาสามารถปรากฏในลำดับใด ๆ ที่เกี่ยวข้องกัน ฉันจะเพิ่มกระสุนเพื่อชี้แจงว่า
AdmBorkBork

7
คุณต้องการคำหนึ่งคำเพื่อให้ระบบของคุณมีชื่อตัวย่อ ฉันขอแนะนำระบบการเรียงลำดับที่น่าทึ่งของ Crazy Librarian: D
Geobits

3
@Geobits คุณมีคลาสไหม?
AdmBorkBork

ตัวเลขเป็นเพียงตัวเลขทศนิยม? จะเกิดอะไรขึ้นถ้ามีหลาย ๆ ตัวพวกเขาแยกกันทั้งหมดหรือไม่
Paŭlo Ebermann

คำตอบ:


5

APL (132)

{⎕ML←3⋄⍵[⍋{2='R'+.=↑¨⍵⊂⍨⍵≠' ':!99⋄↑(+/⍎¨'0',⍵⊂⍨⍵∊⎕D)-⍨((+/∊1.5 1×(⍳×∊⍨)∘⍵¨G)-+/⍵∊(⎕UCS 32+⍳94)~'`',⎕D,∊G←(⊂⎕A),⊂⎕UCS 96+⍳26)÷⍴⍵}¨⍵]}

เนื่องจากคนอื่น ๆ กำลังทำสิ่งเดียวกันนี่ก็เป็นฟังก์ชั่นที่ใช้เรียงลำดับของชื่อและส่งคืนเรียงเช่น:

      titles
┌─────────────┬──────────────────────────────────────┬────┬────────────────┬───────┬────┬────┬────┬───────────┬──┬───────┬───┬───┐
│War and Peace│Reading Rainbow: The Best Unicorn Ever│Maus│Home for a Bunny│Matthew│Mark│Luke│John│Revelations│42│9 Kings│1:8│7th│
└─────────────┴──────────────────────────────────────┴────┴────────────────┴───────┴────┴────┴────┴───────────┴──┴───────┴───┴───┘

      {⎕ML←3⋄⍵[⍋{2='R'+.=↑¨⍵⊂⍨⍵≠' ':!99⋄↑(+/⍎¨'0',⍵⊂⍨⍵∊⎕D)-⍨((+/∊1.5 1×(⍳×∊⍨)∘⍵¨G)-+/⍵∊(⎕UCS 32+⍳94)~'`',⎕D,∊G←(⊂⎕A),⊂⎕UCS 96+⍳26)÷⍴⍵}¨⍵]}titles
┌──┬───┬───────┬───┬─────────────┬────────────────┬────┬────┬───────────┬────┬───────┬────┬──────────────────────────────────────┐
│42│1:8│9 Kings│7th│War and Peace│Home for a Bunny│Mark│John│Revelations│Luke│Matthew│Maus│Reading Rainbow: The Best Unicorn Ever│
└──┴───┴───────┴───┴─────────────┴────────────────┴────┴────┴───────────┴────┴───────┴────┴──────────────────────────────────────┘

คำอธิบาย:

  • ⎕ML←3: ตั้งค่า⎕MLเป็น3(สำหรับ)
  • ⍵[⍋{... }¨⍵]: เรียงลำดับอินพุตตามค่าที่ส่งคืนจากฟังก์ชันภายใน
    • ↑¨⍵⊂⍨⍵≠' ': รับตัวอักษรตัวแรกของแต่ละคำ
    • 2='R'+.=: 'R'ดูว่าทั้งสองเหล่านี้
    • :!99: ถ้าเป็นเช่นนั้นกลับ 99! (≈ 9.3 × 10 155 ) นี่ไม่ใช่อนันต์ แต่จะทำ: ชื่อไม่สามารถมีคะแนนมากกว่า 38 เท่าของความยาว (ZZZZ ... ) ดังนั้นตราบใดที่ไม่มีชื่อเรื่องเดียวที่ใหญ่กว่าประมาณ 2 × 10 130 yottabytes มัน รับประกันได้ว่าสิ่งเหล่านี้จะสิ้นสุด
    • : มิฉะนั้น:
    • (... )÷⍴⍵: หารคะแนนด้วยความยาวหลังจากคำนวณมัน:
      • G←(⊂⎕A),(⎕UCS 96+⍳26): เก็บในGตัวอักษรตัวพิมพ์ใหญ่และตัวพิมพ์เล็ก
      • (⎕UCS 32+⍳94)~'`',⎕D,∊G: อักขระ ASCII ที่พิมพ์ได้ยกเว้นตัวอักษรตัวเลขช่องว่างและ'`'ซึ่งเป็นอักขระที่จะถูกลบจุด (นี่สั้นกว่าการเขียนหมดเพราะGจะใช้ในภายหลัง)
      • +/⍵∊: นับจำนวนตัวอักษรเหล่านี้เป็น
      • -: ลบสิ่งนี้ออกจาก:
      • +/∊1.5 1×(⍳×∊⍨)∘⍵¨G: ผลรวม 1.5 ×คะแนนสำหรับเมืองหลวงและ 1 ×คะแนนสำหรับตัวอักษรตัวพิมพ์เล็ก
    • -⍨: หลังจากนั้นลบผลรวมของตัวเลขใน:
      • ⍵⊂⍨⍵∊⎕D: ค้นหากลุ่มของตัวเลขใน
      • '0',: เพิ่ม'0'เพื่อป้องกันรายการว่างเปล่า
      • ⍎¨: ประเมินแต่ละสตริง
      • +/: หาผลรวม

แทนที่จะเป็นเช่นนั้น!99คุณสามารถใช้⌊/⍬
58

1
ฉันชอบดูรหัสยาวใน APL มันทำให้ฉันรู้สึกเหมือนโลกนั้นใหญ่กว่าฉันมากและฉันก็ชอบสัญลักษณ์
Conor O'Brien

2

Lua 5.3, 366 364 Bytes

r={}for i,s in ipairs(arg)do n=0 s:gsub("%l",function(a)n=n+(a:byte()-96)end):gsub("%u",function(a)n=n+(a:byte()-64)*1.5 end):gsub("%p",function(a)n=n-1 end):gsub("^R?.- R.- ?R?",function()n=math.huge end)m=n/utf8.len(s)s:gsub("%d+",function(a)m=m-a end)table.insert(r,{s=s,n=m})end table.sort(r,function(a,b)return a.n<b.n end)for i,v in ipairs(r)do print(v.s)end

รหัสนี้ใช้งานได้ใน Lua 5.3 เท่านั้นเนื่องจากต้องจัดการกับอักขระ Unicode หากคุณไม่สนใจ Unicode ให้แทนที่ "utf8" ด้วย "string" และมันจะทำงานได้ดีกับ Lua 5.2 หรือ 5.1

มันใช้อินพุตจากอาร์กิวเมนต์บรรทัดคำสั่งดังนั้นให้รันจากบรรทัดคำสั่งหรือวางรหัสนี้เหนือคำตอบของฉัน:

arg = {"Title 1", "Title 2", "Title 3"}

ฉันไม่ได้มี Lua 5.3 ในเครื่องของฉัน แต่ผมทำตามข้อเสนอแนะของคุณเพื่อแลกเปลี่ยนutf8กับstringในIdeoneและได้ผลลัพธ์ออกมา
AdmBorkBork

@TimmyD ดูการแก้ไขของฉัน
Trebuchette

ดี. ลาภลอย และ(arg)กำลังนั่งมองฉันอยู่ตรงหน้า คำถามนี้ทำให้สมองฉันทอด มี +1
AdmBorkBork

ด้วย MoonScript นี้เป็น 266 ไบต์: pastebin.com/wr4qVs5h
kirbyfan64sos

2

Mathematica, 253 216 ไบต์ (214 ตัวอักษร)

r=RegularExpression;c=ToCharacterCode;f=SortBy[Tr@Flatten@Reap[StringCases[#,
{r@"(\\bR.*)+"->∞,r@"\\d+":>0Sow@-FromDigits@"$0",r@"[a-z]":>c@"$0"-96,
r@"[A-Z]":>1.5c@"$0"-96,r@"[!-/:-@[-_{-~]"->-1}]/StringLength@#]&]

เรียกฟังก์ชั่นเช่นf[{"42", "9 Kings", "1:8", "7th"}]; มันจะกลับรายการเรียงลำดับของอินพุต

เพิ่งจะทำมัน! การจับคู่รูปแบบของMathematicaนั้นไม่รัดกุมเมื่อสายเข้ามาเกี่ยวข้องและฉันเพิ่งถูกฆ่าโดยชื่อยาวเหล่านั้น สองไบต์พิเศษสำหรับInfinityอักขระ Unicode

(แจ้งให้เราทราบหากฉันตกหลุมช่องโหว่มาตรฐานใด ๆ )

ปรับปรุง

มองใกล้คำตอบของ edc65 เล็กน้อยดูเหมือนว่า OP จะยอมรับฟังก์ชั่นที่เรียงลำดับรายการสตริง โดยที่ในใจเราสามารถใช้รูปแบบ curried ของSortBy(ซึ่งMathematicaเรียกว่า "รูปแบบการดำเนินการ"); ด้วยหนึ่งอาร์กิวเมนต์ (ฟังก์ชั่นที่ใช้กับองค์ประกอบรายการเพื่อกำหนดลำดับของพวกเขา) มันทำงานเหมือนฟังก์ชั่นที่ใช้เวลาหนึ่งอาร์กิวเมนต์กลับมาในรูปแบบที่เรียงลำดับของอินพุต; นั่นคือเทียบเท่ากับSortBy[list, f](SortBy[f])[list]

Ungolfed

Function[{titles},
  SortBy[titles, Function[{str}, (* sort by function value *)
    Total[Flatten[Reap[ (* total up all the parts *)
      StringCases[str, {
        RegularExpression["(\\bR.*){2}"] -> Infinity
          (* matches R at the start of a word twice, adds infinity to the total *),
        RegularExpression["\\d+"] :> 0 * Sow[-FromDigits["$0"]]
          (* matches a number, Sows it for Reap to collect, then multiplies by zero
                                                          to not affect the average *),
        RegularExpression["[a-z]"] :> ToCharacterCode["$0"] - 96
          (* matches a lowercase letter and returns its value *),
        RegularExpression["[A-Z]"] :> 1.5 ToCharacterCode["$0"] - 96
          (* matches an uppercase letter and returns 1.5 its value *),
        RegularExpression["[!-/:-@[-_{-~]"] -> -1
          (* matches a 'grandiose' symbol and returns -1 *)
      }] / StringLength[#] (* averages character values *)
    ]]]
  ]]
]

1
คำตอบที่ดีและคุณจะได้รับคุกกี้อินเทอร์เน็ตสำหรับการใช้ "อินฟินิตี้" อย่างแท้จริงในการคำนวณของคุณ ;-)
AdmBorkBork

@TimmyD ความงามของการประมวลผลเชิงสัญลักษณ์ =)
2012rcampion

คุณอาจหมายถึง 214 ตัวอักษร, 216 ไบต์ ทำได้ดีมากฉันพยายามแข่งขัน แต่ก็ไม่มีทาง
edc65

2

JavaScript (ES6), 210 218 251

ในฐานะที่เป็นฟังก์ชั่นที่มีอาร์กิวเมนต์อาเรย์

f=L=>(S=s=>([...s].map(c=>t-=(a=s.charCodeAt(l++))>32&a<48|a>57&a<65|a>90&a<96|a>122&a<127?1:a>64&a<123?96-(a<96?a*1.5:a):0,l=t=0),s.split(/\D/).map(n=>t-=n,t/=l),t/!s.split(/\bR/)[2]),L.sort((a,b)=>S(a)-S(b)))

//TEST

test1=['War and Peace','Reading Rainbow: The Best Unicorn Ever','Maus','Home for a Bunny']
test2=['Matthew','Mark','Luke','John','Revelations']
test3=['42','9 Kings','1:8','7th']

;O.innerHTML=f(test1)+'\n\n'+f(test2)+'\n\n'+f(test3);

// The comparing function used to sort, more readable

Sort=s=>(
  t = 0, // running total
  l = 0, // to calc the string length avoiding the '.length' property
  [...s].map(c=>{
    a=s.charCodeAt(l++);
    t-=a>32&a<48|a>57&a<65|a>90&a<96|a>122&a<127
      ? 1 // symbols (ASCII char except space, alphanumeric and backtick)
      : a>64&a<123 
        ? 96-(a<96?a*1.5:a) // alphabetic both upcase and lowcase, and backtick
        // lowcase: 96-a, upcase (64-a)*1.5=>96-a*1.5, backtick is 96 and 96-96 == 0
        : 0 // else space, non ASCII, and numeric : 0
  }),
  t = t/l, // average
  s.split(/\D/).map(n=>t-=n), // sub number values
  f = s.split(/\bR/)[2], // split at words starting with R, if less then 2 f is undefined
  t/!f // dividing by not f I can get the infinity I need
)
<pre id=O></pre>


ทำได้ดีมาก สำหรับการอ้างอิงถึงคนอื่นที่อ่านคำตอบนี้ฉันต้องเปลี่ยนO.innerHTMLไปใช้this.InnerHTMLในคอนโซลของ Firefox
AdmBorkBork

1

C #, 352 349 ไบต์

เนื่องจากความมหัศจรรย์ของ linq:

class A{static void Main(string[]a){foreach(var x in a.OrderBy(b=>{var s="0";int j=0;return Regex.Split(b,@"[^\w]+").Count(l=>l[0]=='R')==2?(1/0d):b.Aggregate(0d,(d,e)=>{if(e>47&e<58){s+=e;return d;}d+=(e>64&e<91)?(e-64)*1.5:(e>96&e<123)?e-96:e>32&e<127&e!=96?-1:0;j+=int.Parse(s);s="0";return d;})/b.Length-j-int.Parse(s);}))Console.WriteLine(x);}}

สามารถบันทึกได้อีก 6 ไบต์หากแบ็คทิคจะรวมอยู่ในรายการเครื่องหมายวรรคตอน!

class A
{
    static void Main(string[] a)
    {
        foreach (var x in a.OrderBy(b =>
            {
                var s = "0";
                int j = 0;
                return Regex.Split(b, @"[^\w]+").Count(l => l[0] == 'R') == 2
                    ? (1 / 0d)
                        : b.Aggregate(0d, (d, e) =>
                        {
                            if (e > 47 & e < 58) { s += e; return d; }
                            d += (e > 64 & e < 91) ? (e - 64) * 1.5 : (e > 96 & e < 123) ? e - 96 : e > 32 & e < 127 & e != 96 ? -1 : 0;
                            j += int.Parse(s);
                            s = "0";
                            return d;
                        }) / b.Length - j - int.Parse(s);
            }))
            Console.WriteLine(x);
    }

}

1

ไป 755 ไบต์

package main
import("os"
"fmt"
"math"
"bufio"
"regexp"
"sort"
"strconv")
type F float64
type T []F
func(t T)Swap(i,j int){t[i],t[j],S[i],S[j]=t[j],t[i],S[j],S[i]}
func(t T)Len()int{return len(t)}
func(t T)Less(i,j int)bool{return t[i]<t[j]}
var S []string
func main(){var t T
for{b:=bufio.NewReader(os.Stdin)
w,_,_:=b.ReadLine()
if len(w)==0{break}
u:=string(w)
var v F
for _,c:=range u{if 96<c&&c<123{v+=F(c)-F(96)}else
if 64<c&&c<91{v+=(F(c)-64)*1.5}else
if (48>c&&c>32)||(c>57&&c<127){v-=1}}
a:=v/F(len(w))
r,_:=regexp.Compile("[0-9]+")
n:=r.FindAllString(string(w),-1)
for _,x:=range n{y,_:=strconv.Atoi(x);a-=F(y)}
if m,_:=regexp.Match("((^| )R.*){2}",w);m{a=F(math.Inf(1))}
S=append(S,u)
t=append(t,a)}
sort.Sort(t)
for _,o:=range S{fmt.Println(o)}}

เวอร์ชันที่จัดรูปแบบ:

package main

import (
    "bufio"
    "fmt"
    "math"
    "os"
    "regexp"
    "sort"
    "strconv"
)

type F float64
type T []F

func (t T) Swap(i, j int)      { t[i], t[j], S[i], S[j] = t[j], t[i], S[j], S[i] }
func (t T) Len() int           { return len(t) }
func (t T) Less(i, j int) bool { return t[i] < t[j] }

var S []string

func main() {
    var t T
    for {
        b := bufio.NewReader(os.Stdin)
        w, _, _ := b.ReadLine()
        if len(w) == 0 {
            break
        }
        u := string(w)
        var v F
        for _, c := range u {
            if 96 < c && c < 123 {
                v += F(c) - F(96)
            } else if 64 < c && c < 91 {
                v += (F(c) - 64) * 1.5
            } else if (48 > c && c > 32) || (c > 57 && c < 127) {
                v -= 1
            }
        }
        a := v / F(len(w))
        r, _ := regexp.Compile("[0-9]+")
        n := r.FindAllString(string(w), -1)
        for _, x := range n {
            y, _ := strconv.Atoi(x)
            a -= F(y)
        }
        if m, _ := regexp.Match("((^| )R.*){2}", w); m {
            a = F(math.Inf(1))
        }
        S = append(S, u)
        t = append(t, a)
    }
    sort.Sort(t)
    for _, o := range S {
        fmt.Println(o)
    }
}

การใช้อินเทอร์เฟซการเรียงลำดับแบบกำหนดเองทำให้มันนานกว่าที่คาดไว้ โปรแกรมอ่านจาก STDIN จนถึงจุดสิ้นสุดของอินพุต oa บรรทัดว่าง


1

PHP, 362 367 ไบต์

<?for(;$w=fgets(STDIN);$S[]=$w){for($l=$i=mb_strlen($w);$i--;){$c=array_sum(unpack("C*",mb_substr($w,$i,1)));96<$c&&$c<123 and $v+=$c-96 or 64<$c&&$c<91 and $v+=1.5*$c-96 or 48<$c&&$c>32||$c>57&&$c<127 and $v-=1;}$v/=$l;preg_match_all("/\d+/",$w,$m);$v-=array_sum($m[0]);preg_match("/((^| )R.*){2}/",$w)&&$v=INF;$t[]=$v;}array_multisort($t,$S);echo join("
",$S);

เวอร์ชันที่จัดรูปแบบ:

<?php
for (; $w = fgets(STDIN); $S[] = $w) {
    for ($l = $i = mb_strlen($w); $i--;) {
        $c = array_sum(unpack("C*", mb_substr($w, $i, 1)));
        96 < $c && $c < 123 and $v += $c - 96
        or 64 < $c && $c < 91 and $v += 1.5 * $c - 96
        or 48 < $c && $c > 32 || $c > 57 && $c < 127 and $v -= 1;
    }
    $v /= $l;
    preg_match_all("/\d+/", $w, $m);
    $v -= array_sum($m[0]);
    preg_match("/((^| )R.*){2}/", $w) && $v = INF;
    $t[] = $v;
}
array_multisort($t, $S);
echo join("
", $S); 

สายที่น่าสนใจ:

$c = array_sum(unpack("C*", mb_substr($w, $i, 1)));

แปลงอักขระ UTF-8 เดียวให้เป็นค่าไบต์และรวมไว้ด้วยกันเพื่อที่เราจะได้รับค่าจริงสำหรับอักขระ ASCII และค่าที่สูงกว่า 127 สำหรับอักขระหลายไบต์

96 < $c && $c < 123 and $v += $c - 96
or 64 < $c && $c < 91 and $v += 1.5 * $c - 96
or 48 < $c && $c > 32 || $c > 57 && $c < 127 and $v -= 1;

ทำให้การใช้งานของผู้ประกอบการมีความสำคัญต่ำandและการกำหนดค่าของตัวอักษรในคำเดียวโดยไม่ต้องorif


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