随机骰子小费


14

在标准骰子(骰子)中,数字的排列方式是使相对的面数增加到七个。用您喜欢的语言编写最短的程序,该程序输出一个随机抛出,然后输出9个随机小费。翻斗是骰子的四分之一转,例如,如果骰子面向5,则所有可能的翻斗都是1,3,4和6。

所需输出示例:

1532131356

Answers:


5

GolfScript,26个字符

0{(.6,5@--\-.,rand=).}10*;

Joey的压缩版本略多一些,基本上可以解决零索引问题。


9

Ruby,44岁

c=0;10.times{$><<c=([*1..6]-[c,7-c]).sample}

我通过幸运的实验找到了[* 1..6]技巧。


1
这里有一些不错的技巧,很棒的东西。由于缺少Array#sample方法而使自己陷入困境。
Lars Haugseth 2011年

4

JavaScript(71个字符)

您可能需要printalert或替换其他内容,具体取决于您的JavaScript环境。

for(C=L=T=0;C++<10;print(L=T))while(!(T-L&&T+L-7))T=Math.random()*6+1|0

合并通过在找到一个值时有条件地递增外部值来循环:for(b = n = 10; n; ab && a + b-7 && print(b = a,n-))a = Math.random()* 6 + 1 | 0
imma 2014年


3

重击

#/!bin/bash
f=`expr $RANDOM % 6` 
f=`expr $f + 1`
printf "$f"
for ((i=0; i<9; i++))
do
   ((bad=7-$f))
   next=`expr $RANDOM % 6`
   next=`expr $next + 1`
   while [ $next -eq $bad ] || [ $next -eq $f ]
   do
      next=`expr $RANDOM % 6`
      next=`expr $next + 1`
   done
printf "$next"
f=$next
done

示例代码:http : //ideone.com/CCfro


的用法((var=expression))非常好-我认为最短的方法是var=$((expression))但是为什么您只使用一次,而在反引号中的expr上浪费大量的字符呢?
彼得·泰勒

我不做很多shell脚本编写,但是由于某些原因((var = expr))在某些地方失败了(是奇怪的:P)自从启动此脚本以来,我就以某种方式完成了。:)
Aman ZeeK Verma 2011年


2

重击仅一环:100 99 98 96

for((i = 10,f = RANDOM%6 + 1; i--;))做
printf $ f
(((n = RANDOM%4 + 1,m = f <4?f:7-f,f = n <m || ++ n <7-m?n:n + 1))
做完了

http://ideone.com/XrZO7

关键思想是要在[1,x]中选择一个不等于y的随机数,您可以在[1,x-1]中选择一个随机数,然后在> = y时递增。对于这个问题,我们想要[1,6]中的随机数不等于f或7-f。我们必须按照min(f,7-f),max(f,7-f)的顺序执行两个测试。

假设最初为空的环境可以通过不初始化i并将循环条件更改为2来节省2个字符 i++<10


2

重击:97 94 92 90 89 87

从Aman ZeeK Verma的答案中获得大量高尔夫机会:

为((i = 10,f = 0; i--;))做
for((n = f; n == f || n + f == 7; f = RANDOM%6 + 1))做:
做完了
printf $ f
做完了

http://ideone.com/QiuTx

注意,可以通过将第一行更改为5个字符来缩小它,for((;i++<10;))但这使假设并不总是正确的。在ideone中它可以正常工作,但是从shell运行它的人可以拥有if导出到非零值。


我想制作一个没有内循环的版本,但我担心它会更长。
彼得·泰勒

这真是太棒了,我猜我对bash实在是太生了:)
Aman ZeeK Verma 2011年

@Aman,大多数不是特定于bash的。这只是几十个改进,每个测试之后都有测试,而当我破坏某些东西时会还原。唯一真正使人烦恼的地方是noop,我必须查找它。man bash但是,如果您有时间阅读,我建议您阅读。我曾经读过本书的封面,只是对可能和值得查找的内容有一个模糊的想法对我很有帮助。
彼得·泰勒

2

Windows PowerShell,45

-join(0..9|%{($d=1..6-ne(7-$d)-ne$d|random)})

