Trình tạo thẻ Dobble / SpotIt


15

Giới thiệu

Dobble / SpotIt là một trò chơi bài, trong đó mọi người phải phát hiện cùng một biểu tượng trên cặp thẻ trong thời gian ngắn nhất, chỉ ra nó và chuyển sang cặp tiếp theo. Mỗi thẻ có nhiều ký hiệu (8 trong phiên bản bình thường), nhưng chính xác một ký hiệu chung giữa mỗi cặp thẻ.

Ví dụ từ bản sao vật lý của trò chơi: Thẻ có ví dụ về các cặp

Thử thách

Viết một chương trình, trong đó đưa ra các ký hiệu (ký tự ascii đơn) và số lượng ký hiệu trên một thẻ sẽ tạo ra các thẻ liệt kê đầu ra với các ký hiệu cho mỗi thẻ. Rõ ràng có nhiều kết hợp tương đương, chương trình của bạn chỉ cần viết bất kỳ kết hợp nào tạo ra số lượng thẻ lớn nhất cho đầu vào đã cho.

Nó là một golf-code, vì vậy mã ngắn hơn, tốt hơn.

Sẽ thật tuyệt nếu tính toán sẽ kết thúc trước cái chết nóng của vũ trụ đối với trường hợp phức tạp nhất.

Đầu vào

Hai đối số cho hàm / stdin (sự lựa chọn của bạn)

  • Đầu tiên chúng là tập hợp các ký hiệu, đại loại như 'ABCDE "hoặc [' A ',' B ',' C ',' D ',' E '] - lựa chọn định dạng của bạn, có thể là chuỗi, bộ, danh sách, luồng hoặc bất cứ điều gì là thành ngữ cho ngôn ngữ lựa chọn. Các ký tự sẽ được cung cấp từ bộ [A-Za-z0-9], không trùng lặp (vì vậy kích thước tối đa của bộ ký hiệu đầu vào là 62). Chúng sẽ không được sắp xếp theo thứ tự ( vì vậy bạn cũng có thể nhận được "yX4i9A" cho trường hợp 6 ký hiệu).

  • Đối số thứ hai là số nguyên, biểu thị số lượng ký hiệu trên thẻ đơn. Nó sẽ <= hơn kích thước của bộ ký hiệu.

Đầu ra

In nhiều dòng cách nhau bởi dòng mới, mỗi dòng chứa ký hiệu cho một thẻ.

Ví dụ

ABC
2
>>>>
AB
BC
AC

Hoặc là

ABCDEFG
3
>>>>
ABC
BDE
CEF
BFG
AEG
CDG
ADF

Hoặc là

ABCDE
4
>>>>
ABCD

Gợi ý

  • Số lượng thẻ được sản xuất không thể lớn hơn số lượng ký hiệu riêng biệt và trong nhiều kết hợp, nó sẽ nhỏ hơn đáng kể
  • Bạn có thể muốn đọc lên một số nền tảng toán học nếu bạn cần trợ giúp về mặt toán học của vấn đề

Đây là thử thách chơi gôn mã đầu tiên của tôi, vì vậy xin vui lòng tha thứ cho các vấn đề có thể xảy ra với định dạng / kiểu - tôi sẽ cố gắng sửa lỗi nếu bạn chỉ ra chúng trong các nhận xét.



Trường hợp thử nghiệm được đề xuất ('abcdefghijklmnopqrstu', 5)-> ['abcde', 'afghi', 'ajklm', 'anopq', 'arstu', 'bfjnr', 'bgkpt', 'bhlou', 'bimqs', 'cfkqu', 'cgjos', 'chmpr', 'cilnt', 'dfmot', 'dglqr', 'dhkns', 'dijpu', 'eflps', 'egmnu', 'ehjqt', 'eikor']hoặc một số giải pháp làm việc 21 thẻ khác. (Lưu ý rằng đây là mặt phẳng hữu hạn chiếu của bậc 4).
Jonathan Allan

Câu trả lời:


5

Python 2 , 192 162 byte

Tôi có một lập luận rằng điều này tạo ra bộ thẻ tối đa cho mọi kịch bản và nó xử lý 3 trường hợp thử nghiệm.

from itertools import*
def m(a,s):
    C=["".join(x)for x in combinations(a,s)]
    while len(C):
        print C[0]
        C=list(set(A for A in C if len(set(A)&set(C[0]))==1<s))

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

Thuật toán

Đưa ra một bảng chữ cái avà kích thước thẻ s, lấy tất cả các kết hợp của scác yếu tố avà gọi nó C, sau đó:

  • Lấy yếu tố đầu tiên của C, gọi nóC0
  • Tiết kiệm C0
  • Xóa tất cả các thành phần khỏiC có liên kết C0không bằng1
  • Lặp lại với yếu tố thứ hai của C
  • Tiếp tục cho đến khi Ctrống

