Inspirado pelo ladrilho de dominó de Fibonacci , esse problema é sobre a geração de arte ASCII representando outra famosa seqüência combinatória.
Um diagrama de montanha em n etapas é um desenho de uma cadeia de montanhas, usando exatamente n '/' e n '\', de modo que os caracteres desenhem uma curva contínua que nunca cai abaixo de sua "altitude" inicial. Por exemplo,
/\/\
/\/ \
e
/\
/\/ \/\
são ambos diagramas de montanha em quatro etapas, mas
/\ /\/\
\/
não é.
Entrada
O programa deve aceitar um número inteiro n de stdin ou como parâmetro para uma função.
Resultado
Imprima todos os diagramas de montanha n- step para stdout. Os diagramas podem estar em qualquer ordem, mas devem ser separados por algum tipo de espaço em branco. Você pode decidir se diferentes diagramas serão exibidos horizontalmente, verticalmente etc.
Como no problema de dominó, você pode usar qualquer espaço em branco que desejar. Isso inclui novas linhas extras antes ou depois da saída impressa.
Exemplo
Algumas amostras de saídas válidas para n = 3:
Saída válida A:
/\
/\ /\ / \ /\/\
/\/\/\ / \/\ /\/ \ / \ / \
Saída B válida:
/\
/\/ \
/\/\
/ \
/\/\/\
/\
/ \
/ \
/\
/ \/\
Saída válida C:
/\
/ \ /\
/ \ /\/ \
/\/\
/\ / \
/ \/\ /\/\/\
Isso é código de golfe; o programa mais curto (em bytes) vence.
fonte
Respostas:
Python 2: 151 caracteres
Uau, isso é uma bagunça.
A primeira idéia é usar os números
0 to 2**N-1
para codificar todas as sequências deN
movimentos para cima e para baixo em seus bits. Lemos esses bits um por um repetidos%2
e/2
iterados em umexec
loop.Armazenamos a cadeia de montanhas lateralmente em uma lista de cordas transposta
L
. Cada vez que geramos uma nova linha de espaços, substituímos um espaço na nova linha por/
ou\
dependendo de uma movimentação para cima ou para baixo.O índice desse espaço são
c
espaços do final, ondec
está a altura de execução. Fazer isso de frente faria as montanhas de cabeça para baixo. Nós o deslocamos ainda maisb
para alinhar movimentos para cima e para baixo, obtendo[b-c]
. Começarc
com 1 em vez de 0 corrige um erro de um por um.Para eliminar os casos em que
c
caem abaixo do valor inicial1
, quando isso acontece, definimosi
como0
, o que faz com que todos os outros movimentos sejam descendentes, tornando-c
se mais negativos. Então, quando verificamos sec
terminou em1
, também verificamos sec
alguma vez caiu abaixo dela. Nós apenasprint
a cordilheira sec
é1
.Para imprimir, é
zip(*L)
necessário transpor o intervalo da vertical para a horizontal e imprimir cada sequência de caracteres unida. Muitos problemas nesta resposta vieram das seqüências de caracteres do Python como imutáveis, por isso trabalhamos com elas como listas de caracteres e as juntamos apenas em strings para impressão.Obrigado a @flornquake pela ajuda e melhorias.
fonte
' '
vez de" "
se desejar fazer um loop usandoexec
. :) Btw, você não precisa escapar da barra invertida.' '
e tentei substituir a string por aspas por uma variável. Isso ainda deu o índice fora do intervalo:for _ in[0]*N:exec("b=i%2;c+=2*b-1;L+=[[" "]*N];L[-1][b-c]='\\/'[b];i=i//2*(c>0);")
exec("b=i%2;c+=2*b-1;L+=[[' ']*N];L[-1][b-c]='\\/'[b];i=i//2*(c>0);")
, ou seja, as aspas internas devem ser diferentes das exteriores.APL (88)
Saída para
n=3
:Explicação:
(N/2)⊤⍳2*N←2×⍵
: obtenha um campo de bits para cada número de0
a2^⍵
.Z←↓⍉¯1+2×
: multiplique por 2 e subtraia 1, dando1
para cima e-1
para baixo. Armazenar um vector de vectores, cada um vector que contém a representação de um número, emZ
.{
...}¨Z
: para cada elemento deZ
:∧/0≤+\⍵
: verifique se a soma atual nunca cai abaixo0
(não fica abaixo do nível do solo),(0=+/⍵)
: e que a soma total é0
(termina no nível do solo).{
...}¨Z/⍨
: selecione os elementosZ
para os quais isso é verdade. Para cada um deles:K←(⍵≠1)++\⍵
: encontre a altura de cada personagem e armazene-aK
. Levante cada\
uma delas, para que elas se alinhem com os/
s corretamente. Isso torna a altura do solo1
.¯1+2×K=⊂⌽⍳⌈/K
: para cada coluna, faça uma lista[1..max(K)]
e marque a posição do caractere nessa coluna com1
e o restante como-1
. A replicação em -1 preenche essa posição com um espaço.'\/'[1+⍵=1]/⍨¨
: encontre o caractere correto para cada coluna e replique-o pela lista dessa coluna.⍉↑
: transforme o resultado em uma matriz e coloque-o com o lado direito para cimafonte
Python,
261241236 caracteresComeça a demorar um pouco para
n=5
subir ...fonte
JavaScript (ES6) 159
163Assim como minha resposta para Fibonacci Domino Tiling, eu examino todas as seqüências de n + n bits, com 1 marcando um '/' e 0 marcando um '\' (apenas para a saída, '2' é adicionado posteriormente para marcar uma nova linha) . Ao construir esse padrão ASCII, verifico o saldo - os mesmos números de 0 e 1 e nunca abaixo da linha de base - e mostro o que obedece às regras.
Saída feita com 'alert', que é padrão para o codegolf JS, mas bastante irritante e talvez contra as regras. Usando console.log, a contagem de caracteres vai para 165.
Menos golfe
Teste no console do FireFox / FireBug.
Resultado
fonte
-b-b
e-n-n
não-2*b
?2*b+1
->b-~b
)CJam, 84 bytes
Observe que este programa imprime as montanhas em um loop infinito para que o intérprete online não o ajude; chamar na linha de comando usando
ou para tentar usar on-line
e basta pressionar o botão executar várias vezes seguidas e imaginar que a saída é concatenada.
A idéia básica é que sabemos que uma cadeia de montanhas de tamanho Q tem Q de cada transição para cima e para baixo.
Então, se for válido, imprimi-lo, caso contrário, o retiramos da pilha para que não transborde.
O roteamento de impressão basicamente constrói cada coluna como espaços Q - altura, depois o símbolo, mais espaços suficientes para atingir Q + 1 total de caracteres e, em seguida, transpomos e imprimimos as linhas com novas linhas entre eles.
fonte
C, 179
excluindo espaços em branco desnecessários.
Uma estratégia semelhante ao edc65. Eu corro todos os
n*2
valores binários de -bit, considerando/
= 1 e\
= 0.Eu formato uma única string contendo
n
quebras de linha todos osn*3
caracteres. Como foi escrita, a string contém 1000 caracteres; portanto, geralmente há muito espaço em branco impresso após a montanha. (Isso pode ser corrigido adicionandos[n*n*3]=0
antes doputs
.) De qualquer forma, isso me permite gerar toda a montanha com um únicoputs
depois de verificar se ela está em conformidade com as regras.Vou tentar convertê-lo em uma função e reduzir para um único
for
loop mais tarde.Saída (observe a enorme quantidade de espaço em branco à direita)
fonte
Haskell, 140 bytes
Depois que várias tentativas falharam em ser muito jogáveis, acabei com essa implementação do Haskell. Estou feliz por estar dentro de um fator de 2 da solução APL!
Solução Golfed:
Ungolfed e comentou:
O programa constrói o conjunto de diagramas de montanha n- step recursivamente. Cada diagrama é representado por uma lista de cadeias infinitamente longas, representando a montanha desenhada de lado, seguida por espaços que se estendem até o infinito. Isso garante que todos os diagramas tenham a mesma altura, o que facilita a recursão. A impressora de montanha aceita um parâmetro que fixa a altura a um valor finito.
Uso da amostra:
fonte
GolfScript 103 ( demo )
O programa usa um parâmetro inteiro tenta renderizar como montanhas todas as representações binárias dos números de 0 a 2 ^ (n-1). Não gera combinações inválidas (por exemplo, as que ficam abaixo do nível 0).
fonte