ทำประตูขึ้นเขียงเกมนักโทษที่ไม่ตรงกัน


15

ในรอบการฝึกกระอักกระอ่วนของนักโทษผู้เล่นสองคนตัดสินใจว่าจะให้ความร่วมมือหรือมีข้อบกพร่องในรอบนั้นหรือไม่ คะแนนสำหรับรอบคือ:

  • ผู้เล่น A และผู้เล่น B ทั้งคู่ให้ความร่วมมือ: 1 คะแนนสำหรับทั้งคู่
  • ผู้เล่น A และผู้เล่น B ทั้งคู่มีข้อบกพร่อง: 2 คะแนนสำหรับทั้งคู่
  • ผู้เล่น A ร่วมมือและผู้เล่น B มีข้อบกพร่อง: 3 คะแนนสำหรับการประสานผู้เล่น A และ0 คะแนนเพื่อป้องกันผู้เล่น B

คุณไม่จำเป็นต้องกังวลเกี่ยวกับกลยุทธ์แม้ว่า: โปรแกรมของคุณจะทำเป็นตารางคะแนนสำหรับเกม (ในกรณีที่คุณคุ้นเคยกับภาวะที่กลืนไม่เข้าคายไม่ออกของ "จุด" ของฉันที่นี่ตรงกับ "ปีในคุก")

ความท้าทายของคุณคือการป้อนข้อมูลที่แสดงถึงตัวเลือกของผู้เล่นในหลายรอบและคำนวณคะแนนรวมตามลำดับ ผู้เล่นคนหนึ่งส่งทางเลือกในตัวพิมพ์เล็กcและd(สำหรับความร่วมมือและข้อบกพร่อง ) และทางเลือกอื่น ๆ ส่งในตัวพิมพ์ใหญ่และC Dตัวเลือกเหล่านี้มีให้กับโปรแกรมของคุณเป็นสตริง

โดยปกติผู้เล่นที่อยู่ในภาวะวิกฤติจะส่งการเคลื่อนไหวพร้อมกันและวนซ้ำ อย่างไรก็ตามในการท้าทายนี้ผู้เล่นอาจส่งตัวเลือกของพวกเขาไปหลายรอบในคราวเดียว หากการเคลื่อนไหวของผู้เล่นไม่เป็นไปตามลำดับโปรแกรมการให้คะแนนจะจดจำมันและจับคู่กับการเคลื่อนไหวครั้งต่อไปที่มีจากผู้เล่นฝ่ายตรงข้าม

นี่คือสตริงอินพุตตัวอย่าง:

cDCddDDCcCc

หากต้องการแสดงรายการที่ตรงกันที่มีอยู่ในข้อมูลนี้ฉันจะเรียกตัวพิมพ์เล็กและตัวพิมพ์ใหญ่แยกกันแล้วจับคู่:

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

เหล่านี้จะถูกจับคู่กับรอบ:

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)

ซึ่งให้คะแนน9(ตัวพิมพ์เล็ก) ถึง6(ตัวพิมพ์ใหญ่) ดังนั้นผลลัพธ์ควรเป็น9,6(หรือตัวคั่นที่ไม่ชัดเจน)

เพื่อแสดงในอีกวิธีหนึ่งนี่คือการจับคู่แต่ละครั้งดึงออกมาในแถวของตัวเอง:

cDCddDDCcCc
cD
  Cd
    dD
      D c
       C  c

มีหนึ่งที่ไม่ตรงกันCเนื่องจากผู้เล่นตัวพิมพ์ใหญ่ส่งการเคลื่อนไหวมากกว่าผู้เล่นตัวพิมพ์เล็ก นั่นเป็นสิ่งที่ยอมรับได้และจะถูกเพิกเฉยอย่างสิ้นเชิงสำหรับการทำประตู

นี่คือข้อกำหนด:

  • คุณต้องเขียนโปรแกรมหรือฟังก์ชั่นที่ยอมรับสตริงของรูปแบบการแสดงออกปกติ/[cdCD]+/ผ่านกลไกการป้อนข้อมูลบางอย่าง (STDIN, ฟังก์ชั่นการโต้แย้ง, อ่านจากไฟล์ ฯลฯ ) (โปรแกรมของคุณอาจยอมรับอินพุตด้วยการขึ้นบรรทัดใหม่)

  • โปรแกรมหรือฟังก์ชั่นของคุณจะต้องส่งออกหรือส่งกลับคะแนนของผู้เล่นเป็นสตริง รูปแบบผลลัพธ์จะต้องเริ่มต้นด้วยคะแนนของผู้เล่นตัวพิมพ์เล็กตามด้วยคะแนนของผู้เล่นตัวพิมพ์ใหญ่คั่นด้วยตัวคั่นที่ไม่ว่างและไม่เป็นตัวเลขที่คุณเลือก (ขึ้นบรรทัดใหม่ต่อท้ายเป็นตัวเลือก)

  • หากผู้เล่นหนึ่งคนมีการเคลื่อนไหวมากกว่าผู้เล่นคนอื่นการเคลื่อนไหวส่วนเกินจะถูกเพิกเฉย

  • หากการเคลื่อนไหวทั้งหมดในการป้อนข้อมูลจากเฉพาะผู้เล่นคนหนึ่ง (นั่นคือไม่มีรอบได้รับการเล่นที่ทั้งหมด) 0แล้วคะแนนของผู้เล่นแต่ละคน

  • การส่งที่น้อยที่สุดในหน่วยไบต์ชนะ

