A Casa do Papai Noel
Nota: Este é o primeiro desafio que tentei definir. Já passou pela Sandbox, no entanto, se você encontrar algo errado com ela, por favor, não diminua o voto, mas deixe um comentário para que eu possa melhorá-la.
fundo
Há um velho quebra-cabeça infantil, onde o desafio é desenhar uma caixa com um teto e uma cruz no meio, sem levantar a caneta do papel ou passar por cima de qualquer linha duas vezes.
Na Alemanha, é conhecida como "das Haus des Nikolaus" ou "A Casa do Papai Noel". Sinceramente, não me lembro como costumávamos chamá-lo. Para quem não está familiarizado com o quebra-cabeça, todos os detalhes estão disponíveis aqui .
Aqui está uma representação de arte ASCII da casa.
/\
/__\
|\/|
|/\|
----
Desafio
Escreva um programa ou função para desenhar a Casa do Papai Noel em qualquer idioma de sua escolha.
Parece fácil demais? Bem, aqui está o problema. Ele também deve produzir cada estágio do desenho e cumprir as regras do quebra-cabeça. Seu programa não é obrigado a receber nenhuma entrada. A casa pronta deve ter exatamente a aparência mostrada acima.
De acordo com o site acima, existem 44 soluções possíveis. Você pode usar qualquer um deles. Este é um desafio de arte ASCII, portanto você não precisa calcular a solução, mas apenas desenhá-la.
Resultado
Um exemplo da saída necessária de uma das 44 soluções é mostrado abaixo:
----
\
\
----
__
\
\
----
\
__\
\
\
----
/\
/__\
\
\
----
/\
/__\
|\
| \
----
/\
/__\
|\/
|/\
----
/\
/__\
|\/|
|/\|
----
Regras
- Eu adicionei uma nova linha extra entre cada saída esperada para tentar tornar os requisitos mais claros. Isso é opcional. Qualquer número de linhas em branco entre cada saída é permitido.
- Sua saída deve consistir apenas nos caracteres /, \, -, _ e espaço, como mostrado acima. Espaços à direita são permitidos.
- Cada linha do seu desenho deve continuar do final da linha anterior e você não pode repetir nenhuma linha.
- Falhas padrão proibidas.
- Você não é obrigado a emitir a rima mencionada no link acima.
- Este é um código de golfe, então a resposta mais curta em bytes será a vencedora.
Resultado
Algumas ótimas respostas, agradecimentos e respeito a todos que postaram. Eu disse a contagem de bytes mais baixa, mas marquei como resposta principal não apenas para isso, mas também para a grande explicação do código. Nice @Dennis.
Respostas:
Geléia ,
403936 bytesExperimente online!
Como funciona
é um literal bijective base-250; cada caractere corresponde ao seu ponto de código na página de códigos de Jelly . O resultado é o número inteiro 13192938935880491074 .
converte o número inteiro gerado em base bijetiva 9, produzindo a matriz inteira
[9, 6, 7, 9, 6, 2, 2, 7, 1, 5, 3, 8, 1, 3, 5, 8, 4, 4, 4, 4] . Os números inteiros correspondem à ordem do traçado, com exceção de 9 , que indica um espaço.
agrupa a matriz gerada em uma matriz singleton, que será necessária para anexá-la à matriz que geraremos agora.
funciona da seguinte maneira.
¤
combina os dois elos à esquerda em uma cadeia niládica. O primeiro,“|_/-\/\|‘
produz os pontos de código dos caracteres especificados, produzindo [124, 95, 47, 45, 92, 47, 92, 124] . Em seguida,Ė
enumera os pontos do código, produzindo[[1, 124], [2, 95], [3, 47], [4, 45], [5, 92], [6, 47], [7, 92] [8, 124]] . A par [n, c] significa que o n th acidente vascular cerebral será o de caracteres ASCII com ponto de código c .
concatena as matrizes geradas. O resultado é a matriz
[[9,6,7,9,6,2,2,7,1,5,3,8,1,3,5,8,4,4,4,4], [1.124 ], [2,95], [3,47], [4,45], [5,92], [6,47], [7,92], [8,124]] .
executa uma redução cumulativa (ou seja, mostrando todas as etapas intermediárias), usando transliteration (
y
) com argumentos trocados (@
). Na primeira etapa, por exemplo, substituímos 1 na matriz original por 124 , que é o ponto de código do caractere | .nivela o resultado e substitui todos os pontos de código pelos caracteres ASCII correspondentes. Em todas as etapas, isso gerará alguns caracteres não imprimíveis com os pontos de código 1 a 9 .
leva o máximo de caracteres pelo caractere de espaço, substituindo todos os caracteres não imprimíveis por espaços.
divide a string gerada em pedaços de comprimento quatro e os une a um avanço de linha como separador.
fonte
Javascript (ES6),
119116969291 bytesfonte
Lote,
356344341337 bytes|
Regras estúpidas de cotação em lote ... se você quer um|
em uma variável, precisa citá-lo com três^
s, por isso é mais barato usá-@
lo e substituí-lo na saída, embora, para conseguir isso, tenha que começar pela parede esquerda. A linha um tem um espaço à direita.echo(
é usada porque or
,c
ef
variáveis poderiam estar vazio e não queremosECHO is off.
impresso.Editar: salvou 12 bytes usando o avanço da última parte. Economizei 3 bytes usando um
for
loop para imprimir cada parte, isso significa que agora uso|
s em minhas variáveis, o que torna o código um pouco mais fácil de ler. 4 bytes salvos usando explícito@
caracteres vez de@echo off
. Eu acho que começar com a parede esquerda ainda requer o menor número de bytes.fonte
echo:
é mais padrão, masecho(
parece que você está abusando de um recurso de idioma, então marque com +1.echo:
falha em alguns casos extremos obscuros, mas não conheço nenhum caso de falhaecho(
.foo.bat
no diretório atual, fazecho(\..\foo.bat
eco ,\..\foo.bat
mas éecho:\..\foo.bat
executadofoo.bat
.echo:.\foo.bat
teria esse efeito. É por causa de uma falha na pilha de diretórios, onde o "UP" do diretório raiz é o diretório atual?C, 118 bytes
fonte
char*p
(sem espaço) e altere'B'
e'J'
para seus códigos ASCII./// , 112 bytes
Experimente online!
fonte
PHP,
9895 bytesinspirado na solução da Arnauld
Nota: A primeira linha de código possui um espaço à direita.
fonte
PHP com GD,
348338 bytes (não competindo)não exatamente o que estava sendo pedido, mas ...
salvar em arquivo, chamar em um navegador
demolir
Para desenhar uma casa maior, altere
$w=9
para a largura desejada.fonte