Điểm một trò chơi tiến thoái lưỡng nan của tù nhân không đồng bộ


15

Trong một vòng tập thể dục tiến thoái lưỡng nan của tù nhân , mỗi người chơi hai người quyết định nên hợp tác hay đào thoát cho vòng đó. Điểm cho một vòng là:

  • Người chơi A và Người chơi B đều hợp tác: 1 điểm cho cả hai
  • Cả người chơi A và người chơi B đều khiếm khuyết: 2 điểm cho cả hai
  • Người chơi A hợp tác và người chơi B khiếm khuyết: 3 điểm khi hợp tác Người chơi A và 0 điểm cho người chơi B

Tuy nhiên, bạn không cần phải lo lắng về chiến lược: chương trình của bạn sẽ chỉ được lập bảng điểm cho một trò chơi. (Trong trường hợp bạn đã quen với tình trạng khó xử của tù nhân, "điểm" của tôi ở đây tương ứng với "năm tù.")

Thử thách của bạn là lấy đầu vào đại diện cho lựa chọn của người chơi qua nhiều vòng và tính tổng điểm tương ứng của họ. Một người chơi gửi các lựa chọn bằng chữ thường cd(cho sự hợp táckhiếm khuyết ), và người chơi khác gửi các lựa chọn bằng chữ hoa CD. Những lựa chọn này được cung cấp cho chương trình của bạn dưới dạng một chuỗi.

Thông thường, người chơi trong tình trạng tiến thoái lưỡng nan của tù nhân gửi di chuyển của họ đồng thời và lặp đi lặp lại. Tuy nhiên, trong thử thách này, người chơi có thể đã gửi lựa chọn của mình cho nhiều vòng cùng một lúc. Nếu di chuyển của người chơi không theo trình tự, chương trình tính điểm sẽ ghi nhớ và khớp với bước di chuyển có sẵn tiếp theo từ người chơi đối phương.

Đây là một chuỗi đầu vào mẫu:

cDCddDDCcCc

Để hiển thị các kết quả khớp tồn tại trong đầu vào này, tôi sẽ gọi riêng chữ thường và chữ hoa và ghép chúng lại:

cDCddDDCcCc
c  dd   c c => cddcc
 DC  DDC C  => DCDDCC

Chúng sẽ được ghép thành các vòng:

c vs D (3 pts for lowercase-player, 0 pts for uppercase-player)
d vs C (0 pts for lowercase-player, 3 pts for uppercase-player)
d vs D (2 pts for both)
c vs D (3 pts for lowercase-player, 0 pts for uppercase-player)
c vs C (1 pt for both)

Cái nào tạo ra điểm số 9(chữ thường) thành 6(chữ hoa), vì vậy đầu ra phải là 9,6(hoặc bất kỳ dấu phân cách rõ ràng nào).

Để diễn đạt nó theo một cách khác, đây là mỗi cặp được kéo ra trên hàng riêng của nó:

cDCddDDCcCc
cD
  Cd
    dD
      D c
       C  c

Có một điều chưa từng có C, bởi vì người chơi chữ hoa đã gửi nhiều di chuyển hơn người chơi chữ thường. Điều đó được chấp nhận, và nó hoàn toàn bị bỏ qua cho mục đích ghi bàn.

Dưới đây là các yêu cầu:

  • Bạn phải viết một chương trình hoặc hàm chấp nhận một chuỗi của biểu thức chính quy /[cdCD]+/, thông qua một số cơ chế đầu vào (STDIN, đối số hàm, đọc từ tệp, v.v.). (Chương trình của bạn có thể tùy ý chấp nhận đầu vào với một dòng mới.)

  • Chương trình hoặc chức năng của bạn phải xuất hoặc trả lại điểm của người chơi dưới dạng chuỗi. Định dạng đầu ra phải bắt đầu bằng điểm của người chơi chữ thường, tiếp theo là điểm của người chơi chữ hoa, được phân tách bằng bất kỳ dấu phân cách không trống, không số nào bạn chọn. (Một dòng mới là tùy chọn.)

  • Nếu một người chơi có nhiều di chuyển hơn người khác, các di chuyển thừa sẽ bị bỏ qua.

  • Nếu tất cả các chuyển động trong đầu vào là từ một người chơi duy nhất (nghĩa là không có vòng nào được chơi cả), thì điểm của mỗi người chơi là 0.

  • Đệ trình nhỏ nhất tính bằng byte thắng.

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

