Dada uma sequência de caracteres em +=-
que há pelo menos um =
, insira números inteiros positivos entre todos os símbolos e no início e no final, de modo que as equações matemáticas sejam atendidas.
Por exemplo, dada a entrada
+-=-=
você precisa inserir números inteiros positivos A a F como este
A+B-C=D-E=F
de tal modo que as equações são satisfeitas, isto é, A + B - C
e D - E
e F
são todos o mesmo número.
Existem muitas maneiras possíveis de fazer isso, pois, desde que as equações funcionem, qualquer conjunto de números inteiros positivos pode ser usado. Cada linha aqui é uma saída válida possível para entrada +-=-=
:
2+3-4=6-5=1
1+1-1=2-1=1
4+2-4=4-2=2
100+1-10=182-91=91
89+231-77=1024-781=243
Observe que o valor das expressões não precisa ser um número inteiro positivo como os números inseridos. Por exemplo, dada a entrada, -=-
as saídas 1-10=8-17
(avaliações para -9) e 10-1=17-8
(avaliações para 9) são igualmente válidas. Obviamente, para algumas entradas, como =
é impossível ter uma expressão negativa, uma vez que apenas números positivos como 5=5
podem ser inseridos.
Observe também que zero não é um número inteiro positivo.
O código mais curto em bytes vence.
Você pode exibir os números como uma lista em vez de inseri-los diretamente na string. Se você imprimir a sequência, poderá haver espaços separando símbolos e números. Então, para entrada +-=-=
, saída
2, 3, 4, 6, 5, 1
ou
2 + 3 - 4 = 6 - 5 = 1
é equivalente a saída
2+3-4=6-5=1
Casos de teste
Input | One Possible Output
= | 1=1
== | 2=2=2
+= | 1+3=4
=+ | 2=1+1
-= | 30-10=20
=- | 1=2-1
=-= | 3=7-4=3
=+= | 2=1+1=2
=== | 100=100=100=100
+=- | 3+2=7-2
-=+ | 7-2=3+2
+=+ | 3+3=3+3
-=- | 1-10=8-17
--= | 60-1-1=58
++= | 60+1+1=62
-+= | 60-9+1=52
+-= | 60+9-1=68
+-=-= | 2+3-4=6-5=1
--=-- | 2-1-1=2-1-1
==-== | 47=47=50-3=47=47
=++=+-=-+=--= | 3=1+1+1=3+1-1=1-1+3=5-1-1=3
+--++-=-+-+- | 35+10-16-29+20+107-1000=5-4+3-2+1-876
====== | 8=8=8=8=8=8=8
fonte
Respostas:
Retina , 58 bytes
Experimente online!
Solução alternativa na mesma contagem de bytes:
Experimente online!
Explicação
A idéia básica é transformar todos os
+
s e-
s em simples+1
e-1
operações e, em seguida, para preceder um número suficientemente grande que faz toda a equações trabalho. Para fazer com que as equações correspondam, podemos simplesmente acrescentar o mesmo número a cada uma delas e, em seguida, reduzi-lo em um para cada um+1
e aumentá-lo em um para cada-1
depois. Como trabalharemos com números unários, o único problema é que o primeiro número precisa ser grande o suficiente para que possamos reduzi-lo em 1 vezes o suficiente.Começamos inserindo um
1
depois de cada-
ou+
.Os
\B
garante que estes jogos são, quer no início da entrada, ou entre uma=
e uma+
ou-
, ou seja, todas as posições onde se deseja inserir o número inicial de uma expressão. A((\+1)|(-1))*
parte em seguida, simplesmente conta o número de+1
s e-1
s em grupos2
e3
respectivamente. Agora vamos dividir a string de substituição:Solte repetidamente
1_
da string, aplicando o cancelamento necessário do+1
s.Por fim, substitua todas as cadeias de caracteres de
1
s pelos seus comprimentos para converter de unário para decimal.fonte
Python 2 , 76 bytes
Experimente online!
fonte
eqtn_len + plus_signs + minus_signs - 2 * plus_signs = eqtn_len + minus_signs - plus_signs
. Então, como todos os outros números no bloco são iguais, o total do bloco é calculado emeqtn_len + minus_signs - plus_signs - minus_signs + plus_signs = eqtn_len
. O comprimento da equação deve ser positivo, para que tudo dê certo.Python 2,
199179178172162158158152 152151 bytesMuito tempo, mas a solução foi fácil de criar.
Experimente online
Isso tentará todas as possibilidades até encontrar uma solução. O programa é extremamente lento. Ele também executa a substituição de cadeias a cada iteração. A edição "172" tornou a velocidade drasticamente mais lenta, pois em vez de começar com um pequeno intervalo, ela começa no máximo. Por exemplo, as entradas
-=
ou=+
precisam tentar 2 ** 32 tentativas antes de chegar a uma solução.Para acelerar o programa, use a versão com 178 bytes do histórico de edição.
fonte
range
No python2 não cria todo o intervalo como uma lista imediatamente? IIRC você pode acelerá-lo usandoxrange
em vez disso, como eu acho que essa é a versão carregamento lento (Python3 usa preguiçoso como padrãorange
)print range(1,65537)
e terminou em 0.034 s.l=...
, mas colocando isso corretamente noproduct(range(...),repeat=len(s)+1)
. Se você precisar de parênteses, ele economiza apenas um byte (\ n)len(s)+1
, eu poderia usá- los-~len(s)
, o que não exigiria parênteses.JavaScript (ES6),
9282 bytesJogou 8 bytes com um truque de @xnor
O truque aqui é inserir um
1
depois de cada+
ou-
, em seguida, acrescentar a cada expressão o número que torna a expressão igual ao comprimento da entrada. Dessa forma, podemos garantir que o número seja sempre positivo; como sempre há pelo menos 1=
na string, o número de+
s nunca pode atingir o comprimento da string, portanto o restante é sempre pelo menos1
. Você pode verificar isso digitando um número arbitrário de+
s no snippet acima.fonte
Python 2 ,
120119 bytes-1 byte graças a mbomb007
Experimente online! ou Verifique todos os casos de teste
Primeiro insiro
1
em todas as posições, para verificar o valor mais alto, depois adiciono-o como deslocamento em todas as equações. Isso funciona porque você não pode adicionar números negativos; portanto, o resultado mínimo é dado pela quantidade de+
na equação que possui apenas+
.fonte
GNU Prolog, 156 bytes
Explicação
Temos várias equações a serem resolvidas. Por que não usar um solucionador de equações real?
x
é basicamente um avaliador de equações para equações da forma+-+
; além da própria equação, ela possui dois argumentos adicionais (uma lista de diferençasL,R
que contém os valores da equação e um valorV
que a equação avalia). Como de costume no Prolog, ele pode ser usado de qualquer maneira (por exemplo, você pode especificarV
e obter umL,R
, especificarL,R
e obter umV
, especificar ambos e verificar se o valor está correto ou não especificar nem, nesse caso, restrições apropriadas serão impostas a ambosV
eL,R
) O "elemento atual" deL,R
é nomeadoE
e também incluímos uma afirmação de queE
é maior que 0 (porque a pergunta requer o uso de números positivos). Essa função é um pouco mais detalhada do que eu gostaria, por exemplo, tive que escrever a funcionar.[E|R]
correspondência de padrão / sem correspondência duas vezes, devido ao fato de que as listas são associativas à direita, mas a adição e subtração são associativas à esquerda. Infelizmente, precisamos usar uma lista real, em vez de inventar nosso próprio tipo de lista associativa à esquerda com células contras, porfd_labeling
q
é semelhante ax
, mas também inclui=
. Basicamente, apenas chamax
e recursivamente. Aliás, é uma demonstração muito clara de como as listas de diferenças funcionam, mostrando que você pode concatenar duas listas de diferençasL,T
eT,R
uma única lista de diferençasL,R
. A idéia básica é que uma lista de diferenças é uma função parcial que pega um argumentoR
e retorna um valorL
que estáR
com a própria lista anexada a ele. Assim, identificando o argumento de uma lista de diferenças e o valor de retorno de outra, podemos compor as funções e concatenar as listas.Finalmente,
s
que é a função que realmente resolve a tarefa na pergunta, é uma função de invólucro que chamaq
com argumentos. Convertemos a lista de diferenças em uma lista regular, fornecendo[]
como argumento e usamosfd_labeling
para encontrar uma solução para a equação que construímos. (Por padrão, parece gostar de definir valores como 1 se não houver motivo para defini-los para outra coisa. No entanto, ele pode ser configurado;value_method(random)
fornece soluções mais "interessantes" do que colocar 1s em todos os lugares, por exemplo, e ainda é muito rápido. )Saída de amostra
Com o programa conforme escrito:
Se eu demorar um pouco mais para adicionar um programa
value_method(random)
, o resultado varia, mas é algo como isto:Nos dois casos,
?
no final da saída significa que pode haver mais de uma solução. (Obviamente, nesse caso, sabemos que há muito mais de uma solução!)fonte
Mathematica, 116 bytes
Função pura pegando uma string como entrada e retornando uma lista de números inteiros positivos. Estratégia básica: sempre adicionamos 1 e subtraímos 1, e escolhemos os números iniciais em cada expressão para tornar tudo igual.
c=Characters@StringSplit[#,"="]/."+"->-1/."-"->1
dividiria a string de entrada em todos os sinais de igual e, em seguida, substituiria cada+
por-1
e cada-
por1
. No entanto, se houver um sinal de igual no início ou no final, ele será ignorado. Portanto, adicionamos artificialmente um novo caractere em cada extremidade ("0"<>#<>"0"
) e fazemos com que ele desapareça após a divisão da cadeia de caracteres (/."0"->Nothing
).O total de cada sub-lista agora é igual a um número inteiro que podemos colocar na frente dos
+
s e-
s para fazer com que cada expressão igual.1-Min[Tr/@c]
é o menor número inteiro que podemos adicionar a cada total para torná-los todos positivos. Então,Prepend[#^2,1-Min[Tr/@c]+Tr@#]&
pega cada sub-lista (a qual^2
vira todas as suas entradas1
) e precede seu total deslocado por esse menor número inteiro de compensação. As listas resultantes sãoJoin
editadas juntas para produzir a saída.fonte
Ruby, 76
O valor alvo para as expressões é fixado em
5**8
menos 1 por razões de golfe! Originalmente eu estava usandos.size+1
menos 1.Ungolfed in program program
Saída
fonte
PHP,
207204197114 bytesabordagem direta: muito mais curta e mais rápida
Executar
echo '<input>' | php -nR '<code>'
ou testá-lo online .demolir
!$c
é verdadeiro na primeira iteração, convertida em1
para indexação de string;"="[1]
está vazia.Depois disso,
$c
é definido e!$c
falso, convertido para0
e"="[0]
é o primeiro caractere.então estamos definitivamente seguros com o tamanho da entrada. Todos os termos serão avaliados para isso.
chunk_split($s,$n,$i)
insere$i
após todos os$n
caracteres de$s
- e no final.Para evitar que termos vazios se voltem para
1
, um erro é forçado configurando o comprimento do pedaço como0
.fonte
Röda ,
112110109 bytesExperimente online!
A função de divisão não funcionou como pretendia com este programa. Por exemplo,
split("", sep="")
retorna uma string vazia em vez de nada. Como isso é lógico? Devido a isso, o programa é quase 20 bytes maior do que poderia ser se a semântica de divisão fosse ideal.A idéia desta resposta é que sabemos que o comprimento da sequência de entrada deve ser maior ou igual ao valor da equação, portanto, definimos o valor da equação como sendo o comprimento da sequência. Para cada parte da equação, acreditamos que todo operador seja
+1
ou-1
subtrai e os adiciona ao valor da equação.Ungolfed:
fonte