Sau đó in các yếu tố đã lưu.

Tranh luận

Một số tập hợp con không rỗng Clà giải pháp tối đa của chúng tôi , K. Vì nó chứa ít nhất một phần tử và hai yếu tố nào không thể phân biệt, chọn một yếu tố tùy ý, C0, của Cđược trong K. Đối với bất kỳ yếu tố etrong K, cardinality của ecông đoàn xlà 1 x != etrong K; do đó loại bỏ tất cả các yếu tố trong Cđó liên kết với C0nó không có tính chính yếu 1. Bằng cách lập luận tương tự, chọn một yếu tố tùy ý mới C, thêm nó vào Kvà giảm bớt C. Cuối cùng Clà tập hợp trống và Ksẽ là giải pháp tối đa bởi vì chúng tôi không chọn một yếu tố nào có thể phân biệt được với bất kỳ yếu tố nào khác.


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

Những trường hợp thử nghiệm đã được viết trước khi tôi nhận ra rằng việc in ấn là một yêu cầu.

a=["a","b","c"]
b=2
c=3
d=m(a,b)
print d,len(d)==c
>> ['bc', 'ab', 'ac'] True

a=["a","b","c","d","e","f","g"]
b=3
c=7
d=m(a,b)
print d,len(d)==c
>> ['aef', 'abc', 'bde', 'ceg', 'adg', 'cdf', 'bfg'] True

a=["a","b","c","d","e"]
b=4
c=1
d=m(a,b)
print d,len(d)==c
>> ['abcd'] True

Cập nhật

  • +9 [16-12-07] Phù hợp với yêu cầu in
  • -11 [16-12-07] Đánh bại Rbiến của tôi
  • -30 [16-12-09] Đánh bại Kbiến của tôi , Cảm ơn @Leo !

1
Bạn có thực sự cần phải trừ tập K từ C ở mỗi bước không? Tôi nghĩ rằng bộ lọc bạn thực hiện ( A for A in C if len(set(A)&set(C[0]))==1) đã loại bỏ các phần tử đã chọn, trừ khi s == 1 (trong trường hợp này là len (set (C [0]) & set (C [0])) sẽ là 1). Bạn có thể chơi gôn từ dòng thứ hai đến dòng cuối cùng:C=[A for A in C if len(set(A)&set(C[0]))==1<s]
Leo

Tôi đã viết một thử thách Dobble trong hộp cát và Dom Hastings đã chỉ cho tôi câu hỏi này như một bản sao có thể (có thể là như vậy), tuy nhiên một điều tôi nhận thấy là việc tạo ra một bộ bài Dobble đầy đủ của N * N + Thẻ N + 1 (và ký hiệu) có ký hiệu N + 1 trên mỗi thẻ với N là số nguyên tố không chính. Với N = 4 = 2 ^ 2, đây sẽ là một cỗ bài sử dụng 4 * 4 + 4 + 1 = 21 ký hiệu và cùng số lượng thẻ; tuy nhiên giải pháp này tạo ra một cỗ bài chỉ có 13 thẻ - nhưng 21 là có thể .
Jonathan Allan

@Jonathan ALLan Chỉ cần thêm một liên kết TIO. Tôi đã chạy chức năng với một bảng chữ cái gồm 21 ký tự và với 5 ký tự cho mỗi thẻ. Nó xuất ra 21 thẻ. Tôi nghĩ rằng điều này là chính xác trừ khi tôi hiểu lầm.
Phi tuyến

Hmm, xin lỗi, tôi đã có một số sai lầm khi chạy nó cục bộ rồi! ( Đó là một sàn Dobble đầy đủ của đơn hàng 4. :) )
Jonathan Allan

2

Haskell, 175 156 byte

Lần đầu tiên tôi chơi golf, hãy cho tôi biết nếu tôi đã làm hỏng điều gì đó.

import Data.List
f 0_=[[]]
f n a=g$c n a
c n a=[a!!i:x|i<-[0..(length a)-1],x<-f(n-1)(drop(i+1)a)]
g[]=[]
g(x:t)=x:g(filter(\z->length(z`intersect`x)<= 1)t)

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

Cảm ơn @Paul Mutser đã cải thiện và -19 byte


Phiên bản gốc


1
Chào mừng đến với PPCG! Lưu ý rằng việc nhập khẩu được tính vào điểm số của bạn. Cải thiện có thể có: 156 byte, bao gồm cả nhập
Paul Mutser

Cảm ơn vì đã ngẩng cao đầu, tôi không chắc họ có làm không!
lỗi

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.