用6个或更少的招式解决主脑


24

您的目标是编写一个程序,以6步或更少的动作解决所有Mastermind难题。

背景

策划大师是一个棋盘游戏。游戏的目的是准确猜测另一位玩家隐藏的4个彩色钉子的组合(颜色和顺序)。做出猜测时,另一位玩家以0到4之间的白色和/或红色钉子回应。红色的钉子是颜色和位置正确的地方。白色的钉子在其余部分中代表颜色,但位置不正确。如果猜测中有重复的颜色,则秘密中每种对应的颜色只会奖励一个钉子。(所以-如果机密中包含1个蓝色,并且猜测中有2个蓝色,其中一个在正确的位置,则将给出一个红色的钉子)。有6种不同的颜色,并且可以使用重复的颜色。

因此,例如,一个游戏可能会如下所示:(假设解决方案是Red Green Green Blue)

1:  Blue Purple Black Green - 2 white pegs
2:  Green Red Black Blue    - 2 white pegs, 1 red peg
3:  Green Green Green Blue  - 3 red pegs
4:  Red Green Green Blue    - 4 red pegs

规则在Wikipedia上得到扩展

要求

  • 该程序必须从stdin读取并写入stdout
  • 为了简单起见,我将使用数字代替颜色。猜测的组合将是1到6之间的4个数字
  • 他们必须将猜测结果输出为从1到6的4个空格分隔的数字,并以换行符结尾。例如:

    1 5 2 2 \ n

  • 程序猜测后,将在0到4之间的2个整数之间用空格分隔并以换行符结尾,然后将其作为输入。第一个是白色的钉子数量,第二个是红色的钉子数量。

  • 输入“ 0 4”(4个红色挂钩)时,程序必须终止
  • 该程序必须能够在不到6步的时间内解决任何难题(您的程序先输出,然后输入响应1圈)。由于能够用更少的钱解决问题,因此没有任何好处(由于证明的复杂性)。
  • 该解决方案必须完全是内部的,并包含在源代码中。仅允许使用标准库。因此,该解决方案可能不依赖于任何其他文件(例如词典)或Internet。

输入/输出示例

> is your programs output
< is the responding input
Solution is 1 5 6 6

> 1 2 3 4
< 0 1
> 4 1 6 6
< 1 2
> 1 6 5 6
< 2 2
> 1 5 6 6
< 0 4 

计分

  • 这是纯粹而简单的Code Golf以字节为单位的最短解决方案获胜。

这是我的第一个Code Golf问题。如果我做错了事,我深表歉意,但我已尽力确保绝对没有歧义,并尽可能避免制定规则。如果我一直模棱两可或不清楚,请随时提出问题。


1
在您的示例中,输入/输出不应该1 2 3 4返回0 1
加菲2012年

1
并且在示例文本中,“绿色绿色绿色蓝色”是否也不应给出白色的钉子(对于第一个绿色)?编辑-维基百科阐明,正如您所写的,不应给任何白色。但是我认为应该在问题中明确说明白色/黑色规则。
ugoren 2012年

允许工作多慢?
停止转动逆时针

@Gaffi -绝对正确-固定
lochok

1
这里没有说明白色钉子的规则。假设您选择了1234,而我猜为5611。我的两个1都在错误的地方显示了正确的颜色,因此从您所说的规则开始,我会说我得到2个白色。但不是-维基百科说是1白色。错误的方法也更容易编程(但是Steven Rumbalski正确实现了Wikipedia的规则)。
ugoren

Answers:


8

Python 2 Python 3,359 365 338个字符

from itertools import*
from collections import*
m=h=set(product(*['123456']*4))
def f(g,k):b=sum(x==y for x,y in zip(g,k));return'%s %s'%(sum(min(g.count(c),k.count(c))for c in set(g))-b,b)
while len(m)>1:g=min(h,key=lambda g:max(Counter(f(g,k)for k in m).values()));print(*g);s=input();m=set(x for x in m if s==f(g,x))
print(*(m.pop()))

有趣的是,我花了很多时间才意识到我有五个字符的变量名。

我不喜欢长进口。感觉我应该能够实现替换,collections.Counter这样可以节省导入。

最后我也不喜欢print(*(m.pop()))。感觉它应该消失在while循环中,但是我找不到不延长它的方法。


TypeError: join() takes exactly one argument (2 given)return j(sum(min(g.count(c),k.count(c))for c in set(g))-b,b)。同样,sum()返回一个int,而j(str.join)应该是可迭代的
Blazer

我的循环结构摆脱了final print,我认为它略短一些。它还可以更好地匹配请求的行为(在“ 4 0”处停止,而不是在您知道答案时)。和len(m)>1== m[1:]。导入确实很烦人- from a,b import *很好。
ugoren

只要感觉正确,该程序似乎就会退出。一次我运行它,并以5个猜测停止,这是不正确的。下次它以4个猜测停止并且是正确的,但是我什至4 0还没有输入,这是客观标准,有时它会例外地退出:print(*(m.pop())) KeyError: 'pop from an empty set'
Blazer 2012年

@西装外套。导致此输出的测试用例是什么?
Steven Rumbalski 2012年

@西装外套: 4 0是四个白色的钉子。我认为您的得分已经颠倒了。
Steven Rumbalski 2012年

7

哈斯克尔,317 304

q[0,4]_=error""
q[n,m]l=(\s->all(==4-m)[g s,n+g(u(foldr((u((.drop 1).(++)).).break.(==)))$unzip s)]).c(u(/=)).zip l
u=uncurry;m=map;g=length;c=filter
f a=[head.c(($(zipWith q(take n a)$f a)).all.flip($)).sequence$replicate 4[1..6]|n<-[0..]]
main=interact$unlines.m(unwords.m show).f.m(m read.words).lines

我喜欢编写纯功能的交互式程序!但是,当然,这种样式有一定的局限性:它现在由于错误而终止,但是您没有指定这是不正确的。我需要将整个内容重构为IOmonad才能获得无错误的退出。


它能保证正确地猜测6个动作吗?
ugoren 2012年

嗯 我以为是这样(适用于OP的示例和其他解决方案),但是详尽的测试表明有时需要进行7个猜测。我将不得不为此工作!
停止转动逆时针

5

Python中,385 357个字符,在5个移动解决

我改变得越多,它的增长就越像Steven Rumbalski的一样。主要区别在于他使用的是字符串而不是整数。
实现了Knuth的算法(希望现在正确)。
借用了史蒂文·鲁姆巴尔斯基(Steven Rumbalski)的得分功能。
产生第一个猜测需要很长时间,以后会变得更好。如果要对其进行
硬编码(g=len(A)==1296 and [1,1,2,2] or ...),将使工作变得更轻松。
我不算4个换行符和制表符对,可以用分号代替。

from collections import*
from itertools import*
a=B=A=list(product(*[range(1,7)]*4))
r=lambda g,k:(sum(x==y for x,y in zip(g,k)),sum(min(g.count(c),k.count(c))for c in set(g)))
while a!=4:
    g=A[1:]and min(B,key=lambda x:max(Counter(r(x,i)for i in A).values()))or A[0]
    print"%d "*4%tuple(g)
    b,a=map(int,raw_input().split())
    A=[x for x in A if r(g,x)==(a,a+b)]

"%d "*4%tuple(g)
gnibbler 2012年

from collections import*
gnibbler 2012年

a,b=map(int,raw_input())
gnibbler 2012年

product(*[range(1,7)]*4)
gnibbler 2012年

Counter(r(x,i)for i in A).values()
gnibbler 2012年
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.