Calculadora de operação inteira simples

28

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:

  • +adiciona 1ao acumulador
  • -subtrai 1do acumulador
  • * multiplica o acumulador por 2
  • / divide o acumulador por 2

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 é , 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
dkudriavtsev
fonte
2
Então ... não é estritamente inteiro, pois /pode render não-inteiros.
Conor O'Brien
2
Então você deve especificar isso explicitamente.
Conor O'Brien
5
O que deve -/retornar?
Dennis
4
Não posso deixar de notar que o trecho de código apresentado na página inicial do rust-lang resolve esse desafio.
Zwei
4
Por favor, adicione mais casos de teste.
Martin Ender

Respostas:

28

Python 2, 48 bytes

i=0
for c in input():exec"i=i%s2&-2"%c
print i/2

Does +2, -2, *2, ou /2. Ao fazer +2e -2em vez de +1e -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.

xnor
fonte
Isto é brilhante! Se você quiser publicá-lo você mesmo, uma porta CJam atualmente estaria liderando o desafio: 0q{2\~-2&}/2/( 2\~avalia o operador com o segundo operando 2, -2&é o bit a bit AND, 2/é a divisão final por dois. q{...}/É um foreach sobre a entrada e 0é apenas a inicial valor).
Martin Ender
Você pode postar, eu não conheço CJam.
Xnor
Realmente inteligente! Portado para ES6 este seria facilmente superar a minha resposta
edc65
Uso brilhante de python. Aprendi algo novo com isso.
precisa saber é o seguinte
12

Haskell, 51 bytes

