Haskell , 74 67 63 ไบต์
r=read
f x|(a,(c,s:d):_)<-lex<$>lex x!!0=show(r a*r d+r c)++s:d
ลองออนไลน์!
คำอธิบาย
ในฐานะH.PWizคิดออกเราสามารถใช้ lexer ของ Haskell ที่นี่เพื่อแยกสตริงออกเป็นส่วนต่างๆ (ก่อนหน้านี้ผมใช้span(>'/')
) และ Laikoni ชี้ให้เห็นว่า<$>
การทำงานเช่นเดียวmapSnd
จากData.Tuple
จาก
lex
ยามรูปแบบการแบ่งรหัสของเราในสามตัวเลขที่เราต้องการใช้ lex
เรียกใช้ lexer ของ haskell เพื่อแยกโทเค็นแรก มันจะส่งกลับรายการที่มีองค์ประกอบที่เป็นวิธีที่เป็นไปได้ในการแยกสตริง องค์ประกอบเหล่านี้เป็นสิ่งอันดับที่องค์ประกอบแรกเป็นโทเค็นแรกและส่วนที่เหลือของสตริงเป็นองค์ประกอบที่สอง ตอนนี้เนื่องจากรูปแบบอินพุตเป็นปกติมากเราจะมีการแยกวิเคราะห์เพียงหนึ่งครั้งเท่านั้นดังนั้นเราจึงสามารถใช้รูปแบบแรกได้เสมอ สิ่งแรกที่เราทำคือเรียกใช้lex
อินพุต
lex x
จากนั้นเราก็แกะมันออกจากรายการซึ่งให้ 2-tuple
lex x!!0
โทเค็นแรกจะเป็นส่วนทั้งหมดของเศษส่วนผสมที่ออกจากส่วนที่จัดทำขึ้นโดยเว้นวรรคเพื่อแยกวิเคราะห์ จากนั้นเนื่องจากสิ่งอันดับFunctors
เราสามารถใช้(<$>)
นามแฝงสำหรับfmap
การสมัครlex
ไปกับองค์ประกอบที่สองของสิ่งอันดับ
lex<$>lex x!!0
นี่กินผ่านอวกาศและแยกโทเค็นถัดไปเป็นตัวเศษของเศษส่วนของเรา <-
ตอนนี้เราผูกนี้ให้ตรงกับรูปแบบการใช้ รูปแบบของเราคือ
(a,(c,s:d):_)
a
หยิบเศษส่วนทั้งหมดเป็นโทเค็นแรกของเรา :_
unwraps lex
รายการที่เกิดจากการที่สองของเรา c
จับโทเค็นที่สองที่เราอ่านอยู่นั่นคือตัวเศษของเศษส่วน ทุกสิ่งที่ยังคงมีอยู่จะถูกs:d
แยกออกเป็นอักขระตัวแรกโดยรับประกันว่ารูปแบบจะเป็น/
และส่วนที่เหลือซึ่งจะเป็นตัวส่วน
ตอนนี้เราได้แยกวิเคราะห์อินพุตที่เราทำการคำนวณจริง:
show(r a*r d+r c)++s:d
ที่ไหน r
เป็นฟังก์ชั่นการอ่านที่เราผูกไว้ก่อนหน้านี้
มันเป็นสิ่งสำคัญที่จะต้องทราบว่าlex
จะส่งคืนรายการว่างเปล่าถ้ามันล้มเหลวและไม่ว่างเปล่าถ้ามันประสบความสำเร็จ ทำไมนี่ไม่ใช่Maybe
ฉันไม่รู้