Tạo một phương trình hợp lệ bằng cách sử dụng các số do người dùng chỉ định


10

Điều này dựa trên một trò chơi mà một trong những giáo viên toán của tôi đã từng chơi ở trường cấp hai. Anh ta sẽ viết 5 số một chữ số ngẫu nhiên lên bảng, và sau đó là một số có hai chữ số ngẫu nhiên. Chúng tôi sẽ cố gắng tạo một phương trình sử dụng tất cả 5 số có một chữ số để tạo ra số có hai chữ số. Dưới đây là một số ví dụ với các giải pháp để giải thích điều này tốt hơn:

Input:           Solution:
7 5 4 8 4 34     5*8-7+4/4 = 34
3 1 5 7 6 54     (7+3)*6-5-1 = 54
3 9 2 1 6 87     9*(2+1)*3+6 = 87
2 1 6 9 7 16     (9-7+6*1)*2 = 16
2 4 5 8 6 96     8*(5+6)+2*4 = 96
3 8 4 5 4 49     8*(4+4)-3*5 = 49

Thách thức này là viết một chương trình có thể tạo ra các phương trình như vậy cho một đầu vào nhất định. Đầu vào có thể được cung cấp thông qua dòng lệnh hoặc qua dấu nhắc. 5 số có một chữ số sẽ luôn được nhập trước (không theo thứ tự cụ thể), theo sau là số có hai chữ số. Chương trình sau đó sẽ in ra một phương trình giải pháp mà nó tìm thấy; bạn không phải xử lý các tình huống không có giải pháp. Hàm phải có khả năng sử dụng các hoạt động sau trong phương trình: cộng, trừ, nhân và chia. Nếu bạn muốn cho phép các hoạt động cơ bản bổ sung, điều đó tốt miễn là chúng vẫn duy trì tinh thần của thách thức (phủ định, lũy thừa và mô đun sẽ là những bổ sung tốt). Thứ tự các phép toán tuân theo các quy tắc toán học tiêu chuẩn, vì vậy sẽ cần có dấu ngoặc đơn để phân nhóm.

Các chương trình sẽ được tính điểm dựa trên độ dài mã (bao gồm cả khoảng trắng cần thiết). Lưu ý: phép chia phải chính xác, không được làm tròn hoặc cắt thành số nguyên gần nhất.



Đó là nhiệm vụ rất giống nhau, nhưng tôi nghĩ thuật ngữ bổ sung và không hạn chế về cách các biểu thức được nhóm nên mở rộng vấn đề đủ để nó khác biệt thú vị. Ngoài ra, đây là một thử thách chơi gôn thay vì thử thách mã, sẽ gọi các giải pháp khác nhau.
Sir_Lagsalot

Điều gì về sự kết hợp? ví dụ: nếu được cho 7 5 4 8 4 34, đầu ra 7 + 54/8 * 4 sẽ được phép?
Patrick Roberts

Câu trả lời:


7

Python 2.7 (284), Python 3.x (253)

from __future__ import division #(Remove for Python 3.x)
from itertools import *
a=raw_input().split()
for i in permutations(a[:-1],5):
 for j in product('+-*/',repeat=5):
  for k,l in combinations(range(1,12,2),2):
   d=''.join(sum(zip(i,j),()))[:-1];d='('+d[:l]+')'+d[l:]
   if eval(d)==int(a[-1]):print d;b

Nó đưa ra một lỗi (gọi hàm không xác định b) trên giải pháp.

Về cơ bản, nó là một lực lượng vũ phu khổng lồ. Nó nhận đầu vào, phân tách nó bằng khoảng trắng ( 1 2 -> [1,2]) và sau đó thẩm thấu qua danh sách đó. Với mỗi hoán vị, nó sẽ lặp qua tất cả các chuỗi có thể có độ dài 5 bằng cách sử dụng các ký tự +-*/. Với mỗi lần lặp đó, nó sẽ tạo ra các kết hợp độ dài 2 của danh sách [1,3,5,7,9,11], đan xen giữa hoán vị và chuỗi với nhau ( 12345 *-/+- -> 1*2-3/4+5-) và đặt trong ngoặc đơn. Cuối cùng, nó sẽ đánh giá nó, và nếu câu trả lời và phương trình là đúng, thì nó sẽ in phương trình và dừng lại.

Điều này là không hiệu quả khủng khiếp, về O(n!/(n-5)!)=O(n^5) , nhưng nó chạy trong một thời gian hợp lý cho các đầu vào thử nghiệm.


