Implemente uma calculadora com script de operação inteira simples.
Conceito
O acumulador inicia em 0 e tem operações executadas nele. No final do programa, imprima o valor do acumulador.
Operações:
+
adiciona1
ao acumulador-
subtrai1
do acumulador*
multiplica o acumulador por2
/
divide o acumulador por2
Script de amostra
A entrada ++**--/
deve fornecer a saída 3
.
Implementação de exemplo
def calc(s)
i = 0
s.chars.each do |o|
case o
when '+'
i += 1
when '-'
i -= 1
when '*'
i *= 2
when '/'
i /= 2
end
end
return i
end
Regras
- Isso é código-golfe , então a resposta mais baixa em bytes vence, mas não está selecionada.
- Implementações criativas são incentivadas.
- As brechas padrão são proibidas.
- Você obtém o programa via stdin ou argumentos e pode gerar a resposta via valor de retorno ou stdout.
- Diverta-se.
- A divisão é interrompida porque é uma divisão inteira.
- O programa
-/
retorna-1
.
Casos de teste
*///*-*+-+
-1
/*+/*+++/*///*/+-+//*+-+-/----*-*-+++*+**+/*--///+*-/+//*//-+++--++/-**--/+--/*-/+*//*+-*-*/*+*+/+*-
-17
+++-+--/-*/---++/-+*-//+/++-*--+*+/*/*/++--++-+//++--*/***-*+++--+-*//-*/+*/+-*++**+--*/*//-*--**-/-*+**-/*-**/*+*-*/--+/+/+//-+*/---///+**////-*//+-+-/+--/**///*+//+++/+*++**++//**+**+-*/+/*/*++-/+**+--+*++++/-*-/*+--/++*/-++/-**++++/-/+/--*/-/+---**//*///-//*+-*----+//--/-/+*/-+++-+*-*+*+-/-//*-//+/*-+//+/+/*-/-/+//+**/-****/-**-//+/+-+/*-+*++*/-/++*/-//*--+*--/-+-+/+/**/-***+/-/++-++*+*-+*+*-+-//+/-++*+/*//*-+/+*/-+/-/*/-/-+*+**/*//*+/+---+*+++*+/+-**/-+-/+*---/-*+/-++*//*/-+-*+--**/-////*/--/*--//-**/*++*+/*+/-+/--**/*-+*+/+-*+*+--*///+-++/+//+*/-+/**--//*/+++/*+*////+-*-//--*+/*/-+**/*//+*+-//+--+*-+/-**-*/+//*+---*+//*/+**/*--/--+/*-*+*++--*+//+*+-++--+-*-*-+--**+/+*-/+*+-/---+-*+-+-/++/+*///*/*-+-*//-+-++/++/*/-++/**--+-////-//+/*//+**/*+-+/+/+///*+*///*-/+/*/-//-*-**//-/-+--+/-*--+-++**++//*--/*++--*-/-///-+/+//--+*//-**-/*-*/+*/-*-*//--++*//-*/++//+/-++-+-*/*-+++**-/-*++++**+-+++-+-***-+//+-/**-+/*+****-*+++*/-*-/***/-/*+/*****++*+/-/-**-+-*-*-++**/*+-/*-+*++-/+/-++*-/*-****-*
18773342
code-golf
math
number
arithmetic
dkudriavtsev
fonte
fonte
/
pode render não-inteiros.-/
retornar?Respostas:
Python 2, 48 bytes
Does
+2
,-2
,*2
, ou/2
. Ao fazer+2
e-2
em vez de+1
e-1
, nós estamos trabalhando em unidades duplicada, de modo que as necessidades de saída final para metade. Exceto, a divisão de piso/
agora precisa arredondar para um múltiplo de 2, o que é feito com&-2
.fonte
0q{2\~-2&}/2/
(2\~
avalia o operador com o segundo operando2
,-2&
é o bit a bit AND,2/
é a divisão final por dois.q{...}/
É um foreach sobre a entrada e0
é apenas a inicial valor).Haskell, 51 bytes
Exemplo de uso:
foldl(#)0 $ "++**--/"
->3
.fonte
Geléia ,
1817 bytesExperimente online!
Como funciona
As seis primeiras linhas definem links auxiliares com índices que variam de 1 a 6 ; eles incrementam, não fazem nada, diminuem, não fazem nada, cortam pela metade (piso) e dobram.
O link principal -
O0;ṛĿ/
- converte os caracteres de entrada em seus pontos de código (O
), acrescenta um 0 (valor inicial) à matriz de pontos de código0;
e reduz a matriz gerada da seguinte maneira.O valor inicial é o primeiro elemento da matriz, ou seja, o 0 precedido . O link rápido
ṛĿ
é chamado para todos os elementos a seguir na matriz, com o último valor de retorno como argumento à esquerda e o elemento atual como um à direita. Ele inspeciona seu argumento correto (ṛ
) e avalia o link com esse índice monadicamente (Ŀ
), aplicando a operação desejada.fonte
Python 2, 54 bytes
A entrada é aceita como uma string literal.
~ord(c)%5%3
mapeia os operadores para os operandos direitos correspondentes.Anteriormente, eu usei o
hash(c)%55%3
que não produzia resultados consistentes entre diferentes versões do Python. Isso me incentivou a explorar outras fórmulas.fonte
hash
é Python versão específica - ideone usa 2.7.10 que dá[1, 1, 2, 2]
como os quatro mapeamentos, enquanto localmente no 2.7.12 eu recebo[2, 0, 1, 0]
SILOS ,
133211 bytesToma os códigos ASCII dos operadores.
Experimente online com casos de teste:
-/
++**--/
*///*-*+-+
fonte
-/
deve retornar -1 , não 0 .Máquina de Turing - 23 estados (684 bytes)
Experimente aqui - permalink
A entrada não deve conter nenhum '*', pois é um caractere especial no código de máquina de Turing. Use 'x' em vez disso. Emite a resposta em binário.
Código não ofuscado
Explicação dos estados:
Inicialização:
esses estados são visitados uma vez no início de cada execução, começando com init2
Instruções de leitura:
esses estados serão visitados várias vezes durante o programa
readop: Move todo o caminho para a direita até ler um operador ou o '.'. Se atingir um operador, mude para o estado correspondente (+, -, x, /). Se atingir um '.', Altere para o estado 'fin'.
return: Retorna a cabeça para o espaço vazio entre o total em execução e os operadores. Então muda para 'readop'.
Operações:
essas operações fazem o trabalho sujo real
+: Mova para a esquerda até que o cabeçote leia qualquer caractere que não seja um espaço em branco. Se esse caractere for um '-', mova para a esquerda e mude para 'dec'. Caso contrário, mude para 'inc'.
-: Semelhante a '+', exceto para 'inc' se houver '-' e 'dec' caso contrário.
inc: se o dígito sob a cabeça for 0 (ou um espaço em branco), altere-o para 1 e mude para 'zero'. Se o dígito for 1, mude para 0 e repita no próximo dígito.
dec: Semelhante ao inc, exceto que 1 vai para 0, 0 vai para 1 e se o cabeçalho lê um espaço em branco, mude para 'neg'.
x, x0, x1: alterna o número um para a esquerda. Mude para 'return'.
/, //, div, div0, div1: mova todo o caminho para a direita do número e, em seguida, desloca um bit para a direita. Se houver um '-', altere para 'inc'. Isso simula o arredondamento de números negativos. Caso contrário, mude para 'zero'
neg: Coloque um '-' após o número e mude para 'readop'
zero, zero1, zero2: remova os zeros à esquerda e mude para 'readop'
Limpeza: Torna a saída apresentável
fonte
Perl 6 ,
5352 bytesExplicação:
Uso:
fonte
C,
636257 bytesWandbox
fonte
05AB1E , 20 bytes
Obrigado ao Enigma por corrigir o
-/
erro -bug!Para 16 bytes se não fosse inteiro Divisão:
Î"+-*/""><·;"‡.V
.Explicação:
Usa a codificação CP-1252 . Experimente online!
fonte
-/
deve retornar -1 , não 0 .Î…+-*"><·"‡'/"2÷":.V
a mesma contagem de bytes.JavaScript ES6,
8068 bytesEconomizou 12 bytes graças a Neil!
fonte
"c"+
e o escrevesse"c+1 c-1 c*2 c/2|0".split
etc.o=>c=[c+1,c-1,c*2,c/2|0]["+-*/".indexOf(o)]
, ou acho que você pode salvar um byte adicional usandoo=>c={"+":c+1,"-":c-1,"*":c*2,"/":c/2|0}[o]
.k=>[...k].reduce((c,o)=>+{"+":c+1,"-":c-1,"*":c*2,"/":c/2|0}[o],0)
pode trabalhar ainda mais curto ainda, mas eu já perdi a conta ...}
e[o]
, portanto, esse comprimento é de apenas 66 bytes. Além disso, o OP esclareceu;-/
deve retornar -1 , não 0 .Ruby,
484442 + 1 = 43 bytes+1 byte para
-n
sinalizador. Recebe entrada em STDIN.Veja-o no ideone (usa,
$_
pois o ideone não usa sinalizadores de linha de comando): http://ideone.com/3udQ3Hfonte
PHP 76 bytes
fonte
Python 2,
5856 bytes-2 bytes graças a @Lynn
Os ordinais dos personagens
+-*/
são43,45,42,47
modulo 11 estes são10,1,9,3
modulo 3 esses são1,1,0,0
, 2 a menos que aqueles são1,1,2,2
dando os valores que precisamos para cada operação:r=r+1
,r=r-1
,r=r*2
, er=r/2
Anterior:
fonte
2-ord(c)%11%3
?Mathematica,
837370 bytes10 bytes salvos devido a @MartinEnder .
Função anônima. Pega uma lista de caracteres como entrada e retorna um número como saída. Sugestões de golfe são bem-vindas.
fonte
SILOS ,
175164 bytesExperimente online!
Método de entrada são. Divisão inteira correta (arredondar para -in infinito).
fonte
C #,
8781 bytesUngolfed:
A entrada é assumida como válida. A divisão por dois é feita deslocando um bit para a direita, porque a divisão regular sempre volta para zero e a troca de bits sempre volta para baixo. O incremento e o decremento fazem uso prático da distância 1 entre os códigos ASCII para
+
e-
.fonte
int f(string s)=>s.Aggregate(0,(i,c)=>c<43?i*2:c<46?i+44-c:i>>1);
(65 bytes)Javascript (ES6), 57 bytes (matriz) / 60 bytes (inteiro)
Retornando uma matriz de todos os resultados intermediários:
Por exemplo, a saída para
"++**--/"
será[1, 2, 4, 8, 7, 6, 3]
.Retornando apenas o resultado final:
Como funciona
Ambas as soluções são baseados na mesma idéia: usar a função hash perfeita
eval(2+c+3)&3
para mapear os diferentes caracteres operadorc
em[0, 3]
.fonte
JavaScript (ES6), 57
Nota: o valor inicial do acumulador é a sequência do programa, usando operações de bit (~, >>, <<, |) e é convertido para 0 no primeiro uso.
Como observação lateral, a resposta inteligente de @xnor teria 40 pontos portados para javascript:
(se você gosta disso, vote nele)
Teste
fonte
Java, 77 bytes
Usa java 8 streams.
fonte
r >> 1
parar>>1
e salvar 2 bytes?s->s.chars().reduce(0,(r,c)->c<43?r*2:c<46?r+44-c:r>>1);
que lhe dará 56 bytesGNU sed,
655957 bytesEdit: 2 bytes mais curtas graças a Toby Speight comentários 's
Corre:
Saída:
O
sed
script prepara a entrada para adc
chamada de shell no final, este último aceitando a entrada na notação polonesa reversa . Na divisão, se o número for negativo (d0>
), o[1-]
comando de decremento armazenado no registrador@
é chamado. Exemplo de conversão:+ - * /
->1+ 1- 2* d0>@2/
.fonte
[1-]
padrão ...s
withS
. Eu esqueci que ele não substitui a pilha do registro, ela o pressiona, tendo o efeito contrário do que eu queria (desde que o usei para todos/
). As aspas ainda são necessárias porque você tem/
símbolos, fazendo com que a string seja interpretada como um caminho de arquivo :) Raspei mais 1 byte removendo o espaço após o-e
.-e
como um nome de arquivo, então você não precisa de aspas para o/
- experimente! Eu acho que é razoável para um código-golfe exigir que o diretório de trabalho atual não contenha nenhum arquivo que comece com01s@
ou0-s@
.-e
a respeito/
, no entanto as cotações ainda são necessários como eu só vi agora. O>
é interpretado diretamente pelo shell como um operador de redirecionamento Eu acho que, desde que eu tenho esse erro:cannot create @2/d0: Directory nonexistent
>
. Você precisa de aspas, afinal. Desculpas por (tentar) enganar! E, embora a adição de uma barra invertida parece com um personagem, ele precisa ser duplicada em umas///
substituição, de modo nenhum benefício lá ...PHP, 75 bytes
Isso usa uma versão modificada da resposta de Jörg Hülsermann .
Ele depende muito da substituição de cadeias, usando uma expressão regular simples (
~.~
).A variável
$s
é redesignada com o novo valor para cada caractere. No final, ele gera o resultado.Nota : Isso deve ser executado usando o
-r
sinalizador.Experimente aqui:
Mostrar snippet de código
Ou tente: http://sandbox.onlinephpfunctions.com/code/7d2adc2a500268c011222d8d953d9b837f2312aa
Diferenças:
echo$s
, estou usandosprintf($s)
. Ambos realizam a mesma ação nos números. Como isso é apenas para teste, não há problema.++*+
o primeiro argumento, o que deve ser mostrado5
.fonte
e
modificador está de volta! : De
, que foi substituído porpreg_replace_callback
e poderia ser abusado ... mas isso não é exatamente isso.Lote, 61 bytes
Tradução da resposta xcellent xcellent em Python.
fonte
Pyke,
2422 bytesExperimente aqui!
Ou 12 bytes (não competitivo)
Experimente aqui!
Adicionar
translate
nó - basicamente várias localizações e substituições.fonte
PHP,
10410282 bytesPrimeira versão com eval:
Segunda versão com operadores ternários:
Pega a sequência de entrada como primeiro argumento na linha de comando.
Esse "somente" funciona para seqüências de entrada menores que 10.000 caracteres - o que deve ser suficiente. Testado com todos os casos de teste, infelizmente não é possível economizar na inicialização no início.A segunda versão funciona com strings de qualquer tamanho e sem inicialização. :-)O elemento principal é a função eval, que manipula com
$i
base em um mapa de operações aritméticas, que são bem diretas, exceto pela divisão. O PHP retorna um valor flutuante ao usar/
eintdiv
possui muitos bytes; portanto, fazemos o deslocamento à direita .Atualizações
$i=$i>>1
para$i>>=1
para a divisão inteira.fonte
Python 3,
986660 bytesObrigado Tukkax!
Não é tão golfista quanto a outra resposta, mas não posso competir com eles sem plágio.
Além disso, eu tenho uma solução lambda recursiva também
7367 bytes (aprimorado!)fonte
i=0 for c in input():i+=[1,-i//2,-1,i][ord(c)%23%4] print(i)
. (não formatado corretamente, é claro). Também acho que você deve mencionar que está usando Python3. Em Python2,input()
avaliaria comoint(raw_input())
.+-
faz 1)R, 201 bytes
Golfe
Comentado
A estratégia é refinar os
+, -, %
operadores. Divida a sequência e analise-a em uma longa lista de funções, a serem alimentadas noReduce()'s
acumulador.Não podia mais jogar golfe. Se alguém puder
b=body<-
trabalhar, pode haver alguns bytes de economia (refine todas as funções comb
depois"-"="+"="/"="*"
). Inicialmente, tentou substituir e analisar a avaliação, mas a ordem das operações e parênteses era aterrorizante.fonte
f, ...
a definição daReduce
função e se livrandostdin()
,scan
mas tentei um pouco ingênuo abordagem que eliminou mais dois bytes, definindo as funções de maneira um pouco diferente. tio.run/##XcvLCsMgEAXQrwnO6Gge29B/...Lex + C,
78,74, 73 bytesO primeiro caractere é um espaço.
Lê de
stdin
, retorna resultado.Compile com
lex golfed.l && cc lex.yy.c main.c -lm -lfl
, teste principal:fonte
Javascript (ES5), 127 bytes
Ungolfed:
fonte
Pitão, 23 bytes
Um programa completo que recebe a entrada como uma sequência e imprime o resultado.
Esta é uma porta da resposta Python do @ xnor .
Experimente online
Como funciona
fonte
u@[yGhG0tG0/G2)CHQ0
19 bytesPHP, 79 bytes
fonte
1
; você precisa dividir e multiplicar por2