PNZ (เดาหมายเลข 3 หลักตามลำดับ)


15

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

กฎ :

  1. ตัวเลขสุ่ม 3 หลักโดยไม่มีการสร้างตัวเลขซ้ำ (นี่คือสิ่งที่ผู้ใช้พยายามคาดเดา)
  2. ผู้ใช้ป้อนตัวเลข 3 ตัวซึ่งจะถูกประเมินโดยโปรแกรม
  3. เอาต์พุต "P" สำหรับทุกหลักที่ถูกต้องในตำแหน่งที่ถูกต้อง
  4. เอาต์พุต "N" สำหรับทุกหลักที่ถูกต้องในตำแหน่งที่ไม่ถูกต้อง
  5. ส่งออก "Z" เฉพาะในกรณีที่ไม่มีตัวเลขที่ถูกต้อง
  6. ยอมรับอินพุตต่อไปจนกว่าตัวเลขทั้งหมดจะถูกต้องและอยู่ในตำแหน่งที่ถูกต้องจากนั้นส่งออก "PPP" ตามด้วยจำนวนการเดาที่ใช้ในบรรทัดใหม่

หมายเหตุ :

  • "หลักที่ถูกต้อง" หมายความว่าหนึ่งในตัวเลขหลักในการเดาก็เป็นหนึ่งในตัวเลขในตัวเลขสุ่ม 3 หลักเช่นกัน

  • "ตำแหน่งที่ถูกต้อง" หมายความว่าเป็น "ตัวเลขที่ถูกต้อง" และอยู่ในตำแหน่งเดียวกับตัวเลขสุ่ม 3 หลัก

  • ลำดับของผลลัพธ์ควรเป็น "P" ทั้งหมดก่อนจากนั้นจึงเป็น "N" หรือเฉพาะ "Z" หากไม่มีสิ่งใดถูกต้อง

  • หากมีการป้อนข้อมูลตัวเลขซ้ำ "P" จะให้ความสำคัญมากกว่า "N" (ตัวอย่าง: Number: 123 Input: 111 Output: P)

  • (ทางเลือก) ไม่ควรประเมินอินพุตที่มีความยาวไม่เกิน 3 หลักและไม่นับรวมต่อการทายผลรวมทั้งหมด

ตัวอย่างถ้าตัวเลขที่สร้างขึ้นเป็น 123

> 147
P
> 152
PN
> 126
PP
> 123
PPP
4

ตัวอย่างถ้าตัวเลขที่สร้างขึ้นเป็น 047

> 123
Z
> 456
N
> 478
NN
> 947
PP
> 047
PPP
5

นี่คือ CodeGolf ดังนั้นโปรแกรมที่สั้นที่สุดชนะ!


ยินดีต้อนรับสู่ PPCG! นี่เป็นความท้าทายครั้งแรกที่ยอดเยี่ยม แต่ฉันเกรงว่าเราเคยทำมาก่อน เกมนี้รู้จักกันในชื่อ Mastermind นี่คือความท้าทายที่มีอยู่แต่ฉันไม่สามารถตัดสินใจได้ว่าจะปิดเก่าหรือใหม่ ฉันเอนตัวลงเล็กน้อยเพื่อปิดสิ่งนี้ แต่ฉันจะให้ชุมชนตัดสินใจ
Martin Ender

@ MartinBüttnerอ้านั่นมันแย่จริงๆ ดูเหมือนว่าปัญหาที่คล้ายกัน ฉันจะเห็นด้วยกับคุณและให้ชุมชนตัดสินใจ
นายสาธารณะ

@ MartinBüttnerเกณฑ์ที่นี่คืออะไร? สิ่งเก่าควรขยายออกไปยังสิ่งใด
Luis Mendo

2
@ MartinBüttnerฉันคิดว่าระหว่างการกำหนดตัวเลขให้เป็นเอกลักษณ์และลักษณะการโต้ตอบความท้าทายนี้แตกต่างพอที่จะคุ้มค่า
AdmBorkBork

@ LuisMendo ไม่มีเกณฑ์อย่างเป็นทางการที่ฉันคิดว่าเพราะการปิดความท้าทายเก่าเป็นสิ่งที่ค่อนข้างเร็ว เกณฑ์ส่วนบุคคลของฉันคือ "สิ่งที่ท้าทายดีกว่าและ / หรือเปล่ามากกว่า"
Martin Ender

คำตอบ:


5

JavaScript (ES6) 184 187 195

แก้ไขบันทึก 8 ไบต์ thx @Neil แก้ไขบันทึก 3 ไบต์ thx @ user81655

(ขึ้นบรรทัดใหม่นับเป็น 1 ไบต์)

d=[...'0123456789']
x=[10,9,8].map(l=>d.splice(Math.random()*l,1))
for(c=p=a='';!p[2];++c)g=prompt(a),n=p='',x.map((d,i)=>d-g[i]?~g.search(d)?n+='N':0:p+='P'),a=p+n||'Z'
alert(a+' '+c)

