首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解开爱因斯坦的谜语

解开爱因斯坦的谜语
EN

Code Golf用户
提问于 2014-05-09 09:47:03
回答 5查看 5.6K关注 0票数 20

爱因斯坦写了一个谜语。他说,世界上98%的人无法解决这一问题。

在去上班的火车上,我用了25分钟就解开了这个谜团。这基本上只是推论。

谜语

一排有五种不同颜色的房子。住在每栋房子里住着一个有着不同nationality.的人--5位主人喝某种饮料,抽某种牌子的雪茄,并保留一定的pet. --没有主人有相同的宠物,抽同样牌子的雪茄,或者喝同样的beverage.问题:鱼是谁的?

为了解开这个谜团,爱因斯坦给出了15个提示:

  1. 英国人住在红房子里。
  2. 瑞典人养狗当宠物。
  3. 丹麦人喝着茶。
  4. 绿屋就在白宫的左面。
  5. 绿屋的主人喝咖啡。
  6. 抽烟的人养鸟。
  7. 这座黄色房子的主人抽烟。
  8. 住在中心房子里的主人喝牛奶。
  9. 挪威人住在第一栋房子里。
  10. 吸烟的主人住在养猫的旁边。
  11. 养马的主人住在抽烟的人旁边。
  12. 抽烟的老板喝啤酒。
  13. 德国人吸烟王子。
  14. 挪威人住在蓝色的房子旁边。
  15. 抽烟的人住在饮水者旁边。

有了这些提示,您就可以找到解决方案。

你的任务:制定一个程序,为你解开这个谜团。硬编码解决方案是不允许的(duh)

允许以任何格式对提示进行硬编码。

示例格式:

代码语言:javascript
复制
//Hints in order
(Nationality:Brit)==(Color:Red)
(Nationality:Swede)==(Pet:Dogs)
(Nationality:Dane)==(Drink: Tea)
(Color:Green)/(Color:White)
(Color:Green)==(Drink:Coffee)
(Smoke:PallMall)==(Pet:Birds)
(Color:Yellow)==(Smoke:Dunhill)
(House:3)==(Drink:Milk)
(Nationality:Norwegian)==(House:1)
(Smoke:Blend)/\(Pet:Cats)

==的意思是等于 /在左边的意思of \在右边的意思of /\的意思是左或右

就像我说的,它允许硬编码提示或将它们作为输入。

输出:输出应该采用以下格式(带有正确的值,只对巨魔说出来;)

代码语言:javascript
复制
 _____________    _____________    _____________    _____________    _____________
|   Number    |  |   Number    |  |   Number    |  |   Number    |  |   Number    |
| Nationality |  | Nationality |  | Nationality |  | Nationality |  | Nationality |
|    Color    |  |    Color    |  |    Color    |  |    Color    |  |    Color    |
|    Drink    |  |    Drink    |  |    Drink    |  |    Drink    |  |    Drink    |
|    Smoke    |  |    Smoke    |  |    Smoke    |  |    Smoke    |  |    Smoke    |
|     Pet     |  |     Pet     |  |     Pet     |  |     Pet     |  |     Pet     |
---------------  ---------------  ---------------  ---------------  ---------------

The <Nationality> in the <Color> house owns the fish!

Ascii艺术盒可以被你改变,只要它们是盒子,不管你用什么符号。

任何关于这个谜语和解决方案的知识都不能在程序中使用。它应该用纯粹的逻辑和演绎来解决谜语。

标记这是一个合作伙伴,但可能是一个代码挑战,不确定。任何关于赢得代码挑战的标准的想法都可以分享:)

现在,这是代码-高尔夫,所以程序与最低的字节码获胜。

祝好运和快乐编码:)

EN

回答 5

Code Golf用户

回答已采纳

发布于 2014-05-09 21:34:49

Prolog - 954字符

代码语言:javascript
复制
m(A,Z):-member(A,Z).
e:-e(Z),w(Z).
e(Z):-Z=[[1,A,F,K,P,U],[2,B,G,L,Q,V],[3,C,H,M,R,W],[4,D,I,N,S,X],[5,E,J,O,T,Y]],m([_,b,r,_,_,_],Z),m([_,s,_,d,_,_],Z),m([_,d,_,_,t,_],Z),m([WH,_,w,_,_,_],Z),m([GH,_,g,_,_,_],Z),GH=:=WH-1,m([_,_,g,_,c,_],Z),m([_,_,_,b,_,p],Z),m([_,_,y,_,_,d],Z),m([3,_,_,_,m,_],Z),m([1,n,_,_,_,_],Z),m([BH,_,_,_,_,b],Z),m([CH,_,_,c,_,_],Z),(BH=:=CH+1;BH=:=CH-1),m([DH,_,_,_,_,d],Z),m([HH,_,_,h,_,_],Z),(HH=:=DH+1;HH=:=DH-1),m([_,_,_,_,b,l],Z),m([_,g,_,_,_,r],Z),m([NH,n,_,_,_,_],Z),m([YH,_,b,_,_,_],Z),(NH=:=YH+1;NH=:=YH-1),m([SH,_,_,_,_,b],Z),m([XH,_,_,_,w,_],Z),(SH=:=XH+1;SH=:=XH-1),p([n,d,b,g,s],[A,B,C,D,E]),p([y,b,r,g,w],[F,G,H,I,J]),p([c,h,b,f,d],[K,L,M,N,O]),p([w,t,m,c,b],[P,Q,R,S,T]),p([d,b,p,r,l],[U,V,W,X,Y]).
t(X,[X|R],R).
t(X,[F|R],[F|S]):-t(X,R,S).
p([W|X],Y):-p(X,V),t(W,Y,V).
p([],[]).
b:-write('+--+--+--+--+--+--+'),nl.
z(A):-writef('|%2L|%2L|%2L|%2L|%2L|%2L|',A),nl.
w([A,B,C,D,E]):-b,z(A),z(B),z(C),z(D),z(E),b.

