Operador ASCII art

22

Reto

Dado un operador ASCII de la lista a continuación y un número n, dibuje una representación ASCII del operador utilizando ese operador como el carácter con los segmentos de línea del operador que tienen una longitud n .

Entrada

Un carácter ASCII de la lista = + - x /y un número entero ndonde n >= 1. (Estoy usando en xlugar de *y en /lugar de ÷, pero podría usar cualquiera de los dos, lo que sea más fácil). Para +y x, solo tiene que manejar números impares para evitar problemas con la alineación.

Salida

Un dibujo ASCII del operador compuesto por el personaje con segmentos de longitud n. Las porciones horizontales deben tener espacios entre los caracteres para compensar las diferencias de distancia vertical / horizontal.

Reglas

Este es el , por lo que gana el código más corto en bytes. Las lagunas estándar están prohibidas.

Ejemplos

Entrada: + 3

  +
+ + +
  +

Entrada: = 4

= = = =
= = = =

Entrada: = 10

= = = = = = = = = =
= = = = = = = = = =

Entrada: - 2

- -

Entrada: / 10

         /
        /
       /
      /
     /
    /
   /
  /
 /
/

Entrada: x 7

x     x
 x   x
  x x
   x
  x x
 x   x
x     x
Yodle
fuente
¿Puedes agregar el caso de prueba = 10?
Rod
1
Supongo que "x" y "+" implican números impares? (Acabo de ver que DrMcMoylex hizo casi la misma pregunta.)
Martin Rosenau el
1
@MartinRosenau Sí, desde la sección Entrada: "Para + y x, solo tiene que manejar números impares para evitar problemas con la alineación".
corvus_192
¿Por qué X y / no están espaciados?
Adám
1
¿se permite el espacio en blanco principal?
Adám

Respuestas:

5

Pip , 62 59 56 bytes

55 bytes de código, +1 para -Sbandera.

[sXbRA_AEv-_aM,b(Y^aWR_Xb/2s)MyRVsX,b.aYaXbJsxyRL2x]@Aa

Tenga en cuenta que esta solución funciona con la entrada de ÷para división y *multiplicación, aunque utiliza esos caracteres para dibujar ASCII-art /y x, respectivamente. OP ha aclarado que esto está bien.Pruébalo en línea!

¿Cómo?

Aquí hay una versión parcialmente separada y comentada . Tenga en cuenta que ay bson los argumentos de la línea de comandos, es decir, el operador y el tamaño, respectivamente. El -Sindicador controla cómo se generan las listas: primero se une a las nuevas líneas, pero se une a cualquier lista anidada en los espacios.

[                 Build a list of all possible figures:
 sXbRA_AEv-_aM,b   0 - Multiplication
 (Y^aWR_Xb/2s)My   1 - Addition
 RVsX,b.a          2 - Division
 YaXbJs            3 - Subtraction
 x                 4 - Empty
 yRL2              5 - Equals
 x                 6 - Empty
] @ Aa            Index, mod 7, with ASCII value of a

Y aquí están las secciones individuales:

Multiplicación

Para cada fila de la figura, generamos una cadena de espacios y luego reemplazamos dos de ellos con el carácter de entrada. Para la fila i, queremos reemplazar los espacios en el índice iy b-1-i; pero tenga en cuenta que este último puede usar el índice negativo -1-i. (Es aún más corto porque la variable vestá preinicializada a negati v e 1.)

sXbRA_AEv-_aM,b
            M,b  Map this function to range(b):
sXb                Space, repeated b times
     _             Function arg
      AE           (Implicitly) convert to list and append element...
        v-_        -1 minus function arg
   RA              Replace the characters at those indices...
           a       ... with input character
                 The resulting list is output with one item per line

Adición

