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

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

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}


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.


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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.