Input:  cDCddDDCcCc
Output: 9,6         -- or any delimiter; I chose commas here

Input:  cccDDD
Output: 9,0         

Input:  DDDDDDccc
Output: 9,0

Input:  cDcDcD
Output: 9,0

Input:  dcDDC
Output: 5,2

Input:  CcdCDDcd
Output: 6,6

Input:  Ddd
Output: 2,2

Input:  ccccccccccc
Output: 0,0

Không phải họ thường nhận được 2 điểm cho sự hợp tác và mất 1 điểm nếu cả hai khiếm khuyết?
Eumel

1
@Eumel Tôi chỉ sao chép các thông số kỹ thuật từ phần giới thiệu Wikipedia, dường như sử dụng một công thức được đề xuất bởi các tác giả gốc. Cũng lưu ý rằng các điểm ở đây là "xấu" vì chúng tương ứng với nhiều năm tù. Người chiến thắng là người chơi có ít điểm nhất .
apsillers

(0,0)hay [0,0]OK cho đầu ra?
xnor

Câu trả lời:


3

Bình thường, 23 byte

jsMc2/L`C,@Gz-zG"cDDCdd

Bộ kiểm tra


Giải trình:

@Gz: Chữ viết thường

-zG: Chữ viết hoa

C,: Ghép đôi, cắt bớt phần còn lại.

`: Lấy đại diện chuỗi của danh sách các cặp

/L ... "cDDCdd: Đối với mỗi chữ cái trong "cDDCdd", hãy đếm số lần nó xuất hiện trong chuỗi repr ở trên.

c2: Cắt một nửa danh sách kết quả.

sM: Cộng mỗi nửa.

j: Tham gia vào dòng mới và in.