x#'+'=x+1
x#'-'=x-1
x#'*'=x*2
x#_=div x 2 
foldl(#)0

Exemplo de uso: foldl(#)0 $ "++**--/"-> 3.

nimi
fonte
12

Geléia , 18 17 bytes

‘

’

:2
Ḥ
O0;ṛĿ/

Experimente 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ódigo 0;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.

Dennis
fonte
10
Este parece ser a resposta geléia com o maior número de novas linhas
Conor O'Brien
10

Python 2, 54 bytes

i=0
for c in input():exec"i=i"+c+`~ord(c)%5%3`
print i

A entrada é aceita como uma string literal. ~ord(c)%5%3mapeia os operadores para os operandos direitos correspondentes.

Anteriormente, eu usei o hash(c)%55%3que não produzia resultados consistentes entre diferentes versões do Python. Isso me incentivou a explorar outras fórmulas.

xsot
fonte
não parece trabalho ...
Destrutível Lemon
55,3 e 65,4 são os dois mais curto para o dobro mod de hash em python 2
Jonathan Allan
@DestructibleWatermelon faz para mim: ideone
Jonathan Allan
Eu acho que 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]
SP3000
1
funciona em ideone, mas não no python dos meus computadores. Provavelmente dependente da versão; nesse caso, a versão deve ser anotada EDIT: ninja'd: /
Destructible Lemon
10

SILOS , 133 211 bytes

:s
def : lbl G GOTO
readIO
i-46
if i a
i+2
if i b
i+2
if i c
i+1
if i d
G e
:a
G v
:p
a-1
a/2
G o
:v
a+1
if a p
a-1
j=a
j/2
k=j
k*2
k-a
a/2
if k t
G o
:t
a-1
:o
G s
:b
a-1
G s
:c
a+1
G s
:d
a*2
G s
:e
printInt a

Toma os códigos ASCII dos operadores.

Experimente online com casos de teste:
-/
++**--/
*///*-*+-+

betseg
fonte
o loadLine é mais golfista?
Rohan Jhunjhunwala 29/08
O PO esclarecido; -/deve retornar -1 , não 0 .
Dennis
@Dennis fixed. Porém, foram adicionados muitos bytes: /
betseg
9

Máquina de Turing - 23 estados (684 bytes)

Experimente aqui - permalink

0 * * r 0
0 _ . l 1
1 * * l 1
1 _ * l 2
2 * 0 r 3
3 _ * r 3
3 + _ l +
3 - _ l -
3 x _ l x
3 / _ l /
+ _ * l +
+ * * * 4
4 - * l 5
4 _ 1 r 6
4 0 1 l 7
4 1 0 l 4
- _ * l -
- * * * 5
5 - * l 4
5 _ * r 8
5 0 1 l 5
5 1 0 l 7
x * * l x
x 1 0 l 9
x 0 0 l a
9 _ 1 r 6
9 1 1 l 9
9 0 1 l a
a _ _ r 6
a 1 0 l 9
a 0 0 l a
/ _ * l /
/ * * l b
b * * l b
b _ * r c
c 0 0 r d
c 1 0 r e
d * * l 7 
d 0 0 r d
d 1 0 r e
e _ * l 7
e - * l 4
e 0 1 r d
e 1 1 r e
8 * * r 8
8 - _ r 3
8 _ - r 3
7 * * l 7
7 _ * r f
f 0 _ r f
f 1 * r 6
f * _ l g
g * 0 r 6
6 * * r 6
6 _ * r 3
3 . _ l h
h _ * l h
h - _ l i
h * * l halt
i * * l i
i _ - r halt

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

init2 * * r init2
init2 _ . l init0
init0 * * l init0
init0 _ * l init1
init1 * 0 r readop
readop _ * r readop
readop + _ l +
readop - _ l -
readop x _ l x
readop / _ l /
+ _ * l +
+ * * * inc
inc - * l dec
inc _ 1 r return
inc 0 1 l zero
inc 1 0 l inc
- _ * l -
- * * * dec
dec - * l inc
dec _ * r neg
dec 0 1 l dec
dec 1 0 l zero
x * * l x
x 1 0 l x1
x 0 0 l x0
x1 _ 1 r return
x1 1 1 l x1
x1 0 1 l x0
x0 _ _ r return
x0 1 0 l x1
x0 0 0 l x0
/ _ * l /
/ * * l //
// * * l //
// _ * r div
div 0 0 r div0
div 1 0 r div1
div0 * * l zero 
div0 0 0 r div0
div0 1 0 r div1
div1 _ * l zero
div1 - * l inc
div1 0 1 r div0
div1 1 1 r div1
neg * * r neg
neg - _ r readop
neg _ - r readop
zero * * l zero
zero _ * r zero1
zero1 0 _ r zero1
zero1 1 * r return
zero1 * _ l zero2
zero2 * 0 r return
return * * r return
return _ * r readop
readop . _ l fin
fin _ * l fin
fin - _ l min
fin * * l halt
min * * l min
min _ - r halt

Explicação dos estados:

Inicialização:
esses estados são visitados uma vez no início de cada execução, começando com init2

  • init2: Mova todo o caminho para a direita e coloque um '.'. Dessa forma, a TM sabe quando parar. Mude para 'init0'.
  • init0: Mova todas as costas para a esquerda até que a cabeça leia um espaço. Em seguida, mova uma célula para a esquerda. Mude para 'init1'.
  • init1: Coloque um zero e mova uma célula para a direita e mude para 'readop'.

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

  • fin, min: Mova o '-' na frente do número, se necessário. Pare.
KoreanwGlasses
fonte
1
A leitura deste código foi muito, muito legal. Então, obrigado por alegrar o meu dia.
Jacobr365
8

Perl 6 , 53  52 bytes

{([Ro] %(<+ - * />Z=>*+1,*-1,* *2,*div 2){.comb})(0)}

{[Ro](%(<+ - * />Z=>*+1,*-1,*×2,*div 2){.comb})(0)}

Explicação:

# bare block lambda that has one implicit parameter 「$_」
{
  (
    # reduce the code refs using ring operator 「∘」 in reverse 「R」
    [R[o]]

      # produce a hash from:
      %(

        # list of pairs of "operator" to code ref
        # ( similar to 「'+' => { $^a + 1 }」 )

          # keys
          < + - * / >

        # keys and values joined using infix zip operator 「Z」
        # combined with the infix Pair constructor operator 「=>」
        Z[=>]

          # values (Whatever lambdas)
          * + 1,
          * - 1,
          * × 2, # same as 「* * 2」
          * div 2,

      ){

        # split the block's argument into chars
        # and use them as keys to the hash
        # which will result in a list of code refs
        .comb

      }

  # call composed code ref with 0
  )(0)
}

Uso:

my $input = '++**--/'
my $output = {[Ro](%(<+ - * />Z=>*+1,*-1,*×2,*div 2){.comb})(0)}.( $input );
say $output; # 3
say $output.^name; # Int
Brad Gilbert b2gills
fonte
7

C, 63 62 57 bytes

s,t;c(char*x){for(;*x;s+=t<4?t?2-t:s:-s>>1)t=*x++%6;s=s;}

Wandbox

o79y
fonte
6

05AB1E , 20 bytes

Obrigado ao Enigma por corrigir o -/erro -bug!

Para 16 bytes se não fosse inteiro Divisão: Î"+-*/""><·;"‡.V.

Î…+-*"><·"‡'/"2÷":.V

Explicação:

Î                      # Push 0, which is our starting variable, and input
 …+-*                  # Push the string "+-*"
     "><·"             # Push the string "><·"
          ‡            # Transliterate. The following changes:
                           "+" -> ">"
                           "-" -> "<"
                           "*" -> "·"
           '/"2÷":     # Replace "/" by "2÷"
                  .V   # Evaluate the code as 05AB1E code...
                           '>' is increment by 1
                           '<' is decrement by 1
                           '·' is multiply by 2
                           '2÷' is integer divide by two
                       # Implicitly output the result

Usa a codificação CP-1252 . Experimente online!

Adnan
fonte
O PO esclarecido; -/deve retornar -1 , não 0 .
Dennis
O problema de divisão de número negativo pode ser corrigido com Î…+-*"><·"‡'/"2÷":.Va mesma contagem de bytes.
Emigna
@Dennis Corrigido o problema.
Adnan
@Emigna Thanks :)
Adnan
5

