Một trò chơi đoán phẳng


13

Có một trò chơi tôi thích chơi. Nó xảy ra trên một lưới có kích thước hữu hạn (nhưng nó được bọc lại, giống như một quả cầu). Trên lưới đó, một điểm ngẫu nhiên (chỉ số nguyên) được chọn. Sau đó, tôi, người dùng, được nhắc nhập đầu vào tọa độ. Nếu đầu vào của tôi khớp chính xác với điểm ngẫu nhiên, tôi được thông báo rằng tôi đã thắng. Mặt khác, tôi được cho biết khoảng cách điểm giữa đầu vào của tôi và điểm ngẫu nhiên. Ví dụ, nếu tôi đoán (2,2)và điểm ngẫu nhiên là (4,3), thì khoảng cách sẽ là sqrt[(3-2)^2 + (4-2)^2] = sqrt[5].

Trò chơi tiếp tục cho đến khi người chơi đến đúng vị trí của điểm.


Mục tiêu Tạo một phiên bản chức năng của trò chơi được mô tả ở trên. Bạn phải tạo một chương trình đầy đủ để làm như vậy. Đây là những gì chương trình của bạn nên làm:

  1. Yêu cầu hai đầu vào: chiều cao và chiều rộng của bảng. Nguồn gốc nằm ở phía trên bên trái của bảng. Những đầu vào sẽ không vượt quá 1024.
  2. Chọn một điểm ngẫu nhiên trên bảng đó; đây sẽ là điểm cần đoán
  3. Chấp nhận đầu vào mô phỏng một lượt. Đầu vào sẽ là một cặp số nguyên được phân tách bằng dấu cách hoặc hai đầu vào số nguyên riêng biệt. Để đáp ứng với đầu vào này, chương trình sẽ thực hiện một trong hai điều sau:
    1. Nếu đầu vào khớp với điểm ngẫu nhiên được chọn, hãy xuất một thông báo báo hiệu chiến thắng của người dùng. Tôi sẽ đề nghị "Bạn đã thắng!".
    2. Mặt khác, xuất khoảng cách giữa điểm đầu vào của người dùng và điểm ngẫu nhiên.
    Trong cả hai trường hợp, bạn phải tăng bộ đếm lần lượt.
  4. Khi người dùng đã giành được chiến thắng, hãy hiển thị số lượt người dùng đã thực hiện. Chương trình sau đó thoát.

Tiền thưởng

Tiền thưởng được áp dụng theo thứ tự xuất hiện trong danh sách này

  • -150 byte nếu chương trình của bạn lấy số nguyên đầu vào Dmô tả thứ nguyên mà trò chơi diễn ra. Ví dụ: nếu D = 3, sau đó bạn tạo một điểm 3số nguyên ngẫu nhiên , lấy 3đầu vào số nguyên và xuất khoảng cách giữa các điểm đó.
  • -50% (hoặc + 50% nếu score < 0) nếu bạn cung cấp biểu diễn đồ họa của bảng (ASCII hoặc Hình ảnh) cho thấy nơi người dùng đã đoán trước đó trên lưới các kích thước đã cho và bộ đếm lần lượt. (Nếu bạn nhận phần thưởng đầu tiên, thì phần thưởng này chỉ áp dụng cho các chế độ 2D1D. Nếu bạn thêm đầu ra đồ họa 3D, bạn sẽ nhận được thêm -50%.)
  • -60 byte nếu bạn có thể cung cấp một gamemode (được chọn bởi một đầu vào lúc đầu; nghĩa là, khi được đưa ra 0, hãy thực hiện các gamemode thông thường; khi được cho 1, thực hiện gamemode này) trong đó điểm di chuyển 1 đơn vị theo hướng trực giao ngẫu nhiên mỗi lượt

Thêm về gói

Việc gói chỉ xảy ra khi, trong phần thưởng thứ ba, điểm di chuyển di chuyển qua bất kỳ ranh giới nào; trong trường hợp này, điểm di chuyển bị vênh đến điểm tương ứng, như vậy:

...              ...
..R (move right) R..
...              ...

Hành vi gói này không ảnh hưởng đến dự đoán của người dùng, ngoài thực tế là điểm đã thay đổi hướng.


Bảng xếp hạng

