El rombo de Pascal (que en realidad es un triángulo) se obtiene agregando el patrón:
*
***
x
en lugar de
* *
x
Esto significa que cada celda es la suma de las tres celdas en la fila directamente encima de ella y una celda en la fila 2 arriba. Al igual que el triángulo de Pascal, la fila cero tiene una sola 1
que genera el triángulo.
Aquí están las primeras dos filas del rombo de Pascal
1
1 1 1
1 2 4 2 1
1 3 8 9 8 3 1
Tarea
Dado un número de fila (comenzando desde la parte superior) y un número de columna (comenzando desde el primer elemento distinto de cero en esa fila), se genera el valor en esa celda en particular. Ambas entradas pueden estar indexadas en 1 o 0 (puede mezclar y combinar si lo desea).
Este es el código de golf, por lo que debe intentar que el tamaño del archivo de su código fuente sea lo más pequeño posible.
Respuestas:
Haskell ,
5955 bytes¿El rombo de Pascal? ¡Más como el rombo de Haskell! amiright?
4 bytes guardados gracias a Ørjan Johansen
Pensé en probar mi propio problema y practicar mi Haskell. Esperemos que esto inspire a más personas a responder esto.
Pruébalo en línea!
Explicación
Esto está un poco desactualizado con el último golf
En lugar de calcular
Calculamos
Esto inclina todo nuestro triángulo para convertirse
Esto alinea todas nuestras filas haciendo que sea más fácil indexar el enésimo elemento de cualquier columna. Luego definimos nuestros casos base.
La fila cero es todo ceros, así que
Hay un solo
1
en la posición,1,1
así que definimos queY también definimos el resto de la primera fila como ceros
Luego definimos el caso general de forma recursiva utilizando el patrón descrito anteriormente:
fuente
n!k=sum[(n-2)!(k-2)+sum(map((n-1)!)[k-2..k])|n>1]
.Pascal , 122 bytes
Bueno, es el rombo de Pascal .
37 bytes guardados gracias a @manatwork
Pruébalo en línea!
fuente
if
condición no tienen sentido. (El 1ºif
guarda 2 caracteres, en el 2ºif
1 carácter al no dejar espacio entre lathen
palabra clave y el dígito anterior). Ah, y la variable r es completamente innecesaria.;
antes de que losfunction
'send
.>=
<=
? Todavía necesito preservar elif n=0
function f(n,k:integer):integer;begin f:=1-Ord((k<0)or(k>n*2));if n>0then f:=f(n-1,k-2)+f(n-1,k-1)+f(n-1,k)+f(n-2,k-2)end;
PHP , 86 bytes
de forma recursiva solo la función fila y columna 0-indexada
Pruébalo en línea!
PHP , 114 bytes
forma recursiva programa completo fila y columna 0-indexado
Pruébalo en línea!
PHP , 129 bytes
fila y columna 0-indexada
Pruébalo en línea!
fuente
Jalea ,
222019 bytesToma un par de índice basado en 0 como argumento de línea de comandos.
Pruébalo en línea!
fuente
MATL ,
222019 bytesAmbas entradas están basadas en 0.
Pruébalo en línea!
Explicación
Deje
r
yc
denote las dos entradas, especificando fila y columna basadas en 0 respectivamente.Cada nueva fila en el rombo de Pascal se puede construir a partir de la matriz que contiene las dos filas anteriores convolucionando con el núcleo
[1 1 1; 0 1 0]
y manteniendo intercambiadas las últimas dos filas del resultado. Esto se hacer
veces, comenzando desde la matriz1
.Resulta que es más corto usar el núcleo
[0 1 0; 1 1 1; 0 1 0]
, que es un literal predefinido. Esto produce una fila adicional, que se descartará.Considere, por ejemplo
r = 3
, que hay3
iteraciones.Empezando desde
convolución con
[0 1 0; 1 1 1; 0 1 0]
daMantener las dos últimas filas (la matriz completa, en este caso) e intercambiarlas da
Convolución de lo anterior con
[0 1 0; 1 1 1; 0 1 0]
daLa matriz formada por las dos últimas filas intercambiadas es
Contiene la nueva fila en la parte inferior y la anterior extendida con ceros.
Convolucionar nuevamente produce
Tomar las dos últimas filas intercambiadas da
Una vez que
r
se han realizado las iteraciones, la salida está contenida en la última fila de la matriz final. Por ejemplo, parac = 2
(basado en 0) el resultado sería8
. En lugar de indexar la última fila y la columna deseada, se puede utilizar un truco que explota la simetría de cada fila: la matriz final se transponey
-c
se toma su enésimo elemento. Esto utiliza la indexación lineal, es decir, la matriz se indexa mediante un único índice en el orden de columnas principales . Como la indexación es modular , la0
entrada-es la esquina inferior derecha (valor1
) y la-2
entrada -th está dos pasos arriba (valor8
).fuente
Pari / GP , 60 bytes
Pruébalo en línea!
fuente
Haskell , 74 bytes
Pruébalo en línea!
Llame con
n # m
, donden
está la fila ym
es la columna.fuente
m<=2*n&&m>=0
puede ser juston>0
.Mathematica, 56 bytes
Función pura que toma dos argumentos enteros (primera fila, segunda columna) y devuelve un entero. Funciona también para argumentos enteros negativos, regresando
0
. Una estructura recursiva bastante sencilla:If[#<1,Boole[##==0],...]
define el comportamiento del caso base para la fila 0 (y superior), mientrasSum[#0[#-i,#2-j],{i,2},{j,2i-2,2}]
implementa la definición recursiva.fuente
Python 2 ,
706665 bytesPruébalo en línea!
fuente
JavaScript (ES6), 68 bytes
fuente
Mathematica, 53 bytes
Usando la función generadora.
fuente
Python 3 ,
8284 bytesEsta es una implementación recursiva con filas y columnas indexadas 1. (Técnicamente necesita un
f=
frente, alguien me avisa si debo cambiarlo a 84 bytes. Todavía es nuevo y no estoy 100% seguro de las reglas).Esto usa la fórmula recursiva que se encuentra en la página OEIS , pero con la
k
's' desplazada hacia la izquierda para alinearse correctamente. Coincidentemente,sum(f(n-1,k-i)for i in(0,1,2))
es del mismo tamaño quef(n-1,k)+f(n-1,k-1)+f(n-1,k-2)
. Toda la función es eland or
truco de Python , donde la primera condición verifica si k está dentro del triángulo y no en el límite, en cuyo caso se usa la fórmula recursiva. Si no lo es, la parte después de queor
se devuelve, que comprueba sik
está adentro(1, 2*n-1)
, es decir, en el límite, regresandoTrue
yFalse
.k+1in(2,2*n)
es un byte más corto quek in(1,2*n-1)
. Ajustar eso entre paréntesis y poner un+
frente se convierte a entero, que es lo que se necesita.Pruébalo en línea!
fuente
f=
.True
lugar de1
porque se comporta como1
python. Esto le permite eliminar el+(...)
al final. Entiendo que si no quieres hacer esto, porque hará que la salida se vea un poco extraña, es una opción.Java (OpenJDK 8) , 87 bytes
Pruébalo en línea!
Al principio, estaba contento con mi método iterativo de 160 bytes ... Hmmm ... olvidémoslo, ¿de acuerdo?
fuente
Python 3 , 75 bytes
Esta es una lambda recursiva que toma la columna y la fila como enteros indexados a 0.
Aquí hay una versión (ligeramente) más legible con una función de impresión:
fuente