Debería escribir un programa o función que reciba una lista de enteros distintos como entrada y salida o que devuelva el número de apariciones de los números de entrada en la siguiente pirámide numérica invertida.
A partir de la lista original en cada paso, creamos uno nuevo con los valores máximos de cada par de números adyacentes (por ejemplo, se 5 1 2 6
convierte en 5 2 6
). Nos detenemos cuando solo hay un número en la lista.
La pirámide completa para 5 1 2 6
es
5 1 2 6
5 2 6
5 6
6
El número resultante de ocurrencias son 3 1 2 4
(para 5 1 2 6
respectivamente).
Entrada
- Una lista de uno o más enteros sin repetición. (por ejemplo,
1 5 1 6
no es válido)
Salida
- Una lista de enteros positivos. El
i
elemento th de la lista es el número de ocurrencias deli
número de entrada th en la pirámide.
Ejemplos
Entrada => Salida
-5 => 1
8 4 => 2 1
5 9 7 => 1 4 1
1 2 3 9 8 6 7 => 1 2 3 16 3 1 2
6 4 2 1 3 5 => 6 4 2 1 3 5
5 2 9 1 6 0 => 2 1 12 1 4 1
120 5 -60 9 12 1 3 0 1200 => 8 2 1 3 16 1 4 1 9
68 61 92 58 19 84 75 71 46 69 25 56 78 10 89 => 2 1 39 2 1 27 6 5 1 6 1 2 14 1 12
Este es el código de golf, por lo que gana la entrada más corta.
Bonus puzzle: ¿puedes resolver el problema a O(n*log n)
tiempo?
Respuestas:
Pyth,
1917 bytesConsulte la Demostración en línea o el conjunto de pruebas completo (los primeros 4 bytes iteran sobre los ejemplos).
Este es un poco más inteligente que el enfoque ingenuo. Cada número del triángulo se puede representar como el valor máximo de un subconjunto conectado de
Q
. En la primera línea usa los subconjuntos de longitud 1, la segunda línea del triángulo usa los subconjuntos de longitud 2, ...Explicación
Para visualizar esto un poco.
m.:QhdUQ
y la entrada[5, 1, 2, 6]
me da todos los subconjuntos posibles:Y
mmeSk.:QhdUQ
me da cada uno de sus máximos (que corresponde exactamente a las filas de la pirámide):Pyth,
2322 bytesEste es solo el enfoque simple de "haz lo que te dicen".
Consulte la demostración en línea o un conjunto de pruebas completo (los primeros 4 bytes iteran sobre los ejemplos).
Explicación
meSd.:G2
asigna cada par de[(G[0], G[1]), (G[1], G[2]), ...]
al elemento máximo.Y
es una lista vacía, por lo tanto, seaYG
agregaG
a laY
.u...QQ
aplica repetidamente estas dos funciones (len(Q)
veces) comenzandoG = Q
y actualizandoG
después de cada ejecución.m/sYdQ
asigna cada elemento de la lista de entrada a su recuento en laY
lista aplanada .fuente
Python, 81
Una solución de divide y vencerás. El elemento máximo se
M
filtra por toda la pirámide, dividiéndolo en un rectángulo deM
's y dos subpirámides.Por lo tanto, el resultado general es la salida de la sublista izquierda, seguido del área del rectángulo, seguido de la salida de la sublista derecha.
La variable de entrada
L
se reutiliza para almacenar el resultado para que la lista vacía se asigne a la lista vacía.Las construcciones en solución son prolijas en Python. ¿Quizás algún lenguaje con coincidencia de patrones pueda implementar el siguiente pseudocódigo?
fuente
f@{}=##&@@{};f@{a___,l_,b___}/;l>a~Max~b:={f@{a},Length@{a,0}Length@{b,0},f@{b}}
CJam,
2322 bytesTodavía estoy buscando opciones de golf.
Esta es una función CJam (más o menos). Esto espera los números de entrada en la pila y también devuelve los recuentos de salida correspondientes en la pila. Un ejemplo:
hojas
en la pila
Estoy bastante seguro de que esto no es a
O(n log n)
tiempo.Expansión de código :
Veamos cómo funciona elaborando un ejemplo de
5 1 2 6
En la segunda fila, se
5 1 2 6
convierte en5 2 6
porque5, 2 and 6
son los máximos de[5 1], [1 2] and [2 6]
respectivamente. En la tercera fila, se convierte en5 6
porque5 and 6
son máximos de[5 2] and [2 6]
respectivamente. Esto también se puede escribir como máximo de[5 1 2] and [1 2 6]
respectivamente. Del mismo modo para la última fila,6
es máximo de[5 1 2 6]
.Básicamente, creamos los segmentos de longitud adecuados a partir del segmento de longitud
1
, que son básicamente los números originales, cada uno envuelto en una matriz, hasta finalmente un segmento de longitudN
para la última fila, dondeN
es el número de enteros de entrada.Pruébalo en línea aquí
fuente
Mathematica, 72 bytes
fuente
Python, 81
Cada entrada de la pirámide es el máximo de la sublista sobre su cono ascendente. Entonces, generamos todas estas sublistas, indexadas por intervalos
[i,j]
con0 < i < j <= len(L)
, y contamos cuántas veces aparece cada elemento como máximo.Una forma más corta de enumerar los subintervalos probablemente ahorraría caracteres. Una parametrización de un solo índice de los pares
[i,j]
sería un enfoque plausible.fuente
Pipa , 56 + 1 = 57 bytes
No compito mucho con el vudú de CJam, me temo. Parece que necesito un mejor algoritmo. Ejecutar con
-s
bandera para obtener una salida delimitada por espacios.Sin golf, con comentarios:
La redefinición de
r
cada vez a través de obras de la siguiente manera:fuente
APL (24)
Esta es una función que toma una lista, así;
Explicación:
{
...}⍵
: aplica la siguiente función a ⍵:⍵≡⍬:⍵
: si ⍵ está vacío, devuelve ⍵2⌈/⍵
: genera la siguiente lista⍵,∇
: return ⍵, seguido del resultado de aplicar esta función a la siguiente lista⍵∘.=
: compara cada elemento en ⍵ con cada elemento en el resultado de la función+/
: suma las filas (que representan elementos en ⍵)fuente
Haskell, 78 bytes
Uso:
f [68,61,92,58,19,84,75,71,46,69,25,56,78,10,89]
->[2,1,39,2,1,27,6,5,1,6,1,2,14,1,12]
.Cómo funciona
fuente
JavaScript, 109 bytes
Creo que encontré una forma interesante de hacerlo, pero solo después de que me di cuenta, el código era demasiado largo para competir. Oh, bueno, publicar esto de todos modos en caso de que alguien vea más potencial de golf.
Estoy haciendo uso de la siguiente fórmula aquí:
De esta manera, no es necesario generar la pirámide completa o subconjuntos de ella. (Es por eso que inicialmente pensé que funcionaría en O (n), pero mala suerte, todavía necesitamos bucles internos).
fuente
MATLAB: (266 b)
ENTRADA
un vector debe tener la forma [abcd ...]
ejemplo:
[2 4 7 11 3]
SALIDA
Ocurrencias de patrones.
EXPLICACIÓN:
si [abcd] es una entrada, el programa calcula el resultado ghij como
g = (a> b) + (a> b) (a> c) + (a> b) (a> c) * (a> d) = (a> b) (1+ (a> c) ( 1+ (a> c))))
h = (b> a) + (b> c) + (b> a) (b> c) + (b> c) (b> d) + (b> a) (b> c) (b> d ) = ... 'simplificado'
i = (c> b) + (c> d) + (c> b) (c> d) + (c> b) (c> a) + (c> d) (c> b) (c> a ) = ..
j = (d> c) + (d> c) (d> b) + (d> c) (d> b) * (d> a) = ...
fuente
J (49)
Supongo que hay margen de mejora ...
fuente