Haskell , 74 67 63 byte
r=read
f x|(a,(c,s:d):_)<-lex<$>lex x!!0=show(r a*r d+r c)++s:d
Hãy thử trực tuyến!
Giải trình
Như H.PWiz đã tìm ra, chúng ta có thể sử dụng từ vựng của Haskell ở đây để chia chuỗi thành các phần của nó. (Trước đó tôi đã sử dụng span(>'/')
) Và Laikoni đã chỉ ra rằng <$>
hoạt động giống như mapSnd
từData.Tuple
.
Bộ bảo vệ mẫu chia mã của chúng tôi thành ba số chúng tôi muốn sử dụng lex
. lex
gọi lexer của haskell để phá vỡ mã thông báo đầu tiên. Nó trả về một danh sách với mỗi phần tử đại diện cho một cách có thể để phân tích chuỗi. Các phần tử này là các bộ dữ liệu với phần tử đầu tiên là mã thông báo đầu tiên và phần còn lại của chuỗi là phần tử thứ hai. Bây giờ vì định dạng đầu vào rất đều đặn, chúng tôi sẽ chỉ có chính xác một phân tích cú pháp, vì vậy chúng tôi luôn có thể lấy cái đầu tiên. Điều đầu tiên chúng ta làm là gọi lex
vào đầu vào
lex x
Sau đó, chúng tôi mở khóa nó từ danh sách của nó cho chúng tôi 2 tuple
lex x!!0
Mã thông báo đầu tiên sẽ là toàn bộ phần của phần hỗn hợp để lại phần được dự phòng bởi một khoảng trắng để phân tích cú pháp. Sau đó, vì các bộ dữ liệu là Functors
chúng ta có thể sử dụng (<$>)
một bí danh fmap
để áp dụng lex
cho phần tử thứ hai của bộ dữ liệu.
lex<$>lex x!!0
Điều này ăn xuyên qua không gian và phá vỡ mã thông báo tiếp theo, tử số của phân số của chúng tôi. Bây giờ chúng tôi liên kết này với một mô hình phù hợp bằng cách sử dụng <-
. Mô hình của chúng tôi là
(a,(c,s:d):_)
a
lấy toàn bộ phần của phân số, mã thông báo đầu tiên của chúng tôi. :_
mở ra danh sách kết quả từ thứ hai của chúng tôi lex
. c
lấy mã thông báo thứ hai mà chúng tôi đã lấy, đó là tử số của phân số. Mọi thứ còn lại bị ràng buộc để s:d
phân tách nó thành ký tự đầu tiên của nó, được đảm bảo bởi định dạng là một/
và phần còn lại sẽ là mẫu số.
Bây giờ chúng tôi đã phân tích cú pháp đầu vào, chúng tôi thực hiện tính toán thực tế:
show(r a*r d+r c)++s:d
Trong trường hợp r
là chức năng đọc chúng ta bị ràng buộc trước đó.
Điều quan trọng cần lưu ý là lex
trả về một danh sách trống nếu nó thất bại và không trống nếu nó thành công. Tại sao đây không phải là một Maybe
tôi không biết.