JavaScript ES6, 80 68 bytes

k=>[...k].reduce((c,o)=>+{"+":c+1,"-":c-1,"*":c*2,"/":c/2|0}‌​[o],0)

Economizou 12 bytes graças a Neil!

Conor O'Brien
fonte
A segunda resposta seria mais legível se você removesse o arquivo "c"+e o escrevesse "c+1 c-1 c*2 c/2|0".splitetc.
Neil
Para a primeira resposta, por que não escrever o=>c=[c+1,c-1,c*2,c/2|0]["+-*/".indexOf(o)], ou acho que você pode salvar um byte adicional usando o=>c={"+":c+1,"-":c-1,"*":c*2,"/":c/2|0}[o].
Neil
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 ...
Neil
@ Neil Ah, sim, eu esqueci isso #
Conor O'Brien
1
De alguma forma, você tem caracteres de largura zero entre }e [o], portanto, esse comprimento é de apenas 66 bytes. Além disso, o OP esclareceu; -/deve retornar -1 , não 0 .
Dennis
5

Ruby, 48 44 42 + 1 = 43 bytes

+1 byte para -nsinalizador. Recebe entrada em STDIN.

i=0
gsub(/./){i=i.send$&,"+-"[$&]?1:2}
p i

Veja-o no ideone (usa, $_pois o ideone não usa sinalizadores de linha de comando): http://ideone.com/3udQ3H

Jordânia
fonte
5

PHP 76 bytes

for(;$c=$argv[1][$n++];)eval('$s=floor($s'.$c.(2-ord($c)%11%3).');');echo$s;
Jörg Hülsermann
fonte
4

Python 2, 58 56 bytes

-2 bytes graças a @Lynn

r=0
for c in input():exec'r=r'+c+`2-ord(c)%11%3`
print r

Os ordinais dos personagens +-*/são 43,45,42,47modulo 11 estes são 10,1,9,3modulo 3 esses são 1,1,0,0, 2 a menos que aqueles são 1,1,2,2dando os valores que precisamos para cada operação: r=r+1, r=r-1, r=r*2, er=r/2


Anterior:

r=0
for c in input():exec'r=r'+c+`(ord(c)%5==2)+1`
print r
Jonathan Allan
fonte
Que tal 2-ord(c)%11%3?
Lynn
@ Lynn Bem, eu vou levá-lo se estiver tudo bem com você? (mas realmente acho que é o suficiente de uma mudança que você pode postá-lo)
Jonathan Allan
2
Vá em frente :) ----
Lynn
4

Mathematica, 83 73 70 bytes

10 bytes salvos devido a @MartinEnder .

