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 6convierte en 5 2 6). Nos detenemos cuando solo hay un número en la lista.
La pirámide completa para 5 1 2 6es
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 6respectivamente).
Entrada
- Una lista de uno o más enteros sin repetición. (por ejemplo,
1 5 1 6no es válido)
Salida
- Una lista de enteros positivos. El
ielemento th de la lista es el número de ocurrencias delinú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.:QhdUQy la entrada[5, 1, 2, 6]me da todos los subconjuntos posibles:Y
mmeSk.:QhdUQme 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.:G2asigna cada par de[(G[0], G[1]), (G[1], G[2]), ...]al elemento máximo.Yes una lista vacía, por lo tanto, seaYGagregaGa laY.u...QQaplica repetidamente estas dos funciones (len(Q)veces) comenzandoG = Qy actualizandoGdespués de cada ejecución.m/sYdQasigna cada elemento de la lista de entrada a su recuento en laYlista aplanada .fuente
Python, 81
Una solución de divide y vencerás. El elemento máximo se
Mfiltra 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
Lse 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 6En la segunda fila, se
5 1 2 6convierte en5 2 6porque5, 2 and 6son los máximos de[5 1], [1 2] and [2 6]respectivamente. En la tercera fila, se convierte en5 6porque5 and 6son 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,6es 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 longitudNpara la última fila, dondeNes 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
-sbandera para obtener una salida delimitada por espacios.Sin golf, con comentarios:
La redefinición de
rcada 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