Ваша цель - написать программу, которая решит любую загадку Mastermind за 6 или менее ходов.
Задний план
Mastermind - настольная игра. Цель игры состоит в том, чтобы точно угадать комбинацию (цвета и порядок) из 4 цветных колышков, скрытых другим игроком. Когда делается предположение, другой игрок отвечает от 0 до 4 белыми и / или красными колышками. Красный колышек - это место, где цвет и местоположение правильные. Белый колышек - это то место, где цвет представлен на оставшихся кусочках, но находится в неверном месте. Если в предположении присутствуют повторяющиеся цвета, в секрете будет присваиваться только один колышек за соответствующий цвет. (Так что - если в секрете содержалось 1 синее, а в предположении было 2 синих с одним в правильном месте, был бы дан один красный колышек). Есть 6 разных цветов, и дубликаты могут быть использованы.
Так, например, игра может выглядеть следующим образом: (при условии, что решение - красный зеленый зеленый синий)
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
Правила расширены в Википедии
Требования
- Программа должна читать из стандартного ввода и писать в стандартный вывод
- Я буду использовать цифры для простоты вместо цветов. Комбинация для угадывания будет 4 числами от 1 до 6
Они должны вывести свои предположения в виде серии из 4 чисел, разделенных пробелами, от 1 до 6, заканчивающихся символом новой строки. Например:
1 5 2 2 \ n
После этого программа получит в качестве входных данных после угадывания 2 целых числа от 0 до 4, разделенных пробелом и заканчивающихся символом новой строки. Первым будет количество белых колышков, вторым - количество красных колышков.
- При вводе «0 4» (4 красных колышка) программа должна завершиться
- Программа должна быть способна решить любую головоломку менее чем за 6 ходов (ваша программа выдает выходной сигнал, за которым следует ответный ввод - 1 ход). Нет бонуса (из-за сложности доказательства) за то, что вы можете решить его за меньшее.
- Решение должно быть полностью внутренним и включено в источник. Только стандартные библиотеки разрешены. Поэтому решение не может полагаться на какие-либо другие файлы (например, словари) или Интернет.
Пример ввода / вывода
> 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. Приношу свои извинения, если я сделал что-то не так, но я постарался как можно лучше убедиться, что нет абсолютно никакой двусмысленности, и предотвратить как можно больше правил, связанных с адвокатской деятельностью. Если я был неоднозначен или неясен, пожалуйста, не стесняйтесь задавать вопросы.
1 2 3 4
возвращаться0 1
?Ответы:
Python 2Python 3,359 365338 символовЗабавно, мне потребовалось много правок, чтобы понять, что у меня есть имя переменной из пяти символов.
Я не люблю долгий импорт. Такое ощущение, что я должен быть в состоянии осуществить замену
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) должен принимать итерациюprint
, и я думаю, что она немного короче. Это также лучше соответствует запрашиваемому поведению (остановка на «4 0», а не когда вы знаете ответ). Иlen(m)>1
==m[1:]
. Импорт действительно раздражает -from a,b import *
было бы неплохо.4 0
, что находится в объективных критериях, а в других случаях он будет выходить с исключением:print(*(m.pop())) KeyError: 'pop from an empty set'
4 0
это четыре белых колышка. Я думаю, что вы изменили счет.Хаскелл,
317304Я люблю писать чисто функциональные интерактивные программы! Но, конечно, у этого стиля есть определенные ограничения: теперь он заканчивается с ошибкой, но вы не указали, что это не нормально. Мне нужно было бы рефакторировать все это в
IO
монаду, чтобы получить выход без ошибок.источник
Питон,
385357 символов, решает в 5 ходовЧем больше я его изменяю, тем больше и больше он становится похож на Стивена Румбальски ... Главное отличие в том, что он работает со строками, а не с целыми числами.
Реализован алгоритм Кнута (надеюсь, теперь правильно).
Заимствовал функцию подсчета очков у Стивена Румбальски.
Требуется много времени, чтобы сгенерировать первое предположение, а потом поправиться.
Жесткое программирование it (
g=len(A)==1296 and [1,1,2,2] or ...
) облегчает жизнь, если вы хотите проверить это.Я не считаю 4 строки новой строки + табуляция, которые можно заменить точкой с запятой.
источник
"%d "*4%tuple(g)
from collections import*
a,b=map(int,raw_input())
product(*[range(1,7)]*4)
Counter(r(x,i)for i in A).values()