Escreva um programa ou função que utilize uma sequência de linhas simples não vazia. Você pode assumir que ele contém apenas ASCII imprimível, excluindo espaço.
Imprima ou retorne uma forma de losango de arte ASCII semelhante a um limão ou lima feita a partir dos prefixos da sequência.
Suponha que a sequência de entrada tenha n letras. Então, essa forma consiste em 2n - 1 colunas de arte ASCII costuradas, cada uma consistindo em 2n - 1 linhas. Contando de 1, a k- ésima coluna tem f (k) = min (k, 2n - k) caracteres de largura e contém cópias f (k) dos primeiros f (k) caracteres de entrada, centralizados verticalmente, com um único espaço em branco linhas que separam as cópias.
Por exemplo, se a entrada for Lemon
, a saída deve ser:
Lemon
Lemo Lemo
Lem Lemon Lem
Le Lemo Lemo Le
L Lem Lemon Lem L
Le Lemo Lemo Le
Lem Lemon Lem
Lemo Lemo
Lemon
Se a entrada for lime
a saída deve ser:
lime
lim lim
li lime li
l lim lim l
li lime li
lim lim
lime
E o mesmo padrão é seguido para outras entradas:
a
a
Be
Be
B B
Be
/\
/\
/ /
/\
cat
cat
ca ca
c cat c
ca ca
cat
|||
|||
|| ||
| ||| |
|| ||
|||
.__.
.__.
.__ .__
._ .__. ._
. .__ .__ .
._ .__. ._
.__ .__
.__.
$tring
$tring
$trin $trin
$tri $tring $tri
$tr $trin $trin $tr
$t $tri $tring $tri $t
$ $tr $trin $trin $tr $
$t $tri $tring $tri $t
$tr $trin $trin $tr
$tri $tring $tri
$trin $trin
$tring
As linhas na saída podem ter espaços à direita e pode haver uma nova linha à direita opcional.
O código mais curto em bytes vence.
Respostas:
Matlab,
140 136 128124 bytesBasicamente, primeiro começa com a seção do meio e, em seguida, acrescenta / acrescenta as versões reduzidas / modificadas passo a passo.
Obrigado por 8 bytes @LuisMendo!
Por exemplo, para
MATLAB
obtermos:fonte
flip
: /Python 2,
121110 bytes116 bytes se estiver usando
raw_input
. O programa basicamente faz uma máscara com base na distância L1 / norma Manhattan / centro, bem como a paridade dessa distância em comparação com a paridade do comprimento da entrada.(Graças a @Lynn por -9 bytes e abrindo caminho para mais 2)
fonte
s
é usado no final da longa fila, por isso, infelizmente, isso não é possívelR
.R
torna o código muito mais limpo!MATL , 44 bytes
Tomei alguma inspiração da resposta de @ flawr (embora o algoritmo não seja o mesmo)
Entrada é uma string com aspas simples.
Experimente online!
fonte
JavaScript (ES6), 132 bytes
Teste
fonte
Pitão, 32 bytes
Demonstração
fonte
Geléia,
32.26 bytesExperimente online!
EDIT: Dennis salvou 6 bytes. Obrigado!
fonte
JavaScript,
187178 bytesUma abordagem bit a bit. A função
m
define uma máscara iniciando em2 ** length
, por exemplo,00100
em binário e definindom(n) = m(n-1) << 1 | m(n-1) >> 1
para a primeira metade. Curiosamente, a segunda metade pode ser definida comom(n) = m(n-1) << 1 & m(n-1) >> 1
. (embora o programa opte por definirm(n) = m(2 * length - 1)
para a segunda metade) A partir daqui, essas máscaras podem ser usadas para determinar se uma palavra ou espaço deve aparecer marcando2 ** column & m(row)
. Claro que em JavaScript é mais curto escrever2 ** something
com1 << something
...nota: escrito enquanto estiver cansado.
Podequase certamente cometer erros.fonte
Haskell, 109 bytes
fonte
Braquilog , 46 bytes
Experimente online!
Contagem de bytes terrível e abordagem provavelmente pior (para não mencionar o Brachylog não é exatamente projetado para a arte ASCII), mas eu perdi tempo suficiente para publicá-lo de qualquer maneira.
Quase a única parte inteligente disso é o uso de
a₁
para gerar os espaços verticais maior-primeiro, enquantoa₀
gera a palavra prefixos menor-primeiro ezz
expandir espaços únicos em blocos de espaço correspondentes às larguras dos prefixos.fonte
TSQL, 259 bytes
Golfe:
Ungolfed:
Violino
fonte
C, 167 bytes
Este programa espera que o texto de entrada seja passado como o primeiro parâmetro para o programa (via linha de comando ou outro modo) e gravará a saída em stdout.
Esta é a minha primeira tentativa de código de golfe aqui, pois parecia um desafio razoável, por isso provavelmente pode ser jogado mais do que eu era capaz devido apenas ao modo como o fiz.
Explicação
É significativo o suficiente observar o uso de
(n < m) ? n : (m * 2) - n
no programa pelo menos duas vezes para obter a distância invertida a partir de uma posição centralm
em um intervalom * 2
com a entradan
. Se houver uma maneira mais curta de fazer isso, isso poderá ser resolvido com mais facilidade, pois esse algoritmo é importante para o funcionamento deste programa.fonte
C, 137 bytes
Demolir:
Isso desenha todos os elementos da grade 2n-1 x 2n-1, com uma função de máscara que decide se o elemento atual deve ser um espaço em branco ou a palavra de entrada (a máscara verifica a forma de um diamante e o padrão quadriculado).
fonte