Considere el triángulo equilátero estándar, con los nodos etiquetados con coordenadas barcéntricas :
Podemos convertir este triángulo de 3 nodos en un triángulo de 6 nodos agregando una nueva línea de 3 vértices (uno más de lo que estaba presente en un lado del triángulo original de 3 nodos), eliminar los bordes internos (pero no los nodos internos) y volver normalizar las coordenadas:
Repitiendo el proceso para pasar de un triángulo de 6 nodos a un triángulo de 10 nodos, agregue una línea de 4 vértices (nuevamente, uno más de lo que estaba presente en un lado del triángulo original de 6 nodos), elimine los bordes internos (pero no los nodos internos ) y re-normalizar las coordenadas:
Este proceso puede repetirse indefinidamente. El objetivo de este desafío es un número entero que N
representa cuántas veces se ha realizado este proceso, generar todos los nodos para el triángulo asociado en coordenadas barcéntricas.
Entrada
Su programa / función debe tomar como entrada un número entero no negativo que N
represente cuántas veces se ha aplicado este proceso. Tenga en cuenta que para N=0
, debe generar el triángulo original con 3 nodos.
La entrada puede provenir de cualquier fuente (parámetro de función, stdio, etc.).
Salida
Su programa / función debería generar todos los nodos en coordenadas barcéntricas normalizadas. El orden de los nodos no importa. Un número puede especificarse como una fracción (no se requiere reducción de fracción) o un número de coma flotante. También puede generar vectores "escalados" para especificar un nodo. Por ejemplo, las 3 de las siguientes salidas son equivalentes y están permitidas:
0.5,0.5,0
1/2,2/4,0
[1,1,0]/2
Si usa salida de punto flotante, su salida debe ser precisa dentro del 1%. La salida puede ser a cualquier sumidero deseado (estándar, valor de retorno, parámetro de retorno, etc.). Tenga en cuenta que a pesar de que las coordenadas barcéntricas están determinadas únicamente por 2 números por nodo, debe generar los 3 números por nodo.
Ejemplos
Los casos de ejemplo están formateados como:
N
x0,y0,z0
x1,y1,z1
x2,y2,z2
...
donde la primera línea es la entrada N
, y todas las siguientes líneas forman un nodo x,y,z
que debería estar en la salida exactamente una vez. Todos los números se dan como números aproximados de coma flotante.
0
1,0,0
0,1,0
0,0,1
1
1,0,0
0,1,0
0,0,1
0.5,0,0.5
0.5,0.5,0
0,0.5,0.5
2
1,0,0
0,1,0
0,0,1
0.667,0,0.333
0.667,0.333,0
0.333,0,0.667
0.333,0.333,0.333
0.333,0.667,0
0,0.333,0.667
0,0.667,0.333
3
1,0,0
0.75,0,0.25
0.75,0.25,0
0.5,0,0.5
0.5,0.25,0.25
0.5,0.5,0
0.25,0,0.75
0.25,0.25,0.5
0.25,0.5,0.25
0.25,0.75,0
0,0,1
0,0.25,0.75
0,0.5,0.5
0,0.75,0.25
0,1,0
Puntuación
Este es el código de golf; el código más corto en bytes gana. Se aplican lagunas estándar. Puede usar los complementos deseados.
[1,2,3]/6
?Respuestas:
CJam (22 bytes)
Este es un bloque anónimo (función) que toma
N
la pila y deja una matriz de matrices de dobles en la pila. Demostración en líneaDisección
fuente
Haskell, 53 bytes
fuente
Python 3, 87 bytes
En realidad, se supone que esto es un comentario de TheBikingViking a la solución, pero no tengo suficiente reputación para hacer comentarios.
Uno puede guardar unos pocos bytes al iterar solo sobre las variables
i,j
y usar el hecho de que con el tercero se sumann+1
.fuente
Mathematica
4443 bytesEsta es una función sin nombre que toma un único argumento entero. La salida es una lista de listas de fracciones exactas (reducidas).
Genera todas las 3 tuplas de múltiplos
1/(N+1)
entre 0 y 1, inclusive, y luego selecciona aquellos cuya suma es 1 (como lo requieren las coordenadas barcéntricas).fuente
05AB1E , 10 bytes
Explicación
Pruébalo en línea
fuente
¤
consume la matriz, ¿por qué/
divide la matriz por eso? ¿"Recuerda" el último valor reventado y lo usa si es necesario?¤
es uno de los pocos comandos que no aparece y consume de la pila. Empuja el último elemento de la lista mientras deja la lista en la pila.MATL , 17 bytes
Pruébalo en línea!
Explicación
El enfoque es el mismo que en otras respuestas:
[0, 1/(n+1), 2/(n+1), ..., 1]
, donden
está la entrada;1
.Más específicamente:
fuente
Medusa ,
3733 bytesGracias a Zgarb por guardar 4 bytes.
Pruébalo en línea!
Al igual que mis respuestas de Mathematica y Peter CJam, esto genera un conjunto de tuplas candidatas y luego selecciona solo aquellas que suman 1. No estoy completamente satisfecho con el diseño todavía, y me pregunto si puedo guardar algunos bytes con ganchos o tenedores, pero tendré que investigar eso más tarde.
fuente
Perl 6:
5040 bytesDevuelve una secuencia de listas de 3 elementos de números racionales (exactos).
Explicación:
$_
Parámetro declarado implícitamente de la lambda.
0, 1/($_ + 1) ... 1
Utiliza el operador de secuencia
...
para construir la secuencia aritmética que corresponde a los posibles valores de coordenadas.[X] EXPR xx 3
Toma el producto cartesiano de tres copias de EXPR, es decir, genera todas las 3 tuplas posibles.
grep *.sum == 1, EXPR
Filtra las tuplas con una suma de 1.
fuente
Rubí, 62
Me sorprendería si esto no se puede mejorar en:
Tomando el consejo latente en el rompecabezas, esto calcula las opciones del segundo nodo basadas en el primero, y el tercer nodo restando los dos primeros.
fuente
Brachylog , 24 bytes
Pruébalo en línea!
fuente
Python 3, 106 bytes
Una función que toman entrada a través de argumentos e imprime una lista de listas de flotantes en STDOUT.
Python no es bueno en productos cartesianos ...
Cómo funciona
Pruébalo en Ideone
fuente
En realidad , 15 bytes
Esto utiliza un algoritmo similar al de la respuesta de Python de TheBikingViking . Sugerencias de golf bienvenidas. Pruébalo en línea!
Sin golf:
fuente
Ruby,
7774 bytesOtra respuesta usando el algoritmo en la respuesta de Python de TheBikingViking . Sugerencias de golf bienvenidas.
Otro algoritmo de 74 bytes basado en la respuesta Ruby de Not that Charles .
fuente
JavaScript (Firefox 30-57),
8881 bytesDevuelve una matriz de matrices de números de punto flotante. Editar: guardado 7 bytes calculando la tercera coordenada directamente. Intenté eliminar el
if
mediante el cálculo del rango dey
directamente pero me costó un byte adicional:fuente
[x/n,y/n/z/n]
, ¿olvidó una coma?