Vấn đề về tiền xu


20

Lý lịch

Tiền tệ chính thức của quốc gia tưởng tượng Golfenistan là foo , và chỉ có ba loại tiền đang lưu hành: 3 foos, 7 foos và 8 foos. Người ta có thể thấy rằng không thể trả một số tiền nhất định, như 4 foos, bằng cách sử dụng những đồng tiền này. Tuy nhiên, tất cả số tiền đủ lớn có thể được hình thành. Công việc của bạn là tìm ra số tiền lớn nhất không thể hình thành với các đồng tiền (5 foos trong trường hợp này), được gọi là vấn đề tiền xu .

Đầu vào

Đầu vào của bạn là một danh sách các số nguyên dương, đại diện cho các giá trị của tiền xu đang lưu hành. Hai điều được đảm bảo về nó:L = [n1, n2, ..., nk]

  • GCD của các yếu tố Llà 1.
  • L không chứa số 1.

Nó có thể chưa được sắp xếp và / hoặc chứa các bản sao (nghĩ các đồng tiền phiên bản đặc biệt).

Đầu ra

Vì GCD Llà 1, mọi số nguyên đủ lớn mcó thể được biểu diễn dưới dạng kết hợp tuyến tính không âm của các phần tử của nó; nói cách khác, chúng ta có

 m = a1*n1 + a2*n2 + ... + ak*nk 

cho một số số nguyên . Đầu ra của bạn là số nguyên lớn nhất không thể được biểu thị dưới dạng này. Như một gợi ý, người ta biết rằng đầu ra luôn luôn nhỏ hơn , nếu và là các phần tử tối đa và tối thiểu của ( tham chiếu ).ai ≥ 0(n1 - 1)*(nk - 1)n1nkL

Quy tắc

Bạn có thể viết một chương trình đầy đủ hoặc một chức năng. Số byte thấp nhất sẽ thắng và các sơ hở tiêu chuẩn không được phép. Nếu ngôn ngữ của bạn có hoạt động tích hợp sẵn cho việc này, bạn không thể sử dụng ngôn ngữ đó. Không có yêu cầu về thời gian hoặc hiệu quả bộ nhớ, ngoại trừ việc bạn sẽ có thể đánh giá các trường hợp kiểm tra trước khi đăng câu trả lời của bạn.

Sau khi tôi đăng thử thách này, người dùng @vihan đã chỉ ra rằng Stack Overflow có một bản sao chính xác . Dựa trên thảo luận Meta này , thử thách này sẽ không bị xóa dưới dạng trùng lặp; tuy nhiên, tôi yêu cầu tất cả các câu trả lời dựa trên các phiên bản SO nên trích dẫn bản gốc, được đưa ra trạng thái Community Wiki và bị xóa nếu tác giả ban đầu muốn đăng câu trả lời của họ ở đây.

Các trường hợp thử nghiệm

[3, 7, 8] -> 5
[25, 10, 16] -> 79
[11, 12, 13, 14, 13, 14] -> 43
[101, 10] -> 899
[101, 10, 899] -> 889
[101, 10, 11] -> 89
[30, 105, 70, 42] -> 383
[2, 51, 6] -> 49

5
FrobeniusNumbertrong Mathicala.
alephalpha

3
Có một cách tốt hơn giới hạn trên, được tìm thấy trong bài viết này thiết lập (p - 1)(q - 1)là giới hạn trên, trong đó pqlà phần tử nhỏ nhất và lớn nhất của tập hợp.
orlp

2
Có bất kỳ giới hạn về thời gian chạy hoặc sử dụng bộ nhớ?
Dennis

1
Trên Stack Overflow có một câu hỏi về mã golf như thế này một thời gian trước
Downgoat

1
Tôi có một giải pháp Pyth 13 byte có thể làm [2,3]trong một khoảng thời gian hợp lý và không có gì khác. [2,5]sẽ tạo ra khoảng một triệu danh sách Python trong bộ nhớ.
isaacg

Câu trả lời:


4

Bình thường, 23 byte

ef!fqTs.b*NYQY^UTlQS*FQ

