Avalie uma expressão omnifixo fornecida.
Omnifix é como a notação de infixo da matemática normal, mas com cópias adicionais de cada símbolo em torno dos argumentos. Os símbolos externos substituem os parênteses e, portanto, não há necessidade de parênteses adicionais.
Você deve suportar adição, subtração, multiplicação, divisão e números reais positivos (números negativos podem ser escritos -0-n-
) dentro de um intervalo razoável para o seu idioma.
Mais e menos devem ser +
e -
, mas você pode usar *
ou ×
por tempos e /
ou ÷
por divisão. Outros símbolos razoáveis serão permitidos mediante solicitação.
Brownie aponta para explicação e recursos adicionais (como operações adicionais, números negativos, seqüências de caracteres etc.) Mesmo que sua resposta não possua esses recursos, fique à vontade para mostrar como poderia.
Forneça um link para testar sua solução, se possível.
Exemplos
Para maior clareza, as explicações abaixo usam alto menos ( ¯
) para indicar números negativos. Você pode retornar números negativos usando qualquer formato razoável.
-5-2-
→ 3
+2+×3×2×+
→ 8
( +2+×3×2×+
→ +2+6+
→ 8
)
-14--3-1--
→ 12
( -4--3-1--
→ -14-2-
→ 12
)
+2.1+×3.5×2.2×+
→ 9.8
( +2.1+×3.5×2.2×+
→ +2.1+7.7+
→ 9.8
)
×3×÷-0-6-÷2÷×
→ -9
( ×3×÷-0-6-÷2÷×
→ ×3×÷¯6÷2÷×
→ ×3ׯ3×
→ ¯9
)
÷4÷-3-÷1÷2÷-÷
→ 1.6
( ÷4÷-3-÷1÷2÷-÷
→ ÷4÷-3-0.5-÷
→ ÷4÷2.5÷
→ 1.6
)
The explanations below use high minus (`¯`) to indicate negative numbers.
Você definitivamente ama APL.-
s pode ser confundido com-
s enquanto¯
s não pode ser confundido com-
s.Respostas:
C # (.NET Core) ,
198197188bytesExperimente online!
Usos
*
e/
.Uma função recursiva. Primeiro, ele tenta analisar a sequência de entrada como a
float
. Se falhar, chama a si próprio passar recursivamente como argumentos o primeiro e o segundo operandos e, em seguida, executa a operação selecionada nos resultados.fonte
IndefOf(f, 1)
pode serIndexOf(f,1)
float
s em vez disso, use os códigos de caracteres, quando você os tiver provavelmente poderá encurtá-los com>
e<
em alguns lugares.i+1,s.Length-i-2
para++i,s.Length+~i
.Python 3,
159158152144 144135135132 bytesExperimente online!
Não permite números negativos (embora
-0-5-
funcione, é claro) e requer operadores python.fonte
while~-(l[i]in'+-*/'):i+=1;a=1
e*l,=input()
para 152 bytesif a:l[i]='(';i=t(t(i+1));l[i-1]=')'
comreturn-~i
135 bytes: PRetina ,
290287286 bytesExperimente online! Nota: Somente capaz de aritmética inteira, portanto, alguns dos casos de teste foram removidos. Aceita e retorna números negativos usando o
¯
prefixo. Edit: Salvo34 bytes graças ao @Cowsquack. Explicação:Eu precisava de uma maneira de lidar com zero, então eu uso
¦
como um prefixo de número positivo. Os números são convertidos para unários.Mas números negativos precisam apenas de um
¯
prefixo.Citar
+
s fica feio, então eu transformei adições em subtrações.Se o valor absoluto do LHS de uma subtração for menor que o RHS, troque-os e anule os dois lados.
Além disso, se o LHS de uma multiplicação ou divisão for negativo, negue os dois lados.
Além disso, se o LHS de uma multiplicação for zero, o resultado será zero. Além disso, dois menos fazem uma vantagem.
Mas um sinal de menos e um sinal de mais (ou vice-versa) fazem um sinal de menos.
Subtraia dois números do mesmo sinal. Faça isso repetidamente até que não haja mais subtrações.
Se ainda houver uma subtração, os sinais devem ser diferentes, então adicione os números. (Mas faça isso apenas uma vez, pois isso poderá revelar uma subtração de dois números do mesmo sinal novamente.)
Realize a multiplicação por adição repetida.
Execute a divisão inteira. Uma das etapas acima terá simplificado a expressão, portanto, retorne até que não haja mais operações.
Converta de volta para decimal.
fonte
+`-(([¯¦])1*)(1*)-\2\3-
,[¯¦]
pode se tornar¯|¦
([×÷])
;)PHP ,
116114109 bytes-5 graças a Martin Ender
Usa
*
para multiplicação e/
divisão. Acontece que números negativos funcionam, apesar de eu não fazer nenhuma tentativa específica para que isso aconteça.Experimente online!
Ungolfed e Explained
Também vou explicar o regex porque é um pouco mágico:
Primeiro, queremos corresponder a qualquer um dos quatro operadores:
*+/-
Então, precisamos corresponder um número
[\d.]+
ou outra expressão omnifixo válida(?R)
.Então, combinamos o mesmo operador que estava no começo.
Em seguida, fazemos o mesmo que fizemos no grupo 3: corresponde a um número ou a uma expressão omnifixa.
Finalmente, combine o operador inicial novamente.
O que quer que corresponda a isso é substituído por
($2)
. Isso pega a peça dentro dos operadores circundantes e a coloca entre colchetes, para que pareça uma notação infix normal.fonte
QuadR ,
333227 bytes-1 graças a Vacas Quack . -5 graças a Erik, o Outgolfer .
com o argumento / flag
≡
Experimente online!
Isso é equivalente à solução Dyalog APL de 40 bytes:
Experimente online!
Explicação
(o texto entre parênteses refere-se ao Dyalog APL em vez de QuadR)
(
…){2}\2
O seguinte padrão duas vezes e o conjunto também duas vezes:(.)
qualquer caractere[
…]+
seguido por um ou mais dos seguintes conjuntos de caracteres:\d
d igits,¯
high menos (sinal negativo)\.
período(
⎕R
É R eplaced com :)(
{
…}
O resultado da seguinte função anônima aplicada ao namespace ⍵ :)⍵M
(⍵.Match
) O texto do M atch¯1↓
soltar o último caractere (o símbolo+
-
×
ou÷
)1↓
cair o primeiro caractere (símbolo)⍎
executar como código APL(
⍕
stringify)≡
(⍣≡
) repita a substituição até que não ocorram mais alteraçõesfonte
⍕
⎕R
não pode operar com dados numéricos. Obrigado.Haskell , 132 caracteres
(134 bytes, porque
×
e÷
tomar dois bytes em UTF-8)Experimente online!
f
analisa o máximo de entrada possível e produz o resultado, bem como a sequência restante (que está vazia nos casos de teste). Se isso não estiver em conformidade com as regras, descasque a sequência restante imperceptível comHaskell , 139 caracteres
fonte
Perl,
6453 bytesIncluir
+1
para-p
Acidentalmente também implementa
,
(joga fora o primeiro argumento) e algumas vezes.
(acrescenta os argumentos)..
embora não funcione muito confiável, pois interfere no ponto decimal no nível de análise e no nível de avaliaçãofonte
Java 8,
205200 bytesPorto de @Charlie resposta # 's C .
-5 bytes graças a @ceilingcat .
Experimente online.
fonte