Usando la estrategia de mi Draw a hollow square answer, definimos una función que envuelve a +en b/2copias de su argumento y devuelve el resultado como una lista de caracteres. (La división de enteros //no es necesaria porque el operador de repetición de cadenas Xse trunca automáticamente a entero). Primero, llamamos a esta función en un espacio, dando [" ";" ";"+";" ";" "]; luego, asignamos la misma función a ese resultado, dando [" ";" ";"+";" ";" "]en la mayoría de las líneas pero ["+";"+";"+";"+";"+"]en la línea central. Esta lista anidada se genera, debido a la -Sbandera, con espacios entre todos los caracteres en una fila y líneas nuevas entre filas.

(Y^aWR_Xb/2s)My
                 Anonymous function:
      _Xb/2        Function arg, repeated b/2 times (implicitly rounded down)
   aWR             Wrap a in two copies of the above
  ^                Split resulting string into list of chars
 Y               Yank that function into y
(          s)    Apply function y to space
             My  Map y to that result

División

Cada fila tiene espacios entre b-1y 0, seguidos del carácter de entrada a.

RVsX,b.a
    ,b    Range(b)
  sX      Space, repeated that many times (works itemwise)
      .a  Concatenate a (itemwise)
RV        Reverse (puts the larger number of spaces at the beginning)
          Outputs newline-separated

Sustracción

Haga una fila separada por espacios del carácter de entrada. Guarda una copia para más tarde.

YaXbJs
 aXb    b copies of a
    Js  Join on space
Y       Yank into y (overwrites the function from earlier, but we're done using it anyway)
        This is a string, so it just gets output

Igual a

El paso de resta almacenó la mitad de lo que necesitamos, ysolo el doble.

yRL2  (Implicitly) convert y to list and repeat it twice
      Outputs newline-separated

Los xvalores ficticios están allí para rellenar la lista principal de modo que la indexación modular proporcione un índice único para cada carácter de entrada +-*÷=.

DLosc
fuente
13

V , 78, 72, 71, 68, 65, 63, 62 , 61 bytes

Ç=ü-/Àé X
ç^Ó/é Àä$
ç+/ÀÄM|ÀR+ 
ç=/Ä
ç¯/lòhYpX
çx/rxòl3Äjxlrx

Pruébalo en línea!

Como siempre, ¡la batalla de cuello con cuello con 05AB1E es realmente divertida!

Como esto contiene caracteres no ASCII, aquí hay un hexdump:

0000000: c73d fc2d 2fc0 e920 580a e75e d32f e920  .=.-/.. X..^./. 
0000010: c0e4 240a e72b 2fc0 c44d 7cc0 522b 200a  ..$..+/..M|.R+ .
0000020: e73d 2fc4 0ae7 af2f 6cf2 6859 7058 0ae7  .=/..../l.hYpX..
0000030: 782f 7278 f26c 33c4 6a78 6c72 78         x/rx.l3.jxlrx

Esto crea espacios iniciales en la salida para =y -, pero parece estar permitido . Si esto no está permitido, siéntase libre de comentar y lo revertiré.

Explicación

El "comando global" (por ejemplo ç) aplica un determinado conjunto de comandos a cada línea que coincide con una expresión regular determinada. La sintaxis es

ç<compressed regex>/<commands>

Esta es la forma más fácil de simular una declaración condicional / modificada. En mi respuesta original, simplemente creé todo el arte ASCII en el lado derecho para cada personaje diferente que necesitamos buscar. Sin embargo, muchas de estas salidas requieren comandos similares. Entonces los combiné. El primer comando ('Ç') es en realidad el inverso del comando global, aplica el comando a cada línea que no coincide con la expresión regular. Entonces el primer comando es:

Ç=ü-        " On every line not containing an '=' or an '-' (e.g. inputs '/', '+', and 'x'):
    /Àé     "   Insert *n* spaces
        X   "   Delete one of them

El siguiente comando es para las entradas '=' y '-'. Estos dos son convenientemente fáciles y similares. Después de este comando, no necesitamos más procesamiento para -.

ç^Ó         " On every line that starts with non-whitespace (e.g. every line not affected by our previous command):
   /é       "   Insert one space
            "   Move back a character
      À     "   Make *n* copies
       ä$   "   Of every character on this line

Desde aquí solo hacemos algunos comandos adicionales para cada entrada posible individual. Para +:

ç+/         " On every line containing a '+':
   ÀÄ       "   Make *n* copies of this line
     M|     "   Move to the first character of the middle line
       À    "   *n* times:
        R+  "   Replace the next two characters with '+ '

El comando para iguales es muy sencillo. Simplemente lo duplicamos con Ä. Para /:

ç¯          " On every line containing a '/':
  /l        "   Move one character to the right
    ò       "   Recursively:
     h      "     Move one character to the left
      Yp    "     Make a copy of this line
        X   "     Delete one character
         ò  "   End loop (implicit)

El último es el más complicado. Básicamente es un puerto de esta respuesta .

çx              " On every line containing a 'x':
  /rx           "   Replace the first character with an 'x'
     ò          "   Recursively:
      l         "     Move one char to the right
       3Ä       "     Make 3 copies of this line
         j      "     Move down one line
          x     "     Delete one char
           l    "     Move one char to the right
            rx  "     Replace this char with an 'x'
DJMcMayhem
fuente
entonces, ¿para eso se usan las líneas múltiples?
Conor O'Brien el
@Conorobrien Sí. El çcomando (así como buscar y reemplazar, /y ?) todos simulan parte de la línea de comando de vim, donde debe presionar enter para ejecutar el comando
DJMcMayhem
13

05AB1E , 81 76 74 73 70 69 68 65 64 62 60 59 57 56 bytes

Actualmente en guerra con la respuesta V . Voy por usted Dr. McMoylex: p.

También en guerra con la respuesta Pip . Te estaré observando Sr. DLosc.


Código:

Ç6&"¹s<ú.s.Bívy¹'xQiÂðñ}, ¹×S)»¹'=Qƒ= ;ƒ¹})D¦»»Rû.c"#è.V

O en una forma más legible:

  Ç6&
"¹s<ú.s.Bívy¹'xQiÂðñ},
 ¹×S)»¹'=Qƒ=
 ;ƒ¹})D¦»»Rû.c"