Nó rất chậm, vì nó kiểm tra tất cả các giá trị cho đến sản phẩm của tất cả các đồng tiền. Đây là một phiên bản gần như giống hệt nhau, nhưng 1) giảm tập hợp các đồng tiền thành những đồng tiền không chia hết cho nhau và 2) chỉ kiểm tra các giá trị tối đa (max(coins) - 1) * (min(coins) - 1)(47 byte):

=Qu?.A<LiHdG+GHGQYef!fqTs.b*NYQY^UTlQS*thSQteSQ

Giải trình

                   S            range 1 to
                    *FQ         product of input
 f                             filter by
               UT                range 0 to T 
              ^  lQ              cartesian power by number of coins
   f                            filter by
      s.b*NYQY                   sum of coin values * amounts
    qT                           equals desired number T
  !                             nothing matching that filter
e                             take last (highest) element

8

Perl, 60 54 51 byte

Mã 50 byte + 1 dòng lệnh

$.*=$_,$r.=1x$_."|"}{$_=$.while(1x$.--)=~/^($r)+$/

Sẽ tiếp tục chơi golf và gửi một lời giải thích sau. Cách tiếp cận cơ bản là để cho công cụ regex thực hiện công việc khó khăn với khớp chuỗi. Ví dụ, nó sẽ xây dựng một regex tương tự ^(.{3})*(.{7})*(.{8})*$và trận đấu với một chuỗi có độ dài nnơi nxuống từ các sản phẩm của các đầu vào cho đến khi nó không phù hợp.

Lưu ý rằng điều này sẽ trở nên chậm theo cấp số nhân khi số lượng đối số tăng lên.

Cách sử dụng: Đối số được đọc từ STDIN (tách dòng mới), ví dụ:

printf "101\n10" | perl -p entry.pl

3

R , 84 78 byte

a1,a2,

a=scan();max((1:(b<-min(a)*max(a)))[-colSums(combn(outer(a,0:b),sum(!!a)))])

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

aioutercolSums

Phiên bản nhanh hơn nhưng dài hơn (bằng hai byte) chỉ xem xét max(a):

a=scan();max((1:(min(a)*(b<-max(a))))[-apply(combn(outer(a,0:b,"*"),sum(!!a)),2,sum)])

Một phiên bản ngắn hơn một chút (78 byte) thường mất quá nhiều log hoặc quá nhiều dung lượng để chạy trên Dùng thử trực tuyến

a=scan();max((1:(b<-prod(a)))[-apply(combn(outer(a,0:b,"*"),sum(!!a)),2,sum)])

1

Python2, 188 187 byte

def g(L):
 M=max(L);i=r=0;s=[0]*M;l=[1]+s[1:]
 while 1:
    if any(all((l+l)[o:o+min(L)])for o in range(M)):return~-s[r]*M+r
    if any(l[(i-a)%M]for a in L):l[i]=1
    else:r=i
    s[i]+=1;i=(i+1)%M

Phần thụt thứ hai được hiển thị là 4 khoảng trắng trên SO, đó là các tab.

Trên thực tế, một giải pháp 'nhanh', không phải là bruteforce, sử dụng 'Phương pháp của Wilf' như được mô tả ở đây .


1

Javascript ES6, 120 130 126 128 127 125 ký tự

f=a=>`${r=[1|a.sort((a,b)=>a-b)]}`.repeat(a[0]*a[a.length-1]).replace(/./g,(x,q)=>r[q]|a.map(x=>r[q+x]|=r[q])).lastIndexOf(0)

Phiên bản thay thế 126 ký tự:

f=a=>{r=[1];a.sort((a,b)=>a-b);for(q=0;q<a[0]*a[a.length-1];++q)r[q]?a.map(x=>r[q+x]=1):r[q]=0;return r.join``.lastIndexOf(0)}

Kiểm tra:

"[3, 7, 8] -> 5\n\
[25, 10, 16] -> 79\n\
[11, 12, 13, 14, 13, 14] -> 43\n\
[101, 10] -> 899\n\
[101, 10, 899] -> 889\n\
[101, 10, 11] -> 89\n\
[30, 105, 70, 42] -> 383\n\
[2, 51, 6] -> 49".replace(/(\[.*?\]) -> (\d+)/g, function (m, t, r) {
  return f(JSON.parse(t)) == r
})

1
Bạn có thể thay thế forEach(bằngmap(
Ypnypn
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.