A última vez em que tentei criar algo fácil que não fosse duplicado, acabou sendo muito difícil. Então, espero que desta vez seja algo que os novatos também possam tentar.
Entrada:
Uma matriz / lista com números inteiros / decimais. (Ou uma sequência que representa uma matriz com números inteiros / decimais.)
Resultado:
Faça um loop pelos números e aplique os cinco operandos matemáticos a seguir nesta ordem:
- Adição (
+
); - Subtração (
−
); - Multiplicação (
*
ou×
ou·
); - Divisão Real / Calculadora (
/
ou÷
); - Exponenciação (
^
ou**
).
(NOTA: Os símbolos entre parênteses são apenas adicionados como esclarecimento. Se sua linguagem de programação usa um símbolo completamente diferente para a operação matemática dos exemplos, é claro que isso é completamente aceitável.)
Continue continuando até chegar ao final da lista e forneça o resultado da soma.
Regras do desafio:
- A exponenciação por 0 (
n ^ 0
) deve resultar em 1 (isso também se aplica a0 ^ 0 = 1
). - Não há casos de teste para divisão por 0 (
n / 0
), então você não precisa se preocupar com esse caso extremo. - Se a matriz contiver apenas um único número, retornamos isso como resultado.
Regras gerais:
- Isso é código-golfe , então a resposta mais curta em bytes vence.
Não permita que idiomas com código de golfe o desencorajem a postar respostas com idiomas que não sejam codegolf. Tente encontrar uma resposta o mais curta possível para 'qualquer' linguagem de programação. - As regras padrão se aplicam à sua resposta, para que você possa usar STDIN / STDOUT, funções / método com os parâmetros adequados, programas completos. Sua chamada.
- As brechas padrão são proibidas.
- Se possível, adicione um link com um teste para o seu código.
Casos de teste:
[1,2,3,4,5] -> 0
-> 1 + 2 = 3
-> 3 - 3 = 0
-> 0 * 4 = 0
-> 0 / 5 = 0
[5,12,23,2,4,4,2,6,7] -> 539
-> 5 + 12 = 17
-> 17 - 23 = -6
-> -6 * 2 = -12
-> -12 / 4 = -3
-> -3 ^ 4 = 81
-> 81 + 2 = 83
-> 83 - 6 = 77
-> 77 * 7 -> 539
[-8,50,3,3,-123,4,17,99,13] -> -1055.356...
-> -8 + 50 = 42
-> 42 - 3 = 39
-> 39 * 3 = 117
-> 117 / -123 = -0.9512...
-> -0.9512... ^ 4 = 0.818...
-> 0.818... + 17 = 17.818...
-> 17.818... - 99 -> -81.181...
-> -81.181... * 13 = -1055.356...
[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2] -> 256
-> 2 + 2 = 4
-> 4 - 2 = 2
-> 2 * 2 = 4
-> 4 / 2 = 2
-> 2 ^ 2 = 4
-> 4 + 2 = 6
-> 6 - 2 = 4
-> 4 * 2 = 8
-> 8 / 2 = 4
-> 4 ^ 2 = 16
-> 16 + 2 = 18
-> 18 - 2 = 16
-> 16 * 2 = 32
-> 32 / 2 = 16
-> 16 ^ 2 = 256
[1,0,1,0,1,0] -> 1
-> 1 + 0 = 1
-> 1 - 1 = 0
-> 0 * 0 = 0
-> 0 / 1 = 0
-> 0 ^ 0 = 1
[-9,-8,-1] -> -16
-> -9 + -8 = -17
-> -17 - -1 = -16
[0,-3] -> -3
-> 0 + -3 = -3
[-99] -> -99
fonte
n ^ 0 = 1
mas0 ^ n = 0
. O conflito é resolvido definindo asn != 0
duas regras, mas deixa0 ^ 0
indefinido. No entanto, existem muitas coisas que se encaixam perfeitamente na matemática, se isso0 ^ 0
for definido1
. Veja a Wikipedia para alguns detalhes.Respostas:
Gelatina , 13 bytes
Experimente online! ou verifique todos os casos de teste .
Como funciona
fonte
Javascript ES7 49 bytes
Economizou 9 bytes graças a Dom Hastings, economizou outros 6 graças a Leaky Nun
Usa o novo operador de exponenciação.
fonte
Infinity
, não será um erro?Haskell,
76656462 bytesObrigado a @ Damien por remover mais dois bytes =)
Isso usa o
>>
que aqui apenas anexa a lista[(+),...]
àslength v
vezes em si . O restante ainda funciona da mesma forma que as versões antigas.Versões antigas:
Essas soluções fazem uso das listas infinitas, como
cycle[...]
apenas repete a lista fornecida infinitamente. Então, basicamente, ele ézip
editado com a lista de números e nós apenasfold
( reduzimos em outros idiomas) a lista compactada por meio de um lambda, que aplica os operadores ao elemento acumulador / lista atual.fonte
foldl(&)u$zipWith(&)v(flip<$>v>>[…])
?import
para&
, de modo que seria mais longo novamente, mas, de qualquer forma, obrigado!uncurry
. Não deu certo, mas notei que você deve salvar outro byte usando em$
vez de parênteses.Pyke,
2221 bytesExperimente aqui!
fonte
Haskell, 61 bytes
Cria uma série de transformações em uma lista, como em [adicionar 1, adicionar 2, subtrair 3, ...], começando com 2 adições porque começamos com 0 na dobra. A seguir, fazemos o que chamo de List Application Fold, ou foldl (flip id), que aplica uma lista de homomorfismos em série. Isso começa com zero, adiciona o valor inicial e depois todas as transformações computadas acima para obter um resultado final.
Observe que (flip id) é igual a (\ x y-> yx), apenas mais curto.
Uso da amostra:
fonte
flip id
, você pode simplesmente usar&
. Orflip($)
. Uau, eu nunca percebi($) = id
&
está definido emData.Function
, então você precisa doimport
também. Talvez algum intérprete online o importe por padrão, mas você precisará especificar qual deles usar.TSQL
11611588 bytesGraças à sugestão de Ross Presser, consegui jogar com até 88 caracteres
Experimente online
fonte
Pitão,
272625 bytesSuíte de teste.
Pyth usa a notação de prefixo:
1+2
é escrito como+1 2
(espaço necessário para separar números).Portanto, para o primeiro caso de teste, a expressão seria
(((1+2)-3)*4)/5
, que na notação de prefixo, seria escrita como/*-+ 1 2 3 4 5
.Em Pyth, a divisão de flutuação é em
c
vez de/
, então ela se tornac*-+ 1 2 3 4 5
.Além disso, em Pyth,
-100
está escrito como alternativa_100
.Portanto, para o caso de teste em terceiro lugar, que é
((((((((-8+50)-3)*3)/-123)^4)+17)-99)*13)
, torna-se:*-+^c*-+ _8 50 3 3 _123 4 17 99 13
.História
v:P+*lQ\(ssV+R\)Q*"+-*/p"lQ\p"**"
.vs+_XUtQUQ"+-*c^"m:+;d\-\_
.vs+_XUtQUQ"+-*c^":jdQ\-\_
fonte
Na verdade, 23 bytes
Experimente online!
Na verdade, usa a notação postfix para matemática, e os operadores que apenas recebem dois argumentos (como os operadores para adição, subtração, multiplicação, divisão e exponenciação) não fazem nada quando existe apenas um elemento na pilha. Assim, transformar a entrada em código na verdade é tão simples quanto reverter a entrada, formatá-la como numérica e anexar as operações. Em seguida, o código resultante pode ser executado, fornecendo a saída desejada.
Explicação:
Exemplo de código traduzido para entrada
1,2,3,4,5
:fonte
s/Actually uses postfix notation/Actually actually uses postfix notation/
Julia,
5350 bytesExperimente online!
fonte
J, 40 bytes
Localiza o número de valores necessários para usar um múltiplo de 5 operadores, que pads com os valores de identidade desses operadores. Em ordem,
+
é 0,-
é 0,*
é 1,%
é 1 e^
é 1, que pode ser um valor de bit00111
ou 7 na base 10. Em seguida, opera nessa lista enquanto percorre os operadores.Uso
Explicação
fonte
Python 2,
816764 bytesEntrada é uma matriz de carros alegóricos. Teste em Ideone .
Como funciona
'*+-*/*'[i::5]
seleciona cada quinto caractere da sequência, começando com o do índice i , portanto, isso gera**
se i = 0 ,+
se i = 1 ,-
se i = 2 ,*
se i = 3 e/
se i = 4 . Como a cadeia tem comprimento 6 , a expressão produzirá uma cadeia vazia se i> 5 .Inicializamos a variável i para 10 . Para cada número n na matriz de entrada, construímos a string
r<op>=n
que éexec
executada.Inicialmente, i = 10 , também
<op>
é a string vazia e inicializa r comr+=n
. Após cada etapa, incrementamos i modulo 5 comi=-~i%5
, por isso, o próximo passo será recuperar o operador adequado.Quando todos os números de entrada tiverem sido processados, imprimiremos r , que mantém a saída desejada.
fonte
Matlab -
95 9185 bytes / oitava - 81 bytesA entrada está nesta forma
a = ['1' '2' '3' '4' '5'];
:, espero que isso seja coberto por "string representando uma matriz com números inteiros / decimais"; caso contrário, são necessários 2 num2str adicionalmente.Todo resultado intermediário é impresso no console, porque isso me salva alguns pontos e vírgulas.
a(1)
é executado para que seu valor seja salvo emans
. Também é claro que usarans
código não é uma boa prática.No Octave,
'+-*/^'(mod(i+2,5)+1)
também funciona, o que economiza outros 4 bytes, graças a Adám e Luis Mendo:Changelog:
fonte
b = '+-*/^'
ser golfed deb='+-*/^'
efor i = 2:length(a)
parafor i=2:length(a)
(retirar os espaços)? Além disso, talvez Dicas para jogar golfe no MATLAB possam ser interessantes para você. :)'+-*/^'(mod(i+2,5)+1)
válido?Mathematica,
676665 bytesSimples
Fold
com uma variáveli
segurando o índice.fonte
+##
vez de#+#2
CJam, 18 bytes
Entrada é uma matriz de carros alegóricos. Experimente online!
Como funciona
fonte
R ,
87 7870 bytesExperimente online!
fonte
do.call
... Eu provavelmente não deveria me considerar um programador R até que o faça!Advanced R
por Hadley Wickam é uma grande praia ler :)do.call
- me fez perceber que estava procurandoget
.Haskell - 74
Casos de teste:
Provavelmente poderia ser mais curto; O suporte de Haskell a listas infinitas e funções de ordem superior torna a solução direta bastante agradável. Uma versão do
^ :: Double -> Double -> Double
seria mais agradável para jogar golfe, mas não consegui encontrar uma. Felizmente, eu não precisava de um lambda completo, de modo que o estilo inútil raspava alguns bytes.fonte
(+)
à lista de operadores e começar afoldl
com0
a ir completamente pointfree e salvar o nome da função e parâmetros:foldl(\x(o,y)->o x y)0.zip((+):cycle[(+),(-),(*),(/),(**)])
.PowerShell v2 +, 124 bytes
Muito tempo, porque o PowerShell não possui um operador
^
ou**
, portanto, precisamos contabilizar um caso separado e usar uma chamada .NET.Pega a entrada
$n
como uma matriz, define nossa saída$o
como o primeiro dígito. Em seguida, verificamos o.count
array e, desde que seja maior que um, inserimos oif
. Caso contrário, pularemos oif
.Dentro do
if
loop pela matriz1..$y|%{...}
e a cada iteração, redefinimos$o
para um novo valor, o resultado de outraif/else
instrução. Desde que nosso contador$i++
não seja o módulo-5 igual a 4 (ou seja, não estamos no^
operador), simplesmente o aceitamos$o
e concatenamos com o símbolo apropriado'+-*/'[$x]
e o próximo número na matriz de entrada$n[$_]
. Nós canalizamos isso paraiex
(apelido paraInvoke-Expression
e semelhante aeval
), e isso é salvo novamente$o
. Se estamos no^
operador, estamos noelse
, então executamos uma[math]::Pow()
chamada e esse resultado é salvo novamente$o
.Nos dois casos, simplesmente enviamos
$o
para o pipeline e saímos , com a saída implícita.fonte
Ferrugem,
123, 117 bytesResposta original:
nomes estúpidos de métodos longos ^^ ahh muito melhor
destroçado
fonte
Perl 6 ,
70 68 6562 bytesExplicação:
Tecnicamente,
* + *
é uma lambda Qualquer que seja, mas é efetivamente a mesma&[+]
que é a abreviação&infix:<+>
do conjunto de sub-rotinas que lidam com adição numérica de infix.Eu não usei isso para multiplicação ou exponenciação, pois as maneiras de escrevê-las dessa maneira são pelo menos contanto que eu tenho (
*×*
ou* * *
e* ** *
)Teste:
Teste no ideone.com
(depois de atualizarem para uma versão Rakudo que não é de um ano e meio antes do lançamento oficial dos shows do Perl 6 )
fonte
Python 3,
8893 bytesComeçou sendo muito mais curto, mas a precedência do operador me derrotou e eu tive que incluir muitos parênteses ...
fonte
Oracle PL / SQL,
275254 bytesOs dados devem ser inseridos em uma tabela chamada
T
com uma colunaN
do tipoNUMBER
Uso:
Resultado:
Versão de 275 bytes:
fonte
Java 8,
173172167138137118113 bytesExplicação:
Experimente aqui.
fonte
double r=a[0];
adouble r=a[0],b;
salvar alguns bytes.float
, mas não há umMath.pow
para carros alegóricos, daí odouble
lugar. Obrigado pelo,b
. E comi++<a.length
eu recebo uma ArrayOutOfBoundsException emb=a[i];
(a menos que eu faça issoi++<a.length-1
, que é um byte a mais em vez de mais curto).== 4
para> 3
e== 0
para< 1
. Não tenho certeza, mas acho que você poderia economizar um pouco criando uma variável parai % 5
.<x
truque, reduzindo a função inteira para 137 caracteres.Alguns truques podem reduzir a abordagem do @ Willmore em 23 a 174 bytes (requer o php 5.6 ou posterior). A parte mais econômica é remover parênteses desnecessários (-10 bytes).
Mas usar o
**
operador em vez depow()
também permite usareval
com uma matriz para as operações; e com mais alguns truques ...PHP> = 5,6, 82 bytes
pega a lista nos parâmetros da linha de comando. Corra com
php -nr '<code>'
ou experimente online .versão antiga,
161 157 151 145 144 144 140 137117 bytesO golfe mais eficaz veio da escrita do resultado intermediário diretamente no primeiro elemento - após a mudança do resultado anterior da matriz.
demolir
suíte de teste
fonte
If the array contains just a single number, we return that as the result.
é bastante claro. Mas obrigado por me deixar revisitar isso.PHP ,
135130 bytesObrigado @titus, -5 bytes, mais 0 correção de caso!
Experimente online!
Menos golfe:
Estava realmente torcendo para que array_reduce () funcionasse para isso, mas requer muitos caracteres para superar a menor pontuação atual do PHP.
Publicá-lo de qualquer maneira, caso alguém tenha alguma sugestão!
fonte
$c
ocorrer0
. Salve dois bytes com uma função anônima em vez dew
.eval('$c'.['/','**','+','-','*'][$i++?$i%5:5].'=$x');return$c;
é seis bytes mais curto e deve resolver o problema zero.Braquilog , 68 bytes
Isso é longo ... mas não usa predicado de avaliação.
Explicação
Predicado principal
Predicado 1
fonte
IBM PC 8087 FPU,
66.82 bytesUsa apenas o coprocessador matemático Intel 8087 do PC IBM para cálculos.
Experimente offline! (no DOSBox ou o que for). Dê ao chip 8087 entediado do seu PC antigo algo a fazer, além de todas as planilhas do Lotus 1-2-3 que você costumava fazer nos anos 80.
Ungolfed (desmontado):
Resultado:
A entrada é feita através de um PROC (x86 mais equivalente a uma função), com BX sendo um ponteiro para uma matriz de WORDs na memória e CX sendo o número de itens e retornando o resultado em ST.
* Nota: O código real para a função é
66.82 bytes. Obviamente, o código para escrever um número de ponto flutuante no console (código do livro de receitas) é de 83 bytes. O programa de teste e os dados são183215 bytes, tornando o .COM executável305380 bytes no total.fonte
APL (Dyalog Unicode) ,
2927 bytes SBCSFunção prefixo tácito anômalo. Observe que
*
é exponenciação no APL.Experimente online!
Como o APL é executado da direita para a esquerda, podemos apenas reverter a ordem dos argumentos das operações inseridas e reverter toda a expressão. O Postfix
⍨
inverte argumentos. Depois de fazer uma mistura perfeita de números e operações, precisamos apenas reverter, nivelar e avaliar:≢{
…}⊢
Chame a seguinte função com contagem e números reais como⍺
e⍵
:'⍨'
esse personagem'+-×÷*',¨
acrescente cada um desses caracteres a isso;["+⍨","-⍨","×⍨","÷⍨","*⍨"]
⍺⍴
usar o argumento esquerdo (contagem de números) para ciclicamente r eshape que⌽
marcha ré⍕
formatar como sequência plana3↓
solte três caracteres principais (um espaço e um símbolo e⍨
)⍎
executar como código APLfonte
Japonês , 16 bytes
Experimente online!
Explicação:
fonte
c #,
238, 202 bytesEu não vi nenhuma solução c #, então darei uma. Este é o meu primeiro codegolf. Comecei a escrever em c # "há dois meses" (embora eu conheça Java até certo ponto).
Ele usa Stack
Casos não testados e de teste
Resultado:
fonte
a, Double.Parse
->a,Double.Parse
;while (s.Count
->while(s.Count
;Pow(l, r)
->Pow(l,r)
). Além disso, você pode removerint
na frente doj=
e colocá-lo atrás doint i=0,j;
. Ótima primeira resposta, porém, e mais uma vez bem-vinda. :)PHP,
206,198, 197 bytesUngolfed
Em PHP, lógica semelhante à minha resposta c # ( 202 bytes ) :).
fonte