Esta é a trança de Pascal:
1 4 15 56 209 780 2911 10864 40545 151316 564719
1 3 11 41 153 571 2131 7953 29681 110771 413403 1542841
1 4 15 56 209 780 2911 10864 40545 151316 564719
Eu inventei isso totalmente. Blaise Pascal não tinha uma trança, até onde eu sei, e se ele tinha, provavelmente era feito de cabelo em vez de números.
É definido assim:
- A primeira coluna tem uma única
1
no meio. - A segunda coluna tem um
1
na parte superior e na parte inferior. - Agora alternamos entre colocar um número no meio ou duas cópias de um número na parte superior e inferior.
- Se o número for na parte superior ou inferior, será a soma dos dois números adjacentes (por exemplo,
56 = 15 + 41
). Se você inclina um pouco a cabeça, é como um passo no triângulo de Pascal. - Se o número ficar no meio, será a soma dos três números adjacentes (por exemplo
41 = 15 + 11 + 15
).
Sua tarefa será imprimir (parte de) esta trança.
Entrada
Você deve escrever um programa ou função que receba um único número inteiro n
, fornecendo o índice da última coluna a ser impressa.
Você pode escolher se a primeira coluna (imprimindo apenas uma única 1
na linha do meio) corresponde a n = 0
ou n = 1
. Essa deve ser uma escolha consistente em todas as entradas possíveis.
Saída
Saída Braid de Pascal até a n
th coluna. O espaço em branco deve corresponder exatamente ao layout de exemplo acima, exceto que você pode preencher a (s) linha (s) mais curta (s) ao comprimento da (s) linha (s) mais longa (s) com espaços e, opcionalmente, pode gerar um único avanço de linha à direita.
Em outras palavras, cada coluna deve ser exatamente tão larga quanto o número (ou par de números iguais) nessa coluna, os números em colunas sucessivas não devem se sobrepor e não deve haver espaços entre as colunas.
Você pode imprimir o resultado em STDOUT (ou a alternativa mais próxima) ou, se escrever uma função, poderá retornar uma string com o mesmo conteúdo ou uma lista de três strings (uma para cada linha).
Detalhes adicionais
Você pode supor que n
não será menor que o índice da primeira coluna (portanto, não será menor que 0
ou 1
dependendo da sua indexação). Você também pode supor que o último número na trança seja menor que 256 ou o maior número representável pelo tipo inteiro nativo do seu idioma, o que for maior . Portanto, se o seu tipo inteiro nativo puder armazenar apenas bytes, você pode assumir que o maior n
é 9
ou 10
(dependendo de você usar com base em 0 ou 1 n
) e se ele pode armazenar números inteiros de 32 bits assinados, n
será no máximo 33
ou 34
.
Aplicam-se as regras padrão de código de golfe . O código mais curto vence.
OEIS
Aqui estão alguns links OEIS relevantes. Obviamente, eles contêm spoilers de diferentes maneiras de gerar os números na trança:
- Superior / inferior: A001353 ou A010905 ou A106707 ou A195503
- Médio: A001835 ou A079935
- Ambos: A002530
Casos de teste
Esses casos de teste usam indexação de 1 base. Cada caso de teste tem quatro linhas, sendo a primeira a entrada e as três restantes a saída.
1
1
---
2
1
1
1
---
3
1
1 3
1
---
5
1 4
1 3 11
1 4
---
10
1 4 15 56 209
1 3 11 41 153
1 4 15 56 209
---
15
1 4 15 56 209 780 2911
1 3 11 41 153 571 2131 7953
1 4 15 56 209 780 2911
---
24
1 4 15 56 209 780 2911 10864 40545 151316 564719 2107560
1 3 11 41 153 571 2131 7953 29681 110771 413403 1542841
1 4 15 56 209 780 2911 10864 40545 151316 564719 2107560
Respostas:
Geléia ,
313029 bytesEste é um link monádico; ele aceita um índice de coluna baseado em 0 como argumento e retorna uma lista de seqüências de caracteres.
Experimente online!
Como funciona
fonte
Pitão , 44 bytes
A geração do número levou 20 bytes e a formatação levou 24 bytes.
Experimente online!
fonte
Python 2, 120 bytes
Experimente em Ideone.
fonte
MATL , 38 bytes
Experimente online!
Computar uma matriz com os números (únicos) leva os primeiros 17 bytes. A formatação leva os 21 bytes restantes.
Explicação
Parte 1: gerar os números
Isto gera uma matriz com os números das primeira e segunda linhas em ordem crescente:
[1; 1; 3; 4; 11; 15; ...]
. Ela começa com1
,1
. Cada novo número é obtido iterativamente dos dois anteriores. Desses, o segundo é multiplicado1
ou2
dependendo do índice de iteração e depois somado ao primeiro para produzir o novo número.O número de iterações é igual à entrada
n
. Isso significa que osn+2
números são gerados. Depois de gerada, a matriz precisa ser cortada para que apenas as primeirasn
entradas sejam mantidas.Parte 2: formate a saída
Para cada número na matriz obtida, isso gera duas seqüências de caracteres: representação do número e uma sequência do mesmo comprimento que consiste no caractere 0 repetido (o caractere 0 é exibido como um espaço no MATL). Mesmo para iterações, essas duas seqüências são trocadas.
As duas seqüências são concatenadas verticalmente. Portanto,
n
matrizes de caracteres 2D são produzidas da seguinte maneira (usando·
para representar o caractere 0):Essas matrizes são concatenadas horizontalmente para produzir
Por fim, essa matriz de caracteres 2D é dividida em duas linhas e a primeira é duplicada no topo da pilha. As três strings são exibidas em ordem, cada uma em uma linha diferente, produzindo a saída desejada
fonte
Haskell, 101 bytes
Define uma função
f :: Int → [String]
.Michael Klein me lembrou que eu não precisava chamar
unlines
o resultado, economizando 7 bytes. Obrigado!Salvei um byte substituindo
" 9"!!mod i 2
porcycle" 9"!!i
.Mais três bytes escrevendo duas listas corecursivas em vez de usar
drop
.Minha namorada apontou que eu posso salvar mais dois bytes iniciando minhas respostas em
0
vez de1
.fonte
C,
183177176 bytesExplicação
C nunca vai ganhar nenhum prêmio por brevidade contra um idioma de nível superior, mas o exercício é interessante e é uma boa prática.
A macro F retira seis bytes ao custo da legibilidade. As variáveis são declaradas globalmente para evitar várias declarações. Eu precisava de um buffer de caracteres para o sprintf, mas, como o K&R está livre da verificação de tipo, o sprintf e o printf podem interpretar t [9] como um ponteiro para um buffer de 36 bytes. Isso salva uma declaração separada.
Função de impressão bonita, em que r é o número da linha. Sprintf formata o número e calcula a largura da coluna. Para economizar espaço, chamamos isso três vezes, um para cada linha de saída; a expressão ri & 1 filtra o que é impresso.
Função do ponto de entrada, argumento é o número de colunas. Calcula a matriz a dos valores da coluna a [] e chama a função de impressão p uma vez para cada linha de saída.
Chamada de amostra (não incluída na resposta e na contagem de bytes):
Atualizada
Incorporou a sugestão de sprint em linha da tomsmeding. Isso reduziu a contagem de 183 para 177 caracteres. Isso também permite remover as chaves ao redor do bloco printf (sprintf ()), já que é apenas uma instrução agora, mas isso só salvou um caractere, porque ainda precisa de um espaço como delimitador. Então, para 176.
fonte
w
onde é usada? Você parece usá-lo apenas uma vez.itoa
vez do sprintf?PowerShell v2 +, 133 bytes
44 bytes para calcular os valores, 70 bytes para formular o ASCII
Recebe a entrada
$n
como a coluna indexada a zero. Define o início da nossa matriz de sequências$a=1,1
. Em seguida, fazemos loop até$n
com1..$n|%{...}
para construir a matriz. A cada iteração, concatenamos a soma de (dois elementos atrás) + (o elemento anterior) * (se somos ímpares ou pares). Isso gerará$a=1,1,3,4,11...
até$n+2
.Portanto, precisamos cortar
$a
apenas os primeiros0..$n
elementos e canalizá-los através de outro loop|%{...}
. A cada iteração, definimos helper$z
igual a um número de espaços mais o elemento atual como uma string. Então, estamos dividindo se isso é concatenado$x
(nas linhas superior e inferior) ou$y
(na linha do meio) por um simples ímpar-parif
/else
. Em seguida, calculamos o número de espaços$l
usando o número atual, especificando-o e obtendo o seu.Length
.Finalmente, nós colocamos
$x
,$y
e$x
novamente no gasoduto, ea saída está implícita. Como o.ToString()
separador padrão de uma matriz ao imprimir em STDOUT é uma nova linha, obtemos isso de graça.Exemplo
fonte
PHP 265 bytes
Sem golfe:
Python 278 bytes
fonte
Ruby, 120 bytes
Retorna uma cadeia de linhas múltiplas.
Experimente online!
fonte
Matlab, 223 caracteres, 226 bytes
Ungolfed e comentou:
fonte
PHP,
135124123120 bytestirando proveito de previsões implícitas e variáveis variáveis,
um terço do código (37 bytes) vai para os espaços, 64 bytes totalmente usados para saída
demolir
fonte
Lote, 250 bytes
Como a primeira e a terceira linhas são as mesmas, só precisamos criar duas strings. Aqui
d
representa a sequência que termina com a última entrada es
representa a sequência que termina com espaços; as últimas quatro linhas garantem que elas sejam impressas na ordem apropriada.i
é apenas o contador de loops (é um pouco mais barato que a contagem regressiva%1
).j
é a alternância entre dobrar o número anterior antes de adicioná-lo ao número atual para obter o próximo número.m
en
contém esses números.l
, além de ser usado temporariamente para calcular o próximo número, também substitui seus dígitos por espaços para preenchers
;s
ed
são trocados sempre pela variável intermediáriat
.fonte