กรณีทดสอบ

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

ปกติแล้วพวกเขาจะไม่ได้รับ 2 คะแนนสำหรับความร่วมมือและเสีย 1 คะแนนถ้าทั้งสองข้อบกพร่อง?
Eumel

1
@Eumel ฉันเพิ่งคัดลอกรายละเอียดจากบทนำ Wikipedia ซึ่งดูเหมือนว่าจะใช้สูตรที่แนะนำโดยผู้เขียนต้นฉบับ โปรดทราบด้วยว่าคะแนนในที่นี้คือ "ไม่ดี" เนื่องจากสอดคล้องกับหลายปีในคุก ผู้ชนะคือผู้เล่นที่มีคะแนนน้อยที่สุด
apsillers

เป็น(0,0)หรือ[0,0]ตกลงสำหรับการส่งออก?
xnor

คำตอบ:


3

Pyth, 23 ไบต์

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

ชุดทดสอบ


คำอธิบาย:

@Gz: อักษรตัวพิมพ์เล็ก

-zG: ตัวอักษรตัวพิมพ์ใหญ่

C,: จับคู่ตัดทอนส่วนที่เหลือ

`: ใช้การแทนค่าสตริงของรายการคู่

/L ... "cDDCdd: สำหรับตัวอักษรแต่ละตัว"cDDCdd"ให้นับจำนวนครั้งที่ปรากฏในการพิมพ์สตริงข้างต้น

c2: สับรายการผลลัพธ์ครึ่ง

sM: เพิ่มแต่ละครึ่ง

j: เข้าร่วมในการขึ้นบรรทัดใหม่และพิมพ์


`ต้องใช้แทน s เพื่อสร้างกรณีที่ฝ่ายหนึ่งไม่เคยเล่น


5

Haskell, 139 134 ไบต์

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

ตัวอย่างการใช้: f "cDCddDDCcCc"-> "9,6"

15 ไบต์เพียงเพื่อให้ได้รูปแบบออกขวาคือการเปลี่ยนคู่ของตัวเลขเป็นสตริง(x,y)"x,y"

มันทำงานอย่างไร:

               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                    

แก้ไข: @Zgarb ช่วยฉันประหยัด 5 ไบต์ ขอบคุณ!


4

LabVIEW, 77 ไบต์

ป้อนคำอธิบายรูปภาพที่นี่

รหัสจะสแกนจากโทเค็นและใช้สิ่งบ่งชี้เหล่านั้นเพื่อตัดสินใจว่าจะไปที่จุดใด

การนับเป็นเช่นนี้


3

Python 3, 110

บันทึก 5 ไบต์ด้วย FryAmTheEggman
บันทึก 7 ไบต์ขอบคุณ apsillers
บันทึก 26 ไบต์ด้วย 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)

ฉันคิดว่าในที่สุดมันก็ออกไปเล่นกอล์ฟ

มันสแกนอักขระแต่ละตัวในอินพุตและเรียงลำดับตามการเป็นตัวพิมพ์ใหญ่หรือไม่ จากนั้นจะมีคณิตศาสตร์แฟนซีที่ละเมิดการแปลงโดยนัยของงูใหญ่ไปเป็น ints


2

JavaScript (ES6), 124 118 ไบต์

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)

การสาธิตสด

(ขยายเล็กน้อยเพื่อให้สามารถอ่านได้)

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>

ที่บันทึกไว้ 6 ไบต์ขอบคุณที่user81655


ตอนแรกฉันมีความเข้าใจในอาร์เรย์ แต่จบลงด้วยการใช้วิธีการอื่น ขอบคุณ
intrepidcoder

1

พาร์ 49 ไบต์

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

ใช้หนึ่งไบต์ต่ออักขระ ดูที่นี่

คำอธิบาย

(              ## 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

9 6ขาออกในรูปแบบ


ในฐานะคนที่ไม่เคยใช้ (หรือเคยได้ยิน) พาร์ฉันพบว่าคำอธิบายของคุณมีความสุขที่ได้อ่าน ขอบคุณ!
apsillers

1

CJam, 92 83 81 ไบต์

จบลงด้วยความยาวกว่าที่ฉันคิด ...

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

ลองที่นี่

คำอธิบาย (ฉันอธิบายได้ไหม?: 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")
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.