Dessinez des radicaux imbriqués

13

De nombreuses formules en mathématiques impliquent des radicaux imbriqués (signes de racine carrée à l'intérieur d'autres signes de racine carrée). Votre tâche ici est de les dessiner en utilisant l'art ascii.

Spécifications

Vous recevrez deux nombres entiers, le nombre à l'intérieur du radical et le nombre de radicaux. Je pense que la meilleure façon d'expliquer ce que vous avez à faire est avec un exemple. Voici la sortie pour 2, 4:

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

Voici quelques éléments à noter:

  • La hauteur de chaque radical augmente d'une unité
  • La longueur des _est toujours 5multipliée par la hauteur
  • Il y a un espace après le dernier /et avant le début du prochain radical intérieur
  • Le nombre à l'intérieur ne sera jamais supérieur à 4 chiffres
  • Si le nombre de radicaux est 0, il suffit de sortir le nombre
  • Mettre des espaces supplémentaires pour le garnir dans un rectangle dépend de vous
  • C'est du , donc le code le plus court en octets gagne!

Cas de test

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

23, 0:
23

4, 1:
  _____
\/ 4

1234, 3:
      _______________
\    /     __________
 \  /  \  /   _____
  \/    \/  \/ 1234
Maltysen
la source
12
Je pense que ce serait un défi légèrement meilleur si les barres horizontales devaient toutes se terminer au même point.
Greg Martin

Réponses:

2

Python 3.5, 145 137 octets

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)]

Légèrement non golfé:

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)

Production:

s(2,4)
        ____________________
\      /       _______________
 \    /  \    /     __________
  \  /    \  /  \  /   _____
   \/      \/    \/  \/ 2
James Hollis
la source
print(' '*i+'_____'*i or n)enregistre 7 octets. EDIT print(' '*i+i*'_____'or n)sauve 8.
Jonathan Allan
Je vous remercie. Je ne savais pas que vous pouviez utiliser "ou" comme ça.
James Hollis
2

JavaScript, 133 132 131 octets

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
la source
2

JavaScript (ES6), 124 octets

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>

Enregistrez 3 octets si le premier paramètre peut être une chaîne plutôt qu'un nombre.

Neil
la source
1

PHP, 178 octets

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 c'est terriblement long.

Titus
la source