Tạo xác suất xung quanh một Numpad


12

Lấy cảm hứng từ câu hỏi này sớm hơn hôm nay , tôi muốn thấy những cách thú vị mà các ngôn ngữ lập trình khác nhau có thể biến một bàn phím số thành xác suất. Thông thường, các trò chơi dựa trên gạch sẽ cho phép bạn sử dụng một bàn phím số để di chuyển theo bất kỳ hướng nào dựa trên vị trí nhân vật của bạn hiện tại. Khi tạo AI cho các game này,Math.random() * 8 không đủ, vì vậy tôi phải có một chút sáng tạo để làm cho chuyển động trông và cảm thấy hơi tự nhiên.

Một numpad được định nghĩa như vậy:

7 | 8 | 9
- - - - -
4 | x | 6
- - - - -
1 | 2 | 3

Xin lưu ý, 5 là một số không hợp lệ, vì bạn không thể tự mình di chuyển.

Tất cả các ví dụ sẽ sử dụng các xác suất này: [50, 40, 30, 20, 10]

Nếu tôi muốn tạo xác suất xung quanh 8, nó sẽ giống như thế này:

40 | 50 | 40 
-- | -- | --
30 | xx | 30
-- | -- | --
20 | 10 | 20

Đầu ra sẽ là [20, 10, 20, 30, 30, 40, 50, 40](với 5 bỏ qua) hoặc[20, 10, 20, 30, null, 30, 40, 50, 40](với 5 hiện tại)

Nếu tôi muốn tạo ra chúng xung quanh 1, nó sẽ trông như thế này:

30 | 20 | 10
-- | -- | --
40 | xx | 20
-- | -- | --
50 | 40 | 30

Đầu ra sẽ là [50, 40, 30, 40, 20, 30, 20, 10](với 5 bỏ qua) hoặc [50, 40, 30, 40, null, 20, 30, 20, 10](với 5 hiện tại)

Bạn có thể viết một chương trình đầy đủ nhận đầu vào theo bất kỳ cách thông thường nào (dòng lệnh, stdin) và in đầu ra hoặc bạn có thể viết một hàm với một đối số số, in hoặc trả về đầu ra. Chương trình hoặc chức năng của bạn nên chấp nhận một số - vị trí để tạo xung quanh. Bạn nên sử dụng các xác suất sau: [50, 40, 30, 20, 10](chúng không phải được mã hóa cứng).

Mã ngắn nhất trong byte thắng. Sơ hở tiêu chuẩn là không được phép. Câu trả lời được đăng trong chuỗi liên kết không được phép. Trailing hoặc không gian hàng đầu được cho phép. Bạn có thể coi vị trí 4là vắng mặt hoặc trống, tùy thuộc vào sở thích của bạn. Tôi không quá cầu kỳ về định dạng đầu ra - in nó ra dưới dạng các chuỗi được phân tách bằng dấu phẩy hoặc dưới dạng một mảng.

(Đây là câu hỏi đầu tiên của tôi, hãy dễ dàng với tôi!)

Câu trả lời:


5

CJam, 27 byte

12369874s_$\_r#m<f{#4-z)0S}

Hãy thử trực tuyến trong trình thông dịch CJam .

Ý tưởng

Nếu chúng ta đi qua các chữ số khoảng 5 theo chiều ngược chiều kim đồng hồ, chúng ta sẽ có được chuỗi 12369874hoặc bất kỳ phép quay nào của nó (tùy thuộc vào điểm bắt đầu).

Sau khi xoay chuỗi này sao cho chữ số đầu vào n ở vị trí ngoài cùng bên trái, các chữ số trong chuỗi xoay có các xác suất sau:

50 40 30 20 10 20 30 40

Nếu chúng ta xem xét các chỉ số của các chữ số này, đó là

 0  1  2  3  4  5  6  7

trừ 4 từ mỗi để mang lại

-4 -3 -2 -1  0  1  2  3

và lấy giá trị tuyệt đối để có được

 4  3  2  1  0  1  2  3

chúng ta chỉ phải thêm 1 và nối 0 để có xác suất mong muốn.

12369874s                   e# Push "12369874".
         _$                 e# Push a sorted copy, i.e., "12346789".
           \                e# Swap it with the unsorted original.
            _r#             e# Find the index of the input in an unsorted copy.
               m<           e# Rotate the unsorted original that many units left.
                 f{       } e# For each character C in "12346789":
                            e#   Push the rotated string.
                   #        e#   Find the index of C.
                    4-      e#   Subtract 4.
                      z     e#   Compute the absolute value.
                       )    e#   Add 1.
                        0S  e#   Push a 0 and a space.