#è.V

Utiliza la codificación CP-1252 . Pruébalo en línea!

Adnan
fuente
1
Aquí vamos de nuevo ...: P
DJMcMayhem
1
@DrMcMoylex Jajaja, buenos viejos tiempos :).
Adnan
30
Más legible ... totalmente ...
Oliver Ni
1
Para una definición dada de "legible".
Matt Lacey
1
Voy por ti, Adnan : P
DLosc
7

Python 3, 304 283 278 bytes

Bastante simple, solo hace una matriz de caracteres y aplica las diferentes operaciones en función de cuál es. El =y -tienen espacios finales si eso no es tan malo.

EDITAR: ¡Gracias a @Shebang y @Rod por sus sugerencias que terminaron ahorrando 21 bytes!

EDIT2: ¡Gracias a @Artyer por guardar 5 bytes!

t,s=input().split()
s=int(s)
r=range(s)
b=[[' ']*s for x in r]
exec(['for x in r:b[s//2][x]=b[x][s//2]=t','b=[t*s]'+'*2'*(t=='='),'for x in r:b[x][s-x-1]='+'b[x][x]='*(t=='x')+'t'][(t>'+')+(t in'x/')])
if t in'-=+':b=[[x+' 'for x in l]for l in b]
print(*map(''.join,b),sep='\n')
Azul
fuente
Puede guardar 8 bytes eliminando la if'-'==tlínea de condición y reemplazando la que está arriba con if t in'=-':b=[[t+' ']*s]*(2*(t>'-'))(creo).
Kade
puede ajustar las funciones dentro de una lista y ejecutar usando exec: exec(['+ block','/ block','x block','= block','- block']['+/x=-'.find(t)])para guardar ~ 18 bytes
Rod
Sí, los espacios finales / líneas nuevas son aceptables.
Yodle
Para la primera línea, haga .split()(No hay divisiones de args en espacios en blanco). En la línea 6, te perdiste un espacio ( b=[[x+' 'for). Puede hacer la última línea print(*map(''.join,b),sep='\n')por 1 bytes menos.
Artyer
7

JavaScript (ES6), 238 225 215 202 196 bytes

(c,n)=>[...Array(i=n*(c=="="?4:c+1-1?2:c<"-"?n+n:n+1))].map(_=>--i%(n+(c=='/'|c>'w'||n))?c>'w'?i%n&&~-i%(n+2)?" ":c:c<'-'?i%(n*2)-n&&(~i&1|(n/2^i/n/2))?" ":c:c=="/"?i%n?" ":c:i%2?c:" ":`
`).join``

Probablemente podría jugar al golf, pero es un comienzo.

ETHproducciones
fuente
6

Scala, 275 bytes

(i,c)=>if(c<44){val b=(" "*(i-1)+"+\n")*((i-1)/2)
b+"+ "*i+"\n"+b}else
if(c<46)"- "*i else
if(c<48)i-1 to(0,-1)map(" "*_+"/\n")mkString else
if(c<62)"= "*i+"\n"+"= "*i
else{val a=0 to i/2-1 map(x=>" "*x+"x"+" "*((i/2-x)*2-1)+"x"+" "*x+"\n")mkString;a+" "*(i/2)+"x"+a.reverse}

Uso:

val f:((Int,Char)=>String)=...
print(f(10, '/'))

Explicación:

El código prueba el valor ascii del carácter para elegir la forma correcta de generar la imagen. Los valores ascii de los operadores en cuestión son: ('+' -> 43), ('-' ->45), ('/' -> 47), ('=' -> 61), ('x' -> 120)

(i,c)=>                              //define a function
  if(c<44){                            //if c is a plus
    val b=(" "*(i-1)+"+\n")*((i-1)/2)    //define the top/bottom part b as (i-1)/2 times (i-1) spaces, a plus sign and a newlineine
    b+"+ "*i+"\n"+b                      //return b, i times a plus and a space, a newline and b
  }else if(c<46)                       //if c is a '-'
    "- "*i                               //return "- " repeated i times
  else if(c<48)                        //if c is a '/'
    i-1 to(0,-1)                         //create a range from i-1 to 0 in steps of -1
    map(" "*_+"/\n")                     //map each number to that number of spaces plus a "/" and a newline
    mkString                             //join them together
  else if(c<62)                        //if c is '='
    "= "*i+"\n"+"= "*i                   //return "= " repeated i times, a newline and "= " repeated i times again
  else{                                //if c if 'x'
    val a=                               //define a, which will be the top part, as...
      0 to i/2-1                         //a range from 0 to i/2-1
      map(n=>                            //map each number n to
        " "*n                              //n spaces
        +"x"                               //plus an "x"
        +" "*((i/2-n)*2-1)                 //plus ((i/2)-n)*2-1 spaces
        +"x"                               //plus an "x"
        +" "*n                             //plus n spaces
        +"\n"                              //and a newline
      )mkString;                         //join them
    a+" "*(i/2)+"x"+a.reverse          //return a, i/2 spaces, "x" and the reverse of a 
  }
corvus_192
fuente
5

JavaScript (ES6), 156 bytes

(c,n)=>[...Array(n--)].map((_,i,a)=>a.map((_,j)=>({'/':a=i+j-n,x:a&&i-j,'-':a=i+i-n,'+':a&&j+j-n,'=':a+2&&a-2}[c]?' ':c)).join(c=='='|c<'/'?' ':'')).join`\n`

Donde \nrepresenta el carácter literal de nueva línea.

Neil
fuente
En Firefox 49, obtengo SyntaxError: invalid property idlo que está escrito actualmente, pero el cambio de los backticks alrededor de la barra diagonal a los apóstrofes solucionó eso. (¿Por qué tienes backticks allí en lugar de apóstrofes?)
ETHproductions
Además, las salidas para +, -y se =ven diferentes a las que exige el desafío: "Las porciones horizontales deben tener espacios entre los caracteres para compensar las diferencias de distancia vertical / horizontal".
ETHproductions
@ETHproductions a) error tipográfico b) lo siento, pasé por alto eso, lo arreglaré más tarde.
Neil
Sin embargo, esto es ridículamente corto. Espero que arreglarlo no agregue demasiados bytes.
ETHproductions
@ETHproductions Gracias. Creo que esto tiene un costo de 19 bytes.
Neil
4

