Sua tarefa neste desafio é analisar uma determinada "Equação de palito de fósforo" como esta ...
... e descobrir se ela pode ser transformada em uma equação válida, reorganizando as correspondências. Nesse caso, você deve emitir o menor número de movimentos para fazê-lo e a equação resultante.
Entrada
A entrada é uma String que pode ser lida em STDIN, usada como argumento de função ou mesmo armazenada em um arquivo. É uma equação que representa um arranjo de palito de fósforo e pode ser descrita usando o seguinte 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 ;
Um exemplo para uma entrada válida seria 3+6-201=0+0+8
.
Tarefa
Considere a ilustração a seguir, onde cada palito de fósforo tem um número atribuído:
Agora, mapeamos cada símbolo de entrada para as posições correspondentes do palito de fósforo da seguinte maneira:
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
Cada fórmula de entrada pode ser transformada em um arranjo de palito de fósforo. Por exemplo, a equação "45 + 6 = 92" se torna
onde palitos de fósforo não utilizados estão acinzentados. Sua tarefa é descobrir o menor número de palitos de fósforo que precisam ser reorganizados para tornar a equação válida.
Resultado
Distinguimos entre três casos possíveis:
- Se a entrada não for válida (ou seja, não atender ao EBNF acima), faça o que você quiser.
- Caso contrário, se há maneiras de transformar a equação para um válido, reorganizando os palitos de fósforo, você tem que saída tanto o número mínimo de rearranjos e da equação correspondente. Assim como a entrada, a equação emitida também deve satisfazer o EBNF fornecido. No exemplo acima, a saída correta seria
1
e46+6=52
. Se houver várias possibilidades para a equação resultante, produza uma delas. - Caso contrário (se a entrada for válida, mas não houver maneira de tornar a equação verdadeira), é necessário gerar a saída
-1
.
Detalhes
- Você não tem permissão para remover ou adicionar correspondências. Isso significa que, se a entrada for construída com
n
palitos de fósforo, a saída também deverá consistir em exatamenten
palitos de fósforo. - Blocos de fósforo "vazios" são permitidos apenas no final e no início de uma equação, não no meio. Por exemplo, transformar
7-1=6
- se em7 =6-1
simplesmente remover-1
do lado esquerdo e adicioná-lo no lado direito com apenas 3 rearranjos de palitos de fósforo não é permitido. Como eu realmente não vejo o mapeamento de números para posições de palitos de fósforo como uma parte interessante desse desafio, para mais de 20 bytes , você pode
- acessar um arquivo no qual o mapeamento
(number/operation ↦ matchstick positions)
é armazenado de forma razoável ou - se sua linguagem de programação suportar um
Map
tipo de dados, suponha que você tenha acesso a um mapa pré-inicializado com o(number/operation ↦ matchstick positions)
mapeamento. Este mapa pode, por exemplo, ter a seguinte aparência:{(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})}
- acessar um arquivo no qual o mapeamento
Exemplos
Entrada: 1+1=3
↦ Saída: 1
e1+1=2
Entrada: 15+6=21
↦ Saída: 0
e15+6=21
Entrada: 1=7
↦ Saída: -1
Entrada: 950-250=750
↦ Saída: 2
e990-240=750
Entrada: 1-2=9
↦ Saída: 1
e1+2=3
Entrada: 20 + 3=04
↦ saída: nada
Vencedora
Isso é código-golfe , então a resposta correta mais curta (em bytes) vence. O vencedor será escolhido uma semana após a publicação da primeira resposta correta.
0: 1, 2, 3, 4, 5, 6
a consistência=
(2 palitos de fósforo) e-
(1 palito de fósforo) e deixar todos os números onde estão. Se, no entanto, os dois tivessem que ser movidos para a esquerda, você também precisaria contar os movimentos necessários.1+1+2=3-6+10
? E mesma pergunta sobre a saída.Respostas:
Javascript, 1069 bytes
Eu testei com algumas equações de teste e parece funcionar o tempo todo agora ...
Bem, esta é a minha primeira vez em enviar uma resposta, então não me vejo ganhando. Este é basicamente um método de força bruta para descobrir todas as respostas e, em seguida, ele pega e retorna as menores em uma matriz. com o primeiro argumento sendo o comprimento e o segundo sendo uma matriz com as saídas.
se a entrada for "1-2 = 9", a saída será [1, ["1 + 2 = 3", "7-2 = 5"]]
e aqui está o código descompactado:
Aviso: Não faça equações como 950-250 = 750, ele usa ~ 45 palitos de fósforo e, como esse código usa força bruta, fará com que o javascript seja interrompido.
fonte
var k
nos loops, como parâmetros não utilizados para a função, economizando 3 bytes para cada declaração.08=8
para80=8
está incorreto.Perl, 334
Bastante rápido, desde que a solução seja alcançável em 1 ou 2 movimentos. Quando não há solução, você aguarda uma longa espera, mesmo no menor caso de
1=7
.Exemplo:
Isso não encontrará soluções que alterem o comprimento da equasão como
11=4
->2 11=11
, mas não tenho certeza se isso seria permitido.fonte