实际上,这很简单。我生成了可能掷骰子的列表,1..6然后仅选择不等于7减去最后掷骰子的骰子,然后仅选择不等于最后掷骰子的骰子。然后,从其余列表中选择一个随机项目并将其分配给$d。由于$d最初是0在第一次掷出普通骰子时进行处理的。

测试脚本:

for($i=0;$i-lt20;$i++){
    $o=@(./tipping.ps1)
    if ($i-gt0-and$o-eq$o2) { throw "Must have random output" }
    if ($o.count-ne1) { throw "Must only have one line of output" }
    if ($o[0]-match'[^1-6]'){ throw "Invalid characters" }
    if($o[0].length-ne10){ throw "Wrong length: $($o[0].length)" }
    $r=[char[]]($o[0])|%{$_-48}
    for ($x=1;$x-lt$r.count;$x++){
        if ($r[$x-1]+$r[$x]-eq7) { throw "Not a tipping: $($r[$x-1]) and $($r[$x])" }
    }
    $o2=$o
}

历史:

  • 2011-02-18 11:57(61)第一次尝试。
  • 2011-02-18 11:58(45)我不需要分别生成第一个数字。

我知道了The term 'random' is not recognized as a cmdlet, function, operable program, or script file. Verify the term and try again.
彼得·泰勒

@Peter:请使用PowerShell v2。该Get-Randomcmdlet在v1中不存在。
乔伊,

2

Ĵ

这应该可以工作,但是不幸的是,J的随机生成器在第三次迭代后卡住了:

