Visão geral
Dada uma lista de dígitos, encontre o menor número de operações para fazer 100
Entrada
Uma sequência de dígitos, que pode ou não estar em ordem numérica. A ordem dos dígitos não pode ser alterada, no entanto, os operadores mais (+) ou menos (-) podem ser adicionados entre cada um para que a soma total seja igual a 100.
Resultado
O número de operadores adicionados, seguido pela sequência completa de dígitos e operadores. Os dois podem ser separados por um espaço, tabulação ou nova sequência de linhas.
Exemplos
válido
Entrada: 123456789
Saída:3 123–45–67+89
Entrada inválida : 123456789
saída:
6
1+2+34-5+67-8+9
(existem maneiras de resolver isso com menos operações)
code-golf
integer
integer-partitions
expression-building
CyberJacob
fonte
fonte
+
e-
? Podemos supor que sempre seremos capazes de fazer a100
partir da entrada?299399
, seria-299+399
válido?Respostas:
JavaScript (ES6),
153176 bytesEDIT: No modo não estrito, JS interpreta expressões numéricas com prefixo 0 como octal (por exemplo,
017
é analisado como 15 em decimal). Esta é uma versão fixa que suporta zeros à esquerda.fonte
2-017-2+117
. Mas017
é uma notação octal em JS, que fornece 15 em decimal. Então, meu código atual encontra apenas2-0-17-2+117
. Vou tentar resolver esse problema ainda hoje.3**(l=s.length,l-1)
=>3**~-(l=s.length)
MATL ,
3736 bytesO caso de teste leva cerca de 6 segundos no TIO.
Experimente online!
Como funciona
fonte
299399
não tem solução e, portanto, não é uma entrada válida (os operadores foram especificados para ir "entre" os dígitos, essa entrada exigiria-299+399
onde-
não houvesse entre dígitos).-299+399
e, nesse caso, preciso de uma pequena alteração no meu código . Pedi esclarecimentos ao OP123456789
deve ter uma contagem de operadores que4
não3
.299399
é uma entrada inválida porque, como o OP também esclareceu, cada entrada deve ter pelo menos uma solução[Python 2],
164158 bytesExperimente online!
Tome N como uma sequência de dígitos; retorna uma tupla (numOps, expressionString).
Basicamente, a mesma abordagem que outras; usa itertools.product para construir os "casos" individuais, por exemplo, para N == '1322', um "caso" seria
('-','','+')
e avaliaria '1-32 + 2'.Lança um ValueError se a entrada for inválida (mas acho que o OP não garantiu entradas inválidas).
fonte
PHP,
166171 bytesExecutar como tubo
-nR
ou testá-lo on-line .usa números formatados para classificar os resultados ->
pode imprimir espaços em branco à esquerda (e pode falhar na entrada com mais de 99 dígitos; aumente o número em
%2d
a corrigir).não mais que 10 dígitos, 161 bytes
demolir
fonte
Geléia , 32 bytes
Um programa completo exibido usando os operadores Jelly (em
_
vez de-
).Nota: Para mostrar
-
na saída em vez de_
(não um requisito), adicione⁾_-y
entreF
eṄ
(⁾_-
é um par de caracteres literal['_','-']
ey
é o átomo diádico de "conversão").Quão?
Experimente online!
fonte
Mathematica, 136
146149156165166bytesRetorna
{3, 123-45-67+89}
por exemplo.O caso de teste leva cerca de 0,09 segundos para ser concluído.
fonte
Python 2 ,
256230208205172171170165 bytes, método iterativolen(a)
porw
z-=1;d=z
pord=z=z-1
Experimente online!
Pouca explicação Usando a representação na base 3, o código intercala os dígitos com os operadores {'+', '-', concatenação} de acordo com todas as combinações possíveis.
Python 2 , 167 bytes, método recursivo
Experimente online!
Algumas saídas
fonte
list(input())
por justinput()
, já que uma string já é iterável para salvar 6 bytes; substituab.count('+')+b.count('-')
porlen(b)-len(a)
para salvar 12 bytes; e substituachr(r+43)
porchr(r+43)*(d>0!=r-1)
e, em seguida, você pode excluir a linhab=b[:-1].replace(',','')
para economizar 15 bytes de rede ((d>0!=r-1)
é equivalente a(d>0 and 0!=r-1)
).Braquilog , 36 bytes
Experimente online!
Mais da metade disso é para obter o formato de saída correto. A lógica central real é apenas:
15 bytes
Experimente online!
Isso retorna uma lista como [123, –45, –67,89]. A expressão é a soma dos elementos e o número de operadores é 1 menor que o comprimento da lista.
~cLhℕ∧100~+L
quase funciona para 12 bytes ( Experimente on-line! ) - mas é muito lento para lidar com entradas completas de 9 dígitos no TIO e, mais importante, falha em entradas como10808
- o Brachylog é inteligente demais para dividir números para ter zeros à esquerda, o que não acontece ' veja a partição [108, -08].fonte
Haskell ,
180178 bytesExperimente online! Uso:
g "123456789"
rendimentos(3,"123-45-67+89")
.#
constrói uma lista de todos os termos possíveis,?
avalia um termo eg
filtra os termos que avaliam para 100 e retornam aquele com o número mínimo de operandos.fonte
Gelatina , 27 bytes
Experimente online!
Não posso dizer que não recebi algumas dicas da resposta mais antiga de Jonathan Allan. ;-)
Comparado à sua resposta, este é apenas dois bytes mais curto (30), e não cinco, se tornarmos a comparação justa devido a atualizações de idioma:
Se compararmos de outra maneira (versão mais recente em vez de mais antiga), a diferença é a mesma (a dele se torna 29 bytes, vista abaixo):
fonte