2

Prolog, 166 byte

a(A,R):-I:J:K:L:M=50:40:30:20:10,B is abs(5-A),member(B:S,[4:[I,J,K,J,L,K,L,M],3:[J,I,J,K,K,L,M,L],2:[K,J,I,L,J,M,L,K],1:[J,K,L,I,M,J,K,L]]),(A/5>1,reverse(S,R);S=R).

Điều này sử dụng thực tế là kết quả cho 9 là kết quả ngược lại của 1, tương tự cho 2 và 8, 3 và 7 và 4 và 6. Có các mẫu có thể nhận ra để đi từ kết quả của 1 đến kết quả của 2,3 và 4 nhưng tôi khá chắc chắn rằng việc viết mã này sẽ lâu hơn so với mã hóa các chuỗi từ 1 đến 4, đó là những gì tôi đã làm.

Ví dụ: a(7,R).đầu ra R = [30, 20, 10, 40, 20, 50, 40, 30].


Một chiến lược hợp lệ, mặc dù tôi hy vọng một số ngôn ngữ giúp thực hiện thuật toán dễ dàng hơn so với việc mã hóa nó. Tôi cho rằng chúng ta sẽ thấy.
Seiyria

@Seiyria Tôi giả sử các ngôn ngữ hướng mảng sẽ làm điều đó. Thật không may, bạn thường không thể hoán vị các phần tử của danh sách trong một số byte ngắn trong Prolog.
Gây tử vong vào

0

Con trăn - 115

a=[50,40,30,20,10,20,30,40]
b=[0,1,2,7,8,3,6,5,4]
def v(n):
 c=8-b[n-1]
 return[(a[c:]+a[:c])[e]for e in b if e-8]

alà một mảng với các giá trị theo thứ tự xung quanh numpad (ngược chiều kim đồng hồ từ 1) và bánh xạ các số trên numpad đến các vị trí xung quanh nó. Dựa trên số lượng khoảng trắng xung quanh numpad cho số đầu vào (được xác định bằng cách sử dụng b), nó tạo ra một mảng có nhiều phần tử được di chuyển từ phía trước ađến cuối, sau đó sử dụng blại để sắp xếp lại các phần tử để tương ứng với số numpad.


Bạn có thể tiết kiệm rất nhiều bằng cách thực hiện /10và sau đó đặt một *10vòng lặp của bạn.
Maltysen

Điều (a[c:]+a[:c])[e]đó không giống nhau a[(c+e)%8]hay a[c+e-8]sao? Và sau đó cắm vào cđơn giản hóa các biểu thức.
xnor

0

Pyth - 38 byte

Sử dụng kỹ thuật tương tự như câu trả lời của Python ngoại trừ nén cơ sở cho hai mảng.

J_jC"3ê"T*RTm@.<jC"<àR"T-8@JtQd.DJ4

Hãy thử nó ở đây trực tuyến .


Các ê và à đang làm gì?
giai đoạn

@phase nén cơ sở đã nói ở trên: codegolf.stackexchange.com/questions/40039/ mẹo
Maltysen 19/07/2015

Những câu trả lời ngắn này sẽ không bao giờ hết làm tôi ngạc nhiên.
Seiyria

@Seiyria Tôi thực sự có thể đề nghị học Pyth - những chương trình này trông phức tạp hơn nhiều so với thực tế :)
orlp

0

Java, 190

void g(int n){int i[]={8,0,1,2,7,8,3,6,5,4};String v="54321234",s="";n=i[n];if(n>0)v=v.substring(8-n)+v.substring(0,8-n);for(n=0;n++<9;s=", ")if(n!=5)System.out.print(s+v.charAt(i[n])+"0");}

String v giữ các xác suất (chia cho 10) theo thứ tự đếm ngược chiều với đầu vào = 1 là 50 mặc định.

int[]idịch đầu vào thành một chỉ mục thành v. Ví dụ, v.charAt(i[1])5. Đầu vào 0 và 5 không hợp lệ nên cả i [0] và i [5] đều có giá trị giữ chỗ là 8, là chỉ số cho '\ 0' ở cuối v.

Tôi xoay các số trong v sang phải theo giá trị i [n], sau đó in xác suất dưới dạng các chuỗi được phân tách bằng dấu phẩy.

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.