(#/*##2&@@#/.Thread[{"+","-","*","/"}->{#+1&,#-1&,2#&,⌊#/2⌋&}])@0&

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.

LegionMammal978
fonte
4

SILOS , 175 164 bytes

loadLine
a=256
o=get a
lbla
a+1
o-42
p=o
p-1
p/p
p-1
r-p
s=o
s-3
s/s
s-1
r+s
m=o
m/m
m-2
m|
r*m
t=r
t%2
d=o
d-5
d/d
d-1
t*d
d-1
d|
r-t
r/d
o=get a
if o a
printInt r

Experimente online!

Método de entrada são. Divisão inteira correta (arredondar para -in infinito).

Freira Furada
fonte
4

C #, 87 81 bytes

int f(string s){int i=0;foreach(var c in s)i=c<43?i*2:c<46?i+44-c:i>>1;return i;}

Ungolfed:

int f(string s)
{
    int i = 0;

    foreach (var c in s)
        i = c < 43 ? i * 2
          : c < 46 ? i + 44 - c
          : i >> 1;

    return i;
}

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 -.

Scepheo
fonte
Algum amor pela nova sintaxe C # 6 e pelo método agregado do Linq? int f(string s)=>s.Aggregate(0,(i,c)=>c<43?i*2:c<46?i+44-c:i>>1);(65 bytes)
Cyril Gandon
@CyrilGandon, tanto quanto sei, teria que incluir o "using System.Linq;", tornando-o 19 mais longo e colocando-o em 84 bytes. É por isso que eu não fiz isso.
Scepheo
4

Javascript (ES6), 57 bytes (matriz) / 60 bytes (inteiro)

Retornando uma matriz de todos os resultados intermediários:

o=>[...o].map(c=>x=[x>>1,x+1,x*2,x-1][eval(2+c+3)&3],x=0)

Por exemplo, a saída para "++**--/"será [1, 2, 4, 8, 7, 6, 3].

Retornando apenas o resultado final:

o=>[...o].reduce((x,c)=>[x>>1,x+1,x*2,x-1][eval(2+c+3)&3],0)

Como funciona

Ambas as soluções são baseados na mesma idéia: usar a função hash perfeita eval(2+c+3)&3para mapear os diferentes caracteres operador cem [0, 3].

 operator | eval(2+c+3)  | eval(2+c+3)&3
----------+--------------+---------------
    +     |  2+3 = 5     |    5 & 3 = 1
    -     |  2-3 = -1    |   -1 & 3 = 3
    *     |  2*3 = 6     |    6 & 3 = 2
    /     |  2/3 ~= 0.67 | 0.67 & 3 = 0
Arnauld
fonte
3

JavaScript (ES6), 57

a=>[...a].map(c=>a=c<'+'?a<<1:c<'-'?-~a:c<'/'?~-a:a>>1)|a

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:

a=>[...a].map(c=>a=eval(~~a+c+2))&&a>>1

(se você gosta disso, vote nele)

Teste

f=a=>[...a].map(c=>a=c<'+'?a<<1:c<'-'?-~a:c<'/'?~-a:a>>1)|a

function update() {
  O.textContent = f(I.value);
}

update()
<input value='++**--/' id=I oninput='update()'><pre id=O></pre>

edc65
fonte
3

Java, 77 bytes

int f(String s){return s.chars().reduce(0,(r,c)->c<43?r*2:c<46?r+44-c:r>>1);}

Usa java 8 streams.

primodemo
fonte
1
Boa resposta e bem-vindo ao site! Eu não sei nada sobre java, mas você pode mudar r >> 1para r>>1e salvar 2 bytes?
DJMcMayhem
Você está absolutamente correto, obrigado @DJMcMayhem
primodemus
1
Incrível, feliz por poder ajudar! Mais uma nota, estou contando 77 bytes. Você incluiu a nova linha na sua contagem de bytes? Você pode tirar mais um byte, pois isso não é necessário.
DJMcMayhem
@DJMcMayhem novamente correta, as contagens aparentemente wc o byte-terminanting nulo ou algo assim ...
primodemus
1
como você está usando java8, por que não definir a função usando lambda, s->s.chars().reduce(0,(r,c)->c<43?r*2:c<46?r+44-c:r>>1);que lhe dará 56 bytes
user902383
3

GNU sed, 65 59 57 bytes

Edit: 2 bytes mais curtas graças a Toby Speight comentários 's

s/[+-]/1&/g
s/*/2&/g
s:/:d0>@2&:g
s/.*/dc -e"0[1-]s@&p"/e

Corre:

sed -f simple_calculator.sed <<< "*///*-*+-+"

Saída:

-1

O sedscript prepara a entrada para a dcchamada 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/.

seshoumara
fonte
Você não precisa as aspas ao redor do argumento para dc, se não há espaços, e há arquivos que correspondam ao [1-]padrão ...
Toby Speight
@TobySpeight Na minha cabeça, mudei o significado de swith S. 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.
precisa saber é o seguinte
1
dc não interpretará o argumento -ecomo 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 com 01s@ou 0-s@.
Toby Speight
@TobySpeight você estava certo sobre -ea 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
seshoumara
Ah, sim, eu não considerei o >. 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 uma s///substituição, de modo nenhum benefício lá ...
Toby Speight
3

PHP, 75 bytes

Isso usa uma versão modificada da resposta de Jörg Hülsermann .

eval(preg_replace('~.~','$s=($s\0(2-ord("\0")%11%3))|0;',$argv[1]));echo$s;

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 -rsinalizador.


Experimente aqui:

Ou tente: http://sandbox.onlinephpfunctions.com/code/7d2adc2a500268c011222d8d953d9b837f2312aa

Diferenças:

  • Em vez de echo$s, estou usando sprintf($s). Ambos realizam a mesma ação nos números. Como isso é apenas para teste, não há problema.
  • Caso não haja argumento passado, ele será executado como se você fosse ++*+o primeiro argumento, o que deve ser mostrado 5.
Ismael Miguel
fonte
Yay! O emodificador está de volta! : D
Tito
@ Titus eu não entendo. Você pode elaborar um pouco?
Ismael Miguel
O PHP anterior à versão 7 tinha um modificador de padrãoe , que foi substituído por preg_replace_callbacke poderia ser abusado ... mas isso não é exatamente isso.
Titus
@Titus Esse modificador patern foi usado para dizer que a saída seria o código PHP real e para tentar manter a sintaxe correta. Isso aqui, não o usa, mas substitui cada caractere por um pedaço de código a ser executado, independentemente de sua sintaxe. As entradas incorretas causarão sérios problemas de segurança.
Ismael Miguel
Eu sei. Mas parece.
Titus
2

Lote, 61 bytes

@set n=
@for %%a in (%*)do @set/an=n%%a2^&-2
@cmd/cset/an/2

Tradução da resposta xcellent xcellent em Python.

Neil
fonte
2

Pyke, 24 22 bytes

\*\}:\/\e:\+\h:\-\t:0E

