PostScript 50 binário, 113 ASCII
Isso usa saída gráfica. Hexdump do programa usando tokens binários:
$ hexdump -C textRect_binary.ps
00000000 74 5b 30 20 39 5b 74 92 62 34 92 36 92 38 92 10 |t[0 9[t.b4.6.8..|
00000010 32 92 19 5d 7b 92 2c 7b 32 92 19 7d 92 83 92 3e |2..]{.,{2..}...>|
00000020 92 6e 7d 92 49 5d 39 20 39 92 6b 91 c7 39 92 8e |.n}.I]9 9.k..9..|
00000030 92 c3 |..|
00000032
Baixe para experimentar . Usando o Ghostscript, o texto a ser renderizado pode ser passado para o programa da seguinte maneira:
gs -st=helloworld textRect_binary.ps
A saída gráfica é assim:
O mesmo código usando tokens ASCII se parece com o seguinte:
t[0 9[t length
4 div dup
ceiling
2 copy]{cvi{2 copy}repeat
exch neg}forall]9 9 moveto/Courier 9 selectfont
xyshow
A estratégia é usar xyshow
para definir para onde nos movemos depois de mostrar cada personagem antes de mostrar o próximo caractere. Estamos começando no canto inferior esquerdo, movendo no sentido horário, ou seja, primeiro para cima, depois para a direita, depois para baixo e para a esquerda. Estamos sempre movendo 9 unidades, então primeiro temos um movimento relativo de 0 9
, então 9 0
, então 0 -9
, então -9 0
. Podemos passar de um par desses números para o próximo com a sequência exch neg
.
Precisamos construir uma matriz para xyshow
que contenha esses pares de números, um par para cada caractere. Isso significa que, se tivermos helloworld
como exemplo uma string, com 10 caracteres, queremos subir duas vezes, depois três vezes para a direita, depois duas vezes para baixo e esquerda três vezes. Obtemos esses valores (dois e três) dividindo o comprimento da corda por 8, uma vez arredondando para o chão e outra para o teto.
Então, copiamos 0 9
duas vezes, depois alternamos para as coordenadas x / y relativas exch neg
, copiamos essas três vezes e assim por diante.
Este código comentado mostra o que acontece na pilha:
t[0 9 % t [ 0 9
[t length % t [ 0 9 [ length
4 div dup % t [ 0 9 [ length/4 length/4
ceiling % t [ 0 9 [ length/4=height width
2 copy] % t [ 0 9 [height width height width]
{%forall % t [ 0 9 ... x y height_or_width
cvi % t [ 0 9 ... x y height_or_width_integer
{2 copy} % t [ 0 9 ... x y height_or_width_integer {2 copy}
repeat % t [ 0 9 ... x y .. x y
exch neg % t [ 0 9 ... x y .. y -x
}forall] % t [0 9 ... -9 0]
9 9 moveto/Courier 9 selectfont
xyshow
xyshow
? É um prazer apresentar-lhe este - há algum tempo você me apresentoukshow
, do qual eu não sabia ;-).Ruby
112100Eu sou novo em Ruby e este é o meu primeiro código de golfe. Eu me baseiei na implementação perl do memowe e tentei fazer uma versão Ruby dela. São
112100 caracteres e assume que você atribui uma sequência a x. Ansioso para ver os outros.Editado para implementar sugestões. Eu acho que são 100 caracteres agora. Obrigado rapazes!
fonte
x.length
comx.size
(Salva 2 caracteres)puts x[0..w=l/2-h=l/4]
.Perl (
124118109 + 3 = 112)Isso antigamente era bem direto. Contou todas as opções de linha de comando como 1 caractere cada.
Exemplo:
fonte
(@s-$h*2)/2 == @s/2-$h
(2)$w
pode ser representada como$w=(@s=split//)/2-($h=int@s/4);
, poupando, assim, duas vírgulas$"
–saves 1 char. (2) -$w+$h == @s/2
economiza 1 caractere. (3) Se$w
for menor por um, podemos simplificar$"x($w-1)
. Para isso, o valor$_
deve ser aumentado em 1. Salva como 3 caracteres. (4) O ponto e vírgula final é überflüssig, economiza 1 caractere. Isso leva ao fragmento de códigosay@s[0..$w--];say$s[1-$_].$"x$w.$s[$w+$_]for+2..$h;say+reverse@s[@s/2..@s-$h]
(com alguns+
por diversão, então não resta um único espaço).Brainfuck -
194187fonte
Mathematica
156 199344Edit : Esta é uma grande reescrita do código anterior. Funciona essencialmente da mesma forma, mas agora recebe como entrada uma string de comprimento <120 caracteres e dimensiona automaticamente o quadrado.
Ainda poderia ser um pouco jogado, mas não chegará ao tamanho das versões anteriores e mais complicadas.
Exemplos
fonte
Perl + Regexes: 104 (101 + 3)
(código de contagem + comutadores)
Aqui está uma solução usando bons Regexes e um pouco de Perl:
Isso funcionará apenas corretamente em uma linha de entrada.
Inspirado por memowe, mas essencialmente sem matrizes.
fonte
echo thisworksgreat | perl -plE'$w=($l=length)/2-($h=int$l/4);s/..{$w}\K.*/"\n".reverse$&/e;$"x=--$w;s/.\K(.*)(.)$/$"$2\n$1/while--$h'
PostScript (106)
Isso é inspirado na solução Mathematica do cara .
Com o Ghostscript, chame isso como
Produz saída como.
Ele usa
kshow
para mostrar os glifos um por um. Depois de mostrar glifos suficientes para um lado, tudo é girado em -90 graus antes de continuar com os glifos restantes.Para saber quando glifos suficientes foram mostrados ao lado, incrementamos um contador em 4 cada vez que um glifo é mostrado. Se o valor do contador modulo o comprimento da string for menor que 4, sabemos que precisamos rotacionar:
Código fonte comentado e sem golfe:
fonte
Python 2.x: 137
Eu sou novo em codificar golfe e tenho certeza de que isso pode ser melhorado…
Código de teste visual:
Algo interessante: Esta solução depende da matemática inteira. Se você fizer as contas simbolicamente, descobrirá isso
h=(c-w-w)/2 => h=w-2
, mas se você substituir esse resultado, todos os outros resultados perderão dois caracteres inferior esquerdo.fonte
K, 84
.
fonte
Scala (135)
O seguinte trecho assume que
x
contém a cadeia de caracteres a ser formatada e deve ser colado no scala REPL:Se você não tem o scala instalado, pode verificar rapidamente usando este interpretador online do Scala: http://www.simplyscala.com/ . Basta colar o seguinte texto e pressionar a tecla avaliar:
fonte
Python 3 (120)
Teste
entrada:
resultado:
fonte
PHP (149)
O texto a ser impresso deve estar em uma variável chamada
$x
.fonte
Python2.7 (99)
Edit: Aparentemente, viola a regra de abranger a área máxima dentro.
fonte
JAVA - 320
Nota: - A entrada é retirada da linha de comando
Entrada: - HelloWorld
Resultado : -
Entrada: - abcdefghijklmnopqrstuvwxyz
Resultado : -
fonte