Dyalog APL , 91 86 bytes

Necesidades ⎕IO←0, lo cual es predeterminado en muchos sistemas. Toma n como argumento izquierdo, y uno de + - × ÷ = como argumento derecho.

{s←⌈⍎⍕32
t' '
d←⌽∘.=⍨⍺
s2 6:t[d∨⌽d6=s]
5=s:t[↑,/2↑¨∨/¨(⌊⍺÷2)=⍳⍺ ⍺]
(2-s)(2×⍺)⍴t}

Explicación

{
    s     3  2              calculate ceil(3 f 2), where f is the given symbol
    t  ' '                     create a string with a space before the symbol
    d   ∘.=⍨                  Boolean \ diagonal
    s  2 6: t[d   d  6 = s]  if ÷ or × index t with one or both diagonals
 find coordinates that are in the middle of at least one dimension
 pad with zeros for spacing
 use that to index into t
    5 = s: t[  ,/ 2↑¨ ∨/¨ (⌊  ÷ 2) =   ⍺]
 - or =:
    (2 - s) (2 × ⍺)  t        one or two rows of double-spaced symbols
}
Adán
fuente
3

Mathematica, 191 bytes

e=#~Mod~2==1&;StringRiffle[Normal@SparseArray[{a_,b_}/;(a+b==d+1||a==b)[e@b&&a<3,,e@b&&(a==⌈d/2⌉||b==d),,e@b&&a<2,,a+b==d+1][[Last@ToCharacterCode@#~Mod~10]]:>#,{d=#2,2d-1}," "],"
"," "]&