输出

代码语言:javascript
复制
+--+--+--+--+--+--+
|1 |n |y |c |w |d |
|2 |d |b |h |t |b |
|3 |b |r |b |m |p |
|4 |g |g |f |c |r |
|5 |s |w |d |b |l |
+--+--+--+--+--+--+

密钥:

  • 第一栏是房号;
  • 第二栏为国籍;
  • 第三栏是最喜欢的颜色;
  • 第四栏是宠物;
  • 第五栏为饮品;及
  • 第六栏是香烟(r =王子,L=青紫)。
票数 24
EN

Code Golf用户

发布于 2014-05-10 02:42:19

Ruby322+ input 442

暴力搜索近250亿个可能的答案。

我的电脑大约需要75天才能运行这个程序。

我从来没有验证这个程序是否打印正确的答案!

ruby riddle.rb < riddle.in的形式运行

riddle.rb (332个字节)

代码语言:javascript
复制
g=readlines
v=g.shift(5).map &:split
c,*d=v.map{|a|[*a.permutation]}
c.product(*d){|a|(f=eval a.map{|b|b.each_with_index.map{|s,i|"#{s}=#{i}\n"}.join}.join+'g.map{|h|eval h}.all?&&fish')&&(r=['-----------']*5
puts [r,[*0..4],*a,r].map{|s|s.map{|t|'|%11s|'%t}.join},"The #{a[0][f]} in the #{a[1][f]} house owns the fish!")}

riddle.in (442字节)

代码语言:javascript
复制
brit dane german norwegian swede
blue green red white yellow
beer coffee milk tea water
blends bluemasters dunhill pall_mall prince
birds cats dogs fish horse
brit==red
swede==dogs
dane==tea
green==white-1
green==coffee
pall_mall==birds
yellow==dunhill
2==milk
norwegian==0
blends==cats-1||blends==cats+1
horse==dunhill-1||horse==dunhill+1
bluemasters==beer
german==prince
norwegian==blue-1||norwegian==blue+1
blends==water-1||blends==water+1

输入文件必须包含5行名称,然后是逻辑表达式行。房子号码是0到4,一定有fish

这个程序给Array#permutation打了五次电话,以找出各种方式来订购国籍、颜色、饮料、香烟和宠物。长循环是c.product(*d){|a|...},调用Array#product来迭代将近250亿个可能的答案。循环体具有(f=eval ...)&&(...)形式。eval ...部分计算逻辑表达式。如果所有都是真的,那么f是鱼的房屋号,&&(...)部分打印出答案。House number 0在Ruby中是正确的。

代码高尔夫意味着不增加代码的速度!但是我没有75天来运行这个程序!

票数 5
EN

Code Golf用户

发布于 2016-06-11 20:56:03

Prolog,653字符

代码语言:javascript
复制
a([],L,L).
a([H|T],L2,[H|L3]):-a(T,L2,L3).
m(X,L):-a(_,[X|_],L).
r(X,Y,L):-a(_,[X,Y|_],L).
n(X,Y,L):-r(X,Y,L);r(Y,X,L).
s:-s(S),w(S).
s(S):-length(S,5),m([b,r,_,_,_],S),m([s,_,_,_,d],S),m([d,_,t,_,_],S),r([_,g,_,_,_],[_,w,_,_,_],S),m([_,g,c,_,_],S),m([_,_,_,p,b],S),m([_,y,_,d,_],S),S=[_,_,[_,_,m,_,_],_,_],S=[[n,_,_,_,_],_,_,_,_],n([_,_,_,b,_],[_,_,_,_,c],S),n([_,_,_,d,_],[_,_,_,_,h],S),m([_,_,b,l,_],S),m([g,_,_,r,_],S),n([n,_,_,_,_],[_,b,_,_,_],S),n([_,_,_,b,_],[_,_,w,_,_],S),m([_,_,_,_,f],S).
b:-write('----------------+'),nl.
z(Y,A):-write(Y),writef('|%2L|%2L|%2L|%2L|%2L|',A),nl.
w([S1,S2,S3,S4,S5]):-b,z(1,S1),z(2,S2),z(3,S3),z(4,S4),z(5,S5),b.
票数 4
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/26852

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档