Thời điểm tốt để từ chối


16

Cài đặt

Giả sử bạn được cung cấp n cầu chì, với 1 ≤ n 5, mỗi cầu chì dài một mét và trong đó mỗi cầu chì có tốc độ cháy liên quan là N mét mỗi D giờ.

Một cầu chì có thể được thắp sáng ở một hoặc cả hai đầu, sau đó bị dập tắt ở một hoặc cả hai đầu, nối lại, dập tắt, v.v., nhiều lần khi cần thiết cho đến khi cầu chì được tiêu thụ hết. Bạn có thể thắp sáng và dập tắt cầu chì ngay lập tức, và bạn có thể quan sát chính xác ngay lập tức một cầu chì được tiêu thụ hoàn toàn (bị cháy).

Cầu chì không thể cắt và cũng không thể thắp sáng bất cứ nơi nào ngoại trừ ở đầu của nó.

Thiết lập như vậy cho phép một hệ thống thời gian chính xác vô hạn, bằng cách đo thời gian giữa bất kỳ hai sự kiện chiếu sáng / tiêu thụ cầu chì nào. Ví dụ: với hai cầu chì có tốc độ đốt cháy là 1 mét mỗi giờ, bạn có thể đo chính xác 45 phút (3/4 giờ) bằng cách

  1. đồng thời: thắp sáng cầu chì thứ nhất ở cả hai đầu, chiếu sáng cầu chì thứ hai ở một đầu và đánh dấu điểm bắt đầu của khoảng thời gian của bạn
  2. thắp sáng đầu thứ hai của cầu chì thứ hai ngay lập tức cầu chì thứ nhất được sử dụng (30 phút sau)
  3. đánh dấu kết thúc khoảng thời gian của bạn tại thời điểm cầu chì thứ hai được sử dụng (15 phút sau)

Các thách thức

Cho một số phần trăm giờ t và một bộ n phân số biểu thị tốc độ ghi chính xác của n cầu chì, viết chương trình hoặc hàm xuất / trả về giá trị trung thực nếu t giờ có thể được đo chính xác thông qua đốt cháy hệ thống của cầu chì hoặc giá trị giả mạo khác.

Đầu vào của chương trình có thể là bất kỳ thứ nào sau đây:

  • đối số dòng lệnh của biểu mẫu TN/TD N1/D1 N2/D2 N3/D3 ...
  • một chuỗi các hình thức TN/TD N1/D1 N2/D2 N3/D3 ...đọc từ stdinhoặc tương đương
  • một chuỗi của biểu mẫu TN/TD N1/D1 N2/D2 N3/D3 ...được truyền dưới dạng đối số hàm
  • một mảng các chuỗi ["TN/TD", "N1/D1", "N2/D2", "N3/D3", ...]được truyền dưới dạng đối số hàm

Trong mọi trường hợp t = TN/ TD, trong đó TN, TD∈ [1.10000].

Tương tự như vậy, trong mọi trường hợp: tốc độ ghi cho cầu chì i = N i / D i = N<i>/ D<i>, trong đó N<i>, D<i>∈ [1,10] i .

Bạn có thể cho rằng sẽ luôn có từ 1 đến 5 cầu chì (bao gồm) và tất cả các đầu vào đều hợp lệ và trong phạm vi. Bạn cũng có thể giả định rằng tất cả các phân số đầu vào được đưa ra trong điều khoản thấp nhất.

Bạn không được sử dụng số dấu phẩy động với các thành phần phân số cho thử thách này. Đó là, nếu bạn sử dụng số dấu phẩy động ở bất cứ đâu trong ứng dụng của mình, chúng chỉ có thể nhận các giá trị tích phân với thành phần phân số bằng không.

Chấm điểm

Đây là một thử thách , do đó, bài nộp theo byte ngắn nhất sẽ được trao phần thắng.


Ví dụ đầu vào / đầu ra

input:  29/6 3/2 2/3 3/5 3/7 7/5
output: true

One solution:
  - light both ends of fuse 1, mark start of interval
  - on fuse 1 consumption: light both ends of fuse 2, light one end of fuse 5
  - on fuse 5 consumption: extinguish one end of fuse 2, light both ends of fuse 3,
    light both ends of fuse 4
  - on fuse 2 consumption: extinguish one end of fuse 3, extinguish both ends of
    fuse 4
  - on fuse 3 consumption: relight one end of fuse 4
  - on consumption of fuse 4: mark end of interval (29/6 hours)

input:  2/1 3/1 5/1 7/1
output: false

input:  5/1 6/1 1/6 9/1 1/9
output: true

One solution:
  - light fuse 1 at one end, light fuse 2 at both ends, light fuse 4 at both ends
  - on fuse 1 consumption: extinguish one end of fuse 2, mark start of interval
  - on fuse 4 consumption: relight one end of fuse 2
  - on fuse 2 consumption: mark end of interval (5 hours)

Hạnh phúc hợp nhất! :)


@ MartinBüttner Tôi đoán nó sẽ là hạn chế số dấu phẩy động.
hmatt1

2
@ MartinBüttner Tôi đồng ý rằng đó không phải là một hạn chế đối với mã nguồn. Tôi không nghĩ rằng [nguồn bị hạn chế] phù hợp với câu hỏi này vì nó hiện đang tồn tại.
hmatt1

@chilemagic: Tôi muốn thu hút sự chú ý đến thực tế rằng logic dấu phẩy động không thể được sử dụng, nhưng nếu sự đồng thuận là nó không được sử dụng đúng cách của thẻ, tôi sẽ loại bỏ nó.
COTO

