ลักษณะทั่วไปของตัวย่อ


14

กำหนดอินพุตของรายการคำและตัวย่อของเอาต์พุตเอาต์พุตรูปแบบที่สามารถสร้างตัวย่อได้

ขอให้เรานำตัวอย่างของ

potato ptao
puzzle pzze

เป็นตัวอย่าง (นั่นคือตัวย่อสำหรับpotatoคือptaoและตัวย่อสำหรับpuzzleคือpzze)

พิจารณาวิธีการที่เป็นไปได้ที่จะได้รับจากptao วิธีการหนึ่งที่เป็นไปได้คือการใช้ครั้งแรกสามสี่และหกตัวอักษรซึ่งเราจะเรียกว่าpotato 1346แต่เนื่องจากtและoปรากฏหลายครั้งในคำว่ามีหลายวิธีที่เป็นไปได้อื่น ๆ เพื่อสร้างptaoจากpotato: 1546, และ13421542

ในทำนองเดียวกันทราบว่าpzzeสามารถสร้างขึ้นจากpuzzleกับใด ๆ ของ1336, 1346, ,1436 1446รูปแบบเดียวที่ทั้งสองตัวย่อที่มีเหมือนกันคือ1346; ดังนั้นต้องเป็นเอาต์พุตสำหรับอินพุตนี้ หากเป็นไปได้หลายรูปแบบคุณอาจส่งออกรูปแบบใดรูปแบบหนึ่งหรือทั้งหมด (อย่างน้อยหนึ่งรูปแบบ)

คุณอาจคิดว่า:

  • คำที่ป้อนและตัวย่อมีตัวอักษรพิมพ์เล็กเท่านั้น

  • มีคู่ของคำ / ตัวย่ออย่างน้อยหนึ่งคู่ในอินพุต

  • มันเป็นไปได้สำหรับทุกตัวย่อที่จะเกิดขึ้นจากคำที่เกี่ยวข้อง

  • จะมีรูปแบบอย่างน้อยหนึ่งรูปแบบที่ใช้ตัวย่อทุกตัว

  • ความยาวสูงสุดของแต่ละคำคือ 9 ตัวอักษร

อินพุตอาจถูกใช้เป็นอย่างใดอย่างหนึ่งต่อไปนี้:

  • อาร์เรย์ 2 มิติ / รายการ / อาร์เรย์ของ tuples / etc [[word, abbr], [word, abbr], ...]

  • อาร์เรย์ / รายการแบบแบน 1 มิติ [word, abbr, word, abbr, ...]

  • สตริงเดี่ยวคั่นด้วยอักขระตัวเดียวที่ไม่ใช่ตัวอักษรตัวพิมพ์เล็ก "word abbr word abbr"

  • hash / associative array / ฯลฯ {word => abbr, word => abbr, ...}

ในตัวเลือกการป้อนข้อมูลเหล่านี้คุณได้รับอนุญาตให้สลับลำดับของคำ / abbr (โปรดอธิบายรูปแบบการป้อนข้อมูลในโพสต์ของคุณทั้งหมด)

เอาต์พุตอาจถูกกำหนดเป็นตัวเลขเดี่ยวสตริงที่คั่นด้วยไม่ใช่ตัวเลขหรืออาร์เรย์ / list / tuple / etc ของตัวเลข

เนื่องจากนี่คือรหัสที่สั้นที่สุดเป็นไบต์จะเป็นผู้ชนะ

กรณีทดสอบ (จำไว้ว่าคุณจะต้องส่งออกผลลัพธ์≥1หากมีหลายรูปแบบ):

In                                Out
--------------------------------------------------------
potato ptao puzzle pzze         | 1346
aabbcc abc fddeef def           | 246
prgrmming prgmg puzzles pzzlz   | 14353
aaaaa a bbbb b ccc c dd d e e   | 1
aaaaa a bbbb b ccc c            | 1, 2, 3
abcxyz zbcyax                   | 623514
abcxyz acbbacbcbacbbac          | 132213232132213
potato ptao                     | 1346, 1546, 1342, 1542
a aaaaa                         | 11111

