生成随机的Boggle棋盘


16

生成一个4x12的字母/空格网格:

每个骰子应该出现一次,位置随机选择。位置应近似为骰子的均匀随机排列。显示每个模具的随机(再次,近似均匀)的面。在3个字符的窗口中左对齐脸部。例如,

A  E  A  A
E  C  D  E
D  A  Qu E
E  A  H  D

是我想要的格式的非随机板。允许尾随空格。

骰子:

A  A  E  E  G  N
E  L  R  T  T  Y
A  O  O  T  T  W
A  B  B  J  O  O
E  H  R  T  V  W
C  I  M  O  T  U
D  I  S  T  T  Y
E  I  O  S  S  T
D  E  L  R  V  Y
A  C  H  O  P  S
H  I  M  N  Qu U
E  E  I  N  S  U
E  E  G  H  N  W
A  F  F  K  P  S
H  L  N  N  R  Z
D  E  I  L  R  X

有趣的事实:集合中只有1K。还有哪些其他信件专门导致死亡?

这是因此字节数最短的程序将获胜!


3
如果有K,就不可能有F。这意味着你不能拼写...卡车!:P
Blazer

@Blazer:是的,你也不能拼写f ... olk。:P
Ry- 2012年

Answers:


5

GolfScript,116个字节

由于计分单位是字节,因此我认为这意味着我们可以使用解决方案中的所有字节。超出可打印的ASCII设置允许的解决方案比Peter Taylor的解决方案短一些,但代价是使代码难以在此处显示。没有不可打印的数据,我的代码如下所示:

'57 BYTES OF BINARY DATA HERE'256base 26base 6/{;9.?rand}${6rand=65+.81='  u '2/=}%8/n*

这与Peter Taylor的解决方案非常相似.81=' u '2/=,尽管我认为即使为了获得更好的随机性而花了额外的char字节,我还是设法略微缩短了他的洗牌时间,但我承认无耻地借用了它。

脚本开头的二进制字符串包含不可打印的字符,因此不能直接粘贴在此处。相反,我将脚本作为十六进制转储提供:

0000000: 2701 8302 7c56 97d5 ec9c 52e3 462e 44d7  '...|V....R.F.D.
0000010: a8d2 81c9 6115 fc80 4da4 6cd3 b06f a6d8  ....a...M.l..o..
0000020: 4e7e 2029 12a9 f331 0b83 3481 de36 81e2  N~ )...1..4..6..
0000030: 41b4 534d dee8 13f7 ccfd 2732 3536 6261  A.SM......'256ba
0000040: 7365 2032 3662 6173 6520 362f 7b3b 392e  se 26base 6/{;9.
0000050: 3f72 616e 647d 247b 3672 616e 643d 3635  ?rand}${6rand=65
0000060: 2b2e 3831 3d27 2020 7520 2732 2f3d 7d25  +.81='  u '2/=}%
0000070: 382f 6e2a                                8/n*

在Linux或xxd安装了该实用程序的任何系统上,可以通过将该十六进制转储传递给,将其转换为可正常工作的116字节的GolfScript程序xxd -r

编辑:替换999rand9.?rand很多更好的随机性。现在,改组应该与基础RNG所允许的接近完美。


啊-我忘记了您可以按映射排序。
彼得·泰勒

4

Python 2.7,253 229 215个字符

from random import*
j=0
for x in map(choice,sample("AAEEGN ELRTTY AOOTTW ABBJOO EHRTVW CIMOTU DISTTY EIOSST DELRVY ACHOPS HIMNQU EEINSU EEGHNW AFFKPS HLNNRZ DEILRX".split(),16)):j+=1;print x+' u'[x=='Q']+'\n'[j%4:],

大多数角色只是骰子本身。我不想花太多时间试图减少太多

次要编辑:删除了2个不必要的字节(多余的空格)

编辑2:降至229

edit3:降至215


1
您可以通过建立索引来使代码更严格,print a+' u'[a=='Q']以及print'\n'[j%4:]
Keith Randall 2012年

@keith谢谢!我通过结合这两个技巧使它变得更加严密:)
Blazer'2