ทดสอบ

d=[...'0123456789']
x=[10,9,8].map(l=>d.splice(Math.random()*l,1))
for(c=p=a='';!p[2];++c)
  g=prompt(a),
  n=p='',
  x.map((d,i)=>
        d-g[i]?~g.search(d)?n+='N':0:p+='P'
       ),
  a=p+n||'Z'
alert(a+' '+c)


ฉันคิดว่าd.splice(v=Math.random()*-~l,1)ช่วยให้คุณประหยัด 5 หรืออาจ 8 ไบต์ (โดยมีค่าใช้จ่ายในการแสดง)
Neil

@ ไม่มีฉันปฏิเสธรอยต่อเมื่อฉันเริ่มหาทางแก้ไขดูเหมือนว่าจะมีความยาว ตอนนี้ฉันจะลองอีกครั้ง
edc65

1
@ user81655 ถูกต้องขอบคุณ จริงๆนักแสดงที่แปลกประหลาด
edc65

3

PowerShell v2 +, 177 231 168 ไบต์

$g=-join(0..9|Random -c 3);for($c=0;$o-ne"PPP";$c++){$n=$p='';$i=read-host;$o=-join(0..2|%{((("","N")[$i.IndexOf($g[$_])-ge0]),"P")[$g[$_]-eq$i[$_]]}|sort -des);($o,"Z")[!$o]}$c

น่าแปลกที่ฉันสามารถตีกอล์ฟรุ่นที่กำหนดให้มีความยาวสั้นกว่ารุ่นที่ไม่ได้รวม ... oO

ขอบคุณมากที่ @ edc65สำหรับความช่วยเหลือและแรงบันดาลใจของเขา!

คำอธิบาย:

$g=-join(0..9|Random -c 3)   # Create an array @(0,1,2,...9) and choose 3 distinct elements
for($c=0;$o-ne"PPP";$c++){   # Loop until output = "PPP", incrementing $count each time
  $i=read-host               # Read input from the user

  $o=-join(0..2|%{((("","N")[$i.IndexOf($g[$_])-ge0]),"P")[$g[$_]-eq$i[$_]]}|sort -des)
       # OK, this is the convoluted part. We're constructing an array of "N", "P", or "",
       # sorting them by descending order (so the P's are first), and then joining them
       # together into a string. The array is constructed by essentially an if/elseif/else
       # statement that is evaluated three times thanks to the 0..2|%{} loop.
       # Starting from the innermost, we choose between "" and "N" based on whether the
       # input number has the current-digit of the secret number somewhere within it. We
       # then choose between that or "P" based on whether it's the _current_ digit of the
       # user input number.

  ($o,"Z")[!$o]
       # Here we output either $o from above or "Z" based on whether $o is empty
}
$c                           # The loop finished (meaning the user guessed), output $count

ตัวอย่างการเรียกใช้:

PS C:\Tools\Scripts\golfing> .\pnz.ps1
123
N
111
Z
222
P
452
PN
562
NN
275
PN
258
PPP
7

คุณจะตรวจสอบว่าตัวเลขไม่ซ้ำกันได้อย่างไร
edc65

@ edc65 เอาต์พุตที่ถูกต้อง นั่นแพงมาก ยังคงทำงานเพื่อเล่นกอล์ฟต่อไป แต่ฉันไม่ได้หวังว่า ...
AdmBorkBork

ฉันแน่ใจว่าคุณสามารถทำได้ดีกว่า ยกระดับความจริงที่ว่าการเดาสามารถมีการทำซ้ำได้ แต่จำนวนที่จะเดาไม่ได้มี ตัวอย่างเช่นในคำตอบของฉันฉันเริ่มต้นจากแต่ละหลักที่จะเดาและตรวจสอบข้อมูลในทางตรงกันข้ามจะไม่ทำงาน
edc65

@ edc65 ขอบคุณสำหรับแรงบันดาลใจและความช่วยเหลือ - ตีกอล์ฟรุ่นที่แก้ไขให้สั้นกว่ารุ่นที่ไม่คงที่! : D
AdmBorkBork

ตอนนี้ฉันต้อง upvote
edc65

0

R , 178 166 ไบต์

y=!(s<-sample(48:57,3))
while(any(y!=s)){F=F+1
y<-utf8ToInt(readline())
cat(rep("P",p<-sum(y==s)),rep("N",n<-sum(y%in%s)-p
),if(!(n+p))"Z","
",if(all(y==s))F,sep="")}

ลองออนไลน์!

ลิงก์ TIO นั้นใช้สำหรับการนับไบต์ - ลองใช้ในคอนโซล R ของคุณ! (หรือแจ้งให้เราทราบหากมีตัวเลือกอื่น)

ดูประวัติรุ่นที่ตีกอล์ฟน้อยกว่าอ่านง่ายขึ้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.