Các trường hợp thử nghiệm quá lớn :)
frageum

5
Lol, tôi đang sử dụng thuật toán O ((n!) ^ 3) cho mục đích chơi gôn.
frageum

Câu trả lời:


8

Con trăn 2, 305

Đây là phiên bản golf. Nó thực tế không thể sử dụng được cho n> 3 , vì độ phức tạp của thời gian (và không gian) giống như 3 n 2 ... thực sự có thể quá thấp so với thời gian. Dù sao, hàm chấp nhận một danh sách các chuỗi.

def f(i):
 Z=range;r=map(__import__('fractions').Fraction,i);R=r[1:];n=len(R);L=[[[1]*n,[0]]];g=0
 for m,p in L: 
  for d in([v/3**i%3for i in Z(n)]for v in Z(3**n)):
    try:x=min(m[i]/R[i]/d[i]for i in Z(n)if m[i]*d[i]>0);L+=[[[m[i]-x*R[i]*d[i]for i in Z(n)],[p[0]+x]+p]]
    except:g|=p[0]-r[0]in p
 return g

Một phiên bản tối ưu hóa một chút có thể hoàn thành các trường hợp thử nghiệm trong vài phút. Nó vẫn có thể chậm đối với trường hợp n = 5 không thể .

def fLessslow(i):
 Z=range
 r=map(__import__('fractions').Fraction,i)
 R=r[1:]
 n=len(R)
 L=[((1,)*n,(0,))]
 ls = set(L)
 for m,p in L: 
  if p[0]-r[0]in p: return 1
  for d in([v/3**i%3 for i in Z(n)]for v in Z(3**n)):
   if any(d[i] and m[i]<=0 for i in Z(n)):continue
   try:
    x=min(m[i]/R[i]/d[i]for i in Z(n)if m[i]*d[i]>0)
    thing = (tuple(m[i]-x*R[i]*d[i]for i in Z(n)),(p[0]+x,)+p)
    if thing not in ls:L+=[thing];ls.add(thing)
   except:5
 return 0

print fLessslow('5/1 6/1 1/6 9/1 1/9'.split())
print fLessslow('29/6 3/2 2/3 3/5 3/7 7/5'.split())

1
Thật tuyệt, 8 lần nâng cấp cho mã lỗi: gọi hàm với ví dụ trong mô tả: print f ('3/4 1/1 1 / 1'.split ()) trả về 0, mặc dù như mô tả nói, nó có thể giải được .
Jakube

@Jakube Cảm ơn bạn đã thử nghiệm ... nó rất hiếm trên trang web này! Nó đã được sửa bây giờ; Tôi quên ở một nơi để chia cho hệ số 1 hoặc 2 tùy thuộc vào số lượng đầu dây được thắp sáng.
frageum

3

Con trăn 2, 331

Nó dài hơn một chút so với phiên bản của feerum, nhưng nó nhanh hơn nhiều. Tất cả các thử nghiệm cùng nhau mất khoảng 3 giây trên máy tính xách tay của tôi. Một tìm kiếm hoàn chỉnh cho n = 5 mất khoảng 10 phút mặc dù. Một số mã tương tự như phiên bản của feerum, nhưng tôi đã không cố tình sao chép bất kỳ mã nào.

from fractions import*
f=Fraction
r=range
g=lambda x:h(f(x[0]),[1/f(i)for i in x[1:]],[])
def h(t,x,y):
 for i in r(1,3**len(x)):
  c=[[],[],[]]
  for j in r(len(x)):c[i/3**j%3]+=[x[j]]
  n,b,w=c
  m=min(b+[i/2 for i in w])
  if h(t,[i for i in n+[j-m for j in b]+[j-2*m for j in w]if i],[i+m for i in y]+[m]):return True
 return t in y

Sử dụng:

print g('3/4 1/1 1/1'.split())
print g('29/6 3/2 2/3 3/5 3/7 7/5'.split())
print g('2/1 3/1 5/1 7/1'.split())
print g('5/1 6/1 1/6 9/1 1/9'.split())

Giải trình:

Biểu thức lambda g thực hiện một số tiền xử lý đầu vào, như chuyển đổi chuỗi thành phân số, tách thời gian mục tiêu khỏi tốc độ ghi và tính thời gian ghi (= 1 / tốc độ ghi).

Hàm h chia tất cả thời gian ghi x thành 3 bộ n, b và w (n là viết tắt của non_burning, b cho one_end_burning và w cho cả hai_ends_burning). Nó lặp lại trên tất cả các sắp xếp đó (ngoại trừ cách sắp xếp n = x, b = [], w = []), xác định cầu chì có tốc độ ghi ngắn nhất (tiết kiệm thời gian tính bằng m) và gọi đệ quy h với thời gian ghi được cập nhật. Trong y tôi lưu tất cả các lần có thể ai đó có thể đo bằng cầu chì. Trong cuộc gọi đệ quy, các giá trị này cũng được cập nhật.

Ngay khi tôi tìm thấy giá trị, nó chấm dứt các cuộc gọi alle với True.


4
Các lập trình viên Python trẻ tuổi của bạn được chiều chuộng với tất cả các phân số tích hợp và các số nguyên lớn của bạn. Quay lại khi tôi còn là một thanh niên, tất cả những gì chúng tôi có là 1của 0chúng tôi, chúng tôi phải gõ một lần tại một bàn điều khiển mà không có màn hình. Đôi khi chúng tôi không có 1s.
COTO
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.