La última vez que intenté encontrar algo fácil que no fuera un duplicado, terminó siendo demasiado difícil ... Así que espero que esta vez sea algo que los recién llegados puedan probar también.
Entrada:
Una matriz / lista con enteros / decimales. (O una cadena que representa una matriz con enteros / decimales).
Salida:
Recorra los números y aplique los siguientes cinco operandos matemáticos en este orden:
- Suma (
+
); - Resta (
−
); - Multiplicación (
*
o×
o·
); - División Real / Calculadora (
/
o÷
); - Exponenciación (
^
o**
).
(NOTA: Los símbolos entre paréntesis solo se agregan como aclaración. Si su lenguaje de programación usa un símbolo completamente diferente para la operación matemática que los ejemplos, entonces eso es, por supuesto, completamente aceptable).
Continúa hasta llegar al final de la lista y luego da el resultado de la suma.
Reglas de desafío:
- La exponenciación por 0 (
n ^ 0
) debería dar como resultado 1 (esto también se aplica a0 ^ 0 = 1
). - No hay casos de prueba para la división por 0 (
n / 0
), por lo que no tiene que preocuparse por ese caso límite. - Si la matriz contiene solo un número, lo devolvemos como resultado.
Reglas generales:
- Este es el código de golf , por lo que la respuesta más corta en bytes gana.
No permita que los lenguajes de código de golf lo desalienten de publicar respuestas con idiomas que no sean de codegolf. Trate de encontrar una respuesta lo más breve posible para 'cualquier' lenguaje de programación. - Se aplican reglas estándar para su respuesta, por lo que puede usar STDIN / STDOUT, funciones / método con los parámetros adecuados, programas completos. Tu llamada.
- Las lagunas predeterminadas están prohibidas.
- Si es posible, agregue un enlace con una prueba para su código.
Casos de prueba:
[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
fuente
n ^ 0 = 1
pero0 ^ n = 0
. El conflicto se resuelve estableciendon != 0
ambas reglas, pero luego se deja0 ^ 0
indefinido. Sin embargo, hay muchas cosas que encajan bien en matemáticas si0 ^ 0
se define como tal1
. Ver Wikipedia para algunos detalles.Respuestas:
Jalea , 13 bytes
Pruébalo en línea! o verificar todos los casos de prueba .
Cómo funciona
fuente
Javascript ES7 49 bytes
Ahorré 9 bytes gracias a Dom Hastings, guardé otros 6 gracias a Leaky Nun
Utiliza el nuevo operador de exponenciación.
fuente
Infinity
, no un error?Haskell,
76656462 bytesGracias a @Damien por eliminar otros dos bytes =)
Esto usa el
>>
que aquí solo agrega la lista[(+),...]
a sí mismolength v
veces. El resto todavía funciona igual que las versiones anteriores.Versiones antiguas:
Estas soluciones hacen uso de las listas infinitas, ya que
cycle[...]
solo repite la lista dada infinitamente. Luego, básicamente, sezip
edita con la lista de números, y solofold
( reducimos en otros idiomas) la lista comprimida a través de una lambda, que aplica los operadores al acumulador / elemento de la lista actual.fuente
foldl(&)u$zipWith(&)v(flip<$>v>>[…])
?import
para&
, así que sería más tiempo nuevamente, ¡pero gracias de todos modos!uncurry
. No funcionó, pero noté que debería poder guardar otro byte usando en$
lugar de paréntesis.Pyke,
2221 bytesPruébalo aquí!
fuente
Haskell, 61 bytes
Crea una serie de transformaciones en una lista, como en [sumar 1, sumar 2, restar 3, ...], comenzando con 2 adiciones porque comenzamos con 0 en el pliegue. A continuación, hacemos lo que yo llamo el Pliegue de aplicación de lista, o foldl (flip id), que aplica una lista de homomorfismos en serie. Esto comienza con cero, agrega el valor inicial, luego realiza todas las transformaciones calculadas anteriormente para obtener un resultado final.
Tenga en cuenta que (flip id) es lo mismo que (\ x y-> yx), solo que más corto.
Uso de la muestra:
fuente
flip id
, simplemente podría usar&
. Oflip($)
. Wow, nunca me di cuenta($) = id
&
está definido enData.Function
, por lo que también necesita elimport
. Tal vez algún intérprete en línea lo importe por defecto, pero luego debe especificar cuál utiliza.TSQL
11611588 bytesGracias a la sugerencia de Ross Presser, pude jugar golf hasta 88 caracteres
Pruébalo en línea
fuente
Pyth,
272625 bytesBanco de pruebas.
Pyth usa notación de prefijo:
1+2
se escribe como+1 2
(espacio necesario para separar números).Por lo tanto, para el primer caso de prueba, la expresión sería
(((1+2)-3)*4)/5
, que en notación de prefijo, se escribiría como/*-+ 1 2 3 4 5
.En Pyth, la división flotante es en
c
lugar de/
, por lo que se conviertec*-+ 1 2 3 4 5
.Además, en Pyth,
-100
se escribe como en su_100
lugar.Por lo tanto, para el caso de prueba tercero, que es
((((((((-8+50)-3)*3)/-123)^4)+17)-99)*13)
, se convierte en:*-+^c*-+ _8 50 3 3 _123 4 17 99 13
.Historia
v:P+*lQ\(ssV+R\)Q*"+-*/p"lQ\p"**"
.vs+_XUtQUQ"+-*c^"m:+;d\-\_
.vs+_XUtQUQ"+-*c^":jdQ\-\_
fuente
En realidad, 23 bytes
Pruébalo en línea!
En realidad, usa la notación postfix para las matemáticas, y los operadores que solo toman dos argumentos (como los operadores de suma, resta, multiplicación, división y exponenciación) no hacen nada cuando solo hay un elemento en la pila. Por lo tanto, convertir la entrada en Código de hecho es tan simple como invertir la entrada, formatearla como números y agregar las operaciones. Entonces, el código resultante se puede ejecutar, dando la salida deseada.
Explicación:
Ejemplo de código traducido para entrada
1,2,3,4,5
:fuente
s/Actually uses postfix notation/Actually actually uses postfix notation/
Julia,
5350 bytesPruébalo en línea!
fuente
J, 40 bytes
Encuentra el número de valores necesarios para usar un múltiplo de 5 operadores, que los pads con los valores de identidad de esos operadores. En orden,
+
es 0,-
es 0,*
es 1,%
es 1 y^
es 1, que puede ser un valor de bit00111
, o 7 en la base 10. Luego opera en esa lista mientras se desplaza por los operadores.Uso
Explicación
fuente
Python 2,
816764 bytesLa entrada es una matriz de flotadores. Pruébalo en Ideone .
Cómo funciona
'*+-*/*'[i::5]
selecciona cada quinto carácter de la cadena, comenzando con el que está en el índice i , por lo que esto produce**
si i = 0 ,+
si i = 1 ,-
si i = 2 ,*
si i = 3 y/
si i = 4 . Como la cadena tiene una longitud 6 , la expresión producirá una cadena vacía si i> 5 .Inicializamos la variable i a 10 . Para cada número n en la matriz de entrada, construimos la cadena
r<op>=n
, que seexec
ejecuta.Inicialmente, i = 10 , también lo
<op>
es la cadena vacía, e inicializa r conr+=n
. Después de cada paso, incrementamos i modulo 5 coni=-~i%5
, por lo que el siguiente paso recuperará el operador adecuado.Cuando se han procesado todos los números de entrada e imprimimos r , que contiene la salida deseada.
fuente
Matlab -
95 9185 bytes / octava - 81 bytesLa entrada está en esa forma:
a = ['1' '2' '3' '4' '5'];
espero que esto esté cubierto por "cadena que representa una matriz con enteros / decimales", de lo contrario, se necesitan 2 num2str adicionalmente.Cada resultado intermedio se imprime en la consola porque eso me ahorra algunos puntos y comas.
a(1)
se ejecuta para que su valor se guarde enans
. También, por supuesto, usarans
código es una mala práctica.En Octave,
'+-*/^'(mod(i+2,5)+1)
también funciona, lo que ahorra otros 4 bytes, gracias Adám y Luis Mendo:Registro de cambios:
fuente
b = '+-*/^'
estar Jugamos al golf ab='+-*/^'
yfor i = 2:length(a)
afor i=2:length(a)
(quitando los espacios)? Además, quizás los consejos para jugar golf en MATLAB puedan ser interesantes para usted. :)'+-*/^'(mod(i+2,5)+1)
valido?Mathematica,
676665 bytesSimple
Fold
con una variable quei
contiene el índice.fuente
+##
lugar de#+#2
CJam, 18 bytes
La entrada es una matriz de flotadores. Pruébalo en línea!
Cómo funciona
fuente
R ,
87 7870 bytesPruébalo en línea!
fuente
do.call
... ¡Probablemente no debería considerarme un programador de R hasta que lo haga!Advanced R
por Hadley Wickam es una gran lectura de playa :)do.call
, me hizo darme cuenta de que estaba buscandoget
.Haskell - 74
Casos de prueba:
Probablemente podría ser más corto; Sin embargo, el soporte de Haskell para listas infinitas y funciones de orden superior hacen que la solución directa sea bastante agradable. Una versión de
^ :: Double -> Double -> Double
sería mejor para jugar al golf, pero no pude encontrar una. Afortunadamente, no necesitaba una lambda completa, por lo que el estilo sin sentido redujo algunos bytes.fuente
(+)
a la lista de operadores e iniciar elfoldl
con0
a llevar por completo pointfree y guardar el nombre de la función y los parámetros:foldl(\x(o,y)->o x y)0.zip((+):cycle[(+),(-),(*),(/),(**)])
.PowerShell v2 +, 124 bytes
Mucho tiempo porque PowerShell no tiene un operador
^
u**
, por lo que debemos tener en cuenta un caso diferente y usar una llamada .NET.Toma la entrada
$n
como una matriz, establece nuestra salida$o
como el primer dígito. Luego verificamos la.count
matriz, y siempre que sea mayor que una ingresamosif
. De lo contrario, nos saltamos elif
.Dentro del
if
bucle, recorremos la matriz1..$y|%{...}
y cada iteración lo restablecemos$o
a un nuevo valor, el resultado de otraif/else
declaración. Mientras nuestro contador$i++
no sea módulo 5 igual a 4 (es decir, no estamos en el^
operador), simplemente lo tomamos$o
y concatenamos con el símbolo apropiado'+-*/'[$x]
y el siguiente número en la matriz de entrada$n[$_]
. Lo canalizamos aiex
(alias paraInvoke-Expression
y similar aeval
), y eso se vuelve a guardar en$o
. Si estamos en el^
operador, estamos en elelse
, así que ejecutamos una[math]::Pow()
llamada, y ese resultado se vuelve a guardar$o
.En cualquier caso, simplemente salimos
$o
a la tubería y salimos , con salida implícita.fuente
Óxido,
123, 117 bytesRespuesta original:
estúpidos nombres largos de métodos ^^ ahh mucho mejor
sin golf
fuente
Perl 6 ,
70 68 6562 bytesExplicación:
Técnicamente
* + *
es un Lambda Cualquiera, pero efectivamente es el mismo&[+]
que es la abreviatura&infix:<+>
del conjunto de subrutinas que manejan la suma numérica infija.Yo no utilizar que para la multiplicación o la exponenciación como las formas de escribirlas como que es al menos tan larga como lo que tengo (
*×*
o* * *
e* ** *
)Prueba:
Pruébelo en ideone.com
(después de actualizar a una versión Rakudo que no es de un año y medio antes del lanzamiento oficial de las especificaciones de Perl 6 )
fuente
Python 3,
8893 bytesComenzó siendo mucho más corto, pero luego la precedencia del operador me derrotó y tuve que incluir muchos paréntesis ...
fuente
Oracle PL / SQL,
275254bytesLos datos deben insertarse en una tabla llamada
T
con una columnaN
de tipoNUMBER
Uso:
Salida:
Versión de 275 bytes:
fuente
Java 8,
173172167138137118113 bytesExplicación:
Pruébalo aquí
fuente
double r=a[0];
adouble r=a[0],b;
para guardar algunos bytes.float
, pero no hay unaMath.pow
para flotadores, de ahí eldouble
lugar. Gracias por el,b
. Y coni++<a.length
obtengo una ArrayOutOfBoundsException enb=a[i];
(a menos que lo hagai++<a.length-1
, que es un byte más largo en lugar de más corto).== 4
a> 3
y== 0
para< 1
. No estoy seguro, pero creo que podría ahorrar un poco creando una variable parai % 5
.<x
truco, reduciendo toda la función a 137 caracteres.Algunos trucos pueden reducir el enfoque de @ Willmore de 23 a 174 bytes (requiere php 5.6 o posterior). La parte que más ahorra es eliminar paréntesis innecesarios (-10 bytes).
Pero usar el
**
operador en lugar depow()
también permite usarloeval
con una matriz para las operaciones; y con algunos trucos más ...PHP> = 5.6, 82 bytes
toma la lista de los parámetros de la línea de comandos. Ejecutar
php -nr '<code>'
o probarlo en línea .versión anterior,
161 157 151 145 144 140 137117 bytesEl golf más efectivo provino de escribir el resultado intermedio directamente en el primer elemento, después de cambiar el resultado anterior de la matriz.
Descompostura
Banco de pruebas
fuente
If the array contains just a single number, we return that as the result.
es bastante claro. Pero gracias por dejarme volver a visitar esto.PHP ,
135130 bytes¡Gracias @titus, -5 bytes, más 0 arreglos de caso!
Pruébalo en línea!
Menos golf:
Realmente estaba enraizando para que array_reduce () funcionara para esto, pero requiere demasiados caracteres para superar el puntaje PHP más bajo actual.
¡Publicarlo de todos modos en caso de que alguien tenga alguna sugerencia!
fuente
$c
golpee0
. Guarde dos bytes con una función anónima en lugar dew
.eval('$c'.['/','**','+','-','*'][$i++?$i%5:5].'=$x');return$c;
es seis bytes más corto y debería resolver el problema cero.Brachylog , 68 bytes
Eso es largo ... pero no utiliza un predicado de evaluación.
Explicación
Predicado principal
Predicado 1
fuente
IBM PC 8087 FPU,
6682 bytesUtiliza solo el coprocesador matemático Intel 8087 de la PC IBM para los cálculos.
¡Pruébalo sin conexión! (en DOSBox o lo que sea). Déle algo al chip 8087 aburrido de su vieja PC, aparte de todas esas hojas de cálculo Lotus 1-2-3 que solía hacer en los años 80.
Sin golf (sin montar):
Salida:
La entrada es a través de un PROC (x86 más equivalente a una función), con BX como un puntero a una matriz de WORD en la memoria, y CX es el número de elementos que contiene y devuelve el resultado en ST.
* Nota: El código real para la función es
6682 bytes. Por supuesto, el código solo para escribir un número de coma flotante en la consola (código del libro de cocina) es 83 bytes. El programa de prueba y los datos son183215 bytes, lo que hace que .COM sea ejecutable305380 bytes en total.fuente
APL (Dyalog Unicode) ,
2927 bytes SBCSFunción de prefijo tácito anónimo. Tenga en cuenta que
*
es exponenciación en APL.Pruébalo en línea!
Debido a que APL se ejecuta de derecha a izquierda, podemos simplemente invertir el orden de los argumentos de las operaciones insertadas e invertir toda la expresión. Postfix
⍨
invierte los argumentos. Después de hacer una combinación perfecta de números y operaciones, solo necesitamos revertir, aplanar y evaluar:≢{
...}⊢
llame a la siguiente función con recuento de y números reales como⍺
y⍵
:'⍨'
Este personaje'+-×÷*',¨
anteponer cada uno de estos caracteres a eso;["+⍨","-⍨","×⍨","÷⍨","*⍨"]
⍺⍴
utilizar el argumento de la izquierda (recuento de los números) de forma cíclica r eshape que⌽
marcha atrás⍕
formatear como cadena plana3↓
suelte los 3 caracteres principales (un espacio y un símbolo y⍨
)⍎
ejecutar como código APLfuente
Japt , 16 bytes
Pruébalo en línea!
Explicación:
fuente
c #,
238, 202 bytesNo vi ninguna solución de C #, así que le daré una. Este es mi primer codegolf. Empecé a escribir en c # "hace dos meses" (aunque conozco Java hasta cierto punto).
Utiliza pila
Sin golf y casos de prueba
Salida:
fuente
a, Double.Parse
->a,Double.Parse
;while (s.Count
->while(s.Count
;Pow(l, r)
->Pow(l,r)
). Además, puede quitarloint
delantej=
y ponerlo detrás delint i=0,j;
. Excelente primera respuesta, y una vez más, bienvenido. :)PHP,
206,198, 197 bytesSin golf
En PHP, lógica similar a mi respuesta de C # ( 202 bytes ) :).
fuente