Tiến thoái lưỡng nan của giám tuyển


9

Giới thiệu

Bạn là bạn của một giám tuyển cho một bảo tàng nghệ thuật, người đã có niềm vui gần đây để có được nghệ thuật hiện đại từ bốn nghệ sĩ ( một số trong đó có thể cung cấp cho người quản lý không có tác phẩm nghệ thuật, những kẻ vô lại trẻ tuổi ). Vì đây là nghệ thuật hiện đại, tất cả các tác phẩm của bất kỳ nghệ sĩ nào đều trông giống hệt nhau. Bạn của bạn muốn sử dụng máy tính để giúp quyết định thứ tự nào để đặt những mảnh này vào.

Yêu cầu chương trình

Chương trình của bạn phải lấy năm số nguyên (được truyền cho một hàm hoặc nhập thông qua stdin (hoặc cách nào khác)). Bốn bức tranh đầu tiên là số lượng tranh được cung cấp bởi mỗi trong số bốn nghệ sĩ. Giá trị cuối cùng là một chỉ số hoán vị i(tính từ 1, không phải 0). Người phụ trách muốn thấy ihoán vị thứ tự theo thứ tự từ điển của các bức tranh.

Chương trình của bạn phải xuất ra hoán vị này ở bất kỳ định dạng hợp lý nào: vd abbccdhoặc [0 1 1 2 2 3]. Thời gian chạy cho tổng đầu vào ít hơn mười bức tranh phải mất ít hơn một giờ (điều này hy vọng sẽ không có vấn đề gì).

Bạn không được phép sử dụng bất kỳ chức năng dựng sẵn nào để thực hiện hoán vị

Ví dụ

Đầu vào: 0 1 2 0 2

Cho rằng chúng ta có một bức tranh của họa sĩ B và hai bức của họa sĩ C (và tất cả chúng đều trông giống nhau), các hoán vị theo thứ tự từ điển là:

['Bcc', ' cbc ', 'ccb']

Hoán vị được tô sáng sẽ là đầu ra chính xác, bởi vì nó là thứ hai theo thứ tự từ điển.

Đầu vào: 1 2 0 1 5

['abbd', 'abdb', 'adbb', 'babd', ' badb ', 'bbad', 'bbda', 'bdab', 'bdba', 'dabb', 'dbab', 'dbba']

Kiểm tra

Dưới đây là một số bài kiểm tra nên chính xác.

1 2 4 1 5    - ABBDCCCC
2 2 3 1 86   - ABBCACDC
4 1 2 0 24   - AACACBA
1 4 3 2 65   - ABBCBBDCDC

Một đoạn mã ngắn trong Python3 sẽ tạo ngẫu nhiên đầu vào và đầu ra có sẵn ở đây (không hợp lệ cho mục nhập, điều này sử dụng nhập khẩu hoán vị Python):

from itertools import permutations
from random import randint
a,b,c,d,n = randint(1,2),randint(1,2),randint(1,3),randint(1,3),randint(1,15)
print(str(a) + " " + str(b) + " " + str(c) + " " + str(d) + " " + str(n) + " - " + str(sorted(set([''.join(p) for p in permutations(a * "a" + b * "b" + c * "c" + d * "d")]))[n-1]))

Bảng điểm

Optimizer - CJam       - 39  - Confirmed - Bruteforce
EDC65     - JavaScript - 120 - Confirmed - Bruteforce
Jakube    - Python2    - 175 - Confirmed - Algorithmic

1
Bạn nói, "tất cả các mảnh trông giống hệt nhau". Bạn có nghĩa là "tất cả các tác phẩm của một nghệ sĩ nhất định trông giống hệt nhau, nhưng các tác phẩm từ các nghệ sĩ khác nhau trông khác nhau"?
DavidC

