从侧视图确定骰子值


52

编写程序或函数,将骰子的左和右值作为整数(1-6),并在顶部返回值。

骰子布局:

    +---+
    | 1 |
+---+---+---+---+
| 2 | 3 | 5 | 4 |
+---+---+---+---+
    | 6 |
    +---+

  ,^.
<´ 5 `>  <-- Top value
|`._,´|
.6 | 4,  <-- Side values
 `.|,´

因此输入6 4将返回5

顺序很重要:

2 3 -> 1
3 2 -> 6

程序不必使用无效的输入值。

为了阻止明显的方法(将表与所有组合一起使用),不允许使用任何内置的文本编码或解压缩程序,基本编码或任何其他类似的减小大小的方法。请注意,只要未使用某些现成的库函数完成操作,仍允许使用table并允许滚动自己的解压缩。

仅供参考,以下是所有组合(即所有可能的输入和输出)的表格:

23, 35, 42, 54 -> 1
14, 31, 46, 63 -> 2
12, 26, 51, 65 -> 3
15, 21, 56, 62 -> 4
13, 36, 41, 64 -> 5
24, 32, 45, 53 -> 6

最短的代码胜出,并且存在标准漏洞。


所以我可以使用所有组合的表格-1 ^^?
dwana 2015年

是的,您可以使用表格。但是您不能使用内置的压缩​​例程来使其更小。
user694733

Answers:


59

Python,30岁

lambda a,b:a^b^7*(2<a*a*b%7<5)

没有查找,只是有点扑朔迷离。

相对的面是成对的,它们是彼此的三位补码,表示它们异或为7。

1,6
2,5
3,4

给定一组中的两个面孔,我们希望从另一组中获得一个面孔。对于(1,2,3),我们可以使用XOR(^)来实现。因此,^最多给出三位补码的正确答案,即x^7。我们可以有条件地补充x^7*_

为了确定是否采用补码(XOR与7),我们检查三元组是否违反了右手定则。这就是说,其a,b循环顺序为

1,6
2,5
3,4

将每一行视为三个类别之一。由于每行中的元素均为负数mod 7,因此我们可以通过执行“哈希”操作x*x%7

1,6 -> 1
2,5 -> 4
3,4 -> 2

每行是从循环前一乘以4模7得到的,因此我们可以检查此关系是否成立,(b,a)以决定是否补:a*a%7==b*b*4%7

这等效于检查模7是否a**2 * b**(-2)等于4。由于b**6等于1模6,因此等效于a**2 * b**4。由于另一个可能的值为2(通过检查大小写),我们可以通过与3进行比较来检查它是否为4。


CJam - 26 -ri:Ari:B^7A7A-e<B7B-e<)=*^
优化

min(a,7-a)通过这样做a^7*(a>3),我可以省去一个字符,但是我觉得应该有一个更短的方法。有任何想法吗?
xnor

哦,有a/4*7^a……
xnor

11
我从未意识到骰子面位具有此属性。好东西!
user694733

1
@ user694733非常幸运地得出6比2的幂小2。
xnor

64

给定两个边ab,第三边有一个很好的多项式表达式7模。

3一种3b-一种b37

或分解

3一种b一种2-b27

模7映射到{0,1,2,3,4,5,6}中的余数。

我解释了为什么它在Math SE答案中起作用,尽管我确实认为可能缺少更清晰的论点。唯一有效的其他两项多项式为

3一种5b5-一种3b7

最初是通过将位扑灭转换为算术运算而发现的,然后对这种形式的多项式进行了蛮力搜索以找到更好的多项式。

请随意将其端口添加到您喜欢的语言中;这是一篇CW帖子。

J,9 by Synthetica

7|3***+*-

看我的帖子

Dyalog APL,由NGN发行9次(打字错误由Adám修正)

7|3×××+×-

从上面J的公然偷来的答案。

TI-Basic,14岁,由Timtech提供

7fPart((A³B-AB³)/21

Pyth,16岁,作者:FryAmTheEggman

M%*3-*H^G3*^H3G7

定义g两个值的函数。

Golfscript,18岁,彼得·泰勒(旧多项式)

~1$*.5?3*@.*@*- 7%

CJam,18岁,马丁 ·布特纳(MartinBüttner)(来自Peter的GolfScript)(旧多项式)

l~1$*_5#3*@_*@*m7%

Mathematica,20岁,马丁·布特纳(MartinBüttner)

Mod[+##(#-#2)3##,7]&

是的,这是一元加号,不,没有更短的方法不使用一元加号。

dc,21,作者:Toby Speight

sb7+d3^lb*rlb3^*-3*7%

我必须添加7以a确保差异始终为正(dc具有带符号的%运算符)。

朱莉娅,24 23,马丁·布特纳(MartinBüttner)

f(a,b)=3a*b*(a^2-b^2)%7

的CoffeeScript,28 26由rink.attendant.6

x=(a,b)->3*a*b*(a*a-b*b)%7

JavaScript(ES6),rink.attendant.6的28 26

x=(a,b)=>3*a*b*(a*a-b*b)%7

本质上与CoffeeScript相同。

Python 28,由xnor提供

lambda a,b:3*a*b*(a*a-b*b)%7

Bash,31岁

没什么特别的:

echo $[3*($1**3*$2-$1*$2**3)%7]

或者:

echo $[3*$1*$2*($1*$1-$2*$2)%7]

另一种(更长,但也许很有趣)的方法

Nim,36岁,Sillesta

proc(x,y:int):int=3*x*y*(x*x-y*y)%%7

Java 7中,46 44由rink.attendant.6

int f(int a,int b){return(a*a-b*b)*a*b*3%7;}

Java的8,25 23凯文Cruijssen

a->b->(a*a-b*b)*a*b*3%7

PHP,49 47 by rink.attendant.6

function x($a,$b){echo($a*$a-$b*$b)*3*$a*$b%7;}

批处理,无限制52个

set/aa=(3*(%1*%1*%1*%2-%1*%2*%2*%2)%%7+7)%%7
echo %a%

CMD本机不支持真正的模数(因此不能处理负数)-因此%%7+7)%%7

LESS(作为参数混合),rink.attendant.6为62 60

.x(@a,@b){@r:mod(3*@a*@b*(@a*@a-@b*@b),7);content:~"'@{r}'"}

请参阅下面的我的帖子

05AB1E,10 8由Emigna(-2字节,由Kevin Cruijssen)

nÆs`3P7%

