Không chỉ là một câu đố bốn


11

Trong biến thể của câu đố Four bốn này, bạn nên sử dụng tối đa x x's(và không có số nào khác) và một tập hợp các thao tác được xác định để đạt được mọi số từ 0 đến 100. Nếu x = 4sau đó, bạn có thể sử dụng tối đa bốn 4svà câu hỏi này trở thành bốn câu hỏi kinh điển câu đố (ngoại trừ bạn có thể sử dụng tối đa bốn 4s thay vì phải sử dụng chính xác bốn trong số chúng). Chúng tôi giả định 1 < x <= 9.

Trong phiên bản này, chỉ các toán tử sau được phép:

  • Ngoài ra ( +), Trừ ( -), Nhân ( *), Division ( /). Lưu ý đây là sự phân chia thực sự, vì vậy mà 5/2 = 2.5.
  • Số mũ (ví dụ 4 ^ 4) vì điều này sẽ không liên quan đến các ký hiệu phụ nếu được viết bình thường bằng tay.
  • Bạn có thể tạo số nguyên mới bằng cách ghép xs. Ví dụ, bạn có thể thực hiện các số nguyên 4, 44, 444, 4444.

Bạn cũng có thể sử dụng dấu ngoặc đơn để nhóm số đơn giản để kiểm soát thứ tự đánh giá của các toán tử. Ví dụ, bạn không thể kết hợp dấu ngoặc đơn với phép nối như trong (4/4)(4/4) = (1)(1) = 11.

Không có biểu tượng khác có thể được sử dụng và thứ tự hoạt động tiêu chuẩn được áp dụng.

Chương trình của bạn sẽ tạo ra, đưa ra một xphạm vi được xác định và ngiữa 0100bao gồm, một giải pháp chính xác cho đầu vào đó nếu nó tồn tại. Nếu không, mã của bạn phải xuất ra một cái gì đó để chỉ ra rằng không có giải pháp như vậy tồn tại.

Bạn phải có thể chạy trình của bạn để hoàn thành trên máy của bạn cho bất kỳ giá trị đầu vào nào trong xntrong phạm vi được phép. Đây là mã golf, vì vậy giải pháp ngắn nhất sẽ thắng.

Câu hỏiliên quan này sử dụng nhiều toán tử hơn (và chỉ 4 giây) và do đó tất cả các số từ 0 đến 100 đều có thể giải được, điều này sẽ không đúng với thử thách này.

Đầu vào và đầu ra

Mã của bạn có hai số nguyên xnlàm đầu vào và sẽ xuất ra một giải pháp (hoặc một dấu hiệu không có giải pháp nào) ở bất kỳ định dạng nào con người có thể đọc được mà bạn thấy thuận tiện. Đầu vào 4 6có nghĩa là "Sử dụng tối đa bốn 4s, tạo số 6" chẳng hạn. Vì vậy, nếu đầu vào là 4 6đầu ra có thể được (4+4)/4+4.



2
Parens có thể được kết hợp với nối? ví dụ `(4/4) (4/4) = (1) (1) = 11?
Chấn thương kỹ thuật số

1
Thêm dấu ngoặc đơn (và không cho phép dấu ngoặc đơn + nối) sẽ làm cho việc này khó hơn đáng kể
Draconis

2
Thêm toán tử lũy thừa và một vòng lặp bên ngoài qua số lần chữ số được sử dụng, đừng IMO thêm bất cứ thứ gì không tầm thường vào codegolf.stackexchange.com/q/82884/194
Peter Taylor

2
@PeterTaylor Các dấu ngoặc đơn dường như tạo ra khá nhiều sự khác biệt. Tôi sẽ bỏ phiếu để mở lại nếu tôi có thể.
felipa

Câu trả lời:


4

Python 3 , 265 byte

def f(x,n):
 for e in g(x,x-(x>7)):
  try:
   if eval(e)==n:return e
  except:1
g=lambda x,d:{str(x)*-~i for i in range(d)}|{s%(a,b)for a in g(x,d-1)for b in g(x,d-a.count(str(x)))for s in'%s**%s (%s/%s) (%s+%s) (%s-%s) %s*%s %s/%s'.split()['**'in a+b:]}if d else{}

Hãy thử trực tuyến!

Hoạt động cho tất cả các số trong tài liệu tham khảo được liên kết bởi Kỹ sư Toast.

Chạy lên x=8trên tio, x=9mất vài phút trên máy của tôi.


Hàm gtrả về một tập hợp tất cả các kết hợp với xsố lượng nhiều nhất xlà. fsau đó lặp qua chúng và trả về cái đầu tiên ước lượng cho số n.

Số lượng giá trị có thể tôi tìm thấy cho mỗi xlà:

x  possible numbers
------
2  5
3  17
4  35
5  56
6  83
7  101
8  101
9  101

Tất cả những con số trên có thể được tạo ra từ (a+b), (a-b), (a+b), a*b, a/b, (a/b), và a^b. a+ba-bkhông cho nhiều số hơn.

a^b cũng chỉ được sử dụng một lần, vì nếu không thì số lượng lớn được tạo ra (điều này cũng được xác minh trong tài liệu tham khảo ở trên)


Một phiên bản thay thế mà ngắn mạch ngay khi tìm thấy giải pháp (không phải là đánh gôn):

Điều này nhanh hơn nhiều vì x=7..9tất cả các số có thể được tạo ra.

Python 3 , 338 289 byte

def f(x,n,d=-1):
 d=[d,x][d<0];X=str(x);r=set()
 for E in{X*-~i for i in range(d)}|{s%(a,b)for a in[0]*d and f(x,n,d-1)for b in f(x,n,d-a.count(X))for s in'%s**%s (%s/%s) (%s+%s) (%s-%s) %s*%s %s/%s'.split()['**'in a+b:]}:
  try:e=eval(E)
  except:e=-1
  if e==n:exit(E)
  r|={E}
 return r

Hãy thử trực tuyến!


Đây là một câu trả lời rất hay! Tôi nghĩ rằng bạn luôn sử dụng chính xác (như trái ngược với lên đến) x xs (ví dụ như (4/4**(4-4))cho 4) nhưng nó chỉ ra rằng không phải như vậy.
Anush

exit(e)ngắn hơnreturn e
mbomb007
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.