Đoạn trích Stack ở cuối bài này tạo ra danh mục từ các câu trả lời a) dưới dạng danh sách các giải pháp ngắn nhất cho mỗi ngôn ngữ và b) dưới dạng bảng xếp hạng tổng thể.

Để đảm bảo rằng câu trả lời của bạn hiển thị, vui lòng bắt đầu câu trả lời của bạn bằng một tiêu đề, sử dụng mẫu Markdown sau:

# Language Name, N bytes

nơi Nlà kích thước của trình của bạn. Nếu bạn cải thiện điểm số của mình, bạn có thể giữ điểm số cũ trong tiêu đề, bằng cách đánh chúng qua. Ví dụ:

# Ruby, <s>104</s> <s>101</s> 96 bytes

Nếu ở đó bạn muốn bao gồm nhiều số trong tiêu đề của mình (ví dụ: vì điểm của bạn là tổng của hai tệp hoặc bạn muốn liệt kê riêng các hình phạt cờ phiên dịch), hãy đảm bảo rằng điểm thực tế là số cuối cùng trong tiêu đề:

# Perl, 43 + 2 (-p flag) = 45 bytes

Bạn cũng có thể đặt tên ngôn ngữ thành liên kết sau đó sẽ hiển thị trong đoạn trích:

# [><>](http://esolangs.org/wiki/Fish), 121 bytes


7
Tiểu nitlog: bạn có thể có nghĩa là nó quấn như một hình xuyến không phải hình cầu. Không thể bọc lưới 2D vào một hình cầu mà không tạo ra sự không liên tục.
Alistair Buxton

2
Ngoài ra nếu bảng kết thúc tốt đẹp thì có thể có một con đường ngắn hơn giữa đoán và mục tiêu bằng cách vượt qua một cạnh.
Alistair Buxton

1
@NBZ Vâng, bạn có thể.
Conor O'Brien

1
@NBZ 1 đơn vị nó một hướng.
Conor O'Brien

2
1. Tôi vẫn không chắc cấu trúc liên kết là gì. Để giúp làm sáng tỏ mọi thứ, nếu bảng là 10x10, điểm ngẫu nhiên là (9,4), và tôi đoán (2,2), là khoảng cách sqrt(13)hoặcsqrt(53) ? (Lưu ý cho tương lai: nếu bạn đang làm bất cứ điều gì kỳ lạ, đừng bao gồm tính ngẫu nhiên vì điều đó gần như không thể cung cấp các trường hợp thử nghiệm). 2. Trong phần thưởng thứ ba, khoảng cách nên được tính và đầu ra trước hoặc sau khi điểm di chuyển?
Peter Taylor

Câu trả lời:


8

CJam, -113 -139 -52 -157 -159 byte

l~]:B:mr{_ea:i~mr0a*W2mr#+*.+B:,.=_[l~].-:mh_p}g],(

Chương trình dài 51 byte và đủ điều kiện nhận phần thưởng -150 byte-60 byte .

Chế độ trò chơi và số lượng kích thước được đọc dưới dạng đối số dòng lệnh, kích thước trong mỗi thứ nguyên từ STDIN. Vì thông điệp chiến thắng là tùy ý , chương trình sẽ in 0.0(khoảng cách đến mục tiêu) để cho biết rằng trò chơi đã kết thúc.

Chạy thử

$ cjam game.cjam 0 3; echo
2 2 2
1 1 1
1.4142135623730951
1 1 0
1.7320508075688774
1 0 1
1.0
0 0 1
0.0
4
$ cjam game.cjam 1 3; echo
2 2 2
0 0 0
1.0
0 0 0
0.0
2

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

l~]       e# Read a line from STDIN, evaluate it and collect the result.
:B        e# Save the resulting array in B. The result is [B1 ... Bd],
          e# where Bk is the board size in dimension k.
