Acho fascinante como as letras "H" e "I" são muito semelhantes. "H" é um traço horizontal cercado por dois traços verticais; "I" é um traço vertical cercado por dois traços horizontais (dependendo da fonte). Aposto que isso pode ser aninhado ... Você sabe o que isso me lembra? Fractais !!!
Vamos definir a pirâmide "IHIH" da seguinte forma: A primeira iteração é essa representação ASCII da letra "I":
---
|
---
A próxima iteração tem um traço vertical em ambos os lados.
| |
|---|
| | |
|---|
| |
Se você visualizar o "I" no meio como um único traço horizontal, essa segunda iteração será basicamente um "H". A terceira iteração adiciona um traço horizontal nas partes superior e inferior
-------
| |
|---|
| | |
|---|
| |
-------
Novamente, se você visualizar o "H" no meio como um único golpe vertical, essa iteração é basicamente um "I". Esse padrão continua, alternando entre "H" e "I" em todas as iterações. Para referência, aqui estão as 6 primeiras iterações:
1:
---
|
---
2:
| |
|---|
| | |
|---|
| |
3:
-------
| |
|---|
| | |
|---|
| |
-------
4:
| |
|-------|
| | | |
| |---| |
| | | | |
| |---| |
| | | |
|-------|
| |
5:
-----------
| |
|-------|
| | | |
| |---| |
| | | | |
| |---| |
| | | |
|-------|
| |
-----------
6:
| |
|-----------|
| | | |
| |-------| |
| | | | | |
| | |---| | |
| | | | | | |
| | |---| | |
| | | | | |
| |-------| |
| | | |
|-----------|
| |
O desafio:
Escreva um programa ou função que produza a n- ésima iteração da pirâmide IHIH e uma nova linha opcional à direita. Sua entrada será um número inteiro positivo único, em qualquer formato razoável que você desejar. Você não precisa lidar com entradas inválidas, por exemplo, números não inteiros, números menores que 1 etc. Seu programa deve, no mínimo, produzir a saída correta para entradas de até 20. Como esse é um código de golfe , brechas padrão não são permitidas. e a resposta mais curta em bytes vence!
Respostas:
Pitão ,
50403125 bytesSuíte de teste.
Explicação
Este é um algoritmo recursivo.
Em cada iteração, realizamos três ações:
"-"
ou"|"
dependendo do número de iterações.Após as iterações, as saídas com números ímpares serão transpostas. Portanto, nós os transpomos.
fonte
Python,
165145133123 bytesUma solução recursiva:
Chamado com
print ("\n".join(i(int(sys.argv[1]))))
, em que o parâmetro é o número de iteração da pirâmide IHIH.Obrigado a @DJMcMayhem por salvar 20 bytes. Levar a idéia por trás dessas sugestões economizou mais 12 bytes. Obrigado a @Maltysen pelas sugestões que cortaram mais alguns bytes.
A função define o delimitador
d
como"|"
e os espaços intermediários como" "
(para iterações de números ímpares), lida com o retorno no caso degenerado e, em seguida, redefine o delimitador" "
e os espaços intermediários"-"
para iterações de número par. A função retorna uma lista de cadeias de caracteres para cada linha do IHIH, incorporando o resultado de uma chamada recursiva à função no lugar certo da lista.fonte
if e<1:return'|'
(sem nova linha entre elas) e remova o "else" e remova o recuo extra.return
. Além disso, você pode mesclar as linhas semif
s com ponto e vírgula, e economizar no recuoQueijo Cheddar ,
186177165154148131 bytesUsa recursão. Adicionará uma explicação depois de terminar o golfe.
Experimente online!
Explicação
Este é um pouco complexo também para acompanhar todas as variáveis que estou usando, mas vou tentar simplificar:
Isso foi um problema para o golfe, mas seus 55 bytes são menores que o original.
fonte
Python 2, 93 bytes
Freira com vazamento economizou 7 bytes.
fonte
int(x/2.)
porque estava tomando,range(-n,n+1)
mas agora posso usá-las. Obrigado!Matrizes ,
8062 bytesUma solução iterativa (recursão em Matricks é difícil ...)
Correr com
python matricks.py ihih.txt [[]] <input> --asciiprint
Explicação:
fonte
JavaScript (ES6),
9290 bytesA solução recursiva funciona com a iteração anterior, adicionando o
v
caractere aos lados e, em seguida, adicionando oc
caractere aos cantos e oh
caractere na parte superior e inferior. O conjunto de caracteres simplesmente alterna cada iteração. Editar: salvou 2 bytes retornandov
quandon=0
.fonte
Dyalog APL ,
5243 bytesv h s←'|- '
Atribui a três caracteres para três nomes ( v ertical, h orizontal, é ritmo)⊃
o primeiro, ou seja|
⍪
transformar em 1 × 1 tabela{
...}⍣⎕
obtenha informações e aplique a função chave que muitas vezesv=⊃⍵:
se o caractere superior esquerdo do argumento for vertical, então:h⍪⍨
horizontais abaixoh⍪
horizontais acimas,
espaços à esquerda de⍵,s
o argumento com espaços à direita⋄
outro:v,⍨
verticais à direita dev,
verticais à esquerda des⍪
espaços acima⍵⍪s
o argumento com espaços abaixoTryAPL online!
fonte
Braquilog , 84 bytes
Experimente online!
Um porto da minha resposta em Pyth .
fonte
C, 110 bytes
Invocar como
f(n)
. Para 111 bytes, eu poderia fazer:isto é,
#define
salva exatamente um byte.fonte
Dyalog APL, 34 bytes
{
...}⍣⍵⍪'|'
Aplicar função nos⍵
tempos entre chaves , começando com a matriz de caracteres 1x1|
. O resultado de cada aplicativo é o argumento para o próximo aplicativo.s b←' -|'~⊃⍵
s é espaço eb é a barra que não está no canto superior esquerdo do argumento (' -|'~'-'
remove a barra horizontal e deixa espaço e barra vertical)s,⍵,⊃s b
adicione espaço à esquerda e à direita (⊃
seleciona s do vetor sb)b,b,⍨⍉
transponha e adicione b à esquerda e à direitaPara números ímpares, isso deixa o resultado transposto, portanto é necessária uma transposição final.
⍉⍣⍵
⍵
Tempos de transposição (uma vez seria suficiente, mas mais curto para codificar dessa maneira)TryAPL online
fonte
Cheddar , 107 bytes
Experimente online!
fonte
Cheddar, 85 bytes
Minha primeira resposta Cheddar. Experimente online!
Se eu tentar escrever
r=(-n|>n).map(v->abs v).map
er(y->r(x->…))
, em seguida , o intérprete trava. ; -;fonte
v->abs v
em(abs)
(por exemplor.map((abs))
) qual retornará uma função que tenha o comportamento da função abs. por exemplo(+)(1,2)
->3
.(^)(2,6)
-> 64. Também grande wow em mim outgolfing em quase 50%Runtime Error: `abs` has no behavior for types `Number` and `Number`
(porquemap
recebe tanto o elemento e seu índice, presumivelmente.)APL (Dyalog Classic) , 34 bytes
Experimente online!
(usos
⎕io←1
)⍳⎕
é1 2 ... N
(⌽,0,⊢)
é um trem que o transforma em-N ... -1 0 1 ... N
∘.( )⍨
executa os parênteses para cada par de coordenadas⍺ ⍵
o trem
(≤-(1+=)×2|⌈)
ou seu equivalente dfn{(⍺≤⍵)-(1+⍺=⍵)×2|⍺⌈⍵}
produz uma matriz como:'- |'[2+ ]
cria esses índices válidos⎕IO=1
e seleciona os caracteres correspondentesfonte
Ruby,
817877 bytesIsso é baseado na resposta Python de Lynn . Sugestões de golfe são bem-vindas.
Edit: 3 bytes graças a Lynn. Correções e golfe 1 byte graças à Jordânia.
Ungolfing:
fonte
.map(&:abs)
?*
não está fazendo nada. Você pode usar em*""
vez de.join
. Além disso, o usop
envolve cada linha entre aspas (que chamainspect
seus argumentos), o que pode desqualificá-lo.&:abs
(map &:abs
). Você pode fazer algo com s emArray#product
vez demap
s aninhados , mas isso dificulta as quebras de linha.r.product(r).map
(no entanto, isso funciona) é mais longo e não parece permitir quebras de linha com muita facilidade.MATLAB,
168163 bytesProvavelmente, essa não é a maneira mais inteligente de fazer isso: expandir uma string por todos os lados em
n
etapas:Uso: Salvar como
g.m
(preciso adicionar isso à contagem de bytes?) E chamar, por exemplog(15)
.Ungolfed:
fonte
' '
por0
(o Matlab trata char 0 como um espaço) e'-'
por45
. O nome do arquivo não precisa ser incluído na contagem de bytesNa verdade ,
484544 bytesEsta é uma tentativa de portar minha resposta Ruby para Actually. Isso é muito longo e as sugestões de golfe são muito apreciadas. Experimente online!
Aqui está uma versão de 46 bytes que separa as funções aninhadas para que possamos definir
"| -"
em menos bytes. Experimente online!Ungolfing:
Primeiro algoritmo
Segundo algoritmo
fonte
u;±ux♂A╗╜`;2@%2╛%u╛(2±&<I"| -"E`#"╝╜%r£Mεj."%£M
é maior do que o que você possui atualmente (em 2 bytes), mas você pode encontrar alguma inspiração para maneiras de torná-lo mais curto que eu não estou vendo.Tela ,
19181714 bytesExperimente aqui!
Se eu tivesse permissão para produzir todas as outras saídas giradas em 90 °, os últimos 4 caracteres poderiam ser removidos.
Explicação (alguns caracteres foram alterados para parecer ~ monoespaços):
fonte
05AB1E ,
2928 bytesExperimente online!
-1 graças a Dzaima ...
Esta é uma solução iterativa.
Essencialmente Isso é feito criando o seguinte padrão:
Em seguida, em pares, transponha cada elemento e adicione o preenchimento.
Ao transpor após cada iteração, acabamos criando um único canto do padrão.
Em seguida, podemos usar os comandos de reflexão do 05AB1E.
fonte
Mathematica,
158164 bytesCalcula matematicamente o símbolo correto nas coordenadas (i, j), onde ambos correm de -n a n. Formato humano:
fonte
PHP, 166 bytes
joguei mais de 100 bytes na minha primeira abordagem e ainda é a resposta mais longa aqui.
demolir
destroçado
fonte
Perl 5 , 150 bytes
Experimente online!
fonte
Haskell , 110 bytes
Experimente online!
Explicação / Ungolfed
A função auxiliar
g
pega um caractere e uma lista de seqüências de caracteres e, em seguida, pré e anexa esse caractere a cada sequência:Em seguida, o operador
(!)
assume uma função (g
), um número (n
) e um caractere (c
). Em seguida, calcula a saída paran-1
, aplica a funçãog
a ela e adiciona uma string da mesma largura que consiste emc
s no início e no final:Com isso, estamos prontos para gerar os resultados recursivamente, primeiro precisamos cobrir o caso base:
E então a recursão:
fonte
J , 37 bytes
TIO
fonte
Stax , 22 bytes
Execute e depure
Descompactado, não jogado e comentado, parece com isso.
Execute este
fonte