Lập phương trình toán học từ ngày


19

Trong lớp Kinh tế của tôi, bạn bè và tôi muốn tìm ra cách sắp xếp lại các chữ số theo định dạng ngày (theo MM / DD / YY) để tạo ra một phương trình toán học hợp lệ. Đối với hầu hết các phần, chúng tôi được phép sử dụng phép cộng, phép trừ, phép nhân, phép chia, dấu ngoặc đơn và phép lũy thừa ngoài phép nối.

Chương trình của bạn nên làm một cái gì đó tương tự. Chương trình nên nhập ngày hiện tại và chèn toán tử để in biểu thức theo các quy tắc sau.

  • Các chữ số PHẢI được sử dụng theo thứ tự. Sắp xếp lại các chữ số không được phép.
  • Biểu thức kết quả phải chính xác về mặt toán học.
  • Bổ sung, trừ, nhân, chia, lũy thừa và sử dụng dấu ngoặc đơn được cho phép. Vậy là ghép các chữ số. Tuy nhiên, không phải tất cả các hoạt động là cần thiết. Bạn không thể sử dụng dấu trừ để làm cho một chữ số âm (như -1+1+11=10vào ngày 11 tháng 11 năm 2010).
  • Chương trình phải chạy trong 60 giây trên một máy tiêu chuẩn.

Ví dụ, thử thách này được viết vào ngày 10 tháng 11 năm 2015. Chương trình sẽ diễn giải điều này là 11/10/15. Một đầu ra mẫu sẽ là (1+1)/10=1/5.


Tiền thưởng

Bạn có thể nhân số byte trong mã của mình với 0,9 cho mỗi một trong những điều sau đây mà chương trình của bạn hỗ trợ.

  • Chương trình in tất cả các biểu thức có thể có thể được hình thành, phân tách bằng các dòng mới. Nhân với 0,95 bổ sung nếu các biểu thức được liệt kê theo thứ tự tăng dần của các ký hiệu bổ sung.
  • Chương trình cũng hoạt động cho các ngày MM / DD / YYYY, in một khả năng với hai chữ số đầu tiên của năm ngoài khả năng không có. Nếu phần thưởng này được kết hợp với phần thưởng đầu tiên, tất cả các khả năng với hai chữ số đầu tiên của năm phải được in.
  • Chương trình này cũng in một phương trình cho khi có nhiều bất bình đẳng (ví dụ, trên 11 tháng 11 năm 2011, 1=1=1=1=1=1sẽ được in, ngoài khả năng chẳng hạn như 1*1=1=1=1=1, 1*1*1=1=1=1, và 1*1*1*1=1=1. Tất cả những trường hợp này phải được in cho tiền thưởng đầu tiên phải đạt được.
  • Chương trình hỗ trợ chuyển đổi thành các cơ sở từ 2 đến 16. Lưu ý rằng nếu cơ sở không phải là 10, tất cả các số trong biểu thức phải được viết trong cùng một cơ sở và (Base b)phải được viết sau biểu thức ( bthay thế tương ứng).

Đây là mã golf, vì vậy các quy tắc tiêu chuẩn được áp dụng. Mã ngắn nhất trong byte thắng.


1
Những hoạt động được phép?
anOKsquirrel

1
@FryAmTheEggman Có đủ sự tương đồng để gọi đây là một bản sao? Tôi đã không nghĩ như vậy bởi vì thử thách này không chỉ sử dụng một chữ số và không có RHS cụ thể (chỉ có sự bình đẳng).
Arcturus

17
DD / MM / YYYY> MM / DD / YYYY.
orlp

3
Tôi nghĩ rằng bạn muốn sử dụng phương trình trong câu hỏi của bạn nơi bạn đã viết biểu thức (một biểu thức chỉ là một mặt của phương trình, và sau đó câu hỏi của bạn không thực sự có ý nghĩa).
Paŭlo Ebermann

1
Điều này có thể được chứng minh cho bất kỳ ngày nào không?
Zach Gates

Câu trả lời:


6

Python 3, 424 420 369 363 byte

import time as t
r=range
x=len
d=list(t.strftime('%m%d%y'))
o=([[x,x+'(',x+')']for x in ['']+"+ - == * / **".split()])
n=[]
for l in o:
    n=l+n
o=n
for p in r(x(o)**(x(d)-1)):
    e=''
    for i in r(x(d)-1):
        e+=str(d[i])+o[(p//(x(o)**i))%x(o)]
    e+=str(d[-1])
    try:
        if eval(e)and e.find('=')!=-1:
            print(e.replace('==','=').replace('**','^'))
            break
    except:pass

Brute-buộc tất cả các kết hợp hoạt động có thể có trong các số và dừng lại khi tìm thấy một.

EDIT: Đã lưu 4 byte nhờ @NoOneIsHere

EDIT 2: Đã lưu 51 (!) Byte nhờ @ValueInk


1
Xin chào, và chào mừng đến với PPCG! Bạn có thể nội tuyến except:passvà loại bỏ không gian trong [ (p//(len(o)**i))%len(o)].
NoOneIsHãy là

Nếu bạn đang nhập bộ phận từ __future__, việc nâng cấp lên Python 3 có hoạt động tốt hơn cho tình huống của bạn không? Ngoài ra, tôi không hiểu lý do tại sao bạn đảo ngược okhi bạn xây dựng danh sách các nhà khai thác mà bạn có.
Mực giá trị

@ValueInk Vâng, tôi có thể thay đổi nó thành python 3 và lưu khá nhiều byte. Khi tôi bắt đầu thực hiện thử thách, tôi hoàn toàn không tập trung vào việc chơi golf, vì vậy nó chắc chắn vẫn có thể được rút ngắn lại. Ngoài ra, vì chương trình bắt buộc tất cả các kết hợp cho đến khi tìm thấy một kết hợp, tốc độ là một vấn đề và tôi thấy rằng nó có xu hướng hoạt động nhanh hơn nếu bạn sử dụng ngược lại o. Có lẽ tôi sẽ đánh golf này xuống một chút nữa để biến nó thành một ứng cử viên nặng ký.
Theo

o=([[x,x+'(',x+')']for x in",+,-,==,*,/,**".split(',')])cho 2 byte
Jonathan Allan

1
@Jonathan ALLan Huh. Cảm ơn đã chỉ ra những điều này. Tôi sẽ làm lại mã khi tôi có thời gian (có thể là vào ngày mai)
Theo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.