เพียงเพื่อให้แน่ใจว่าฉันเข้าใจกระบวนการตัวย่อสามารถเรียงลำดับตัวอักษรใหม่ได้หรือไม่
xnor

@ xnor ถูกต้องตามที่เห็นในหลายกรณีทดสอบ
Doorknob

อาร์เรย์ 2 มิติสามารถมีทิศทางอื่นได้หรือไม่? แต่ละคอลัมน์ไม่ใช่แต่ละแถวจะมีคู่ของคำ / ตัวย่อ
Luis Mendo

@DonMuesli ไม่ไม่สามารถทำได้
Doorknob

เราสามารถใช้การทำดัชนีเป็นศูนย์ได้ดังนั้นพิมพ์ 0235 แทนที่จะเป็น 1346?
Denker

คำตอบ:


3

Pyth, 19 ไบต์

mhh@Fd.TmmxkmbhdedQ

ลองที่นี่!

นำรายการในรูปแบบต่อไปนี้:

[["word","abbr"],["word","abbr"],...]

ทางเลือก 17 ไบต์โซลูชันซึ่งแสดงผลลัพธ์เป็นรายการของดัชนี zero-based ซึ่งถูกรวมอยู่ในรายการ 1 องค์ประกอบ:

m@Fd.TmmxkmbhdedQ

คำอธิบาย

ตัวอย่าง: [["potato", "ptao"],["puzzle", "pzze"]]

ก่อนอื่นเราทำการแมปถ่านทุกตัวในรายการย่อของรายการดัชนีทั้งหมดที่เกิดขึ้นในคำที่ให้ผล

[[[0], [2, 4], [3], [1, 5]], [[0], [2, 3], [2, 3], [5]]]

จากนั้นเราเปลี่ยนรายการนี้ที่ให้เรา

[[[0], [0]], [[2, 4], [2, 3]], [[3], [2, 3]], [[1, 5], [5]]]

ดังนั้นดัชนีของอักขระแต่ละตัวของแต่ละตัวย่อจึงอยู่ในรายการเดียว

จากนั้นเราเพียงแค่ต้องค้นหาดัชนีทั่วไปหนึ่งรายการในรายการทั้งหมดที่ให้:

[[0], [2], [3], [5]]

นี่คือผลลัพธ์ของตัวเลือก 17 byte ของฉันด้านบน [1,3,4,6]นี้จากนั้นจะได้รับการเปลี่ยนเป็น

การวิเคราะห์รหัส

mhh@Fd.TmmxkmbhdedQ # Q = อินพุต

m Q # การป้อนข้อมูลแผนที่ด้วย d
        m ed # ทำแผนที่ย่อแต่ละตัวด้วย k
            mbhd # map word ไปยังรายการ char
         mxk # map แต่ละตัวย่อถ่านไปยังรายการดัชนี
      .T # Transpose
    Fd # พับทุกองค์ประกอบ
   @ # และกรองตามสถานะ
 hh # รับองค์ประกอบแรกของผลลัพธ์และเพิ่มขึ้น

คุณไม่สามารถลบdmถูกต้องก่อนหน้า@ใช่ไหม
Doorknob

@ Doorknob ฉันสามารถ ขอบคุณที่จำได้!
Denker

3

MATL , 29 ไบต์

!"@Y:!=2#fX:wX:h]N$v1XQtv4#X>

อินพุตเป็นอาร์เรย์ 2D ในรูปแบบต่อไปนี้:

{'potato' 'ptao'; 'puzzle' 'pzze'}

ลองออนไลน์! (รหัสที่เชื่อมโยงรวมถึงการดัดแปลงบางอย่างเนื่องจากการเปลี่ยนแปลงในภาษาตั้งแต่คำตอบนี้ถูกโพสต์ )

!       % take input. Transpose
"       % for each column
  @Y:   %   push column. Unpack the two strings and push them onto the stack
  !     %   transpose second string
  =     %   matrix with all pairwise matchings of characters in word and abbreviation
  2#f   %   find row and col indices of those matchings
  X:    %   transform into column vector
  wX:   %   swap, transform into column vector
  h     %   concat into a two-col matrix
]       % end for
N$v     % concatenate all matrices containing the indices
1       % push 1
XQ      % build matrix adding 1 for each (row,col) index
tv      % concat vertically with itself, so that it has at least two rows.
        % This forces the following function to work on each col.
