แยกคำเป็นคำอื่น ๆ (เช่น“ afterglow” =“ aft” +“ erg” +“ low”)


13

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

(หมายเหตุ: นี่เป็นเพียงการสุ่มตัวอย่างเล็ก ๆ เพื่อเป็นตัวอย่างเท่านั้นผลลัพธ์ที่แท้จริงนั้นมีมากมายมหาศาล)

afterglow = after + glow
afterglow = aft + erg + low
alienation = a + lie + nation
alienation = a + lien + at + i + on
alienation = a + lien + at + ion
alienation = alien + at + i + on
alienation = alien + at + ion
archer = arc + her
assassinate = ass + as + sin + ate
assassinate = ass + ass + in + ate
assassinate = assassin + ate
backpedalled = back + pedal + led
backpedalled = back + pedalled
backpedalled = backpedal + led
goatskin = go + at + skin
goatskin = goat + skin
goatskin = goats + kin
hospitable = ho + spit + able
temporally = tempo + rally
windowed = win + do + wed
windowed = wind + owed
weatherproof = we + at + her + pro + of
yeasty = ye + a + sty

ตกลงคุณจะได้รับความคิด :-)

กฎระเบียบ

  • ใช้ภาษาโปรแกรมที่คุณเลือก รหัสที่สั้นที่สุดตามจำนวนตัวอักษรสำหรับแต่ละภาษาที่ชนะ ซึ่งหมายความว่ามีผู้ชนะหนึ่งรายสำหรับแต่ละภาษาที่ใช้ ผู้ชนะโดยรวมจะเป็นรหัสสั้นที่สุดของทั้งหมดที่ส่งมา
  • รายการอินพุตอาจเป็นไฟล์ข้อความอินพุตมาตรฐานหรือโครงสร้างรายการใด ๆ ที่ภาษาของคุณมี (รายการอาร์เรย์พจนานุกรมชุด ฯลฯ ) คำสามารถเป็นภาษาอังกฤษหรือภาษาธรรมชาติอื่น ๆ (หากรายการนั้นเป็นคำภาษาอังกฤษคุณจะต้องเพิกเฉยหรือคัดกรองรายการตัวอักษรเดียวก่อนกรองยกเว้น "a" และ "i" ในทำนองเดียวกันสำหรับภาษาอื่นคุณจะต้องเพิกเฉยต่อรายการไร้สาระหากพวกเขา ปรากฏในไฟล์)
  • รายการเอาต์พุตสามารถเป็นไฟล์ข้อความเอาต์พุตมาตรฐานหรือโครงสร้างรายการใด ๆ ที่ภาษาของคุณใช้
  • คุณสามารถใช้พจนานุกรมอินพุตใดก็ได้ที่คุณชอบ แต่คุณอาจต้องการใช้พจนานุกรมที่มีคำที่เหมาะสมมากกว่าพจนานุกรมที่มีคำที่คลุมเครืออาร์เคนหรือคำที่ทำให้งงเกินไป นี่คือไฟล์ที่ฉันใช้: รายการ Corncob ที่มีคำในภาษาอังกฤษมากกว่า 58,000 คำ

คำถาม

ความท้าทายนี้เกี่ยวกับการเขียนรหัสเป็นหลักเพื่อให้งานสำเร็จ แต่ก็ยังสนุกกับการรวมผลลัพธ์ต่าง ๆ ...

  1. subwords ใดที่เกิดขึ้นบ่อยที่สุด
  2. คำใดที่สามารถย่อยสลายเป็นจำนวนคำย่อยได้มากที่สุด
  3. คำใดสามารถย่อยสลายวิธีที่แตกต่างกันมากที่สุด?
  4. คำใดที่ประกอบด้วยคำย่อยที่ใหญ่ที่สุด
  5. คุณพบว่าการย่อยสลายที่สนุกที่สุดคืออะไร?

@Geobits - อ้าขอบคุณ! ฉันพลาดการย่อยสองครั้งalienationเมื่อฉันตัดและวางสิ่งนั้น แก้ไขแล้ว ในแง่ของคนอื่น ๆ รายการด้านบนเป็นเพียงตัวอย่างเล็ก ๆ โปรแกรมทดสอบของฉันสร้างคำตอบนับหมื่นเมื่อให้รายชื่อ Corncob
ทอดด์เลห์แมน

1
"คำหลักใดที่เกิดขึ้นได้บ่อยที่สุด" จะโยนเดาป่าออกไปแล้วพูดว่า 'a' อาจจะอยู่ใกล้จุดสูงสุด
Sellyme

@SebastianLamerichs - ฉันไม่ได้ ... อาจเป็นได้ :)
ทอดด์เลห์แมน

@ToddLehman ประโยคนั้นมีคำย่อย 0 รายการดังนั้น 'a' จึงยังคงเท่ากันก่อน: P
Sellyme

@SebastianLamerich หากคุณอ้างถึงคำตอบของทอดด์ถึงคุณ "dunno" สามารถแบ่งออกเป็น "dun" + "no" ;)
ฉันปลุกมนุษย์ต่างดาว

คำตอบ:


3

Python 186

a=open(raw_input()).read().split()
def W(r):
 if r:
    for i in range(1,len(r)+1):
     if r[:i]in a:
        for w in W(r[i:]):yield[r[:i]]+w
 else:yield[]
while 1:
 for f in W(raw_input()):print f

ไม่ได้มีประสิทธิภาพโดยเฉพาะ แต่จริงๆแล้วไม่แย่มาก มันไร้เดียงสา (ฉันคิดว่ามันเป็นไปได้ แต่ฉันคิดว่าไม่น่าเป็นไปได้ว่าหลามทำการปรับให้เหมาะสมอย่างชาญฉลาด) ตรวจสอบว่าคำย่อยอยู่ในพจนานุกรมซังข้าวโพดและค้นหาคำซ้ำได้มากที่สุด แน่นอนพจนานุกรมเล่มนี้ค่อนข้างกว้างขวางและคุณสามารถลองใช้ซึ่งไม่รวมตัวย่อและตัวย่อต่าง ๆ (นำไปสู่สิ่งต่าง ๆ เช่นbedridden: be dr id den) พจนานุกรมที่เชื่อมโยงดูเหมือนจะไม่ได้ระบุว่า 'A' หรือ 'I' เป็นคำศัพท์ดังนั้นฉันจึงเพิ่มมันด้วยตนเอง

แก้ไข:

ตอนนี้อินพุตแรกคือชื่อไฟล์ของพจนานุกรมที่จะใช้และทุก ๆ เพิ่มเติมคือคำ


เป็นมูลค่าที่ระบุว่านี่คือ Python 2 เพราะรหัสไม่ทำงานใน Python 3 เพราะprint fควรจะเป็นprint(f)

นอกจากนี้ฉันจะเรียกใช้สิ่งนี้ได้อย่างไร echo archer|python2 filename.pyส่งออก EOFError สำหรับบรรทัดสุดท้าย

บางสิ่งที่คุณยังสามารถเปลี่ยนแปลงได้ (ฉันยังไม่ได้ทดสอบสิ่งเหล่านี้ แต่ฉันค่อนข้างแน่ใจว่ามันใช้งานได้): for f in W(raw_input()):print f=> ''.join(W(raw_input()); a=open('c').read().split('\n')=>a=open('c').readlines()
Sepıʇǝɥʇuʎs

@ ɐɔıʇǝɥʇuʎsคนแรกของคุณจะทำงานได้ แต่readlinesเก็บอักขระบรรทัดใหม่ไว้ที่ท้ายบรรทัดซึ่งเป็นสาเหตุที่ฉันทำเหมือนที่ฉันทำ
KSab

@ ɐɔıʇǝɥʇuʎsโอ้จริง ๆ แล้วดูเหมือนว่าjoinองค์ประกอบทั้งหมดจะต้องเป็นสตริงและฉันไม่สามารถรับมันในรูปแบบที่เล็กกว่าสิ่งที่ฉันมีอยู่แล้ว
KSab

2

งูเห่า - 160

sig Z(x,y)
def f(b)
    c as Z=do(x,y)
        if x.length<1,print y
        for z in File.readLines('t'),if z==x[:e=z.length].toLower,c(x[e:],y+' '+z)
    for t in b,c(t,'[t]:')

นี่คือฟังก์ชั่น (การเรียงลำดับของสองฟังก์ชั่น) ที่ใช้List<of String>* และพิมพ์สตริงที่มีการจัดเรียงคำย่อยที่เป็นไปได้สำหรับแต่ละสตริงในรายการอาร์กิวเมนต์

* ประเภทนี้เป็นจริงList<of dynamic?>แต่การจัดหาสิ่งอื่นนอกเหนือจากList<of String>นี้อาจจะทำให้แตกได้


2

สกาลา, 132 129

แก้ไข: สั้นกว่าเล็กน้อยเป็นวงอ่านจาก stdin กว่าฟังก์ชั่น

while(true)print(readLine.:\(Seq(List(""))){(c,l)=>l.flatMap{m=>Seq(c+""::m,c+m.head::m.tail)}}filter(_.forall(args contains _)))

ทำงานเป็น

scala decompose.scala aft after erg glow low

(หรือใช้รายการคำที่ยาวขึ้น :))

เดิม:

def f(s:Seq[String])=s.map{_.:\(Seq(List(""))){(c,l)=>l.flatMap{m=>Seq(c+""::m,c+m.head::m.tail)}}filter(_.forall(args contains _))}

ฟังก์ชั่นจาก Seq [String] ถึง Seq [Seq [List [String]]] รับพจนานุกรมเป็นอาร์กิวเมนต์บรรทัดคำสั่ง

Ungolfed:

def decompose(wordList: Seq[String]) =
  wordList.map{ word =>                              // for each word
    word.foldRight(Seq(List(""))){ (char, accum) =>  // for each character
      accum.flatMap{list =>
        Seq(char+""::list,char+list.head::list.tail) // add it as both a new list and 
      }                                              // the to start of the first list
    }.filter(_.forall(args contains _))              // filter out lists w/ invalid words
  }

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

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