:mr       e# Pseudo-randomly select a non-negative integer below Bk,
          e# for each k between 1 and d.
{         e# Do:
  _       e#   Copy the item on the stack. The original becomes a dummy value
          e#   that will be used to count the number of turns.
  ea      e#   Push the array of command-line arguments.
  :i~     e#   Cast each to integer and dump them on the stack.
          e#   This pushes m (game mode) and d (number of dimensions).
  mr      e#   Pseudo-randomly select a non-negative integer below d.
  0a*     e#   Push an array of that many zeroes.
  W2mr#   e#   Elevate -1 to 0 or 1 (selected pseudo-randomly).
  +       e#   Append the result (1 or -1) to the array of zeroes.
  *       e#   Repeat the array m times.
  .+      e#   Perform vectorized addition to move the point.
  B:,.=   e#   Take the k-th coordinate modulo Bk.
  _[l~]   e#   Push a copy and an evaluated line from STDIN.
  .-:mh   e#   Compute their Euclidean distance.
  _p      e#   Print a copy.
}g        e# While the distance is non-zero, repeat the loop.
],(       e# Get the size of the stack and subtract 1.
          e# This pushes the number of turns.

2
Và Dennis đã vượt qua tất cả mọi người. Lần nữa.
Seadrus

1
Bạn đã vô tình cập nhật điểm số lên 152 thay vì -52, đưa bạn cuối cùng lên bảng xếp hạng
Moose

7

Pyth, 91 (-150 -60) = -119

VvwaYOvw;JY#IqQ1=dOlY XYd@S[0 @Jd +@Yd?O2_1 1)1)=T[)VYaT^-Nvw2)=ZhZ=b@sT2Iqb0Bb;p"Won in "Z

Giải pháp cũ: (54-150 = -96)

JYVQaYOvw;#=J[)VYaJ^-Nvw2)=ZhZ=b@sJ2Iqb0Bb;p"Won in "Z

Tất cả đầu vào diễn ra trên một dòng mới.

  • Số nguyên đầu tiên đại diện cho chế độ chơi ( một trong hai 1hoặc0 )
  • Số nguyên thứ hai đầu tiênD đại diện cho kích thước của chơi.
  • Đầu Dvào tiếp theo đại diện cho kích thước trường
  • Mỗi Dđầu vào từ thời điểm này trở đi là dự đoán

Chơi mẫu (gợi ý không xuất hiện trong chương trình thực tế):

  #Hint: Gamemode (1 or 0)
1
  #Hint: Dimensions
3
  #Hint: X-size
4
  #Hint: Y-size
4
  #Hint: Z-size
4
  #Hint: Guesses
  #Hint:[3, 2, 1]
3
2
2
1.0
  #Hint:[3, 2, 1]
3
2
1
1.0
  #Hint:[2, 2, 1]
2
2
1
1.0
  #Hint:[3, 2, 1]
3
2
1
Won in 4

Không nên di chuyển thứ hai?
JNF

@JNF điểm có thể di chuyển trong gamemode 1 (phần thưởng -60 byte)
Jakube

Holy moly, đó là một số mã pyth dài. Không thực sự chơi golf mặc dù. Ví dụ, tôi thấy hai khoảng trắng, có thể được loại bỏ. Ngoài ra: Bạn có thể sử dụng J=YmOvwvwthay vì VvwaYOvw;JY, ngắn hơn 2 byte. Tôi đã không xem qua mã khác, nhưng tôi đoán bạn cũng có thể rút ngắn một vài điều ở đó.
Jakube

@ Jakube, tôi đã giả sử gợi ý cho chúng tôi biết điểm hiện tại là gì
JNF

3

Con trăn 2, 210 - 150 = 60

from random import*
q,r,o=map,raw_input,int
a=q(randrange,q(o,r().split(' ')))
m=q(o,r().split(' '))
t=1
while m!=a:print sum([(c-d)**2for c,d in zip(m,a)])**.5;m=q(o,r().split(' '));t+=1
print'You won in %d'%t

Thử thách đầu tiên chỉ cho đến nay. Dùng thử trực tuyến


3

Pip, 43 42 byte - 150 = -108

Lấy kích thước bảng làm đối số dòng lệnh (với D ngụ ý từ số lượng đối số). Đưa ra dự đoán là các số được phân tách bằng dấu cách trên stdin.

YRR_MgWd:++i&RT$+(y-(q^s))**2Pd"Won in ".i

Mã này tận dụng lợi thế của các tính năng lập trình mảng của Pip. Các mảng của cmdline args được lưu trữ trong g. Chúng tôi tạo ra điểm cần đoán bằng cách ánh xạ toán tử sắp xếp RRlại gvà kéo danh sách kết quả vào ybiến. Sau đó đến vòng lặp while, trong đó điều kiện như sau:

d:++i&RT$+(y-(q^s))**2

  ++i&                  Increment i, the guess counter; the result is always > 0, so the
                          short-circuiting & operator evaluates the next expression:
              q         Read a line from stdin
               ^s       Split on spaces
           y-(   )      Subtract from our chosen point itemwise
          (       )**2  Square, itemwise
        $+              Fold on +, summing the list of squares
      RT                Square root
d:                      Assign this distance to d

Nếu khoảng cách là khác không, bên trong vòng lặp in nó. Nếu nó bằng không, chúng tôi đã đạt được điểm mục tiêu; vòng lặp tạm dừng và chương trình xuất ra thông báo thắng và số lượt.

Chạy ví dụ:

C:\Users\dlosc> pip.py -f guessing.pip 10 5 6 4
5 2 3 2
3.1622776601683795
6 2 3 2
4.123105625617661
3 2 3 2
1.4142135623730951
3 1 3 2
2.23606797749979
3 2 2 2
1.7320508075688772
2 2 3 2
1
2 2 3 1
1.4142135623730951
2 3 3 2
Won in 8

2

R, 134 - 150 = -16 byte

function(...){G=sapply(list(...),sample,1)
C=0
repeat{g=scan()
C=C+1
if(any(G!=g))cat(sqrt(sum((G-g)^2)))else{cat("Won in",C);break}}}

2

Haskell, 240 - 150 = 90

import System.Random
r x=randomRIO(0,x-1)
m=map read.words
g=getLine
main=do g;(fmap m g::IO[Int])>>=mapM r>>=b 1
b c v=do i<-fmap(sqrt.fromIntegral.sum.map(^2).zipWith(-)v.m)g;if i==0 then putStrLn$"Won in "++show c else do print i;b(c+1)v

1

Thuốc nhuộm APL , 77 71 - 210 = -139

S F M
P←?S
{P←S|P+(?D)⌽D↑Mׯ1 1[?2]
C+←1
P≢G←⎕:0⊣⎕←.5*⍨+/2*⍨P-G
C}⍣≢C←0

Đồng ý:

Lưu ý rằng điều này chạy trong chỉ mục gốc 0 ( ⎕IO←0) được mặc định trong nhiều APL.
Lấy chế độ boolean làm đối số bên phải ( M) và kích thước kích thước làm đối số bên trái ( S).
Số lượng kích thước là D, phải được đặt (ví dụ D←3) trước khi gọi, theo OP).
P←?SMục tiêu được điểm ngẫu nhiên trong phạm vi 1 mặc dù mỗi người trong số các giới hạn chiều
{... }⍣≢C←0lặp lại các chức năng cho đến khi kết quả là khác nhau từ C, ban đầu được 0
?2ngẫu nhiên số 0 hoặc 1
¯1 1[... tiết kiệm mới điểm mục tiêu tăng truy cập đoán đầu vào, và nếu nó là khác nhau từ điểm mục tiêu sau đó ... khoảng cách trong mỗi chiều bình phương tổng hợp căn bậc hai] chỉ số từ danh sách của hai số
nhân với chế độ; làm cho 0nếu chế độ là 0
D↑pad với 0s để khớp
(?D)⌽ngẫu nhiên số thứ nguyên xoay danh sách (0 đến số thứ nguyên-1)
P+điều chỉnh
S|mô-đun kích thước thế giới mục tiêu hiện tại
P←
C+←1
P≢G←⎕:
P-G
2*⍨
+/
.5*⍨
⎕← in nó
0⊣ trả về 0 (nghĩa là giống hệt với giá trị ban đầu, vì vậy lặp lại)
C... khác, trả về số lần đoán (khác với 0, dừng vòng lặp và trả về giá trị cuối cùng)


@Dennis Trên thực tế, tôi đã phá vỡ nó khi tôi làm cho nó một chức năng, vì vậy bây giờ nó là một chương trình một lần nữa. Tôi đã lưu bao nhiêu byte dưới dạng "chương trình" khiến tôi phải trả giá bằng cách chuyển sang chỉ mục gốc 0, mà OP cho phép.
Adám

1
ĐỒNG Ý. Vì tò mò: Đây là phương ngữ nào? Tôi không biết dòng đầu tiên sẽ giả sử làm gì ...
Dennis

@Dennis Dyalog. Đây là một chức năng truyền thống, dòng đầu tiên là dòng [0], tức là tiêu đề chức năng, nhưng nó có vẻ bất thường bởi vì nó có tên fn-tên phải-phải, nhưng không có kết quả.
Adám
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.