Ваша задача в этой задаче - проанализировать данное «уравнение спички», как это ...
... и выяснить, можно ли превратить его в правильное уравнение путем перестановки совпадений. Если это так, вы должны вывести наименьшее количество ходов и полученное уравнение.
вход
Входные данные представляют собой строку, которую можно прочитать из STDIN, принять в качестве аргумента функции или даже сохранить в файле. Это уравнение, которое представляет расположение спичек и может быть описано с использованием следующего EBNF:
input = term, "=", term ;
term = number | (term, ("+" | "-"), term) ;
number = "0" | (numeralExceptZero , {numeral}) ;
numeralExceptZero = "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ;
numeral = "0" | numeralExceptZero ;
Примером правильного ввода будет 3+6-201=0+0+8
.
задача
Рассмотрим следующую иллюстрацию, где каждой спичке присвоен номер:
Теперь мы сопоставим каждый входной символ с соответствующими позициями спички следующим образом:
0 ↦ 1,2,3,4,5,6
1 ↦ 4,5
2 ↦ 2,3,5,6,8
3 ↦ 3,4,5,6,8
4 ↦ 1,4,5,8
5 ↦ 1,3,4,6,8
6 ↦ 1,2,3,4,6,8
7 ↦ 4,5,6
8 ↦ 1,2,3,4,5,6,8
9 ↦ 1,3,4,5,6,8
- ↦ 8
+ ↦ 8,10
= ↦ 7,9
Каждую формулу ввода можно превратить в спичечное устройство. Например, уравнение «45 + 6 = 92» становится
где неиспользованные спички закрашены серым. Ваша задача - найти наименьшее количество спичек, которые нужно переставить, чтобы уравнение было верным.
Выход
Мы различаем три возможных случая:
- Если ввод недействителен (т.е. он не удовлетворяет вышеуказанному EBNF), выведите все, что вы хотите.
- В противном случае, если есть способы превратить уравнение в правильное путем перестановки спичек, вы должны вывести как минимальное количество перестановок, так и соответствующее уравнение. Как и входные данные, выведенное уравнение также должно удовлетворять заданному EBNF. В приведенном выше примере правильный вывод будет
1
и46+6=52
. Если для получающегося уравнения есть несколько возможностей, выведите любую из них. - В противном случае (поэтому, если входные данные верны, но нет способа сделать уравнение истинным), вы должны вывести
-1
.
Детали
- Вам не разрешено удалять или добавлять совпадения. Это означает, что если вход построен из
n
спичек, выход также должен состоять из точноn
спичек. - «Пустые» блоки спичек допускаются только в конце и в начале уравнения, а не в середине. Так, например, переход
7-1=6
в7 =6-1
простое удаление-1
с левой стороны и добавление его с правой стороны всего с 3 перестановками спичек не допускается. Поскольку я действительно не рассматриваю сопоставление чисел с позициями спичек как интересную часть этой задачи, для плюс 20 байтов вы можете либо
- получить доступ к файлу, в котором отображается
(number/operation ↦ matchstick positions)
хранится любым разумным способом, или - если ваш язык программирования поддерживает
Map
тип данных, предположим, что у вас есть доступ к карте, которая предварительно(number/operation ↦ matchstick positions)
инициализируется с помощью -mapping. Например, эта карта может выглядеть так:{(0,{1,2,3,4,5,6}),(1,{4,5}),(2,{2,3,5,6,8}),(3,{3,4,5,6,8}), ..., (-,{8}),(+,{8,10}),(=,{7,9})}
- получить доступ к файлу, в котором отображается
Примеры
Вход: 1+1=3
↦ Выход: 1
и1+1=2
Вход: 15+6=21
↦ Выход: 0
и15+6=21
Вход: 1=7
↦ Выход: -1
Вход: 950-250=750
↦ Выход: 2
и990-240=750
Вход: 1-2=9
↦ Выход: 1
и1+2=3
Вход: 20 + 3=04
↦ Выход: все
победитель
Это код-гольф , поэтому выигрывает самый короткий правильный ответ (в байтах). Победитель будет выбран через неделю после публикации первого правильного ответа.
0: 1, 2, 3, 4, 5, 6
для согласованности=
(2 спички) и-
(1 спичка) и оставить все числа там, где они есть. Однако, если 2 нужно было сдвинуть влево, вам также нужно будет подсчитать необходимые ходы.1+1+2=3-6+10
? И тот же вопрос о выходе.Ответы:
Javascript, 1069 байт
Я проверил его с помощью нескольких тестовых уравнений, и теперь, похоже, он работает все время ...
Ну, это мой первый раз, когда я представляю ответ, поэтому я не вижу себя победителем. Это в основном метод грубой силы, чтобы выяснить все ответы, а затем он берет и возвращает самые маленькие из них в массиве. с первым аргументом, являющимся длиной, и вторым, являющимся массивом с выходными данными.
если вход «1-2 = 9», выход будет [1, [«1 + 2 = 3», «7-2 = 5»]]
и вот несжатый код:
Предупреждение: не делайте уравнений, таких как 950-250 = 750, он использует ~ 45 Matchsticks и потому что этот код использует грубую силу, это приведет к зависанию javascript.
источник
var k
в циклах, как неиспользуемые параметры для функции, сохраняя 3 байта для каждого объявления.08=8
для80=8
неверно.Perl, 334
Довольно быстро, пока решение достижимо за 1 или 2 хода. Когда нет решения, вы ждете долгого ожидания, даже в малейшем случае
1=7
.Пример:
Это не приведет к поиску решений, которые изменят длину равенства, как
11=4
->2 11=11
, но я не уверен, что это будет разрешено.источник