Há um resultado combinatório clássico de que o número de maneiras de ladrilhar uma 2*n
faixa por 1*2
dominós é o número n- ésimo de Fibonacci. Seu objetivo é imprimir todas as inclinações para um determinado item n
, desenhadas com traços e linhas verticais como essas 8 inclinações para n=5
:
|————
|————
——|——
——|——
|||——
|||——
————|
————|
||——|
||——|
|——||
|——||
——|||
——|||
|||||
|||||
Você deve fornecer um programa ou função nomeada que tome n
como entrada e imprima a saída necessária. Menos bytes ganha.
Entrada
Um número n
entre 1
e 10
inclusive via STDIN ou entrada de função.
Resultado
Imprima todas as inclinações de dominó possíveis da 2*n
tira, desenhadas horizontalmente. As inclinações podem estar em qualquer ordem, mas cada uma deve aparecer exatamente uma vez. Eles devem ser separados por uma linha em branco.
Um dominó vertical é feito de duas barras verticais ( |
) e um dominó horizontal é feito de dois traços ( —
). Você pode usar hífens ( -
) no lugar dos traços para permanecer no ASCII.
Você pode fazer qualquer coisa com espaço em branco, desde que a saída impressa pareça a mesma.
——
e|
por comprimento como Dennis, não Length-n
cordas de—
e|
filtrados por—
aparecer em pares. E para o último, eu esperaria que fosse através de expressões regulares ou operações de string na string produzida, comos.split('——
) `, não por uma abordagem aritmética como a sua.Respostas:
C, 106
Versão Golfed
Versão original
Como funciona
A variável
i
vai de1<<n-1
baixo a 0, produzindo todos os números binários possíveis comn
dígitos. 0 codifica para|
e 1 codifica para-
. Estamos interessados em números que contêm 1's em pares. Obviamente, esses números são divisíveis por 3.Quando um número é dividido por 3, o número original pode ser recuperado multiplicando o resultado por 2 e adicionando-o a si mesmo (efetivamente mutliplicando por 3.) interesse, não é necessário transporte, portanto, nesses casos, apenas OR pode ser usado em vez de adição. Isso é usado para testar os números de interesse, pois eles são os únicos em que a expressão
i/3|i/3*2
retorna o valor original dei
. Veja o exemplo abaixo.1111
= 15 --->0101
= 5 --->1111
= 15 (válido,0101|1010
==0101+1010
)1001
= 9 --->0011
= 3 --->0111
= 7 (inválido0011|0110
,! =0011+0110
)O valor do teste é sempre igual ou menor que o valor original. Como números que não são múltiplos de 3 também retornam um número menor que o original quando dividido por 3 e depois multiplicado por 3, o teste também fornece o FALSO desejado nesses números.
Na versão original, alguns loops
j
são usados para varrer os bitsi
e produzir a saída. Na versão golfed, um únicofor
loop é usado, no qualh
percorre todos os números de(n*2)*(1<<n)-1
até 0. Valores dei
são gerados porh/2/n
. A variávelj
não é mais usada, pois a quantidade equivalente é obtida deh%n
. O uso den*2
permite que ambas as linhas sejam impressas a partir do mesmo loop, com um pouco de multiplexação naputs
instrução para imprimir uma ou duas novas linhas no final da linha.Observe que a carne disso está na posição de incremento do
for()
suporte e, portanto, é executada após oi=h/2/h
.Saída de amostra n = 6:
fonte
i/3|i/3*2
truque é engenhoso! Eu não esperava uma expressão aritmética para a gramática.CJam,
3327 bytesGraças a @ jimmy23013 por jogar fora 6 bytes!
Experimente online!
fundo
Esta é uma implementação iterativa de um algoritmo recursivo:
As possíveis inclinações para n podem ser obtidas adicionando um dominó vertical às possíveis inclinações para n - 1 e dois dominós horizontais às possíveis inclinações para n - 2 .
Desta forma, o número de pavimentações para n é a soma dos números de pavimentações para n - 1 e n - 2 , ou seja, o n ° número de Fibonacci.
Como funciona
Exemplo de execução
fonte
LNli{_'|f\@"——"f\+2/}*\;{_N}/
.f\
ainda não havia sido implementado no 0.6.2, mas consegui combinar nossas abordagens. Obrigado!Haskell, 89 bytes
f
é uma função que, dado um número, retorna uma lista de uma linha de todas as possíveis inclinações de Fibonacci possíveis de comprimento n possível. não importa que retorne uma linha, porque as duas linhas de todas as inclinações são iguais.f
funciona chamando recursivamente emn-1
en-2
e adicionando"|"
e"--"
(respectivamente) para as cordas.g
é a função que responde às perguntas. basicamente chamaf
a entrada, dobra cada string para mostrar duas linhas e une todas por novas linhas.saída de exemplo:
fonte
CJam,
4237 bytesEu contei os traços como um byte cada, pois a pergunta permite substituí-los por hífens ASCII.
Experimente online.
Como funciona
Para obter todas as inclinações possíveis de 2 × L , iteramos sobre todos os números inteiros não negativos I <3 L , fazendo com que os dígitos pares na base 3 correspondam aos dominós horizontais e os ímpares aos verticais.
Como cada I possui L ou menos dígitos na base 3, isso gera todas as formas possíveis de cobrir a faixa de 2 × L. Tudo o que resta é filtrar as coberturas maiores ou menores que 2 × L e imprimir as coberturas restantes.
Exemplo de execução
fonte
3b
. Isso está certo?JavaScript (E6) 102
Gere configurações a partir de seqüências de bits, 0 -> '-' e 1 -> '|'.
Teste no console do firefox / firebug
Resultado
fonte
Haskell: 109 bytes
Esta é uma tradução do conhecido one-liner Haskell para calcular preguiçosamente a sequência dos números de Fibonacci:
A sequência principal de seqüências de caracteres lado a lado, não destruídas:
E o one-liner de Fibonacci para comparação:
Exemplo de uso:
fonte
Cobra - 176
Mal posso esperar até eu terminar o pacote de golfe Cobra.
fonte
J - 54 char
Função tomada
n
como argumento à direita.A principal raiz deste golfe é o
(];'--'&,"1@[,'|',"1])&>/
. Isso pega uma lista de inclinações de comprimento (N-2) e (N-1) e retorna uma lista de inclinações de comprimento (N-1) e N. Essa é a recorrência padrão de Fibonacci, à álgebra linear.];
retorna a lista da direita como a nova esquerda (como não há alterações).'--'&,"1@[
adiciona--
blocos à lista da esquerda, enquanto'|',"1]
adiciona|
blocos à lista da direita, e esses juntos são a nova lista da direita.Repetimos isso várias
n
vezes (esse é o@[&0
) e começamos com o ladrilho vazio e o ladrilho único de comprimento 1. Em seguida, retornamos o primeiro do par com0{::
. Ou seja, se o executarmos zero vezes, retornamos o primeiro, ou seja, o ladrilho vazio. Se o executarmosn
vezes, calculamos até o parn
(n
+1), mas descartamos o último. É trabalho extra, mas menos personagens.O
(1 2$,:)
é algo J tem que fazer, a fim de fazer as pavimentações nas listas facilmente extensível. Tornamos a lista inicial esquerda uma lista de 1 item de uma matriz de caracteres de 2 linhas, cada linha tendo o comprimento 0. A lista inicial direita é a mesma, mas tem as linhas com o comprimento 1, preenchidas|
. Em seguida, adicionamos os novos blocos a cada linha e anexamos as listas de matrizes quando unimos os dois conjuntos de inclinações. É uma aplicação simples de um conceito que J chama de classificação: manipulando essencialmente a dimensionalidade de seus argumentos e fazendo um loop implicitamente quando necessário.Tente você mesmo no tryj.tk .
fonte
Python 3: 70 bytes
Cria recursivamente todas as seqüências possíveis que
s
representam uma linha de dominós, que são duplicadas e impressas. Iniciars
como o caractere de nova linha faz com que a linha em branco aconteça automaticamente.O
==
entre as duas chamadasf
é apenas para realizar as duas chamadas de função. Eles geralmente retornamNone
porque são impressos e==
é um dos poucos operadores definidosNone
.As
and
s eor
s são para produzir o comportamento-circuito curto direito de reproduzir asif
s eelse
s do código ungolfed.Ungolfed:
fonte
Retina , 44 bytes
Nota: A retina é mais jovem que esse desafio.
Recebe a entrada unária com uma nova linha à direita.
Cada linha deve ir para seu próprio arquivo e
#
deve ser alterada para nova linha no arquivo. Isso é impraticável, mas você pode executar o código como um arquivo com o-s
sinalizador, mantendo os#
marcadores (e alterando a nova linha para#
na entrada também). Você pode alterar as#
costas para novas linhas na saída para facilitar a leitura, se desejar. Por exemplo:Método:
1
alteração para|
e uma com as duas primeiras1
alteradas para--
. Fazemos isso até termos linhas com pelo menos dois1
.1
sobraram apenas um single , mudamos para|
um.fonte