Dada uma lista não vazia de números inteiros não negativos, considere reescrevê-la como um problema aritmético em que:
- Um sinal de adição (
+
) é inserido entre pares de números que aumentam da esquerda para a direita (também conhecido como do início da lista ao final). - Um sinal de menos (
-
) é inserido entre pares de números que diminuem da esquerda para a direita. - Um sinal de multiplicação (
*
) é inserido entre pares de números iguais.
Dito de outra maneira: qualquer sub-lista se a,b
torna a+b
se a<b
, a-b
se a>b
e a*b
se a==b
.
Por exemplo, a lista
[12, 0, 7, 7, 29, 10, 2, 2, 1]
se tornaria a expressão
12 - 0 + 7*7 + 29 - 10 - 2*2 - 1
que avalia como 75
.
Escreva um programa ou função que inclua essa lista e a avalie, imprimindo ou retornando o resultado.
- A ordem das operações é importante. Multiplicações devem ser feitas antes de qualquer adição ou subtração.
- Se a lista de entrada tiver um número, deve ser o que ela avalia. por exemplo,
[64]
deve dar64
. - O uso de
eval
ouexec
ou construções semelhantes é permitido.
Aqui estão alguns exemplos adicionais:
[list]
expression
value
[0]
0
0
[1]
1
1
[78557]
78557
78557
[0,0]
0*0
0
[1,1]
1*1
1
[2,2]
2*2
4
[0,1]
0+1
1
[1,0]
1-0
1
[1,2]
1+2
3
[2,1]
2-1
1
[15,4,4]
15-4*4
-1
[9,8,1]
9-8-1
0
[4,2,2,4]
4-2*2+4
4
[10,9,9,12]
10-9*9+12
-59
[1,1,2,2,3,3]
1*1+2*2+3*3
14
[5,5,4,4,3,3]
5*5-4*4-3*3
0
[3,1,4,1,5,9,2,6,5,3,5,9]
3-1+4-1+5+9-2+6-5-3+5+9
29
[7637,388,389,388,387,12,0,0,34,35,35,27,27,2]
7637-388+389-388-387-12-0*0+34+35*35-27*27-2
7379
O código mais curto em bytes vence. O desempatador é a resposta anterior.
code-golf
math
number
arithmetic
Passatempos de Calvin
fonte
fonte
Respostas:
Python 2, 63 bytes
Constrói
eval
es a string de expressão. O símbolo aritmético é escolhido comparando o número anteriorp
ao atualx
. O símbolo é anexado seguido pelo número atual.O primeiro número é tratado com um truque inteligente do Sp3000. O valor inicial de
p
é definido como uma sequência, que é maior que qualquer número e, portanto, causa a-
antes do primeiro número. Mas,s
é inicializado aoprint-
mesmo tempo em que inicia o resultadoprint--
(graças ao xsot por salvar 2 bytes ao inicializar comprint
.)fonte
print
para a string e usar emexec
vez deeval
.Pitão,
312619171615 bytesExpressões com
*
não serão avaliadas on-line, mas teoricamente funcionariam.2 bytes graças a Maltysen.
Conjunto de testes (com avaliação).
Os outros casos (sem avaliação).
História
M+G@"*-+"->GH<GHv+sgMC,JsMQtJ\x60e
M+G@"*-+"->GH<GHv+sgVQtQ\x60e
vtssVm@"*-+"->Zd<~Z
vtssVm@"*-+"._-~Z
vssVm@"*-+"._-~k
vsm+@"*-+"._-~k
fonte
+
e-
on-line)--safe
switch, que substituieval
porast.literal_eval
.Geléia ,
18161514 bytesNão usa avaliação interna. Experimente online! ou verifique todos os casos de teste .
Como funciona
fonte
eval
como um átomo ...MATL , 12 bytes
Isso usa a ótima idéia do @ aditsu de codificação em tamanho de execução.
Experimente online!
Explicação
fonte
CJam, 20
Experimente online
Explicação:
fonte
JavaScript (ES6), 54
eval
recebe uma lista de expressões separadas por vírgula e retorna o valor da última.Teste
fonte
Julia,
7657 bytesMinha primeira vez jogando golfe com Julia, então talvez haja melhorias óbvias. Experimente online!
Dennis economizou uma tonelada de bytes.
fonte
!
.Pitão -
232220 bytesComo no Kenny, a multiplicação não funciona online.
Teste o conjunto sem fazer avaliação .
fonte
R, 92 bytes
Provavelmente ainda há algum bom golfe que pode ser feito aqui.
Ungolfed:
fonte
Braquilog ,
3432 bytesExperimente online!
fonte
TI-BASIC, 146 bytes
Vou formatá-lo bem quando não estiver em dispositivos móveis. O sono me escapa, então você entende isso. Apreciar.
fonte
Javascript ES6,
6462 caracteresfonte
a
um parâmetro?a[i+1]...a[i+1]
=>a[++i]...a[i]
- 2 caracteres mais curta, mas substitui por engano toda a remoção do códigoa=>
).Java, 384 bytes
Tentativa sem golfe online
fonte
int a=l.length
,&&
=>&
, coloque oint i=0
na mesma "linha" comoint n=l[0],m
.if(i<l.length-2&&l[i+1]!=l[i+2])n+=l[i+1];else{m=l[i+1];while(i<l.length-2&&l[i+1]==l[i+2])m*=l[(i++)+1];n+=m;
, você pode simplesmente substituir isso pelo conteúdo dentro doelse
bloco.Javascript ES6, 79 caracteres
fonte
Perl, 49 bytes
Código de 48 bytes + 1 para
-p
Uso
Notas
Aprendi aqui que você pode capturar um lookahead no PCRE, embora seja um pouco pouco intuitivo (em
(?=(\d+))
vez de((?=\d+))
). No entanto, faz sentido depois de ler, pois você capturaria uma correspondência de comprimento zero (a cabeça de impressão) com a segunda e, em vez disso, capturaria a correspondência com a primeira.Obrigado a @ninjalj por salvar 8 bytes!
fonte
-e
gratuitamente, adicionando ump
tornando--pe
se um ? Será atualizado por enquanto, mas se você encontrar uma fonte que eu possa citar / vincular para daqui para frente, isso seria incrível!$&.qw(* - +)[$&<=>$1]
na parte de substituição dos///
operador.Na verdade, 30 bytes
Infelizmente, como o
≡
comando eval ( ) avalia apenas literais no TIO, esse programa não funciona no TIO.Explicação:
fonte
R ,
12044 bytesExperimente online!
O algoritmo é semelhante ao desta resposta , mas só o percebi depois de codificar minha resposta. Muito melhor do que minha resposta original que estava usando
eval(parse)
.Alavanca totalmente as operações vetorizadas de R - faz a
*
operação primeiro usandorle(x)$values ^ rle(x)$lenghts
e pontilha produtos com esse vetorsign( diff( rle(x)$values ) )
(previsto com1
).fonte
05AB1E (herdado) ,
171615 bytes-2 bytes graças a @Emigna .
Experimente online ou verifique todos os casos de teste .
Explicação:
fonte
>
movendo+
para o final da string.Ć
e¨
, se você usar‚ζ
em vez deø
‚ζ
é uma alternativa alternativa perfeita, pois o espaço é ignorado na avaliação. Obrigado novamente. :)PHP, 103 bytes
Desafio puro. Isso ficou mais do que o esperado. Eu acho que usar
array_map
ou similar não melhorará a contagem de bytes, pois as funções anônimas ainda são caras no PHP.Executa a partir da linha de comando, solicitará uma lista separada por vírgula, como:
fonte
PowerShell v2 +, 62 bytes
Recebe entrada como argumentos de linha de comando separados por espaço, que são convertidos em matriz automática
$args
. Nós iteramos através de cada elemento, usando a variável helper em$o
cada iteração para lembrar qual era a nossa entrada anterior. Usamos uma string indexada para obter o operador apropriado, efetuando cálculos nos valores booleanos convertidos implicitamente (por exemplo, se a entrada anterior for menor, a[]
avaliação é feita de1+2*0
forma que'*+-'[1]
o+
selecionado).As seqüências concatenadas são deixadas no pipeline. Recolhemos todos esses fragmentos em conjunto (por exemplo,
3-
,1+
,4-
, etc.) com uma-join
operação, concatenar sobre o número final (convertidas, implicitamente, a cadeia de caracteres), e inseri-lo emiex
(nome alternativo paraInvoke-Expression
e semelhantes aeval
).fonte
Japt , 25 bytes
Gostaria de abreviá-lo, mas não consegui fazer uma versão sem avaliação funcionar.
Experimente online!
fonte
Japonês
-x
,2119 bytesTente
Explicação
fonte