4#X>    % arg max of each col: position that produces a match in all pairs.
        % If there are several maximizers in each col this gives the first

รหัสที่ต้องการบางอย่างที่เกี่ยวข้อง (และยาว!) เทคนิคเพื่อ

  • ป้องกันการวางแนวของเวกเตอร์ที่ผลิตโดยfind( f) จากการเปลี่ยนแปลงขึ้นอยู่กับรูปร่างของอินพุต ข้อความเหล่านี้คือข้อความX:wX:: บังคับให้เอาต์พุตทั้งสองเป็นคอลัมน์เวกเตอร์
  • ตอบโต้พฤติกรรมเริ่มต้น "ทำงานไปตามส่วนที่ไม่ใช่ซิงเกิลตัน" ของฟังก์ชันmin( X>) ข้อความเหล่านี้คือtv: แนบสำเนาของตัวเองเพื่อรับรองอย่างน้อยสองแถว);

2

Perl, 46 45 42 ไบต์

รวม +1 สำหรับ -p

ให้อินพุตเป็นคำต่อเนื่องบน STDIN เช่น

perl -p abbrev.pl
prgrmming
prgmg
puzzles
pzzlz

ยุติ STDIN ด้วย^Dหรือ^Zหรืออะไรก็ตามที่จำเป็นในระบบของคุณ

abbrev.pl:

s#.#${${--$_.$.%2}.=$&}||=-$_#eg;$_ x=eof

คำอธิบาย

พิจารณาอินพุตนี้ (เค้าโครงแนวคิดไม่ใช่วิธีที่แท้จริงในการป้อนข้อมูลสำหรับโปรแกรมนี้):

potatoes     ptao
puzzle       pzze

โปรแกรมสร้างสตริงที่แสดงคอลัมน์แนวตั้งของสตริงแบบเต็มซึ่งจัดทำดัชนีไว้บน id คอลัมน์

id1    pp     -> 1
id2    ou     -> 2
id3    tz     -> 3
id4    az     -> 4
...

ฯลฯ มันยังทำเช่นเดียวกันสำหรับตัวย่อ แต่ใช้รหัสอื่น

ID1    pp     -> 1
ID2    tz     -> 3
ID3    az     -> 4
ID4    oe     -> 6

คำที่ถูกประมวลผลโดยนัยหนึ่งโดยหนึ่งโดยใช้-pตัวเลือก สตริงคอลัมน์ถูกสร้างขึ้นโดยใช้การต่อข้อมูลซ้ำหลายครั้งในขณะที่แต่ละคำกำลังใช้s#.# ...code.. #egงานดังนั้นแต่ละคอลัมน์ต้องใช้รหัสซ้ำ ฉันใช้ลบด้วยจำนวนคอลัมน์ตามด้วยหมายเลขบรรทัดโมดูโล 2 หมายเลขคอลัมน์สามารถสร้างโดยใช้--$_ซึ่งเริ่มต้นเป็นคำปัจจุบันซึ่งเนื่องจากการใช้เพียงa-zรับประกันการประเมินเป็น 0 ในบริบทที่เป็นตัวเลข -1, -2, -3, ...ดังนั้นผมจึงได้รับ ฉันอยากจะใช้จริง1, 2, 3, ...ๆ แต่การใช้$_++จะทำให้เพิ่มสตริงมายากล perl แทนตัวนับตัวเลขปกติ ฉันไม่ต้องการที่จะใช้$_ และไม่ใช่ตัวแปรอื่น ๆ เพราะตัวแปรอื่น ๆ ที่ฉันจะต้องเริ่มต้นให้เป็นศูนย์ในทุกวงที่ใช้จำนวนไบต์มากเกินไป

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

ฉันใช้ช่องว่างชื่อโกลบอลของ perl ผ่านการอ้างอิงที่ไม่เข้มงวดเพื่อสร้างสตริงคอลัมน์ดังนี้

${--$_.$.%2}.=$&

