Попробую порассуждать.
Каким образом можно изменить римское число, составленное из спичек, путём перемещения всего одной спички? Способа, мне видится, всего три: добавить спичку (не из коробки, а из другого числа, так что правила соблюдаются), убрать спичку (опять же не в коробку, а в другое число или знак математической операции) и, наконец, переставить спичку внутри числа.
Из римского числа семь (VII) можно получить:
- ничего не меняя (потому что возможно изменение затронет что-то другое) - собственно семь (VII)
- добавлением - только восемь (VII -> VIII)
- удалением - только шесть (VII -> VI)
- перестановкой - только двенадцать (VII -> XII)
Из римского числа шесть (VI) можно получить:
- ничего не меняя (потому что возможно изменение затронет что-то другое) - собственно шесть (VI)
- добавлением - только семь (VI -> VII)
- удалением - только пять (VI -> V)
- перестановкой - только одинадцать (VI -> XI) или четыре (VI -> IV)
Из знака математической операции вычитание (-) можно получить:
- ничего не меняя (потому что возможно изменение затронет что-то другое) - собственно вычитание (-)
- добавлением - только сложение (- -> +)
- удалением - ничего не удастся получить
- перестановкой - только деление (- -> /)
Далее проведём простой brute force.
/* Formatted on 10.11.2010 10:47:56 (QP5 v5.163.1008.3004) by Petrovich */
WITH possible_numbers
AS ( SELECT ROWNUM candidate
FROM DUAL
CONNECT BY ROWNUM <= 12),
seven
AS (SELECT candidate
FROM possible_numbers
WHERE candidate = ANY (6, 7, 8, 12)),
six
AS (SELECT candidate
FROM possible_numbers
WHERE candidate = ANY (4, 5, 6, 7, 11))
SELECT l1.candidate || ' '
|| CASE
WHEN l1.candidate + l2.candidate = r.candidate THEN '+'
WHEN l1.candidate - l2.candidate = r.candidate THEN '-'
WHEN l1.candidate / l2.candidate = r.candidate THEN '/'
END
|| ' '
|| l2.candidate
|| ' = '
|| r.candidate
variant
FROM seven l1
CROSS JOIN six l2
CROSS JOIN seven r
WHERE ( l1.candidate + l2.candidate = r.candidate
OR l1.candidate - l2.candidate = r.candidate
OR l1.candidate / l2.candidate = r.candidate);
Простым перебором получается всего восемьдесят вариантов, но учитывая математический знак и тот факт, что равенство должно остаться равенством, их останется всего шесть.
VARIANT
6 + 6 = 12
7 + 5 = 12
8 + 4 = 12
12 - 4 = 8
12 - 5 = 7
12 - 6 = 6
Смотрим далее. Если после знака равно стоит двенадцать (XII), значит изменение затронуло правую часть равенства. А значит в левой изменений быть не должно и равенства со сложением в левой части (первые три) нам не подходят. Что же осталось? Примечательно то, что в оставшихся равенствах первое число двенадцать (XII). Значит изменение затронуло первый операнд в левой части равенства. А значит в остальных частях равенства изменений быть не должно. Значит второй операнд должен быть равен шести (VI). И у нас остаётся всего один кандидат. Это последнее равенство в списке. Но правая часть равенства-кандитата должна была остаться неизменной. Но этого не произошло. Из этого я делаю вывод, что кандидатов просто нет. Либо условия задачи неполные. А вот если бы можно было ломать спичку во время переноса, как я и пытался предложить, то можно было взять из правой части равенства спичку, оставив там число шесть (VII -> VI), сломать её пополам и сделать из первого операнда левой части двенадцать (VII -> XII), тогда, возможно, это стало бы решением задачи. Или вариант, предложенный ТЕМОЙ, взять из второго операнда левой части равенства спичку, оставив там число пять (VI -> V), сломать её пополам и сделать из первого операнда левой части двенадцать (VII -> XII), тоже мог бы стать решением.