Escreva uma função ou programa que possa fazer aritmética simples (adição, subtração, multiplicação e divisão) na base 10 e na base 2.
A função pegará uma expressão matemática como entrada e produzirá o resultado correto na base correta. A entrada será n
números separados por um ou vários operadores ( + - * /
).
Se todos os valores de entrada contiverem apenas 0 e 1, todos os valores serão considerados binários. Se pelo menos um dígito for 2-9
, todos os valores serão considerados como base 10.
Regras:
- Você pode assumir que haverá apenas um operador entre os números (
10*-1
não aparecerá) - Você pode assumir que não haverá parênteses.
- Precedência normal do operador (tente a expressão na calculadora do Google em caso de dúvida).
- Você não pode assumir que haverá apenas números inteiros
- Não haverá zeros à esquerda na entrada ou na saída
- Você pode assumir que apenas dados válidos serão fornecidos
- Você pode assumir que todos os valores de entrada são positivos (mas o operador negativo pode tornar a saída negativa possível
1-2=-1
e10-100=-10
) - REPL não é aceito
- Você pode optar por receber a entrada como argumentos separados ou como um único argumento, mas a entrada deve estar na ordem correta.
- Ou seja, você pode representar
1-2
com os argumentos de entrada1
,-
,2
, mas não1
,2
,-
.
- Ou seja, você pode representar
- Você deve aceitar os símbolos
+ - * /
na entrada, nãoplus
,minus
etc. - Você deve suportar valores de ponto flutuante (ou até o limite máximo do seu idioma, no entanto, o suporte apenas a números inteiros não é aceito).
eval
é aceito
Exemplos:
1+1
10
1010+10-1
1011
102+10-1
111
1+2+3
6
10*10*10
1000
11*11*11
11011
10*11*12+1
1321
10.1*10.1
110.01
20.2*20.2
408.04
10/5
2
110/10
11
Also accepted (optional line or comma-separated input):
10
+
10
-
1
11 <-- This is the output
Este é um código de golfe, portanto o código mais curto em bytes vencerá.
code-golf
arithmetic
base-conversion
binary
Stewie Griffin
fonte
fonte
110/10
, é11.0
aceitável?Respostas:
Japt,
7772626062 *605951 bytesExplicação (mais ou menos o mesmo que para a resposta JS):
Experimente online!
* não se dividiu corretamente
fonte
eval
estão atribuídosOx
. Vou ver se pode ser ainda mais encurtado.OxUf"[2-9]" ?U:`({Ur"\\d+(\\.\\d+)?""(($&e14+P).n(2)/16384)"}).s(2)
provavelmente é possível gerar código Japt em vez de JS e usá-loOv
para avaliar isso.OvUf"[2-9]" ?U:Ur"\\d+(\\.\\d+)?""~~[$&e14+P n2 /16384]" +" s2
A~~[...]
é necessária porque incompatíveis parênteses em uma confusão string com o transpiler .OvUf"[2-9]" ?U:"({Ur"[\\d.]+""º$&e14+P n2 /2pE¹"})¤
JavaScript ES6,
8797 1100 2106 310210198100 4938886 bytesDemonstração + explicação:
1 - esqueci os carros alegóricos
2 - novamente o problema dos carros alegóricos: parseInt assoalhos binários, então eu tenho que multiplicar por 1e14 e depois dividir por 16384
3 - espero que tenha conseguido a tarefa dada, agora comece a jogar golfe: D
4 - houve um erro ao dividir
fonte
e.match(/[2-9]/g)
parae.match`[2-9]`
.('0b'+$&*1e14)/1638
isso deve funcionar, mas eu não estou 100% de certezaJolf, 31 bytes, não-competitivo
Acrescentei uma quantidade decente de funções inspiradas nesse desafio e, como tal, é considerado não competitivo. Estou feliz porque finalmente implementei funções unárias (como
(H,S,n)=>val
no ES6, mas são suportadas no ES5!)Conjunto de testes , Tente a sua própria entrada , ou configurar manualmente a entrada .
fonte
Bash, 60 bytes
Exemplo de execução:
fonte
dc
exigiria a ordem inversa de polimento das operações, o que não é permitido pelo desafio.𝔼𝕊𝕄𝕚𝕟 2, 46 caracteres / 72 bytes
Try it here (Firefox only).
Explicação
fonte
PowerShell, 107 bytes
Ungolfed
Exemplo
fonte