在线尝试。

Haskell,31 27 25(按通用显示名称)

a#b=3*a*b*(a*a-b*b)`mod`7

在线尝试!

Excel,27 by Wernisch

=MOD(3*(A1^3*B1-A1*B1^3),7)

Excel VBA,25岁,泰勒·斯科特(Taylor Scott)

?3*[A1^3*B1-A1*B1^3]Mod 7

第四(gforth)41由reffu

: f 2>r 2r@ * 2r@ + 2r> - 3 * * * 7 mod ;

在线尝试!

C#,23,凯文·克鲁伊森(Kevin Cruijssen)

a=>b=>(a*a-b*b)*a*b*3%7

1
FWIW,(ab)**5 % 7 == (ab)**-1 % 7 == a^b^7所有的ab1..6这样a != ba+b != 7
彼得·泰勒

@PeterTaylor事实上,我发现,表达通过使用**5作为代理用于反转模7
XNOR

2
我一直在为这个惊人的多项式的“为什么”而失去睡眠。也许math.SE人士可以提供帮助。 math.stackexchange.com/questions/1101870/...
数字创伤

1
我写了一个关于math.SE的推导:math.stackexchange.com/a/1101984/24654
xnor

1
您可以将APL序列重写为7|3×××+×-,发音为:7乘以3的乘积乘以总和乘以差(两个数字之间)。
ngn

9

CJam,43个 28字节

不知道基于全表的方法是否会更短,但是这里有:

l_~^56213641532453s@S-#)g7*^

输入像

2 3

输出:

1

