IMP: ตัวแยกวิเคราะห์การคูณโดยนัย


9

แจ็คชอบภาษาการเขียนโปรแกรม C แต่ไม่ชอบเขียนนิพจน์เช่นV=a*b*h; การคูณค่า

เขาอยากจะเขียนV=abh;แทนทำไมผู้แปลจึงควรคร่ำครวญถึงabhสัญลักษณ์ที่ไม่ได้นิยามเนื่องจากint a, b, h;มีการนิยามดังนั้นเราจึงสามารถอนุมานการคูณได้

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

เพื่อความง่ายไม่นับรวมจำนวน (ตาม2*a*b) เข้าด้วยกันจะปรากฏเฉพาะตัวแปรเท่านั้น

อินพุตเป็นคำศัพท์การคูณ T , เติมเต็ม regexp:

[a-zA-Z_][a-zA-Z_0-9]*

และตัวแปรชุด Z

การแยก P ของคำว่า T บนชุดตัวแปร Z คือสตริงที่ตอบสนองต่อไปนี้:

  1. หลังจากลบสิ่งที่เกิดขึ้นทั้งหมด*จาก P เราได้รับ T
  2. อาจเป็นชื่อตัวแปรจาก Z หรือประกอบด้วยชื่อตัวแปรที่เหมาะสมจาก Z แยกด้วย*อักขระเดี่ยว

วิธีแก้ปัญหาควรพิมพ์การแยกวิเคราะห์คำทั้งหมด

ตัวอย่าง:

Vars           a, c, ab, bc
Term           abc
Solution       ab*c, a*bc

Vars           ab, bc
Term           abc
Solution       -

Vars           -
Term           xyz
Solution       -

Vars           xyz
Term           xyz
Solution       xyz

Vars           width, height
Term           widthheight
Solution       width*height

Vars           width, height
Term           widthheightdepth
Solution       -

Vars           aaa, a
Term           aaaa
Solution       aaa*a, a*aaa, a*a*a*a

อินพุต (รายการตัวแปรและคำศัพท์) อาจมีให้ในลักษณะที่เหมาะสมกับภาษา

เอาต์พุตสามารถอยู่ในรูปแบบที่เหมาะสม (การแยกวิเคราะห์หนึ่งรายการต่อบรรทัดหรือรายการที่คั่นด้วยเครื่องหมายจุลภาค ฯลฯ ) - แต่ควรมีความชัดเจนและเป็นไปได้ที่จะอ่าน

เอาต์พุตว่างเป็นที่ยอมรับได้หากไม่มีการแยกคำที่เป็นไปได้ (ในตัวอย่างที่ฉันใช้ '-' เพื่อความชัดเจน)

นี่คือรหัสกอล์ฟดังนั้นรหัสที่สั้นที่สุดชนะ


1
ในตัวอย่างแรกของคุณฉันเชื่อว่าab*cการแยกวิเคราะห์ไม่ถูกต้องเนื่องจากcไม่ใช่ตัวแปรที่อนุญาต
isaacg

1
ด้วยการสแกนแบบเรียกซ้ำฉันพบว่าผลลัพธ์ของคุณในตัวอย่าง แต่มันก็น่าสงสัย: ทำไมa*aaa aaa*aและไม่ใช่ab*c c*ab
edc65

เนื่องจากกฎ 1. การแยกวิเคราะห์ ใช่การคูณมักจะสลับกัน แต่เราไม่ได้ไปไกล - เราแค่ต้องการ "สร้างใหม่" การคูณตามลำดับที่ทำ ที่จริงแล้วในภาษาของแจ็คเราอาจมีประเภทเมทริกซ์ - การคูณไม่ได้เป็นการเปลี่ยน และ "aaaa" สามารถเป็นได้ทั้งการตีข่าวของ "aaa" และ "a" หรือ "a" หรือ "aaa" - สิ่งนี้ไม่ได้เกิดจากการสลับสับเปลี่ยน แต่สำหรับความกำกวมที่เราคำนึงถึง
pawel.boczarski

สำเนาซ้ำกันของcodegolf.stackexchange.com/questions/45496/…
feersum

คำตอบ:


4

Pyth, 18 ตัวอักษร

mj\*dfqzsTsm^Qkhlz

โซลูชันนี้ดัดแปลงมาจาก โซลูชันการตีความปลาของฉัน ปัญหานั้นคล้ายกันมาก

คาดว่าอินพุตเช่น:

aaaa
"a", "aaa"

ให้ผลลัพธ์ดังนี้:

['a*aaa', 'aaa*a', 'a*a*a*a']

ลองที่นี่

  • sm^Qkhlz: สร้างลำดับของตัวแปรทั้งหมดที่มีความยาวสูงสุดของจำนวนสตริงอินพุตของตัวแปร

  • fqzsT: กรองลำดับตัวแปรที่ตรงกับสตริงอินพุต

  • mj\*d: ใส่*สัญลักษณ์และภาพพิมพ์


3

Python 2 - 147 94 ไบต์


R=lambda S,V,F=[]:S and[R(S[len(v):],V,F+[v])for v in V if v==S[:len(v)]]or print("*".join(F))

นี่เป็นการกำหนดฟังก์ชั่นRที่จะใช้เช่น:

>>> R("abc", ["a", "bc", "ab", "c"])

พิมพ์ผลลัพธ์เช่น:

a*bc
ab*c

1

JavaScript (ES6) 111

ดัดแปลงมาจากคำตอบ "ปลา" ของฉันความแตกต่างหลักคือการหาวิธีแก้ไขทั้งหมดไม่ใช่แค่คำตอบแรก

F=(v,t)=>(k=(s,r)=>s?v.map(v=>s.slice(0,l=v.length)==v&&k(s.slice(l),[...r,v])):console.log(r.join('*')))(t,[])

เอาต์พุตถูกพิมพ์ไปที่คอนโซล ผลลัพธ์ของฟังก์ชันไม่มีความหมายและต้องถูกยกเลิก

ทดสอบในคอนโซล Firefox / FireBug

F(['a','c','ab','bc'],'abc')  
a*bc  
ab*c

F(['ab','bc'],'abc')

F(['aaa','a'],'aaaa')
aaa*a
a*aaa
a*a*a*a

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