Experimente aqui!

Ou 12 bytes (não competitivo)

~:"ht}e".:0E

Experimente aqui!

Adicionar translatenó - basicamente várias localizações e substituições.

~:           -   "+-*/"
        .:   -  input.translate(^, V)
  "ht}e"     -   "ht}e"
          0E - eval(^, stack=0)
Azul
fonte
2

PHP, 104 102 82 bytes

Primeira versão com eval:

$i=0;while($c<9999)eval('$i'.['+'=>'++','-'=>'--','*'=>'*=2','/'=>'>>=1'][$argv[1]{$c++}].';');echo$i;

Segunda versão com operadores ternários:

while($o=ord($argv[1]{$c++}))$i=$o<43?$i*2:($o<44?$i+1:($o<46?$i-1:$i>>1));echo$i;

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 $ibase 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 /e intdivpossui muitos bytes; portanto, fazemos o deslocamento à direita .

Atualizações

  1. Salva 2 bytes encurtando $i=$i>>1para $i>>=1para a divisão inteira.
  2. Jogou fora a avaliação em favor dos operadores ternários.
YetiCGN
fonte
2

Python 3, 98 66 60 bytes

Obrigado Tukkax!

Não é tão golfista quanto a outra resposta, mas não posso competir com eles sem plágio.