这是我以前的算法(从2个面中确定正确的面)和xnor的xor方法的混合。

在这里在线尝试


您能解释一下这是如何工作的吗?和ep1024有相同的想法吗?
user694733

@ user694733一点也不。添加说明。
Optimizer

是的,我看到了时间。我只是想知道它是否相似,因为他对此有解释,而且我也不知道CJam是如何工作的。
user694733

@Optimizer我也想开始使用CJam,您可以为我提供指导的任何一般性指导吗?我看到了一些示例,但几乎没有任何解释:(
Teun Pronk 2015年

上面的链接提供了一些示例,以及指向主要网站的链接,其中包含对语言关键字的解释。除此之外,请在此处使用cjam关键字搜索以从现有答案中学习。
Optimizer

5

更少,62字节

这篇文章中使用算法:

.x(@a,@b){@r:mod(3*@a*@b*(@a*@a+6*@b*@b),7);content:~"'@{r}'"}

如果使用整数值,它可能会更短,但是要使其显示,我需要使用CSS content属性,该属性需要变量插值

但是,使用CSS预处理器语言进行代码高尔夫的情况并不常见!

要与某些HTML结合使用,您可以这样做:

p::after { .x(1, 3); }
<p>Number on top: </p>

4

Pyth,30个字节

K"23542 31463 12651 "h/x+K_Kz6

需要两位数字作为输入,并且两者之间没有空格(例如23not 2 3)。

说明:

位于其中的任何两位数字序列23542表示1顶部的两侧。同样,31463对于2等。反转此字符串将给出4通过的序列6

这段代码只是在字符串中进行查找"23542 31463 12651 15621 36413 24532",将索引除以6,然后递增以确定顶端必须是什么。

在此在线测试。

感谢@FryAmTheEggman提供有关打高尔夫球的技巧。


一些与青霉病有关的高尔夫:J"23542 31463 12651 "h/x+J_Jscz)6如果其中一些令人困惑,请给我发声。身高KJ分配值,h是一元的+1s字符串列表是jk。(此外,如果允许的话,23最好使用像这样的字符串作为输入将是最好的)
FryAmTheEggman 2015年

3

采用与es1024类似的方法,但具有不同的查找字符串:

JavaScript(ES6),73 72 61字节

t=(l,r)=>-~('354233146312651215623641332453'.search([l]+r)/5)

JavaScript(ES5),88 87 77字节

function t(l,r){return -~('354233146312651215623641332453'.indexOf([l]+r)/5)}

CoffeeScript,71 62字节

只是为了好玩,由于允许省略括号,因此在CoffeeScript中,ES6的代码短了1个字节。

由于使用了-~技巧,结果证明与ES6的字符数相同。

t=(l,r)->-~('354233146312651215623641332453'.indexOf([l]+r)/5)

1
保存1个字节:''+l+r=>[l]+r
edc65

@ edc65谢谢!哦,添加不同类型时JavaScript的行为方式
rink.attendant.6 2015年

1
是的,运算符+很奇怪。但是操作员呢?1+Math.floor=> -~。另外,搜索而不是indexOf。
edc65

有趣。我知道,search但这仅适用于ES6。
rink.attendant.15年

实际上,String.prototype.search自ECMAScript 3rd Edition以来,它一直是JavaScript的一部分,因此您可以更改答案。developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
kamoroso94

3

J(9)

使用从算法这个职位。

7|3***+*-

函数的树形图(可能会清除一些内容):

    f=:7|3***+*-
    f
7 | 3 * * * + * -
   5 !: 4 < 'f'
  ┌─ 7            
  ├─ |            
──┤   ┌─ 3        
  │   ├─ *        
  └───┤   ┌─ *    
      │   ├─ *    
      └───┤   ┌─ +
          └───┼─ *
              └─ -

示范:

   3 f 5
1
   4 f 6
2
   2 f 6
3
   2 f 1
4
   1 f 2
3
   4 f 5
6

0

PHP,81字节

与我的JavaScript解决方案相同:

function t($l,$r){echo(int)(1+strpos('354233146312651215623641332453',$l.$r)/5);}