`phải được sử dụng thay vì s để tạo ra trường hợp một bên không bao giờ chơi.


5

Haskell, 139 134 byte

g=filter
(n!m)(a,b)=(a+n,b+m)
f s=init$tail$show$foldr id(0,0)$zipWith(#)(g(>'a')s)$g(<'E')s
'c'# 'C'=1!1
'c'#_=3!0
_# 'D'=2!2
_#_=0!3

Ví dụ sử dụng: f "cDCddDDCcCc"-> "9,6"

15 byte chỉ để có được định dạng đầu ra đúng, tức là biến một cặp số (x,y)thành một chuỗi "x,y".

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

               g(>'a')s        -- extract all lowercase letters
                     g(<'E')s  -- extract all uppercase letters
         zipWith(#)            -- combine both lists element wise with function #
                               -- # calls ! depending on the combination of c/d/C/D
                               -- ! takes 2 numbers a and b and returns a function
                               -- that takes a pair (x,y) and returns (x+a,y+b)
                               -- now we have a list of such functions
    foldr id(0,0)              -- apply those functions starting with (0,0)
init$tail$show                 -- format output                    

Chỉnh sửa: @Zgarb đã giúp tôi tiết kiệm 5 byte. Cảm ơn!


4

LabVIEW, 77 byte

nhập mô tả hình ảnh ở đây

Mã quét từ các mã thông báo và sử dụng các chỉ báo đó để quyết định các điểm đi đâu.

Đếm như thế này


3

Trăn 3, 110

Đã tiết kiệm được 5 byte nhờ FryAmTheEggman.
Tiết kiệm được 7 byte nhờ vào apsillers.
Đã lưu 26 ​​byte nhờ DSM.

x=[[],[]]
a=b=0
for m in input():x[m<'E']+=m
for w,p in zip(*x):d=p>'C';c=w<'d';b+=d*2+c;a+=3-d-2*c
print(b,a)

Tôi nghĩ rằng cuối cùng tất cả đã chơi golf.

Nó quét qua từng ký tự trong đầu vào và sắp xếp nó dựa trên chữ hoa hay không. Sau đó, nó thực hiện một số phép toán lạ mắt lạm dụng chuyển đổi ngầm của Python thành ints.


2

JavaScript (ES6), 124 118 byte

s=>(A=B=i=0,U=(r=x=>s.replace(/c|d/g,x))``,r(l=>U[i]&&(U[i++]<'D'?l<'d'?++A&++B:B+=3:l<'d'?A+=3:(A+=2,B+=2))),A+','+B)

Bản thử trực tiếp

(Mở rộng một chút để dễ đọc.)

var f=function (s) {
    A=B=i=0;
    U=(r=function(x){return s.replace(/c|d/g,x)})("");
    r(l=>U[i]&&(U[i++]<'D'?l<'d'?++A&++B:B+=3:l<'d'?A+=3:(A+=2,B+=2)));
    return A+','+B;
}

var input = ["cDCddDDCcCc","cccDDD","DDDDDDccc","cDcDcD","dcDDC","CcdCDDcd","Ddd","ccccccccccc"];
var output = ["9,6","9,0","9,0","9,0","5,2","6,6","2,2","0,0"];
var passed = true;

for (var index=0;index<input.length;index++) {
    if (f(input[index]) !== output[index]) passed = false;
}

document.getElementById("result").textContent = 
  passed ? "All tests passed." : "Some tests failed.";
<div id="result"></div>

Đã lưu 6 byte nhờ user81655 .


Ban đầu tôi đã hiểu mảng, nhưng cuối cùng lại sử dụng một phương pháp khác. Cảm ơn.
intrepidcoder

1

Mệnh , 49 byte

(lW▼·L)w▼·U))t˅y])[h7%Z2*↓″4>5*-]z2↔-″0<4*+╞)t.Σ¡

Một byte được sử dụng cho mỗi ký tự. Xem tại đây .

Giải trình

(              ## Construct array
 l             ## Read line
 W             ## Assign to w
 ▼·L)          ## Filter by immutable under lower-case
 w             ## Get w
 ▼·U)          ## Filter by immutable under upper-case
)              ## 
t              ## Transpose and truncate
˅y])           ## If empty, empty 2-D matrix
[              ## Map
 h             ## Decimal to hex
 7%            ## Modulo 7
 Z             ## Assign to z
 2*↓″4>5*-     ## Score of lower case
 ]             ## Put in array
 z2↔-″0<4*+    ## Score of upper case
 ╞             ## Add to array
)              ## 
t              ## Transpose and truncate
.Σ             ## Map - sum
¡              ## Empty array onto stack

Đầu ra dưới dạng 9 6.


Là một người chưa bao giờ sử dụng (hoặc nghe nói về) Par, tôi thấy lời giải thích của bạn rất thú vị để đọc. Cảm ơn!
apsillers

1

CJam, 92 83 81 byte

Điều này đã kết thúc lâu hơn tôi nghĩ nó sẽ ...

0]K*X3tC30tG22tZ11t:L;0'a]q+{'D>}:B$_{B}%1#/z{,1>},{2<[:i:#K%L=]sY0e[{si}%}%:.+S*

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

Giải thích (Dám tôi giải thích điều này ?: O):

0]K*C3tX30tG22tZ11t:L;    e# Creates this array [0,30,0,11,0,0,0,0,0,0,0,0,3,0,0,0,22,0,0,0]
0'a]q+                    e# Creates an array that looks like [0, 'a', input string]
{'D>}:B$                  e# Sorts the array by if the int representation of each element is greater than the int value of the character 'D' (e.g. [0,C,D,a,c,d])
_{B}%1#/                  e# Finds the index of the first value in the array that is > 'D' and splits the array at that index.
z{,1>},{                  e# Zip the two sub arrays and filter for only sub arrays with more than one element. (e.g [[0,a],[C,c],[D,d]])
{2<[:i:#K%L=]s            e# For each sub array, take the first two elements, convert each to an it, calculate n=(x[0]^x[1]) mod 20, and get the nth element in the very first array, and convert it to a string
Y0e[                      e# Pad the string with 0 so it is length 2. (e.g. [["00"],["22"],["11"]])
{si}%}%:.+                e# get the numerical representation of each digit and dot sum all of them (e.g [[0,0],[2,2],[1,1] => [3,3])
S*                        e# Join with a space (e.g "3 3")
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.