Trình mô phỏng cuộc thi kéo giấy


9

Bạn quyết định tổ chức một giải vô địch kéo giấy bằng đá để tìm ra ai là người giỏi nhất. Bạn không muốn để may mắn quyết định người chiến thắng để mọi người phải đưa cho bạn chiến thuật của mình bằng văn bản trước cuộc thi. Bạn cũng thích những thứ đơn giản, do đó, việc di chuyển của đối thủ cạnh tranh (hiển thị đá, giấy hoặc kéo) chỉ phải dựa trên lượt trước đó (RvR, RvP, RvS, PvR, PvP, PvS, SvR, SvP hoặc SvS). Trong lượt đầu tiên, người chơi phải hiển thị một dấu hiệu cố định.

Bạn đã quyết định viết một chương trình (hoặc chức năng) để mô phỏng chức vô địch.

Chi tiết cuộc thi

  • Sẽ có ít nhất 2 thí sinh.
  • Mỗi người chơi chơi chính xác một trận đấu với những người khác.
  • Một trận đấu kéo dài 7 vòng.
  • Trong mỗi vòng, người chiến thắng được 2 điểm, người thua không được điểm nào. Trong trường hợp hòa cả hai người chơi ghi được 1 điểm.
  • Điểm của người chơi trong một trận đấu là tổng số điểm của người đó qua các lượt của trận đấu.
  • Điểm số cuối cùng của người chơi trong giải vô địch là tổng số điểm của anh ấy hoặc cô ấy trên tất cả các trận đấu.

Chi tiết đầu vào:

  • chương trình hoặc chức năng của bạn nhận được Nchuỗi dài 10 ký tự, mỗi chuỗi tương ứng với chiến lược của người chơi. Tất cả các ký tự là (chữ thường) r phoặc scó nghĩa là trong tình huống đã cho, người chơi sẽ hiển thị giấy hoặc kéo đá.
  • Chữ cái đầu tiên mã lần lượt đầu tiên (trong mọi trận đấu cho đối thủ cạnh tranh đó). Thứ hai cho thấy những gì xảy ra nếu vòng cuối cùng là rock vs rock. Những cái tiếp theo là RvP, RvS, PvR, PvP, PvS, SvR, SvP và SvS trong đó chữ cái đầu tiên là dấu hiệu của người chơi và thứ hai là của đối thủ. Ví dụ rrpsrpsrps, người chơi bắt đầu với đá và sau đó sao chép bước di chuyển cuối cùng của đối thủ.
  • Bạn có thể nhập danh sách các chuỗi dưới dạng danh sách / mảng hoặc dữ liệu tương tự của ngôn ngữ của bạn hoặc dưới dạng một chuỗi. Trong trường hợp sau, một số loại ký tự phân cách là phải.

Chi tiết về đầu ra:

  • Chương trình hoặc chức năng của bạn sẽ xuất ra điểm số cuối cùng của mỗi người chơi theo cùng thứ tự với đầu vào được cung cấp.
  • Điểm số nên được phân tách bằng khoảng trắng hoặc dòng mới. Không gian lưu trữ hoặc dòng mới được cho phép.

Ví dụ:

Đầu vào: ['rrpsrpsrps', 'rpppsprrpr']

Đầu ra: 5 9(lần lượt là rvr rvp pvs svp pvr rvp pvs)

Đầu vào: ['rrpsrpsrps', 'rpppsprrpr', 'ssssssssss']

Đầu ra: 13 17 12(trận đấu là 5-9(thứ 1 so với thứ 2), 8-6(thứ 1 so với thứ 3) và 8-6(thứ 2 so với thứ 3))

Đây là môn đánh gôn nên bài dự thi ngắn nhất sẽ thắng.


Lấy cảm hứng từ Numberphile? ;-)
Jakube

Là ví dụ thứ hai đúng? Tôi nghĩ rằng người thứ nhất thua người thứ ba với 6-8và người thứ hai thua người thứ ba với 6-8.
Jakube

@Jakube Sửa ví dụ đầu vào. Cám ơn.
ngẫu nhiên

Câu trả lời:


2

Python 2: 201 188 ký tự

def f(Q):c=lambda m:'rps'.index(m);l=len(Q);r=[0]*l;i=0;exec'p,q=i/l,i%l;m,n=c(Q[p][0]),c(Q[q][0]);exec"r[p]+=(p!=q)*(m+1-n)%3;m,n=c(Q[p][m*3+n+1]),c(Q[q][n*3+m+1]);"*7;i+=1;'*l*l;return r

Logic của chương trình: Tôi chuyển đổi các chữ cái để số ( r=0, p=1, s=2). mlà số của người thứ nhất, nsố của người thứ hai. Bởi vì trò chơi là chu kỳ, (m-n)%3đã xác định kết quả. Và tất nhiên, tôi có thể thay đổi kết quả bằng một f=(m+1-n)%3. Bây giờ f=0có nghĩa là, người chơi thứ hai qthắng, f=1có nghĩa là hòa, và f=2, người chơi thứ nhất pthắng. Nó cũng đã là điểm số cho người chơi 1. Do đó tôi chỉ cần thêm tất cả các giá trị (p!=q)*(m+1-n)%3cho mỗi người chơi.

Kiểm tra nó với print f(['rrpsrpsrps', 'rpppsprrpr', 'ssssssssss'])

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.