Función anónima. Toma una cadena y un número como entrada, y devuelve una cadena como salida. No es el más corto de lejos, pero sigue siendo divertido de escribir.

LegionMammal978
fuente
3

C, 396 bytes

#define p(x) printf(x);
i,j,k,m;f(char s,int n){i=k=0;if(s==45)for(;i<n;++i)p("- ")m=n/2;if(s==43)for(;i<n;++i)for(j=0;j<=m;++j)if(i-m)p(j-m?"  ":"+\n")else{for(;k<n;++k)p("+ ")p("\n")j+=m;}if(s==61)for(;i<2;++i){for(k=0;k<n;++k)p("= ")p("\n")}j=n;if(s==47)for(;i<n;++i){--j;for(k=0;k<j;++k)p(" ")p("/\n")}if(s==120)for(;i<n;++i){k=m-abs(m-i);for(j=0;j<n-k;++j)p(j-k?" ":"x")p(i-m?"\bx\n":"\n")}}

Llamar con:

int main()
{
   f('x', 5);
   return 0;
}
Steadybox
fuente
2

SOML , 104 100 bytes (no competitivos)

    Cd³³b»E +=?ce*d+e{t}bd*Oe{t}} ==?b*tt} -=?b*t} /=?bc*b{j:d+p}} x=?"”cb*e{jj⁴⁴d;d+++tGG;c+;}XOdoe{O

Esto es bastante competitivo, ya que estoy bastante seguro de que todo lo que usé aquí tiene documentos en github antes de la fecha de publicación de estas preguntas, pero el analizador no tiene soporte para algunas funciones que usé tan idk.

dzaima
fuente
2