i=0
for c in input():i+=[1,-i//2,-1,i][ord(c)%23%4]
print(i)

Além disso, eu tenho uma solução lambda recursiva também

73 67 bytes (aprimorado!)

s=lambda x,z=0:s(x[1:],z+[1,-z//2,-1,z][ord(x[0])%23%4])if x else z
Limão destrutível
fonte
Através da aplicação de parte de sua solução recursiva para a versão processual: 60 Bytes: 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 como int(raw_input()).
Yytsi 29/08/16
@TuukkaX não funciona para z = 0 ( +-faz 1)
Destructible Lemon
oh sim, meu erro.
Yytsi 29/08/16
1
Adicione o título Python3, por favor.
Yytsi 29/08/16
2

R, 201 bytes

Golfe

p=.Primitive;"-"="+"=function(x)p("+")(x,1);body(`-`)[[1]]=p("-");"*"="/"=function(x)p("*")(x,2);body(`/`)[[1]]=p("%/%");Reduce(function(f, ...)f(...),rev(mget(strsplit(scan(stdin(),""),"")[[1]])),0,T)

Comentado

p = .Primitive                       # Redefine
"-" = "+" = function(x)p("+")(x,1)   # Define - and +
body(`-`)[[1]] = p("-")              # Change the body, what we do to save a byte
"*" = "/" = function(x)p("*")(x,2)   # Same as above
body(`/`)[[1]] = p("%/%")            # Same as above
Reduce(function(f, ...)f(...),       # Function wrapper to evaluate list of func.  
  rev(mget(strsplit(scan(stdin(),""),"")[[1]])), # Strsplit input into list of functions
  init = 0,                                      # Starting Arg = 1
  right = T)                                     # Right to left = True 

A estratégia é refinar os +, -, %operadores. Divida a sequência e analise-a em uma longa lista de funções, a serem alimentadas no Reduce()'sacumulador.

Não podia mais jogar golfe. Se alguém puder b=body<-trabalhar, pode haver alguns bytes de economia (refine todas as funções com bdepois "-"="+"="/"="*"). Inicialmente, tentou substituir e analisar a avaliação, mas a ordem das operações e parênteses era aterrorizante.

Vlo
fonte
Isso é um ano depois, mas eu consegui reduzi-lo em 10 bytes trocando um pouco sua abordagem - você pode eliminar 8 bytes removendo o espaço entre f, ...a definição da Reducefunção e se livrando stdin(), scanmas tentei um pouco ingênuo abordagem que eliminou mais dois bytes, definindo as funções de maneira um pouco diferente. tio.run/##XcvLCsMgEAXQrwnO6Gge29B/...
Giuseppe
1

Lex + C, 78 , 74 , 73 bytes

O primeiro caractere é um espaço.

 c;F(){yylex(c=0);return c;}
%%
\+ c++;
- c--;
\* c*=2;
\/ c=floor(c/2.);

Lê de stdin, retorna resultado.

Compile com lex golfed.l && cc lex.yy.c main.c -lm -lfl, teste principal:

int main() { printf("%d\n", F()); }
Stefano Sanfilippo
fonte
1

Javascript (ES5), 127 bytes

function(b){for(a=c=0;a<b.length;++a)switch(b[a]){case"+":++c;break;case"-":--c;break;case"*":c*=2;break;case"/":c/=2}return c}

Ungolfed:

function c(a){
  c=0;
  for(var i=0;i<a.length;++i){
    switch(a[i]){
      case "+":++c;break;
      case "-":--c;break;
      case "*":c*=2;break;
      case "/":c/=2;break;
    }
  }
  return c;
}
Paul Schmitz
fonte
1

Pitão, 23 bytes

FNQ=Z.v%".&%sZ2_2"N;/Z2

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

FNQ=Z.v%".&%sZ2_2"N;/Z2   Program. Input: Q. Z initialised as 0
FNQ                       For. For N in Q:
        ".&%sZ2_2"         String. Literal string ".&%sZ2_2"
       %          N        String format. Replace %s with the current operator N
           %sZ2            Operator. Yield Z*2, Z//2, Z+2, Z-2 as appropriate
         .&    _2          Bitwise and. Result of above & -2
     .v                    Evaluate. Yield the result of the expression
   =Z                      Assignment. Assign result of above to Z
                   ;      End. End for loop
                    /Z2   Integer division. Yield Z//2
                          Print. Print the above implicitly 
TheBikingViking
fonte
1
Converter Python em Pyth é principalmente uma má ideia. u@[yGhG0tG0/G2)CHQ019 bytes
Jakube 29/08
@ Obrigado Jakube - Eu sou muito novo em Pyth, então qualquer conselho é apreciado. Fique à vontade para postar isso como uma resposta separada, pois é uma abordagem diferente.
TheBikingViking 29/08/16
1

PHP, 79 bytes

<?$i=0;switch($_POST['a']){case"+":$i+1;case"-":$i-1;case"/":$i/2;case"*":$i*2}
Ursinho Pooh
fonte
2
Inclua o número de bytes no cabeçalho, remova espaços desnecessários e use nomes de variáveis ​​com 1 letra.
TuxCrafting 29/08/16
Isso é mesmo golfe ?! :-D
YetiCGN
@ TùxCräftîñg eu fiz isso.
Winnie The Pooh
Você divide e multiplica 1; você precisa dividir e multiplicar por2
TuxCrafting
@ TùxCräftîñg eu fiz isso.
Winnie The Pooh