a=:>:i.6
f=:a#~1-(+&(a=])7&-)
((,(?4)&{@f@(_1&{))^:9)>:?6

6 4 5 4 5 4 5 4 5 4


我绝对不是J专家,但是从我对这个线程的J答案的撰写看来,(?4)如果您不注意它,它似乎会滚动一次,并在以后的迭代中被视为常量,这对我来说似乎很困难。我使用类似(?@4:)的结构来解决它。
JB


2

J,30个字符

>:(?@4:{(i.6)-.],5&-)^:(<10)?6

6 2 3 5 4 2 4 1 3 6

说明(从右到左阅读):

  • ?6 返回0到5之间的随机数
  • ^:(<10)将函数应用9次,一路累加结果。该函数是:
  • ?@4:{(i.6)-.],5&-
    • ] , 5&- 返回输入数字及其补数为5的数组(我们当前正在处理从0开始的数字,所以相反的面孔之和为5)
    • (i. 6) -. 从完整的整数0到5中删除它们。从输入位置进行一次小费操作后,我们将获得所有有效位置。
    • ?@4: { 随机选择其中之一。
  • >: 增加整个序列,使数字回到1到6的间隔。

想到了“>:”,然后结束。
Eelvex

1
@Eelvex我不知道为什么当所有关于它们的明智推理都使用0到5时,现实世界的骰子为什么是1到6::D
JB

2

GS2,16个字节

16 2f 25 08 41 20 17 30 16 2f 31 31 25 09 19 32

运作方式如下

16 2f 25     # make range from 1 to 6 and push random element
08           # start block
    41       # duplicate top of stack twice
    20 17 30 # negate top of stack and add 7
    16 2f    # push range from 1 to 6
    31 31    # do set-wise difference with each of the two previous numbers
    25       # push a random element from the list
09           # end block
19 32        # repeat block 9 times

我认为gs2比这个挑战要新。
lirtosiast,2015年

1

QBasic(71个字符)

这两个换行是必需的,并且每个字符都包含在字符计数中。

RANDOMIZE:FOR I=0TO 9
1N=INT(RND*6)+1:IF L=N OR L+N=7THEN 1
?N:L=N:NEXT

1

TI-BASIC,38 34

For(I,1,9
Ans→X
Repeat Ans≠X and Ans≠7-X
randInt(1,6
End
Disp Ans
End

无聊的解决方案,但比以前的版本短。我利用了一个事实,即在新的计算器上将其Ans初始化为零。


我不知道是否可能,但我会给能找到更短解决方案的任何人50代表。
lirtosiast 2015年

您如何计算34?
递归

这里的每个令牌都是内存中的一个字节;以这种方式对TI-BASIC进行评分是标准。如果您有计算器,请输入程序,查看内存管理屏幕,然后减去9并减去程序名称的长度,以获取代码大小。
lirtosiast 2015年

1

Java 8,130字节

v->{int d=(int)(Math.random()*6+1),i=10,p;String r=""+d;for(;i-->0;r+=d)for(p=d;p==d|p+d==7;d=(int)(Math.random()*6+1));return r;}

在这里尝试。

作为具有冗长主方法的完整程序,这将是178个字节

interface M{static void main(String[]a){int d=(int)(Math.random()*6+1),i=10,p;String r=""+d;for(;i-->0;r+=d)for(p=d;p==d|p+d==7;d=(int)(Math.random()*6+1));System.out.print(r);}}

在这里尝试。

@AmanZeeKVerma的Bash半端口答案

说明:

 v->{              // Method with empty unused parameter and String return-type
   int d=(int)(Math.random()*6+1),
                   //  Random dice-roll 1-6
       i=10,       //  Counter-integer, starting at 10
       p;          //  Temp integer to store new side
   String r=""+d;  //  Result-String, starting at the first dice-roll
   for(;i-->0;     //  Loop (1) 10 times:
       r+=d)       //    After every iteration, append the result with a random side
     for(p=d;      //   Set the new side to the current side
         p==d      //   Loop (2) as long as the new side and current side are the same
         |p+d==7;  //   or as long as both combined are exactly 7:
       d=(int)(Math.random()*6+1)
                   //    Set the new side to a random side 1-6
     );            //   End of loop (2)
                   //  End of loop (1) (implicit / single-line body)
  return r;        //  Return the result-String
}                  // End of method


0

> <>,71字节

我很高兴能够展示> <>的x代码指针随机化,因为我不记得在这里看到过它。

a&0 v
 /2v
1x3v 
>x< <<
6x4v
 \5v ~
:{:/ ^?=}
:{:/ ^?=7+}
:~$<^&;!?:-1&n

您可以在此在线解释器上尝试(粘贴代码,提交,开始)。


解决问题后,您将获得我的支持。
lirtosiast 2015年

@ThomasKwa完成,我也许可以将它打一点,但至少现在可以使用了。
亚伦2015年

0

R,67个字节

c(3,5,1,4,2,6)[(sample(1:6,1)+cumsum(sample((-2:2)[-3],9,T)))%%6+1]

在线尝试!

一个高尔夫球手的R答案,但我认为这与迄今为止提交的答案不同。

c(3,5,1,4,2,6)                                                     #A dice and its facets
               (sample(1:6,1)                                      #Initial dice roll
                             +cumsum(sample((-2:2)[-3],9,T)))      #9 tippings in c(-2,-1,1,2)
                                                             %%6+1 #converts to values in [0,6]
              [                                                   ]#

0

05AB1E,23 个字节

6LΩUTFX?6LʒDXÊsX+7Ê*}ΩU

绝对可以打高尔夫球,但我目前没有看到。

在线尝试。

说明:

6LΩ              # Pick a random value from the range [1,6]
                 #  i.e. [1,2,3,4,5,6] → 3
   U             # Save this random value in variable `X`
TF               # Loop 10 times:
  X?             #  Print `X` without newline to STDOUT
  6Lʒ     }      #  Create a range [1,6] again, and filter it by:
     DXÊ         #   Check if the current value is not equal to `X`
                 #    i.e. 1 and 3 → 1 (truthy)
                 #    i.e. 3 and 3 → 0 (falsey)
     sX+         #   Sum the current value with `X`
                 #    i.e. 1 and 3 → 4
                 #    i.e. 3 and 3 → 6
        7Ê       #   And check if it's not equal to 7
                 #    i.e. 4 and 7 → 1 (truthy)
                 #    i.e. 6 and 7 → 1 (truthy)
     *           #   If both checks are truthy, keep it in the filtered list
                 #    i.e. 1 and 1 → 1 (truthy)
                 #    i.e. 0 and 1 → 0 (falsey)
           Ω     #  Pick a random value from the filtered list
                 #   i.e. [1,2,5,6] → 1
            U    #  And save it in variable `X` for the next iteration of the loop
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.