Escreva um programa ou função que utilize uma sequência garantida para conter apenas caracteres ASCII imprimíveis , exceto espaço, e que seja um número triangular positivo (1, 3, 6, 10, 15, ...) de comprimento.
Imprima ou retorne a mesma sequência, mas moldada em um triângulo usando espaços. Alguns exemplos mostram melhor o que quero dizer:
Se a entrada for R
, a saída será
R
Se a entrada for cat
, a saída será
c
a t
Se a entrada for monk3y
, a saída será
m
o n
k 3 y
Se a entrada for meanIngfu1
, a saída será
m
e a
n I n
g f u 1
Se a entrada for ^/\/|\/[]\
, a saída será
^
/ \
/ | \
/ [ ] \
Se a entrada for
Thisrunofcharactersismeanttohavealengththatcanbeexpressedasatriangularnumber.Diditwork?Youtellme,Ican'tcountverywell,ok?
então a saída será
T
h i
s r u
n o f c
h a r a c
t e r s i s
m e a n t t o
h a v e a l e n
g t h t h a t c a
n b e e x p r e s s
e d a s a t r i a n g
u l a r n u m b e r . D
i d i t w o r k ? Y o u t
e l l m e , I c a n ' t c o
u n t v e r y w e l l , o k ?
Basicamente, as novas linhas são inseridas entre as substrings de comprimento triangular, os espaços são adicionados entre todos os caracteres e cada linha é recuada com espaços para ajustar-se à forma do triângulo.
Opcionalmente, uma única nova linha à direita e linhas com espaços à direita são permitidas, mas, caso contrário, sua saída deve corresponder exatamente a esses exemplos. A última linha do triângulo não deve ter espaços à esquerda.
O código mais curto em bytes vence.
Respostas:
Pitão, 22 bytes
Experimente on-line: Demonstration or Test Suite
Explicação:
fonte
Python, 81 bytes
Uma função recursiva. Vai do final de
s
, cortando e imprimindo caracteres. O número de caracteres a tomar é calculado a partir do comprimento des
. A função é configurada para imprimir na ordem inversa das chamadas recursivas, que terminam quandos
estão vazias e resolvem o backup da linha. Cada camada, o prefixo,p
possui um espaço extra adicionado.No Python 3, o
if
pode ser feito via curto-circuito, embora isso não pareça salvar caracteres:Uma alternativa igualmente longa com o encadeamento da desigualdade:
Ambos
print
ef
retornoNone
, o que é difícil de usar.fonte
Retina ,
1081029487826463 bytesAgradeço ao Sp3000 por me fazer seguir minha abordagem original, que reduziu a contagem de bytes de 108 para 82.
Um enorme agradecimento a Kobi, que encontrou uma solução muito mais elegante, o que me permitiu salvar outros 19 bytes em cima disso.
Onde
<space>
representa um caractere de espaço único (que seria removido pelo SE). Para fins de contagem, cada linha entra em um arquivo separado e\n
deve ser substituída por um caractere de avanço de linha real. Por conveniência, você pode executar o código como está em um único arquivo com o-s
sinalizador.Experimente online.
Explicação
Bem ... como sempre, não posso dar uma introdução completa aos grupos de equilíbrio aqui. Para uma cartilha, veja minha resposta Stack Overflow .
O primeiro estágio é um
S
estágio plit, que divide a entrada em linhas de comprimento crescente. o_
indica que pedaços vazias devem ser omitidos da divisão (que afeta apenas o final, porque haverá uma correspondência na última posição). O regex em si é inteiramente contido em uma olhada, para que não corresponda a nenhum caractere, mas apenas a posições.Esta parte é baseada na solução de Kobi com um pouco de golfe adicional que eu me encontrei. Observe que os lookbehinds são correspondidos da direita para a esquerda no .NET, portanto, a melhor explicação a seguir deve ser lida de baixo para cima. Também inseri outra
\G
na explicação para maior clareza, embora isso não seja necessário para o padrão funcionar.Eu ainda estou admirando o trabalho de Kobi aqui. Isso é ainda mais elegante que o regex de teste principal. :)
Vamos para a próxima etapa:
Simples: insira um espaço após cada caractere que não seja de avanço de linha.
Este último estágio recua todas as linhas corretamente para formar o triângulo. O
m
é apenas o modo de várias linhas de costume para fazer^
coincidir com o início de uma linha. O+
instrui o Retina a repetir esse estágio até que a string pare de mudar (o que, nesse caso, significa que a regex não corresponde mais).Portanto, isso corresponde ao início de qualquer linha que não tenha um recuo maior que o seguinte. Em qualquer posição, inserimos um espaço. Esse processo termina quando as linhas são organizadas em um triângulo puro, porque esse é o layout mínimo em que cada linha tem um recuo maior que o seguinte.
fonte
Doces ,
675957 bytes&iZ1-=yZ1+Z*2/>{0g}0=z@1i&{|.}bYR(" ";=)ZR(=a&{;}" ";)"\n";Y1-=ya1j
&1-8*1+r1-2/=y@1i&{|.}bYR(" ";=)ZR(=a&{;}" ";)"\n";Y1-=ya1j
&8*7-r1-2/=y@1i&{|.}bYR(" ";=)ZR(=a&{;}" ";)"\n";Y1-=ya1j
ou:
forma longa:
fonte
CJam,
2726 bytesAgradecimentos ao Sp3000 por economizar 1 byte.
Surpreendentemente perto de Pyth, vamos ver se isso pode ser jogado ...Teste aqui.
Explicação
fonte
'
paraS
???S
é uma string, não um caractere, elef
será mapeado sobre essa string em vez da lista de linhas.Ruby,
847773 bytes77 bytes
Redução de mais alguns bytes removendo a variável
r
conforme sugerido por steveverrill.84 bytes
Ungolfed:
Primeiro cálculo do número triangular a partir da sequência de entrada
por exemplo, o tamanho da string de entrada é 120 e nosso número triangular n será 15.
Na linha acima, ele imprime espaços seguidos por séries de cadeias que são buscadas na cadeia de entrada usando o seguinte padrão
[[0,0],[1,2],[3,5],[6,9]]
Uso:
fonte
upto
que não requer um argumento inteiro (times
certamente). Incorporei parte da sua sintaxe em uma revisão da minha resposta. A maior dica que tenho para você é que você não precisa dessa variávelr
. Basta usar um em,
vez de..
e o número após a vírgula é o número total de elementos a serem retornados, em vez do final do intervalo.Pitão, 27 bytes
Suíte de teste
Uma abordagem interessante - imperativa e usos
.I
. Provavelmente jogável.fonte
C,
138136134 bytesToma uma string como entrada:
fonte
printf(" ")
eprintf("\n")
porputs(" ")
eputs("\n")
. Cada substituição economizará 2 bytes. :)Abordagem Ruby 2 rev 1, 76 bytes
Otimizado usando idéias de sintaxe da resposta de Vasu Adari, além de algumas reviravoltas minhas.
Abordagem Ruby 2 rev. 0, 93 bytes
Abordagem completamente diferente. Primeiro, adicionamos espaços entre os caracteres da entrada. Em seguida, imprimimos as linhas linha por linha.
Abordagem Ruby 1, 94 bytes
isso acabou muito mais tempo do que o previsto.
w
contém o número de caracteres imprimíveis na linha inferior ou, equivalentemente, o número de linhas.Cada linha contém
w
caracteres de espaço em branco (o último dos quais é a nova linha), portanto, a idéia é imprimir esses caracteres de espaço em branco e inserir os caracteres imprimíveis sempre que necessário.fonte
Minkolang 0.14 , 42 bytes
Experimente aqui.
Explicação
fonte
Python 2,
8885 bytesObrigado xnor por salvar 3 bytes.
fonte
s
atrapalha o cálculo do número de espaços?S=s=raw_input()
?CJam, 50 bytes
Experimente aqui.
Explicação
fonte
JavaScript (ES6), 135 bytes
De-golfe + demo:
fonte
for (s = j = 0; j < w.length; j += s++);
? Além disso, dentro de a<pre>
, você pode usar em\n
vez de<br>
. Além disso, você esqueceu de mencionar que é o ES6.Java,
258194Golfe:
Ungolfed:
Saída do programa:
fonte
import static System.out;
tem 25 bytes eSystem.
7 bytes. Ele é usado três vezes e 21 <25, para aumentar o tamanho em 4 bytes. Porém, as boas importações estáticas podem economizar espaço e nem todo mundo sabe sobre elas.JavaScript (ES6), 106 bytes
Usa recursão em vez de um loop for para criar a string.
Para encontrar o comprimento da linha mais longa, use a fórmula do enésimo número triangular
T_n
éT_n = (n^2 + n)/2
. Dadosn
e resolvidos para oT_n
uso da fórmula quadrática, temos:Acontece que após o revestimento, adicionar 1/4 na raiz quadrada não altera o resultado, portanto, a fórmula para a linha mais longa é
Math.sqrt(2*a.length)|0
.fonte
TeaScript , 44 bytes
Isso usa o mesmo método da minha resposta JavaScript , mas é muito mais curto.
Ungolfed
fonte
Powershell, 69 bytes
Script de teste com menos golfe:
Saída:
fonte
C #, 202
Não sei se isso é legal no código-golfe, mas passar uma lista na função é importante? Não consigo encontrar uma maneira de compensar isso sem uma List <string> declarada fora da função, então eu a coloco como parâmetro.
Uso:
fonte
C, 102 bytes
fonte
Bash + sed, 87
fonte
R, 142 bytes
Tenho certeza de que posso entender isso mais. Ainda estou trabalhando nisso. Sinto que estou perdendo uma recursão fácil - mas não consegui reduzi-la corretamente.
destroçado
fonte
05AB1E , 11 bytes
Experimente online!
fonte