Đây không phải là một mục hợp lệ, nhưng tôi nghĩ nó vẫn có thể hữu ích cho ai đó: {:A.a.{~97+[:I.}:là J hợp lệ và hoạt động, nhưng sử dụng A.cho hầu hết các công việc, vì vậy nó không hợp lệ. Nếu bạn có thể viết một hàm thay thế A.và đặt nó vào hàm này, bạn sẽ có câu trả lời hợp lệ.
ɐɔıʇǝɥʇuʎs

@ ıʇǝɥʇuʎs - Bạn không cần phải sử dụng "ABCD", bạn có thể sử dụng bất kỳ hệ thống ký tự / số / ký hiệu nào cả. Tôi sợ rằng tôi không biết J, và vì vậy không thể nói chính xác vấn đề, nhưng hy vọng điều này sẽ giúp =)
Alexander Craggie

@PopeyGilbert Chà, một phiên bản chỉ nhổ ra số sẽ là {:A.[:I.}:... Vấn đề là vậy, nhưng tôi vẫn không nghĩ A.sẽ hợp lệ: jsoftware.com/help/dipedia/dacapdot.htmlm
--ıʇǝɥʇuʎs

Điều gì xảy ra nếu hoán vị yêu cầu không tồn tại? 1 0 0 0 100?
edc65

Câu trả lời:


5

Python 2: 175 163 ký tự

Đây không phải là một câu trả lời golf nghiêm túc. Với một thuật toán khác, tôi đạt 138 byte. Chỉ muốn đăng bài này ở đây, vì nó không sử dụng vũ lực. Độ phức tạp là Theta (#pictures).

f=lambda x:0**x or x*f(x-1)
def g(Q,n):
 while sum(Q):
  for j in 0,1,2,3:
   p=f(sum(Q)-1)*Q[j]
   for k in Q:p/=f(k)
   if p<n:n-=p
   else:print j;Q[j]-=1;break

Sử dụng:

g([1, 4, 3, 2], 65)

biên tập:

Cùng một thuật toán, chỉ cần một số môn đánh gôn: không nhập phương thức giai thừa và ít thay đổi theo thứ tự tính toán.

Bản dịch thứ Py: 61 ký tự

Lu*GhHUb1WsPQV4J*@QNytsPQFZPQ=J/JyZ)I<JeQ XQ4-eQJ)EN XQNt@QNB

Không có gì đặc biệt ở đây, bản dịch chính xác mã trăn của tôi. Cách quá lâu mặc dù. Tôi đã sử dụng một vài thứ xấu xí (dài). 9 chữ cái đầu tiên là định nghĩa của giai thừa.

Lu*GhHUb1    def y(b): G=1; for H in range(b): G*= H+1; return G

Ngoài ra, những thứ như Q[j]-=1là quá dài: XQNt@QN(nhiều hơn 1 ký tự so với Python !!!)

Sử dụng:

Hãy thử ở đây: Trình biên dịch / thực thi Pyth . Tắt chế độ gỡ lỗi và sử dụng [2, 2, 3, 1, 86]làm đầu vào.


Nó hoạt động! Chúc mừng bạn đã đưa ra giải pháp Python đầu tiên! Tuy nhiên, tôi đã thấy rằng trong môi trường của mình, tôi phải di chuyển ra from math import*ngoài chức năng. Thêm bạn vào bảng xếp hạng!
Alexander Craggie

Wow ... Giải pháp của bạn cực kỳ hiệu quả - Đối với 32 bức tranh, chỉ mất 0,034 giây o.0.
Alexander Craggie

3

CJam, 50 43 39 byte

q~(])\{W):Wa*}%s:X{Xm*:s_&}X,(*{$X=},$=

Điều này có thể được đánh golf rất nhiều.

Lấy đầu vào từ STDIN theo định dạng sau:

4 1 2 0 24

Đầu ra bức tranh. Ví dụ cho đầu vào trên:

0020210

Dùng thử trực tuyến tại đây

Xin lưu ý rằng trình biên dịch trực tuyến từ bỏ kích thước tranh lớn hơn. Bạn sẽ phải thử các đầu vào lớn hơn trên phiên bản Java


Chúc mừng bạn đã là người giải quyết đầu tiên! 50 byte chắc chắn là một giá trị khó đánh bại. Tôi sẽ thêm bạn vào đầu bảng xếp hạng!
Alexander Craggie

@PopeyGilbert ít nhất bạn nên đợi 1 tuần hoặc lâu hơn trước khi chấp nhận câu trả lời
Trình tối ưu hóa

À, được rồi, tôi rất xin lỗi! Trong thử thách trước đây tôi chỉ thay đổi câu trả lời được chấp nhận khi ai đó bị đánh. Lỗi của tôi.
Alexander Craggie

1
@PopeyGilbert Điều đó rất cao quý đối với bạn (và tôi ước tất cả các tác giả thách thức đã làm), và về nguyên tắc không có gì sai khi chấp nhận sớm nếu bạn làm vậy, nhưng một số người dường như bị xúc phạm nếu một thách thức quanh đây chấp nhận câu trả lời sớm (bởi vì, tôi đoán, không ai mong tác giả thay đổi câu trả lời được chấp nhận).
Martin Ender

Cá nhân tôi nghĩ rằng nên có ít nhất 2 câu trả lời để lựa chọn giữa trước khi chấp nhận, ngay cả khi nó được thực hiện sớm. Tất nhiên nếu chỉ có 1 câu trả lời cho đến một tuần hoặc lâu hơn, hãy chấp nhận nó.
Tối ưu hóa

3

JavaScript (ES6) 120 138 147

Là một chức năng với năm tham số cần thiết, đầu ra thông qua bàn điều khiển.
Sử dụng ký hiệu 0,1,2,3. Tôi tính tổng các ký hiệu, sau đó xây dựng và kiểm tra mỗi 4 số cơ sở có số chữ số cần thiết. Các số có số sai của bất kỳ chữ số nào sẽ bị loại bỏ.
Lưu ý: với số nguyên JavaScript 32 bit, công việc này cho tối đa 15 bức tranh.

Chỉnh sửa Shorter (tránh .toString) và cách nhanh hơn (điều kiện thoát được sửa đổi). Thời gian cho mỗi bài kiểm tra dưới 1 giây.

Edit2 không thay đổi thuật toán, đánh gôn nhiều hơn (thêm thụt lề để dễ đọc)

F=(w,x,y,z,n)=>{
  for(a=0;n;n-=l=='0,0,0,0')
    for(l=[w,x,y,z],t=w+x+y+z,v='',b=a++;t--;b/=4)--l[d=b&3],v=d+v;
  console.log(v)
}

Ungolfed và không cần FireFox

F=function(w,x,y,z,n) {
  for(a=0; n; a++) // exit when solution found (if wrong parameters, run forever)
  {
    l=[w,x,y,z]; // required number of each symbol
    t=w+x+y+z; // total of digits
    v=''; // init output string
    for(b=a;
      t--; // digit count down
      b >>= 2) // shift for next digit
    {
        d = b & 3; //get digit
        --l[d]; // decrement for the current digit
        v = d + v; // add to output string         
    }
    l[0]|l[1]|l[2]|l[3] // if digits ok
    ||--n // decrement counter
  }
  console.log(v) // when found, exit for and print the answer
}

Kiểm tra trong bảng điều khiển FireBug / FireFox

F(1, 2, 4, 1, 5) 
F(2, 2, 3, 1, 86)
F(4, 1, 2, 0, 24)
F(1, 4, 3, 2, 65)

Đầu ra

01132222
01120232
0020210
0112113232

Xin chào! Có một chút rắc rối khi chạy nó. Tôi đang tải xuống FireFox để xem có giúp được gì không. Tôi sẽ thêm bạn vào bảng xếp hạng!
Alexander Craggie

Tôi tìm thấy một bảng khá hay ở đây - Tôi sẽ cho rằng Firefox là cần thiết. Đã thử nghiệm và nó hoạt động! Thay đổi bảng xếp hạng để xác nhận.
Alexander Craggie

Bảng xếp hạng nhưng không có upvote ... bạn thực sự không thích nó! :(
edc65

À! Tôi rất xin lỗi = (Hiện đã được nâng cấp =)
Alexander Craggie

Tôi tự hỏi thuật toán này sẽ kéo dài bao lâu trong CJam. Nhưng đến bây giờ, tôi không biết làm thế nào điều này hoạt động: P
Trình tối ưu hóa

2

Bình thường , 20

@fqPQm/TdU4^U4sPQteQ

Hãy thử nó ở đây.

Đầu vào ở dạng danh sách Python, vd [1, 2, 4, 1, 5]

Đầu ra cũng ở dạng danh sách Python, ví dụ [0, 1, 1, 3, 2, 2, 2, 2]cho đầu vào trên.

Giải pháp là lực lượng vũ phu, và mất khoảng 10 giây, trường hợp xấu nhất, trên máy của tôi.

Làm thế nào nó hoạt động:

@fqPQm/TdU4^U4sPQteQ
           ^U4sPQ         All permutations of [0, 1, 2, 3] with length equal to the number
                          of paintings.
     m/TdU4               Find the count (/) of paintings by painter in the input list.
 fqPQ                     Filter the permutations on the counts being the desired counts
                          in the input.
                          This gives all possible orderings of the paintings.
@                teQ      Index into this list at the given location - 1. (0-indexing)
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.