1
我设法将其降低到218而不杀死它(我想呢?):1)将import语句更改为from random import*并删除所有r.。2)将字符串中的分隔符更改为`(空格),并利用str.split的默认参数。3)摆脱任何与之相关的j用途'\n'[len(d)%4:]。4)使用list.pop的默认参数。5)... 6)利润!
Dillon Cower

@DC啊,谢谢!我很惊讶却忽略了它们。但我想这就是我在几分钟内写出的内容:P
Blazer

1
我用一个小地图招3个字符更加减少了,但我必须保持j=0...+'\n'[j%4:]它的工作
开拓者

3

GolfScript(141 139 137 个字符字节)

其中94扩展到包含骰子的字符串。Figure不包含插入不必要的换行符以使其换行,因此无需滚动即可查看代码:

'Y
ISY
XIAOOW
VYAAEEGNABBJOOEHRTVWCIMOTUEIOSSTACHOPSHIMNQUEEINSUEEGHNWAFFKPSHLNNRZ'n/'TTELRD'*
6/{[6rand=99rand\]}%${1=.81='  u '2/=}%8/n*

如果我的(正确的)分析是正确的,则没有其他字符串足够长且足够频繁以通过简单替换来压缩数据,而不管骰子的顺序和骰子内如何。
彼得·泰勒

通过插入骰子并使用游程长度编码,我能够将表格从96个字符减少到84个字符。解码可能会弥补差异...对于python来说确实如此。
standby 2012年

您可以以30位编码6个字母,然后以5个可打印字符编码,节省16个字节。但是您需要一些移位/遮罩才能提取它们。
ugoren

@ ugoren,Ilmari已经做到了。
彼得·泰勒

@PeterTaylor,如果您说他做到了,我相信您(我从不费心去学习Golfscript)。但是他似乎正在使用57个不可打印的字符,而我建议使用80个可打印的字符。
ugoren

2

Ruby,201 197个字符

%W(AAEEGN ELRTTY AOOTTW ABBJOO EHRTVW CIMOTU DISTTY EIOSST DELRVY ACHOPS HIMNQU EEINSU EEGHNW AFFKPS HLNNRZ DEILRX).sample(16).map{|c|c[rand 6]}.each_slice(4){|x|puts x.join("  ").gsub(/Q ?/,"Qu")}

(单线)

编辑1:使用%W()避免.split和一对引号。

编辑2:达到规格(每个输出列之间有两个空格)


我刚刚批准了“匿名用户”对此答案的修改;我以为是Mark,而您只是忘记了登录。(对。您的输出似乎不完全符合规范;使用x.join(" ").gsub(/Q ?/,"Qu")它将解决此问题,但需要增加三个字符。)
Ilmari Karonen

(这是join字符串中的一个额外空格,而正则表达式中则是一个额外的空格和问号,以防SE软件破坏了这些空格...)
Ilmari Karonen 2012年

@IlmariKaronen谢谢,我没有注意到列之间的两个空格。现在应该规范。
马克·托马斯

2

Powershell,234个字符

$d=(0..15|%{@{'AAEEGNELRTTYAOOTTWABBJOOEHRTVWCIMOTUDISTTYEIOSSTDELRVYACHOPSHIMNQUEEINSUEEGHNWAFFKPSHLNNRZDEILRX'[6*$_+(random)%6]=random}.GetEnumerator()}|sort Value|%{$_.Key})
0..3|%{($d[($_*4)..($_*4+3)])-join"   "-replace'Q ','Qu'}

这是带有额外空格的相同代码,旨在提高可读性:-)

#########################################
# roll the 16 dice and shuffle them     #
#########################################

$d=(
        0..15 | % {
                    @{
                       'AAEEGNELRTTYAOOTTWABBJOOEHRTVWCIMOTUDISTTYEIOSSTDELRVYACHOPSHIMNQUEEINSUEEGHNWAFFKPSHLNNRZDEILRX'[6*$_+(random)%6]=random
                     }.GetEnumerator() 
                  } | sort Value | % {
                                        $_.Key
                                     }
    )

############################################
# add the 16 results to the 4 by 4 grid    #
############################################

0..3 | % {
            ($d[($_*4)..($_*4+3)]) -join "   " -replace 'Q ','Qu'
         }

我不知道shufflePowershell 的内置功能,因此我将每个结果转换为一个键值对-等于骰子结果的键和等于随机数的值。然后,只是按值对这些对进行排序然后输出键的情况。


也许您可以使用以毫秒为单位的当前时间中的最后一位数字作为排序值?
西装外套

@Blazer-可能,但是“随机”只需要六个字符:-)
Andrew Shepherd

0

Perl,179个字符

@d=(Qu,map"$_ ",HIMNUAAEEGNELRTTYAOOTTWABBJOOEHRTVWCIMOTUDISTTYEIOSSTDELRVYACHOPSEEINSUEEGHNWAFFKPSHLNNRZDEILRX
=~/./g);print+(splice@d,6*int rand@d/6,6)[rand 6],@d%24?$":$/while@d

这是该程序的详细版本:

my $fullset = "HIMNUAAEEGNELRTTYAOOTTWABBJOOEHRTVWCIMOTUDISTTY"
           . "EIOSSTDELRVYACHOPSEEINSUEEGHNWAFFKPSHLNNRZDEILRX";
my @dice = ("Qu");
push @dice, "$_ " for split //, $fullset;
while (@dice) {
    my @die = splice @dice, 6 * (int rand @dice / 6), 6;
    print $die[rand 6];
    print @dice % 24 ? " " : "\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.