Re[7]: Золотые слитки Гериона
От: Буравчик Россия  
Дата: 07.02.16 23:21
Оценка:
Здравствуйте, Кодт, Вы писали:

К>А покажи свою программу, что ли.


Да мне не жалко. Но как всегда запутано все, сделано наспех. Добавил комментариев.

Это программа для проверки решения, а не для поиска решения.

У нас даны взвешивания. Для опровержения решения пытаемся найти контрпример — такие веса слитков, которые проходят эти взвешивания и при этом слиток 1кг будет иметь другой вес. Проверяются все перестановки весов слитков (11! вариантов). Выводится "ок" или контрпример — как надо поменять веса.

import qualified Data.Map as Map
import Data.List


-- список взвешиваний
actions = 
    [ [1, 2, 3, 4]
    , [1, 2, 3, 5]
    , [1, 2, 6]
    , [1, 3, 6]
    , [1, 4, 6]
    ]
    
-- запускаем
main = find_kontrprimer actions of
    Nothing     -> putStrLn "ok"
    Just mapper -> putStrLn $ "bad solve\n" ++ show mapper



-- максимальный вес, который выдерживает мешок
bag_max_weight = 11

-- слитки
boxes = [1..11]

-- проверка, что мешок не порвется
bag_unhurt acts = all (<= bag_max_weight) $ map sum acts

-- перестановка слитков во взвешиваниях
convert_boxes acts mapper = map (map (mapper Map.!)) acts

-- список перестановок весов слитков, список словарей (старый вес => новый вес)
mappers = [ Map.fromList $ zip boxes new_boxes | new_boxes <- permutation boxes]

-- проверка, что данная перестановка является контрпримером для взвешиваний
-- т.е. при всех взвешиваниях мешок не порвался и это стало возможным когда слиток 1 имеет вес отличный от 1кг
is_kontrprimer mapper acts = (mapper Map.! 1 /= 1) && (bag_unhurt $ convert_boxes acts mapper)

-- поиск контрпримера
find_kontrprimer acts = find is_kontrprimer mappers


UPDATE: сделал небольшой рефакторинг, чтоб понятней было
Best regards, Буравчик
Отредактировано 08.02.2016 8:36 Буравчик . Предыдущая версия . Еще …
Отредактировано 07.02.2016 23:59 Буравчик . Предыдущая версия .
Отредактировано 07.02.2016 23:24 Буравчик . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.