En matemáticas, una forma de descubrir cuál es el tipo de una relación dada (lineal, cuadrática, etc.) es calcular las diferencias. Para hacerlo, tome una lista de valores y para los cuales el espacio entre los valores correspondientes de x es el mismo, y reste cada uno del número que está arriba, creando una lista de números uno más corto que la lista anterior. Si la lista resultante está completamente compuesta de números idénticos, entonces la relación tiene una diferencia de 1 (es lineal). Si no son idénticos, repite el proceso en la nueva lista. Si ahora son idénticos, la relación tiene una diferencia de 2 (es cuadrática). Si no son idénticos, simplemente continúe este proceso hasta que lo sean. Por ejemplo, si tiene la lista de valores de y [1,6,15,28,45,66] para aumentar gradualmente los valores de x:
First Differences:
1
6 1-6 =-5
15 6-15 =-9
28 15-28=-13
45 28-45=-17
66 45-66=-21
Second differences:
-5
-9 -5+9 =4
-13 -9+13 =4
-17 -13+17=4
-21 -17+21=4
As these results are identical, this relation has a difference of 2
Tu tarea:
Escriba un programa o función que, cuando se le da una matriz de enteros como entrada, devuelve la diferencia de la relación descrita por la matriz, como se explicó anteriormente.
Entrada:
Una matriz de enteros, que pueden tener cualquier longitud> 1.
Salida:
Un entero que representa la diferencia de la relación descrita por la entrada.
Casos de prueba:
Input => Output
[1,2,3,4,5,6,7,8,9,10] => 1
[1,4,9,16,25,36] => 2
[1,2,1] => 2 (when there is only one value left, all values are automatically identical, so the largest difference an array can have is equal to the length of the array-1)
"Hello World" => undefined behavior (invalid input)
[1,1,1,1,1,1,1,1,1] => 0 (all elements are already identical)
[1, 3, 9, 26, 66, 150, 313, 610] => 6
Tanteo:
Este es el código de golf , el puntaje más bajo en bytes en cada idioma gana para ese idioma. La puntuación más baja en general obtiene la marca de verificación verde.
fuente
[1,2,1]
dar 2?[1,2,1] -> [1,-1] -> [-2]
[1,3,9,26,66,150,313,610]
->6
si lo deseaRespuestas:
Casco , 6 bytes
Gracias Leo por dejarme usar su versión que funciona para
[1,1,1,1,1,1]
Pruébalo en línea!
Explicación
fuente
[1,1,1,1]
, ¿puedo usar el tuyo?JavaScript (ES6), 47 bytes
Casos de prueba
Mostrar fragmento de código
fuente
MATL , 8 bytes
Pruébalo en línea! O verificar todos los casos de prueba .
Explicación
Esto compite las diferencias consecutivas de forma iterativa hasta que el resultado sea todo ceros o vacío. La salida es el número requerido de iteraciones menos 1.
fuente
R ,
5044 bytesPruébalo en línea!
Toma un
diff
del
, lo establecel
y comprueba si el resultado contiene valores distintos de cero. Si lo hace, la subastaF
(inicializado comoFALSE
implícitamente), y vuelveF*1
a convertirFALSE
a0
en el caso de que todosl
es idéntico ya.fuente
+F
truco para 5 bytes . Buena respuesta por cierto!Mathematica, 49 bytes
Gracias @alephalpa para -6 bytes y @hftf -1 byte
y aquí hay otro enfoque de @hftf
Mathematica, 49 bytes
fuente
(s=#;t=0;While[UnsameQ@@s,s=Differences@s;t++];t)&
UnsameQ[1,2,1]
Es falso;!SameQ[1,2,1]
es verdad. No creo que el bucle manual de guarda caracteres o bien:Length@NestWhileList[Differences,#,!SameQ@@#&]-1&
ya es la misma longitud que la suya después de reemplazarUnsameQ
con!SameQ
.Jalea , 7 bytes
Pruébalo en línea!
Explicación
fuente
IÐĿE€ċ0
Japt ,
107 bytesPruébalo en línea!
Se basa en el hecho de que el resultado está garantizado dentro de la longitud de la matriz de entrada.
Explicación
Al final, esto asignará la matriz
[1, 3, 9, 26, 66, 150, 313, 610]
a[true, true, true, true, true, true, false, false]
,que contiene
6
true
s.Versión anterior de 10 bytes
Pruébalo en línea!
fuente
Perl 6 , 37 bytes
Pruébalo en línea!
Explicación: La función toma la entrada como una lista. Luego construye una secuencia recursiva como esta: el primer elemento es la lista original (
$_
), los siguientes elementos son devueltos al{@(@$_ Z- .[1..*])}
ser invocados en el elemento anterior, y eso se repite hasta que la condición*.none
sea verdadera, lo que ocurre solo cuando la lista es está vacío o contiene solo ceros (o, técnicamente, otros valores de falsey). Luego tomamos la lista y le restamos 2, lo que lo fuerza primero al contexto numérico (y las listas en contexto numérico son iguales al número de sus elementos) y, al final, devuelve 2 menos que el número de elementos en el lista.El bloque extraño
{@(@$_ Z- .[1..*])}
simplemente toma la lista dada (.[]
- llamada rebanada Zen - la indexación con corchetes vacíos produce la lista completa), la comprime usando el operador menos (Z-
) con la misma lista sin el primer elemento (.[1..*]
) y lo fuerza a una lista (@(...)
- necesitamos eso porque zip devuelve solo una Seq, que es básicamente una lista unidireccional que solo se puede iterar una vez. Lo cual es algo que no nos gusta). Y eso es todo.fuente
@(.[] Z- .[1..*])
a[.[] Z-.[1..*]]
debería guardar dos bytes.Java 8,
191 + 58 = 249198140 bytes.Gracias PunPun1000 por 51 bytes.
Gracias Nevay por 58 bytes.
Pruébalo en línea!
Pruébelo en línea (versión de 198 bytes)
Entonces, esta es la primera vez que publico aquí en PPCG (y la primera vez que hago un desafío de código de golf). Cualquier crítica constructiva es bienvenida y apreciada. Traté de seguir las pautas para publicar, si algo no está bien, no dude en señalarlo.
Versión embellecida:
fuente
java.util.stream.IntStream k = java.util.Arrays.stream(a);
public
no necesita ser incluido en el conteo de bytes. 2) No debería aceptar un segundo parámetro, pero eliminarlo puede ahorrar bytes. 3) puede eliminar algunos corchetes innecesarios allíHaskell, 46 bytes
esto simplemente se repite -
zipWith(-)l$last l
es la lista de diferencias del
. yg
es la función que responde a la pregunta.fuente
Kotlin , 77 bytes
primera publicación, trató de editar la última respuesta en kotlin 2 veces; D
tomó parte de prueba de @jrtapsell
TryItOnline
fuente
APL (Dyalog Classic) ,
2217 bytesPruébalo en línea!
¡Gracias a @ngn por -5 bytes!
¿Cómo?
{ ... }
, la función1=≢∪⍵:0
, si cada elemento es igual en el argumento, devuelve0
1+∇2-/⍵
, de lo contrario, devuelve 1 +n
de las diferencias (que esn-1
, por lo tanto, agregar una a ella dan
)fuente
{1=≢∪⍵:0⋄1+∇2-/⍵}
Jalea , 7 bytes
Pruébalo en línea!
Explicación
-1 byte gracias a Jonathan Allan
fuente
IÐĿEÐḟL
para siete (veo que Miles también encontró un siete usando recursividad).05AB1E , 7 bytes
Pruébalo en línea!
Explicación
fuente
JavaScript (ES6), 58 bytes
fuente
Python 2 , 65 bytes
-7 bytes gracias a Jonathan Allan.
Pruébalo en línea!
fuente
c
a1
, decrementar y luego usarprint-c
.f=lambda l,c=1:any(l)and f([j-i for i,j in zip(l,l[1:])],c-1)or-c
max(...,0)
para pasar los[1, 1, 1, 1, ...]
casos de prueba.Dyalog APL, 19 bytes
Explicación:
fuente
≢-1+∘≢2-/⍣{1=≢∪⍵}⊢
k , 21 bytes
Esto funciona en k, pero no en oK, porque el bucle while de oK se ejecuta antes de verificar la condición (en lugar de verificar primero la condición y luego ejecutar el código). Por lo tanto, en OK, el
1 1 1 1 1
ejemplo no funcionará correctamente.¡Prueba oK en línea!
Explicación:
fuente
~&/1_=':
->1<#?
Haskell ,
666160 bytesPruébalo en línea!
Guardado 5 bytes gracias a Christian Sievers
Guardado 1 byte gracias a proud-haskeller
iterate(z(-))
calcula las listas de diferencias.or.z(/=)
prueba si hay elementos no iguales en esas listas.length.takeWhile
cuenta las listas de diferencias con elementos no iguales.fuente
or.z(/=)
z=(=<<tail).zipWith
, un byte más cortoJava (OpenJDK 8) ,
9894 bytesPruébalo en línea!
fuente
Japt , 7 bytes
El mismo enfoque (pero derivado de forma independiente) que Justin con una implementación diferente.
Pruébalo
Explicación
Entrada implícita de la matriz
U
.Mapa sobre cada elemento.
Tome cada par secuencial (
ä
) de elementosU
y reduzca la diferencia absoluta (a
).Reasigna esa matriz a
U
.Count (
è
) el número de sub-arrays que devuelven verdadero (es decir, distinto de cero) cuando se reduce por adición.fuente
TI-Basic, 19 bytes
Por defecto, las variables comienzan en cero. Además, nunca pensé que estaría usando
IS>(
para algo útil.fuente
C # (.NET Core) ,
7069 + 18 bytes-1 byte gracias a Kevin Cruijssen
Debe recibir 0 cuando se llama para que funcione correctamente. También incluido en el recuento de bytes:
Pruébalo en línea!
Explicación:
Versión iterativa 84 + 18 bytes:
Pruébalo en línea!
fuente
(y,z)=>y-z
. Pero buena respuesta, +1 de mi parte.Clojure, 62 bytes
Muy bien
=
puede tomar cualquier número de argumentos, y un solo argumento es idéntico a "sí mismo".(apply = [1 2 3])
se ejecuta como(= 1 2 3)
.fuente
Pyth , 15 bytes
Verifique todos los casos de prueba.
¿Cómo?
Explicación # 1
fuente
Wtl{Q=hZ=.+Q)Z
WP{Q=hZ=.+Q)Z
. ¡Gracias!Perl 5 , 83 + 1 (-a) = 84 bytes
Pruébalo en línea!
Ingrese como una lista de números separados por un espacio.
fuente
Pyke , 11 bytes
Pruébalo aquí!
fuente
Pyth, 10 bytes
Si podemos indexar desde 1, podemos guardar un byte eliminando el inicio
t
.Pruébalo en línea
Explicación
fuente
Kotlin , 83 bytes
Embellecido
Prueba
TryItOnline
fuente
lang-kotlin
, no simplementekotlin
, en las sugerencias de resaltador.Swift 4 , 90 bytes
Implementación alternativa basada en cierre:
Casos de prueba:
fuente