Digamos que eu tenho uma expressão:
9 * 8 + 1 - 4
Essa expressão pode ser interpretada de seis maneiras diferentes, dependendo da precedência do operador:
(((9 * 8) + 1) - 4) = 69 (* + -)
((9 * 8) + (1 - 4)) = 69 (* - +)
((9 * (8 + 1)) - 4) = 77 (+ * -)
(9 * ((8 + 1) - 4)) = 45 (+ - *)
((9 * 8) + (1 - 4)) = 69 (- * +)
(9 * (8 + (1 - 4))) = 45 (- + *)
Digamos que eu seja um desenvolvedor e não tenha vontade de memorizar tabelas de precedência, etc., então vou adivinhar.
Nesse caso, a maior margem de erro seria 45-77, que é uma diferença de 32. Isso significa que meu palpite só será desativado em um máximo de 32.
O desafio
Dada uma expressão consistindo de números e +
, -
, *
, /
(divisão inteira) e %
, de saída da diferença absoluta do maior e o menor valor possível para que a expressão, com base na prioridade de operadores.
Especificações
- A expressão de entrada não conterá parênteses e todo operador é associativo à esquerda.
- A expressão de entrada conterá apenas números inteiros não negativos. No entanto, subexpressões podem ser consideradas negativas (por exemplo
1 - 4
). - Você pode pegar a expressão em qualquer formato razoável. Por exemplo:
"9 * 8 + 1 - 4"
"9*8+1-4"
[9, "*", 8, "+", 1, "-", 4]
[9, 8, 1, 4], ["*", "+", "-"]
- A entrada conterá pelo menos 1 e no máximo 10 operadores.
- Qualquer expressão que contenha uma divisão ou módulo por 0 deve ser ignorada.
- Você pode assumir que o módulo não receberá operandos negativos.
Casos de teste
9 * 8 + 1 - 4 32
1 + 3 * 4 3
1 + 1 0
8 - 6 + 1 * 0 8
60 / 8 % 8 * 6 % 4 * 5 63
code-golf
number
arithmetic
expression-building
Esolanging Fruit
fonte
fonte
%
como tendo duas precedências diferentes no seu segundo exemplo.%
operador trabalha com números negativos? A maneira como C ou Python ou algo mais?Respostas:
Python 2 ,
171156 bytesExperimente online!
Como funciona
Cercamos cada operador com um número diferente de pares de parênteses voltados para fora para simular diferentes precedências (de todas as maneiras possíveis) e envolvemos pares de parênteses voltados para dentro em torno de toda a cadeia, para obter uma expressão possível
eval
. Por exemplo, com+
↦)+(
*
↦))*((
-
↦)))-(((
Nós temos
9 * 8 + 1 - 4
↦(((9 ))*(( 8 )+( 1 )))-((( 4)))
=77
.fonte
or
fora dosum
para remover uma camada de colchetes:sum([...],[])or[eval(a)]
em vez desum([...]or[[eval(a)]],[])
sum
pode estar vazio sem que o argumento esteja vazio - no entanto, é realmente bom porque oeval
erro deve falhar nesse caso. Obrigado.Gelatina , 126 bytes
"Precedência do operador? Parênteses? Pah, quem precisa disso?" - desafios de usar o Jelly para um desafio de precedência do operador.
Experimente online!
A entrada é usada como uma sequência, por exemplo "1 + 2_3 × 4: 5% 6". Observe que a multiplicação usa "×" em vez de "*", a divisão usa ":" em vez de "/" e a subtração usa "_" em vez de "-".
Como funciona O programa é dividido em três partes: gerando todas as expressões de diferentes precedências do operador, avaliando-as e retornando a diferença entre o máximo e o mínimo.
Todas as expressões são geradas com o código:
Os links são avaliados com isso (eu provavelmente poderia melhorar com uma estrutura diferente):
A diferença entre o máximo e o mínimo é calculada com o código no link (5):
fonte
Python 2 ,
235234233226 bytes-1 byte (e uma correção) graças a Anders Kaseorg !
-7 bytes graças ao Step Hen !
Experimente online!
fonte
a
uma tupla em vez de uma lista e até salvar 1 byte ao fazer isso (a=()
,a+=eval(*l),
).Haskell 582 bytes
Isso não foi tão bem quanto eu esperava que fosse ...
Experimente Online!
Tentar jogar golfe em um programa longo me faz escrever um código ruim :(
Tentei usar o algoritmo de Anders em Haskell, mas ele saiu do meu controle
A função e é como um caso específico de avaliação. (#) pega uma lista de cadeias que representam números inteiros e uma cadeia de operadores e retorna a diferença entre os valores máximos e mínimos possíveis. por exemplo
fonte
#
para##
, você poderia mudar o nomee
para(#)
, assim:(n#s)(x:a)=...
r=read;j=zipWith;o=map
e substitua essas funções pelos aliases da letra.Pitão, 45 bytes
Tenho certeza de que muito mais otimização pode ser feita, mas eu gosto até agora.
Toma entrada como esta:
[9, 8, 1, 4], ["*", "+", "-"]
.Experimente online!
fonte
Mathematica,
186164159 bytes\[Function]
leva 3 bytes.Algumas alternativas (mantém o mesmo valor)
#2-#&@MinMax[...]
substituirMax@#-Min@#&[...]
Head@#2
substituir#2[[0]]
Experimente online em http://sandbox.open.wolframcloud.com : digite
( .... )[{60, "/", 8, "%", 8, "*", 6, "%", 4, "*", 5}]
com....
substituído pelo código acima para o caso de teste60 / 8 % 8 * 6 % 4 * 5
. PressioneShift + enter
para avaliar.fonte
Javascript, 280 bytes
Nota : A divisão inteira é arredondada usando a função floor, o que significa que os números negativos são arredondados para longe de zero.
Esta solução é baseada nesta resposta .
Exemplo de trecho de código:
fonte
a/b|0
pára a verificação de erro de divisão / modulo 0, masMath.floor(a/b)
funcionouHaskell , 254 bytes
Experimente online!
A entrada é uma sequência inteira, como 4 + 5 * 2. Ela gera todas as permutações de operações e, para cada permutação, divide a sequência recursivamente. Ele filtra as divisões por 0 com a mônada da lista.
fonte
(%)
é um operador de módulo. É o restante de uma operação de divisão entre o argumento da esquerda e o argumento da direita.Python 2 ,
262256254 bytesExperimente online!
fonte
in [
ain[
(espaço não é necessário)PHP , 316 bytes
Experimente online!
fonte
Python 3 , 284 bytes
Editar: parece que algo está errado com a avaliação do último exemplo. Eu vou investigar amanhã.
Outra resposta Python. Não conseguia superar todos os outros, mas gastei muito tempo nisso para não colocá-lo.
Experimente online!
fonte
while(p)
pode se tornarwhile p
por um byte salvo.Clojure (+ combinatória),
342377 + 41 = 418 bytes+35 bytes devido a um erro.
Experimente online!
Para que esta função funcione, você precisa
use
daclojure.math.combinatorics
biblioteca (41 bytes):Nuances:
Esta função é uma função anônima, o que significa que você deve fazer isso para usá-lo:
Além disso, estou usando a palavra em
quot
vez de/
(já que Clojure faz divisão de fração por padrão) e emmod
vez de%
.Programa não destruído:
fonte
use
declaração.The characters used to import the library will likely be counted
codegolf.meta.stackexchange.com/questions/10225/...require
necessidades a serem incluídas no código e seu comprimento devem ser adicionados à contagem de bytes.JavaScript (ES6), 210 bytes
Entrada como uma matriz de números e operadores
Menos golfe
Teste
fonte