在数字键盘附近生成概率


12

受到今天早些时候提出的这个问题的启发,我希望看到各种编程语言将小键盘变成概率的有趣方式。通常,基于图块的游戏将允许您使用数字键盘根据角色当前所在的位置向任何方向移动。当为这些游戏制作AI时,Math.random() * 8还远远不够,所以我必须要有一点创造力,使机芯的外观和感觉更加自然。

小键盘的定义如下:

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

请注意,5是无效数字,因为您无法继续前进。

所有示例将使用以下概率: [50, 40, 30, 20, 10]

如果我想在周围生成概率8,则看起来像这样:

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

输出将是[20, 10, 20, 30, 30, 40, 50, 40](省略5个)或[20, 10, 20, 30, null, 30, 40, 50, 40](显示5个)

如果我想在周围生成它们1,它将如下所示:

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

输出将是[50, 40, 30, 40, 20, 30, 20, 10](省略5个)或[50, 40, 30, 40, null, 20, 30, 20, 10](显示5个)

您可以编写一个完整的程序,该程序以任何常用方式(命令行,stdin)获取输入并打印输出,或者您可以编写一个带有数字参数的函数来打印或返回输出。您的程序或函数应接受一个数字-产生的位置。您应该使用以下概率:([50, 40, 30, 20, 10]它们不必进行硬编码)。

以字节为单位的最短代码获胜。不允许出现标准漏洞。不允许在链接主题中发布答案。允许尾随空格或前导空格。您可以4根据自己的喜好将职位视为缺席或空缺。我对输出格式不太挑剔-将其打印为逗号分隔的字符串或数组。

(这是我的第一个问题,请放心!)

Answers:


5

CJam,27个字节

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

CJam解释器中在线尝试。

理念

如果我们以逆时针方向遍历5左右的数字,我们将获得字符串12369874或字符串的任意旋转(取决于起始点)。

旋转此字符串以使输入数字n位于最左侧后,旋转后的字符串中的数字具有以下概率:

50 40 30 20 10 20 30 40

如果我们考虑这些数字的索引,它们是

 0  1  2  3  4  5  6  7

从每个中减去4得到

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

并取绝对值得到

 4  3  2  1  0  1  2  3

我们只需要加1并加上0即可获得所需的概率。

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个字节

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).

这利用了以下事实:9的结果与1的结果相反,与2和8、3和7以及4和6相同。从1的结果到2,3的结果都有可识别的模式和4,但我敢肯定,编码的时间要比硬编码1至4的序列的时间长,这就是我所做的。

示例:a(7,R).输出R = [30, 20, 10, 40, 20, 50, 40, 30]


这是一个有效的策略,尽管我希望某些语言可以比硬编码更容易进行算法。我想我们会看到的。
Seiyria

@Seiyria我假设面向数组的语言会做到这一点。不幸的是,您通常无法在Prolog中置换短字节列表中的元素。
致命

0

蟒蛇-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]

a是一个数组,其值在小键盘周围(从1开始逆时针旋转),并将b小键盘上的数字映射到其周围的位置。根据输入数字的小键盘周围的空格数(使用确定b),它创建一个数组,其中有许多元素从前a到后移动,然后b再次使用重新排列元素以与小键盘数字相对应。


/10将a *10放入循环中可以节省很多。
马蒂森(Maltysen)

是不是(a[c:]+a[:c])[e]同样是a[(c+e)%8]还是a[c+e-8]?然后插入即可c简化表达式。
xnor


0

爪哇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 以逆时针方向保存概率(除以10),其中input = 1为默认值50。

int[]i将输入转换为v的索引。例如,v.charAt(i[1])is 5。输入0和5无效,因此i [0]和i [5]的占位符值为8,这是v末尾'\ 0'的索引。

我将v中的数字向右旋转i [n]的值,然后将概率打印为逗号分隔的字符串。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.