PHP, 306 292 281 282 281 275 270 bytes

$r=str_pad("",2*$n=$argv[2],($c=$argv[1])." ")."\n";if(",">$c)$r=($m=str_repeat(str_pad($c,$n," ",0)."\n",$n/2))."$r$m";if(9<$c)$r.=$r;if(w<$c)for($r=$c;$i<$n;$r[$i*(2+$n)]=$r[++$i*$n-1]=x)$r[$i*$n+$i+$n]="\n";if("/"==$c)for($r=$s="";$i++<$n;$s.=" ")$r="$s/\n$r";echo$r;

Ooh, esto es voluminoso ... necesita más golf.
Podría guardar 4 bytes con saltos de línea físicos o un byte al poner "\ n" en una variable.

Tito
fuente
1
Agradable. Para el "+", creo que necesitas igualar la altura y no siempre 3. También deberías poder jugar más al golf if () en lugar de mayúsculas y minúsculas;
Criptografía
2

C #, 744 bytes

Creo que tiene 1 millón de caracteres, pero no me importa, estoy tan feliz de haber resuelto esto ...

Golfizado:

string A(string s,int n){string O="";Func<string,int,string>R=(a,b)=>{return string.Join("",Enumerable.Repeat(a,b))+"\r\n";};switch(s){case"+":for(int i=0;i<n;i++){if(i==n/2){O+=R("+",n);}else{O+="+".PadLeft(n-n/2,' ').PadRight(n-n/2,' ')+"\r\n";}}return O;case"=":return R("=",n)+R("=",n);case "-":return R("-",n);case "/":for(int i=n;i>0;i--){O+="/".PadLeft(i)+"\r\n";}return O;case "x":int x=0;string[]r=new string[n];for(int i=n;i>0;i--){if(n-x-x<0){O+="x".PadLeft(x+1)+"\r\n";break;}string row=string.Join("",Enumerable.Repeat(" ",x))+"x"+string.Join("",Enumerable.Repeat(" ",n-x-x))+"x"+"\r\n";O+=row;x++;r[x]=row;if(i==n/2)break;}for(int i=r.Length-1;i>0;i--){if(string.IsNullOrEmpty(r[i]))continue;O+=r[i];}return O;default:return "";}}

Sin golf:

public string A(string s, int n)
{
  string O = "";

  Func<string, int, string> R = (a, b) =>
  {
    return string.Join("", Enumerable.Repeat(a, b)) + "\r\n";
  };

  switch (s)
  {
    case "+":
      for (int i = 0; i < n; i++)
      {
        if (i == n / 2)
        {
          O += R("+", n);
        }
        else
        {
          O += "+".PadLeft(n - n / 2, ' ').PadRight(n - n / 2, ' ') + "\r\n";
        }
      }
      return O;
    case "=":
      return R("=", n) + R("=", n);
    case "-":
      return R("-", n);
    case "/":
      for (int i = n; i > 0; i--)
      {
        O += "/".PadLeft(i) + "\r\n";
      }
      return O;
    case "x":
      int x = 0;
      string[] r = new string[n];
      for (int i = n; i > 0; i--)
      {
        if (n - x - x < 0)
        {
          O += "x".PadLeft(x + 1) + "\r\n";
          break;
        }
        string row = string.Join("", Enumerable.Repeat(" ", x))
          + "x"
          + string.Join("", Enumerable.Repeat(" ", n - x - x)) + "x" + "\r\n";
        O += row;
        x++;
        r[x] = row;
        if (i == n / 2)
          break;
      }
      for (int i = r.Length - 1; i > 0; i--)
      {
        if (string.IsNullOrEmpty(r[i]))
          continue;
        O += r[i];
      }
      return O;
    default:
      return "";
  }
}

Pruebas:

+: 3, 5, 7, 9, 11
/: 7, 8, 9, 10
-: 3, 4, 5, 6
=: 3, 4, 5, 6, 7
x: 5, 7, 9, 11

