Considere o triângulo equilátero padrão, com nós rotulados usando coordenadas baricêntricas :
Podemos transformar esse triângulo de 3 nós em um triângulo de 6 nós adicionando uma nova linha de 3 vértices (um a mais do que estava presente em um lado do triângulo de 3 nós original), remova quaisquer arestas internas (mas não os nós internos) e normalize as coordenadas:
Repetindo o processo para ir de um triângulo de 6 nós a um triângulo de 10 nós, adicione uma linha de 4 vértices (novamente, mais um que estava presente em um lado do triângulo de 6 nós original), remova quaisquer arestas internas (mas não os nós internos ) e normalize novamente as coordenadas:
Este processo pode ser repetido indefinidamente. O objetivo deste desafio é fornecer um número inteiro que N
representa quantas vezes esse processo foi executado, produzindo todos os nós do triângulo associado em coordenadas baricêntricas.
Entrada
Seu programa / função deve ter como entrada um número inteiro não negativo N
representando quantas vezes esse processo foi aplicado. Observe que N=0
, para , você deve gerar o triângulo original com 3 nós.
A entrada pode vir de qualquer fonte (parâmetro de função, stdio, etc.).
Saída
Seu programa / função deve produzir todos os nós em coordenadas baricêntricas normalizadas. A ordem dos nós não importa. Um número pode ser especificado como uma fração (redução de fração não necessária) ou um número de ponto flutuante. Você também pode gerar vetores "dimensionados" para especificar um nó. Por exemplo, todas as três seguintes saídas são equivalentes e permitidas:
0.5,0.5,0
1/2,2/4,0
[1,1,0]/2
Se estiver usando saída de ponto flutuante, sua saída deve ter precisão de 1%. A saída pode ser para qualquer coletor desejado (stdio, valor de retorno, parâmetro de retorno, etc.). Observe que, embora as coordenadas barocêntricas sejam determinadas exclusivamente por apenas 2 números por nó, você deve gerar todos os 3 números por nó.
Exemplos
Casos de exemplo são formatados como:
N
x0,y0,z0
x1,y1,z1
x2,y2,z2
...
onde a primeira linha é a entrada N
e todas as linhas seguintes formam um nó x,y,z
que deve estar na saída exatamente uma vez. Todos os números são dados como números aproximados de ponto flutuante.
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
Pontuação
Isso é código de golfe; o menor código em bytes vence. Aplicam-se brechas padrão. Você pode usar quaisquer embutidos desejados.
[1,2,3]/6
?Respostas:
CJam (22 bytes)
Este é um bloco anônimo (função) que assume
N
a pilha e deixa uma matriz de matrizes de duplas na pilha. Demonstração onlineDissecação
fonte
Haskell, 53 bytes
fonte
Python 3, 87 bytes
Na verdade, isso deve ser um comentário da TheBikingViking à solução, mas não tenho reputação suficiente para comentários.
Pode-se salvar alguns bytes apenas iterando sobre as variáveis
i,j
e usando o fato de que com o terceiro eles somamn+1
.fonte
Mathematica,
4443 bytesEsta é uma função sem nome que recebe um único argumento inteiro. Saída é uma lista de listas de frações exatas (reduzidas).
Gera todas as três tuplas de múltiplos
1/(N+1)
entre 0 e 1, inclusive, e seleciona aquelas cuja soma é 1 (conforme exigido pelas coordenadas baricêntricas).fonte
05AB1E , 10 bytes
Explicação
Experimente online
fonte
¤
consome a matriz, por que a/
divide por isso? Ele "lembra" o último valor que apareceu e o usa, se necessário?¤
é um dos poucos comandos que não aparece e consome da pilha. Empurra o último elemento da lista enquanto deixa a lista na pilha.MATL , 17 bytes
Experimente online!
Explicação
A abordagem é a mesma que em outras respostas:
[0, 1/(n+1), 2/(n+1), ..., 1]
, onden
está a entrada;1
.Mais especificamente:
fonte
Água-viva ,
3733 bytesObrigado ao Zgarb por salvar 4 bytes.
Experimente online!
Como minhas respostas do Mathematica e do CJam de Peter, isso gera um conjunto de tuplas candidatas e seleciona apenas aquelas que somam 1. Ainda não estou totalmente satisfeito com o layout e me pergunto se posso salvar alguns bytes com ganchos ou garfos, mas vou ter que investigar isso mais tarde.
fonte
Perl 6:
5040 bytesRetorna uma sequência de listas de 3 elementos de números racionais (exatos).
Explicação:
$_
Parâmetro implicitamente declarado do lambda.
0, 1/($_ + 1) ... 1
Usa o operador de sequência
...
para construir a sequência aritmética que corresponde aos possíveis valores de coordenadas.[X] EXPR xx 3
Toma o produto cartesiano de três cópias do EXPR, ou seja, gera todas as três tuplas possíveis.
grep *.sum == 1, EXPR
Filtre as tuplas com uma soma de 1.
fonte
Ruby, 62
Ficaria surpreso se isso não puder ser melhorado:
Tomando o conselho latente no quebra-cabeça, calcula as opções do segundo nó com base no primeiro e no terceiro nó, subtraindo os dois primeiros.
fonte
Braquilog , 24 bytes
Experimente online!
fonte
Python 3, 106 bytes
Uma função que recebe entrada por meio de argumento e imprime uma lista de listas de carros alegóricos para STDOUT.
Python não é bom em produtos cartesianos ...
Como funciona
Experimente no Ideone
fonte
Na verdade , 15 bytes
Isso usa um algoritmo semelhante ao da resposta em Python do TheBikingViking . Sugestões de golfe são bem-vindas. Experimente online!
Ungolfed:
fonte
Ruby,
7774 bytesOutra resposta usando o algoritmo na resposta Python do TheBikingViking . Sugestões de golfe são bem-vindas.
Outro algoritmo de 74 bytes baseado na resposta de Not that Charles's Ruby .
fonte
JavaScript (Firefox 30-57),
8881 bytesRetorna uma matriz de matrizes de números de ponto flutuante. Editar: salvou 7 bytes calculando diretamente a terceira coordenada. Tentei eliminar o
if
cálculo do intervaloy
diretamente, mas custou um byte extra:fonte
[x/n,y/n/z/n]
, esqueceu uma vírgula?