1
Toán số nguyên có thể gây ra đầu ra không chính xác khi sử dụng phép chia. Ví dụ: đầu vào "3 6 8 7 1 29" mang lại "(3 + 8/6) * 7 + 1", bằng 31 1/3, không phải 29. Tôi sẽ cập nhật mô tả để làm rõ điều này.
Sir_Lagsalot

Nó mang lại (3/6)*8*7+1cho tôi.
beary605

Ok, tôi sẽ coi đó là một vấn đề với trình thông dịch mà tôi đã sử dụng.
Sir_Lagsalot

3

Scala 368:

G = -Line thứ 2 dễ kiểm tra hơn, lần đầu tiên linh hoạt để nhận các đối số lệnh và cả hai đều có độ dài bằng nhau, vì vậy tôi chỉ tính từ cái thứ hai - loại bỏ nó để thực hiện các đối số:

val g=(args.map(_.toDouble))
val g=Array(3,9,2, 1, 6, 87)
val k="+*/-DQ"
val i=(0 to 5)
val f:Seq[(Double,Double)=>Double]=Seq(_+_,_*_,_/_,_-_,(a,b)=>b-a,(a,b)=>b/a)
val h=g.init.permutations;
for(j<-h;o<-i;p<-i;q<-i;r<-i;z=try{f(r)(f(q)(f(p)(f(o)(j(0),j(1)),j(2)),j(3)),j(4))}catch{case _ => 0}
if(z==g(5)))printf("(((%d%c%d)%c%d)%c%d)%c%d=%d\n",j(0),k(o),j(1),k(p),j(2),k(q),j(3),k(r),j(4),g(5))

Đầu ra mẫu (bạn có thể có một câu hỏi ngay bây giờ - chỉ một lát):

(((5+7)/1)+6)*3=54
(((5-7)D1)*6)*3=54
(((5D7)+1)*6)*3=54
(((5+7)+6)Q1)Q3=54

Điều gì về 5D7 này? D1? Có phải là hex không? Có Q1, Q3 - cái gì thế.

Sir_Lagsalot cho phép các hoạt động cơ bản mới theo tinh thần của thách thức, và vâng, đây là các hoạt động cơ bản, Delta và Quotient.

Chúng khác với a / b và ab ở chỗ aQb có nghĩa là b / a và aDb có nghĩa là ba. Hãy gọi nó là ký hiệu tiếng Ukraina.

Vì thế

(((5-7)D1)*6)*3=54

có nghĩa

((1-(5-7))*6)*3=54
 (1-(-2))*6*3
   3*6*3 = 18*3=54

Đối với câu hỏi thú vị hơn về cách thức và lý do: Lúc đầu, tôi phát điên về khả năng đặt dấu ngoặc đơn và liệu (a + b) -c = a + bc = (a + bc) = ((a + b ) -c) = (b + a) -c và cứ thế. Bạn có thể nổi điên với câu hỏi này, nhưng nếu bạn viết ra các kết hợp dấu ngoặc đơn có thể, đôi khi bạn sẽ vứt bỏ bảng cào và đối mặt với thực tế: Bạn luôn thực hiện 4 thao tác giữa 5 giá trị và bạn luôn bắt đầu với một trong số chúng. Nếu mẫu luôn(((_x_)x_)x_)x_ ?= _ (x là một trong 4 toán tử) và cho phép hướng ngược lại (xb) và (bxa), bạn đã giải quyết mọi khả năng.

Bây giờ đối với a + b và a * b, chúng ta không cần phải đi ngược lại, chúng là giao hoán. Vì vậy, tôi đã phát minh ra toán tử D và Q, chỉ cần chuyển hướng. Bây giờ tôi có thêm 2 toán tử, nhưng không cần phải chuyển hướng. Vâng - nó được thực hiện trong chức năng Sequence:

 (a,b)=>b-a,(a,b)=>b/a

Sự hiểu biết của tôi lấy các giá trị từ Mảng g và phân phối chúng trên a đến e, sau đó tôi chọn 4 chỉ mục để chọn hàm và sau đó là biểu tượng toán tử liên quan (chỉ theo chỉ mục). Tôi phải bắt lỗi div / 0, vì phép trừ có thể dẫn đến số không, trong khi dữ liệu đầu vào mẫu không chứa 0.


Các toán tử Delta và Quotient đều ổn. Nếu bạn có kế hoạch chơi gôn, bạn sẽ cần thêm dấu ngoặc đơn vào đầu ra.
Sir_Lagsalot

Đầu ra bây giờ in dấu ngoặc đơn.
người dùng không xác định
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.