Demasiado para pegar y formatear aquí, creé un pastebin:

Pastebin

Pete Arden
fuente
Por favor juegue golf y proporcione un conteo de bytes.
mbomb007
2

C, 331 bytes

i,j;f(o,n){if(47==o)for(i=n;i;puts("")){for(j=i--;j--;putchar(j?32:o)){}}
if(43==o)for(i=n;i--;puts("")){for(j=n;j--;printf(i==n/2||!j?"+ ":" ")){}}
if(45==o)for(i=n;i--;putchar(o)){}
if(61==o)for(i=3;i--;puts("")){for(j=n;j--;putchar(i&1?32:o)){}}
if(120==o)for(i=n;i;puts("")){for(j=0;j++<n;putchar(j==i||j==n-i+1?o:32)){}i--;}}

El operador se pasa como código ASCII oy el recuento de caracteres n. Solo agregué espacios entre caracteres consecutivos horizontalmente en el signo más, ya que este era el único donde la salida se habría distorsionado si no lo hubiera hecho y en la tarea solo decía "debería". Yo uso dos bucles anidados en cuenta regresiva (a excepción de- donde solo necesito una línea).

= Tres líneas, una de ellas vacía, directa

+utilizando printfdebido a los espacios

- sencillo

/ haga que el bucle interno se imprima en cero y comience en el contador del bucle externo

x tener la impresión del bucle interno en el contador del bucle externo y su "inverso" n-i . Todavía necesito ver por qué estoy fuera de uno aquí.

Llamada de muestra:

#include <stdio.h>
/*  =       61
    +       43
    -       45
    /       47
    Space   32
    x       120
*/
int main(int argc, char **argv){
    printf("%s\n%s\n",argv[1], argv[2]);
    f(*argv[1],strtol(argv[2],NULL,10));
}
Florian
fuente
1

Lua, 402 344 312 bytes

312:

r,p,b,x=string.rep,print,' ','x'function d(s,n)h,l=(n+1)/2,s..b;e=r(l,n)if s=='-'then p(e)elseif s=='='then p(e)p(e)else for f=1,n do p(s=='/'and(r(b,n-f)..s)or s=='+'and(f~=h and r(' ',n-1)..'+'or r('+ ',n))or f<h and r(b,f-1)..x..r(b,n-2*f)..x or f>h and r(b,n-f)..x..r(b,2*f-2-n)..x or r(b,f-1)..x)end end end

344:

r,p,b,x=string.rep,print,' ','x'function d(s,n)h,l=(n+1)/2,s..b;e=r(l,n)if s=='-'then p(e)elseif s=='='then p(e)p(e)else for f=1,n do if s=='/'then p(r(b,n-f)..s)elseif s=='+'then p(f~=h and r(' ',n-1)..'+'or r('+ ',n))elseif s=='x'then p(f<h and r(b,f-1)..x..r(b,n-2*f)..x or f>h and r(b,n-f)..x..r(b,2*f-2-n)..x or r(b,f-1)..x)end end end end

402:

r,p,b,x=string.rep,print,' ','x'function d(s,n)h=(n+1)/2;if s=='-'then p(r(s..b,n))end;if s=='='then p(r(s..b,n))p(r(s..b,n))end;if s=='/'then for i=1,n do p(r(b,n-i)..s)end end;if s=='+'then for i=1,n do p(i~=h and r(' ',n-1)..'+'or r('+ ',n))end end;if s=='x'then for i=1,n do if i<h then p(r(b,i-1)..x..r(b,n-2*i)..x)elseif i>h then p(r(b,n-i)..x..r(b,-n+2*i-2)..x)else p(r(b,i-1)..x)end end end end

Se reducen 90 caracteres y ahora es doloroso verlos incluso cuando se expanden. : |

Cotilla
fuente
"También parece que este es un viejo desafío. Vaya" No hay nada de malo en responder a viejos desafíos.
Steadybox