PostScript 50 binario, 113 ASCII
Esto usa salida gráfica. Hexdump del programa utilizando tokens binarios:
$ 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
Descargar para probarlo . Usando Ghostscript, el texto a ser procesado se puede pasar al programa de la siguiente manera:
gs -st=helloworld textRect_binary.ps
La salida gráfica se ve así:
El mismo código que usa tokens ASCII se ve así:
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
La estrategia es usar xyshow
para definir dónde nos movemos después de mostrar cada personaje antes de mostrar el siguiente personaje. Comenzamos en la esquina inferior izquierda, moviéndonos en el sentido de las agujas del reloj, es decir, primero hacia arriba, luego hacia la derecha, luego hacia abajo y luego a la izquierda. Siempre estamos moviendo 9 unidades, así que primero tenemos un movimiento relativo de 0 9
, luego 9 0
, luego 0 -9
, luego -9 0
. Podemos pasar de un par de estos números al siguiente con la secuencia exch neg
.
Necesitamos construir una matriz para xyshow
que contenga estos pares de números, un par para cada personaje. Esto significa que si tenemos helloworld
como ejemplo una cadena, que tiene 10 caracteres, queremos subir dos veces, luego tres veces a la derecha, luego dos veces hacia abajo y tres veces a la izquierda. Obtenemos estos valores (dos y tres) dividiendo la longitud de la cuerda entre 8, una vez redondeando al piso, una vez al techo.
Entonces, copiamos 0 9
dos veces, luego cambiamos a las coordenadas relativas x / y usando exch neg
, copiamos esas tres veces y así sucesivamente.
Este código comentado muestra lo que sucede en la pila:
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
? Feliz de presentarte esta, hace un tiempo me conocistekshow
, de lo cual no estaba muy consciente ;-).Ruby
112100Soy nuevo en Ruby y este es mi primer código de golf. Me basé en la implementación perl de memowe e intenté hacer una versión de Ruby. Esto es
112100 caracteres y supone que asigna una cadena a x. Espero ver a los demás.Editado para implementar sugerencias. Creo que ahora son 100 caracteres. ¡Gracias chicos!
fuente
x.length
conx.size
(Guarda 2 caracteres)puts x[0..w=l/2-h=l/4]
.Perl (
124118109 + 3 = 112)Esto anteriormente era bastante sencillo. Se contaron todas las opciones de línea de comando como 1 carácter cada una.
Ejemplo:
fuente
(@s-$h*2)/2 == @s/2-$h
(2)$w
se puede representar como$w=(@s=split//)/2-($h=int@s/4);
, ahorrando dos puntos$"
–saves 1 char. (2) -$w+$h == @s/2
ahorra 1 char. (3) Si$w
es más pequeño por uno, podemos simplificar$"x($w-1)
. Para esto,$_
se debe aumentar en 1. Se guarda como 3 caracteres. (4) El punto y coma final es überflüssig, ahorra 1 char. Esto lleva al fragmento de códigosay@s[0..$w--];say$s[1-$_].$"x$w.$s[$w+$_]for+2..$h;say+reverse@s[@s/2..@s-$h]
(con algunos+
por diversión, por lo que no queda un solo espacio).Brainfuck -
194187fuente
Mathematica
156 199344Editar : esta es una reescritura importante del código anterior. Funciona esencialmente igual, pero ahora toma como entrada una cadena de longitud <120 caracteres y automáticamente dimensiona el cuadrado.
Todavía podría jugarse un poco, pero no se reducirá al tamaño de las versiones anteriores y con errores.
Ejemplos
fuente
Perl + expresiones regulares: 104 (101 + 3)
(código de conteo + interruptores)
Aquí hay una solución con buenas expresiones regulares y un poco de Perl:
Esto solo funcionará correctamente en una línea de entrada.
Inspirado por memowe, pero esencialmente sin ninguna matriz.
fuente
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)
Esto está inspirado en la solución Mathematica de dude .
Con Ghostscript llama a esto como
Produce resultados como.
Se usa
kshow
para mostrar los glifos uno por uno. Después de que se hayan mostrado suficientes glifos para un lado, todo se gira -90 grados antes de continuar con los glifos restantes.Para saber cuándo se han mostrado suficientes glifos en el lateral, incrementamos un contador en 4 cada vez que se muestra un glifo. Si el valor del contador módulo la longitud de la cadena es menor que 4, entonces sabemos que tenemos que rotar:
Código fuente comentado y sin golf:
fuente
Python 2.x: 137
Soy nuevo en el código de golf y estoy bastante seguro de que esto se puede mejorar ...
Código de prueba visual:
Algo de interés: esta solución depende de la matemática entera. Si solo hace los cálculos simbólicamente, lo encontrará
h=(c-w-w)/2 => h=w-2
, pero si sustituye ese resultado, a cualquier otro resultado le faltarán dos caracteres en la esquina inferior izquierda.fuente
K, 84
.
fuente
Scala (135)
El siguiente fragmento supone que
x
contiene la cadena para formatear, y debe pegarse en el REPL de scala:Si no tiene instalado Scala, puede verificarlo rápidamente utilizando este intérprete de Scala en línea: http://www.simplyscala.com/ . Simplemente pegue el siguiente texto y presione evaluar:
fuente
Pitón 3 (120)
Prueba
entrada:
salida:
fuente
PHP (149)
El texto a imprimir debe estar en una variable llamada
$x
.fuente
Python2.7 (99)
Editar: aparentemente viola la regla de abarcar el área máxima dentro.
fuente
JAVA - 320
Nota: - La entrada se toma de la línea de comando
Entrada: - HelloWorld
Salida: -
Entrada: - abcdefghijklmnopqrstuvwxyz
Salida: -
fuente