ต่อไปฉันจะจับคู่สตริงคอลัมน์แต่ละคอลัมน์กับหมายเลขคอลัมน์แรกที่สตริงนั้นเคยปรากฏใน (การแมปที่ระบุไว้ด้านบน) โดยใช้เนมสเปซโกลบอล perl อีกครั้ง (แต่โปรดสังเกตว่าชื่อไม่สามารถปะทะกันได้

${${--$_.$.%2}.=$&} ||= -$_

ฉันต้องปฏิเสธเพราะเหมือนที่ผมอธิบายไว้ข้างต้นฉันนับคอลัมน์ที่เป็น$_ ให้แน่ใจว่าเพียงครั้งแรกของคอลัมน์ที่กำหนดได้รับจำนวนคอลัมน์ใหม่มิฉะนั้นหมายเลขคอลัมน์ก่อนหน้านี้จะถูกรักษาไว้และกลับมาเป็นค่า สิ่งนี้จะเกิดขึ้นเป็นพิเศษสำหรับทุกคำที่ย่อเนื่องจากข้อกำหนดรับประกันได้ว่าจะมีคอลัมน์ในคำเต็มที่จะปรากฏล่วงหน้า ดังนั้นในคำที่สั้นที่สุดตัวอักษรแต่ละตัวจะถูกแทนที่ด้วยหมายเลขคอลัมน์ในคำแบบเต็มที่สอดคล้องกับคอลัมน์สำหรับคำที่สั้นทั้งหมด ดังนั้นผลลัพธ์ของการเปลี่ยนตัวครั้งสุดท้ายจึงเป็นผลลัพธ์สุดท้ายที่ต้องการ ดังนั้นพิมพ์ถ้าหากเราอยู่ที่จุดสิ้นสุดของอินพุต:-1, -2, -3, ...||=

$_ x=eof

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


1

Haskell, 74 ไบต์

import Data.List
foldl1 intersect.map(\(w,a)->mapM(`elemIndices`(' ':w))a)

รูปแบบอินพุตเป็นรายการของคู่สายอักขระเช่น:

*Main > foldl1 intersect.map(\(w,a)->mapM(`elemIndices`(' ':w))a)  $ [("potato","ptao"),("puzzle","pzze")]
[[1,3,4,6]]

วิธีการทำงาน: mapM(เหมือนsequence . map) ก่อนเปลี่ยนทุกคู่(w,a)ให้เป็นรายการของดัชนีของตัวอักษรในตัวย่อ ( ' ':แก้ไขดัชนีพื้นฐาน 0 ของ Haskell เป็นพื้นฐาน 1 ตัว) ("potato", "ptao") -> [[1],[3,5],[4],[2,6]]จากนั้นลงในรายการชุดค่าผสมทั้งหมดที่ องค์ประกอบที่ตำแหน่งiถูกดึงออกมาจากiรายการย่อย, th [[1,3,4,2],[1,3,4,6],[1,5,4,2],[1,5,4,6]]เช่น foldl1 intersectค้นหาจุดตัดของรายการทั้งหมดดังกล่าว


0

ES6, 92 ไบต์

(w,a)=>[...a[0]].map((_,i)=>[...w[0]].reduce((r,_,j)=>w.some((s,k)=>s[j]!=a[k][i])?r:++j,0))

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


0

Python 3, 210 ไบต์

ไม่ใช่คำตอบที่น่าประทับใจเมื่อเห็น topscores ที่นี่ แต่นี่เป็นความเข้าใจที่แปลกประหลาดที่สุดที่ฉันเคยทำกับ Python วิธีการค่อนข้างตรงไปตรงมา

 def r(p):
    z=[[[1+t[0]for t in i[0]if l==t[1]]for l in i[1]]for i in[[list(enumerate(w[0])),w[1]]for w in p]]
    return[list(set.intersection(set(e),*[set(i[z[0].index(e)])for i in z[1:]]))[0]for e in z[0]]

ฟังก์ชันคาดว่าอินพุตจะเป็นสตริง 2 มิติเช่น: [[word, abbr],...]และส่งคืนรายการจำนวนเต็ม

Ps: คำอธิบายโดยละเอียดจะมาเร็ว ๆ นี้

Ps2: ยินดีรับคำแนะนำเพิ่มเติมเกี่ยวกับการเล่นกอล์ฟ!

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