Dibujar radicales anidados

13

Muchas fórmulas en matemáticas involucran radicales anidados (signos de raíz cuadrada dentro de otros signos de raíces cuadradas). Su tarea aquí es dibujarlos usando ascii art.

Especificaciones

Se le darán dos enteros, el número dentro del radical y el número de radicales. Creo que la mejor manera de explicar lo que tienes que hacer es con un ejemplo. Aquí está la salida para 2, 4:

        ____________________
\      /       _______________
 \    /  \    /     __________
  \  /    \  /  \  /   _____
   \/      \/    \/  \/ 2

Aquí hay algunas cosas a tener en cuenta:

  • La altura de cada radical aumenta en uno
  • La longitud de la _'s siempre5 veces la altura
  • Hay un espacio después del último / y antes de que comience el siguiente radical interno
  • El número dentro nunca será mayor de 4 dígitos
  • Si el número de radicales es 0, solo genera el número
  • Poner espacios adicionales para rellenarlo en un rectángulo depende de ti
  • Este es el , por lo que gana el código más corto en bytes .

Casos de prueba

2, 4:
        ____________________
\      /       _______________
 \    /  \    /     __________
  \  /    \  /  \  /   _____
   \/      \/    \/  \/ 2

23, 0:
23

4, 1:
  _____
\/ 4

1234, 3:
      _______________
\    /     __________
 \  /  \  /   _____
  \/    \/  \/ 1234
Maltysen
fuente
12
Siento que este sería un desafío un poco mejor si todas las barras horizontales tuvieran que terminar en el mismo punto.
Greg Martin

Respuestas:

2

Python 3.5, 145 137 bytes

def s(n,x):[([print(' '*j+'\\'+'  '*i+'/ '+' '*j,end='')for j in range(x-i-1,-1,-1)],print('  '*i+i*'_____'or n))for i in range(x,-1,-1)]

Ligeramente no golfista:

def s(n,x):
    for i in range(x,-1,-1):
        for j in range(x-i-1,-1,-1):
            print(' '*j+'\\'+'  '*i+'/ '+' '*j,end='')
        print('  '*i+i*'_____' or n)

Salida:

s(2,4)
        ____________________
\      /       _______________
 \    /  \    /     __________
  \  /    \  /  \  /   _____
   \/      \/    \/  \/ 2
James Hollis
fuente
print(' '*i+'_____'*i or n)ahorra 7 bytes. EDITAR print(' '*i+i*'_____'or n)ahorra 8.
Jonathan Allan
Gracias. No sabía que podías usar 'o' así.
James Hollis
2

JavaScript, 133 132 131 bytes

f=(n,r,q=r)=>~r?'1\\0/1 '[x='repeat'](d=q-r).replace(/\d/g,i=>' '[x](+i?d-=.5:r*2))+(r?' '[x](r*2)+'_'[x](5*r):n)+`
`+f(n,r-1,q):''


F=(n,r)=>console.log( f(n,r) )
F(2,4)
F(23,0)
F(4,1)
F(1234,3)
.as-console-wrapper{max-height:100%!important;top:0}

Washington Guedes
fuente
2

JavaScript (ES6), 124 bytes

f=(s,n,i=0,r=(n,c=` `)=>c.repeat(n))=>n?r(n+n)+r(n*5,`_`)+`
`+f(s,n-1).replace(/^/gm,_=>r(i)+`\\${r(n+~i<<1)}/`+r(++i)):s+``
<div oninput=o.textContent=f(s.value,+n.value)><input id=s><input id=n type=number min=0><pre id=o>

Ahorre 3 bytes si el primer parámetro puede ser una cadena en lugar de un número.

Neil
fuente
1

PHP, 178 bytes

for($r=[" $argv[1]"];$i++<$argv[2];$r[]=$p("",2*$i).$p(_,5*$i,_))for($k=-1;++$k<$i;)$r[$k]=($p=str_pad)("\\".$p("",2*$k)."/",2*$i," ",2).$r[$k];echo join("\n",array_reverse($r));

bah eso es terriblemente largo.

Titus
fuente