PNZ (Đoán 3 chữ số duy nhất theo thứ tự)


15

Từ một thử thách trong một cuốn sách lập trình từ lâu, PNZ là một trò chơi mà người dùng phải đoán ba chữ số duy nhất theo đúng thứ tự.

Quy tắc :

  1. Một số 3 chữ số ngẫu nhiên không có chữ số lặp lại được tạo ra. (Đây là những gì người dùng đang cố đoán)
  2. Người dùng nhập dự đoán gồm 3 chữ số, được chương trình đánh giá.
  3. Xuất một "P" cho mỗi chữ số chính xác ở một vị trí chính xác.
  4. Xuất một "N" cho mỗi chữ số chính xác ở một vị trí không chính xác.
  5. Chỉ xuất một chữ "Z" nếu không có chữ số nào đúng.
  6. Tiếp tục chấp nhận đầu vào cho đến khi tất cả các chữ số là chính xác và ở đúng vị trí, sau đó xuất "PPP" theo sau là số lần đoán trên một dòng mới.

Lưu ý :

  • "Chữ số chính xác" có nghĩa là một trong các chữ số trong dự đoán cũng là một trong các chữ số trong số có 3 chữ số ngẫu nhiên.

  • "Vị trí đúng" có nghĩa là "Số chính xác" VÀ nằm cùng vị trí với số ngẫu nhiên 3 chữ số.

  • Thứ tự xuất ra phải là đầu tiên của "P", sau đó là "N" hoặc chỉ "Z" nếu không có gì chính xác.

  • Nếu đầu vào chứa các chữ số lặp lại, "P" sẽ ưu tiên hơn "N" (Ví dụ Number: 123 Input: 111 Output: P:)

  • (TÙY CHỌN) Không nên đánh giá các đầu vào có độ dài không chính xác 3 chữ số, cũng không được tính vào tổng số lần đoán

Ví dụ nếu các chữ số được tạo là 123

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

Ví dụ nếu các chữ số được tạo là 047

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

Đây là CodeGolf, vì vậy chương trình ngắn nhất sẽ thắng!


Chào mừng đến với PPCG! Đây là một thử thách đầu tiên tuyệt vời, nhưng tôi sợ chúng tôi đã làm điều này trước đây. Trò chơi còn được gọi là Mastermind. Đây là thử thách hiện tại nhưng tôi không thể quyết định nên đóng cái cũ hay cái mới. Tôi hơi nghiêng về việc đóng cái này, nhưng tôi sẽ để cộng đồng quyết định.
Martin Ender

@ MartinBüttner Ah, đó là xấu của tôi. Có vẻ như một vấn đề khá giống nhau. Tôi sẽ đồng ý với bạn và để cộng đồng quyết định.
Ông Công khai

@ MartinBüttner Tiêu chí ở đây là gì? Những gì cũ nên được ưu tiên?
Luis Mendo

2
@ MartinBüttner Tôi nghĩ giữa việc yêu cầu các chữ số là duy nhất và bản chất tương tác, thử thách này đủ khác biệt để có giá trị.
admBorkBork

@LuisMendo Tôi không có tiêu chí chính thức nào, bởi vì đóng những thách thức cũ là một điều khá gần đây. Tiêu chí cá nhân của tôi là "thử thách nào tốt hơn và / hoặc nhiều barebones hơn".
Martin Ender

Câu trả lời:


5

JavaScript (ES6) 184 187 195

Chỉnh sửa Đã lưu 8 byte thx @Neil Chỉnh sửa Đã lưu 3 byte thx @ user81655

(dòng mới được tính là 1 byte)

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)

Kiểm tra

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)


Tôi nghĩ d.splice(v=Math.random()*-~l,1)giúp bạn tiết kiệm 5 hoặc thậm chí 8 byte (với chi phí của một số hiệu suất).
Neil

@Neil Tôi đã từ chối mối nối khi tôi bắt đầu tìm giải pháp, nó có vẻ dài. Bây giờ tôi sẽ thử lại
edc65

1
@ user81655 đúng, cảm ơn. Thực sự là một diễn viên kỳ lạ
edc65

3

PowerShell v2 +, 177 231 168 byte

$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

Điều kỳ lạ là tôi đã có thể chơi golf phiên bản cố định có chiều dài ngắn hơn phiên bản không trộn ... oO

Rất cám ơn @ edc65 vì sự giúp đỡ và cảm hứng của anh ấy!

Giải trình:

$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

Chạy ví dụ:

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

Làm thế nào để bạn kiểm tra các chữ số không được lặp lại?
edc65

@ edc65 Đầu ra chính xác. Đó là đắt tiền. Vẫn còn làm việc để chơi gôn hơn nữa, nhưng tôi không hy vọng ...
admBorkBork

Tôi chắc rằng bạn có thể làm tốt hơn. Tận dụng thực tế là dự đoán có thể có sự lặp lại, nhưng con số để đoán không có. Chẳng hạn, trong câu trả lời của tôi, tôi bắt đầu từ mỗi chữ số để đoán và kiểm tra đầu vào, điều ngược lại sẽ không hoạt động
edc65

@ edc65 Cảm ơn bạn đã truyền cảm hứng và trợ giúp - đánh golf phiên bản cố định ngắn hơn phiên bản không cố định! : D
admBorkBork

Bây giờ tôi buộc phải upvote
edc65

0

R , 178 166 byte

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="")}

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

Liên kết TIO chỉ dành cho số byte - hãy thử điều này trong bảng điều khiển R của bạn! (hoặc cho tôi biết nếu có một lựa chọn thay thế).

Xem lịch sử cho phiên bản ít chơi hơn, dễ đọc hơn.

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.