0

罗阿118

由于我找不到错误,也没有时间寻找它,因此不得不还原最新版本。

z=io.read;o={"","","34","5 2","2165","46 13",""," 31064","  5612","   2 5","    43"}a=z();b=z();print(o[a+b]:sub(a,a))

虽然仍在努力。


在这里进行了测试,它似乎又回来42 3
user694733

确实..很奇怪。看着它。
Teun Pronk

@ user694733修复了问题:)
Teun Pronk

0

JavaScript(ES6),79个字节

不是最短的,但我尝试了与当前答案不同的方法。

f=(a,b)=>[a,b,7-a,7-b].reduce((p,v,i,r)=>p?p:'2312132'.indexOf([v]+r[i+1])+1,0)

0

Lua,89个字节

xnor的Python解决方案的直接移植。

x=require('bit32').bxor
function(a,b)c=a*a*b%7;return x(a,x(b,2<c and c<5 and 7 or 0))end

0

Bash,85岁

这不能与@xnor的魔术多项式在高尔夫方面竞争。但是我认为这是计算答案的另一种有趣的方式:

g(){
((d[$1$2]))||{
d[$1$2]=$3
g $2 $1 $[7-$3]
g $2 $3 $1
}
}
g 1 2 3
echo ${d[$1$2]}

具体来说,我们了解以下有关骰子的知识:

  • 如果左面为1,右面为2,则顶面为3
  • 围绕相反的顶点旋转120°可提供更多三倍的面值。例如,一旦获得{l = 2,r = 3,t = 1},我们旋转{l = 1,r = 2,t = 3},然后再次旋转,得到{l = 3,r = 1,t = 2}
  • 对面的总和总是7

递归地结合以上内容(以{1,2,3}硬编码为起点),我们可以为所有可能的值生成{l,r}-> t的完整映射。该答案定义了一个递归函数g(),该函数填充整个数组,使得d [lr] = t。最初使用{1,2,3}调用递归函数,然后递归遍历整个多维数据集,直到不再有未设置的数组元素为止。该函数以两种方式递归自身:

  • 交换l和r并从7(相反的面)中减去t
  • 将{l,r,t}旋转到{r,t,l}

然后,它对所需值进行简单的数组查找。


0

Dyalog APL,9个字节

的ɐɔıʇǝɥʇuʎs公然字符替换Ĵ解决方案

7|3×××+×-

编辑:我后来注意到,这个确切的解决方案是由ngn在1月17日提出的。

  the division remainder when divided by seven of
  |        three times
  |        | the product of the arguments
  |        |   times   \┌───┐
  |        |     \  ┌───┤ × 
┌────┐   ┌────┐   ┌─┴─┐ └───┘ ┌───┐
 7| ├───┤ 3× ├───┤ ×    ┌───┤ +  - the sum of the arguments
└────┘   └────┘   └─┬─┘ ┌─┴─┐ └───┘      
                    └───┤ ×  ---- times
                        └─┬─┘ ┌───┐
                          └───┤ -  - the difference between the arguments
                              └───┘

在线尝试APL


0

朱莉娅,26个字节

f(a,b)=a$b$7*(2<a^2*b%7<5)

要么

f(a,b)=(3*a^5*b^5-a^3*b)%7

要么

f(a,b)=3*a*b*(a+b)*(a-b)%7


0

C#(Visual C#交互式编译器),49字节

x=>1+("3542331463126512156236413"+x).IndexOf(x)/5

在线尝试!

-1个字节感谢@GB!

输入是一个2字符串,其中包含可见的左数字和右数字。

以下是我独立提出的解决方案。利用rink.attendant.6的JavaScript答案中的查找字符串,我能够削减 5个字节(但现在我们的答案非常相似;)

C#(Visual C#交互式编译器),55字节

x=>1+"42354 31463 51265 21562 41364 24532".IndexOf(x)/6

在线尝试!


1
使用(“ 3542331463126512156236413” + x)代替完整字符串获取49个字节
GB
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.