Raíz cuadrada del arte ASCII

30

Estás trabajando como pasante para un matemático que realmente odia a TeX, LaTeX, etc. Tanto que ha decidido abandonar toda la composición tipográfica y hacerte formatear todo en ASCII. Se cansó de esto después de un tiempo y decidió comenzar a automatizar partes, comenzando con raíces cuadradas.

Así es como se hace una raíz cuadrada:

###  this is the input
###
###

_____  put a row of underscores stretching one character off either side on top
 ### 
 ### 
 ### 

   _____  put a diagonal of slashes in front going the height of the input
  / ### 
 /  ### 
/   ### 

      _____ put a diagonal of backslashes in front of that, going up half of the input's height rounded up
     / ###
 \  /  ###
  \/   ###

¡Y eso es!

Reglas

Debe crear un programa o función que tome una cadena, una lista de cadenas (es decir, líneas) o una matriz de caracteres, y genere la entrada transformada de acuerdo con la descripción anterior (no necesariamente por el mismo orden o proceso exacto)

Puede suponer que la entrada es rectangular si lo prefiere. El espacio en blanco al final no es obligatorio ni está prohibido.

Este es el , por lo que gana la respuesta más corta en bytes.

Ejemplos:

Input:
40
Output:
  ____
\/ 40

Input:
  ____
\/ 40
Output:
   ________
  /   ____
\/  \/ 40 

Input:
/| 
 | 
 | 
_|_
Output:
      _____
     / /|
    /   |
\  /    |
 \/    _|_

Input:
#  # 
#  # 
#####
   # 
   # 
Output:
        _______
       / #  #  
      /  #  #  
\    /   ##### 
 \  /       #  
  \/        #  
DanTheMan
fuente
3
A V le
irá
16
un matemático que realmente odia TeX, LaTeX, etc. Casi dejo de leer allí mismo
Luis Mendo
55
Estás trabajando . Casi dejo de leer allí mismo
Arnauld

Respuestas:

7

Python 2 , 196 bytes

x=Q=input()
l=len(x)
k=(l+1)/2
q=l+k
x=[[' ']*(q+1)+list(y)for y in x]
for i in range(k):x[i+l/2][i]='\\'
for j in range(l):x[j][q-j-1]='/'
print'\n'.join([' '*q+'_'*(2+len(Q[0]))]+map(''.join,x))

Pruébalo en línea!

-2 bytes gracias a Step Hen

-13 bytes gracias a Jonathan Allan

Hiperneutrino
fuente
@StepHen Hm. Funciona pero /también funcionaría. Gracias.
HyperNeutrino
Lo mismo parai+l//2
Stephen
Los guiones bajos necesitan estirar un carácter adicional a cada lado.
Neil
Puede tomar la entrada como una lista de cadenas (Python 2 input()evalúa la entrada sin formato). También '_'*len(Q[0])+'__'es '_'*(2+len(Q[0])).
Jonathan Allan
5

Carbón , 32 bytes

WS⊞υιP⪫υ¶↖P×_⁺²⌈EυLι↙↙Lυ↑↖÷⁺¹Lυ²

Pruébalo en línea! El enlace es a la versión detallada del código. Versión de 29 bytes que supone una entrada rectangular:

WS⊞υιP⪫υ¶↖P×_⁺²Lθ↙↙Lυ↑↖÷⁺¹Lυ²
Neil
fuente
3
@LuisMendo Charcoal está envejeciendo ...
Erik the Outgolfer
@EriktheOutgolfer D: viejo cómo
solo ASCII
@ Solo ASCII Bueno, SOGL es más nuevo y mejor, así que ... sin ofender a Charcoal, aunque todavía gana mucho.
Erik the Outgolfer
@EriktheOutgolfer pero cómo es mejor :(
ASCII-solo
En mi opinión, es como decir que Haskell es más nuevo y mejor, así que Haskell> C # aunque todavía gana mucho
solo ASCII el
5

Python 3 , 138 147 Bytes

def f(l):h=len(l);w=len(l[0]);c=int(h/2);print('\n'.join([(h*2-c)*' '+w*'_']+[(i*' '+'\\'+(h-i-1)*2*' '+'/'+i*' ')[c:]+s for(i,s)in enumerate(l)]))

La variable 'l' es una lista de cadenas, cada cadena es una línea. Versión legible:

def f(l):
  height = len(l)
  width = len(l[0])
  half_height_floor = int(height / 2)

  print((height * 2 - half_height_floor) * ' ' + width * '_')

  for (index, line) in enumerate(l):
    #build a V based on the location of the line
    #surrounding V whitespace
    outer_space = index * ' '

    #inner V whitespace
    inner_space = (height - index - 1) * 2 * ' ' #inner v space

    #complete V
    v = outer_space + '\\' + inner_space + '/' + outer_space

    #left half_height_floor chars removed
    v_chopped = v[half_height_floor:]

    print(v_chopped + line)

Forma un símbolo de raíz cuadrada con una V completa y luego afeita la izquierda en consecuencia.

Pruébalo en línea!

Conner Johnston
fuente
2
Hola, bienvenido a PPCG. Buena primera respuesta, pero este es un fragmento, ya que está asumiendo la variable lcomo entrada. También debe incluir la parte donde lse ingresa, ya sea como parámetro de función o como función input (), etc. (PS, su respuesta también parece carecer de algunos espacios en blanco).
officialaimm
2
@officialaimm, gracias por la bienvenida! Para practicar para futuros problemas, he actualizado e incluido el enlace TIO
Conner Johnston
3

Python 2 ,  131  130 bytes

x=input()
n=len(x)
s=" "
for v in[s*2*n+"_"*(2+len(x[0]))]+[s*i+"\\"+s*2*(n+~i)+"/"+s*-~i+r for i,r in enumerate(x)]:print v[n/2:]

Un programa completo que toma una lista de líneas como entrada con la asignación de solo rectangular (en realidad, la primera línea es una de las más largas).

Pruébalo en línea!

Jonathan Allan
fuente
2

Java 8, 244 bytes

Una solución muy larga, pero probablemente cercana a la más corta para Java. Esta lambda toma líneas de entrada como a String[]y devuelve a String. Todas las líneas deben tener la misma longitud.

Según los resultados del ejemplo, supuse que no es necesario agregar un espacio a cada línea en la entrada, por lo que el programa no lo hace.

Gracias a Jonathan Allan por recordarme sobre el ~operador.

l->{int h=l.length,w=l[0].length(),a=h/2,i=w+3,x=h+a+h%2;String s="",t=s;for(;--i>0;)t+="_";for(;i++<x;)s+=" ";t=s+t;for(i=0;i<h;)t+="\n"+s.substring(0,i<a?x+~i:i-a)+(i<a?"":"\\"+s.substring(0,(h+~i)*2))+"/"+s.substring(0,i+1)+l[i++];return t;}

Pruébalo en línea

Sin golf

l -> {
    int
        h = l.length,
        w = l[0].length(),
        a = h / 2,
        i = w + 3,
        x = h + a + h % 2
    ;
    String
        s = "",
        t = s
    ;
    for (; --i > 0; )
        t += "_";
    for (; i++ < x; )
        s += " ";
    t = s + t;
    for (i = 0; i < h; )
        t +=
            "\n"
            + s.substring(0, i < a ? x + ~i : i - a)
            + (i < a ? "" : "\\" + s.substring(0, (h + ~i) * 2))
            + "/"
            + s.substring(0, i + 1)
            + l[i++]
        ;
    return t;
}

Expresiones de gratitud

  • -2 bytes gracias a Kevin Cruijssen
Jakob
fuente
1
Buena respuesta +1. Puede jugar al golf 2 bytes mediante la creación de una variable para h+a+h%2la que se utilizan dos veces en su código: l->{int h=l.length,w=l[0].length(),a=h/2,i=w+3,x=h+a+h%2;String s="",t=s;for(;--i>0;)t+="_";for(;i++<x;)s+=" ";t=s+t;for(i=0;i<h;)t+="\n"+s.substring(0,i<a?x+~i:i-a)+(i<a?"":"\\"+s.substring(0,(h+~i)*2))+"/"+s.substring(0,i+1)+l[i++];return t;}. (También utilicé el encabezado y pie de página en el enlace TIO, para que pueda aislar su código real de golf del código de prueba)
Kevin Cruijssen
1

Japt , 46 bytes


l *2
£Vç hY'\ h~Y'/ +S+XÃuVç +'_p2+Ug l¹msV/4

La nueva línea líder es parte del programa. Entrada y salida es una matriz de cadenas que representan líneas.

Pruébalo en línea! usando la -Rbandera para unir la matriz resultante con nuevas líneas.

Justin Mariner
fuente
@ETHproductions Lamentablemente, eso no funcionará ya que Ues una matriz y no una cadena.
Justin Mariner
Ah,
maldición
1

JavaScript (ES6), 140 bytes

Toma la entrada como una matriz de cadenas / devuelve una matriz de cadenas.

a=>[a[0].replace(/./g,'_'),...a].map((r,y)=>[...a,...a].map((_,x)=>x-y+1|y-.5<l/2?l*2-x-y?' ':'/':'\\',c=y?' ':'_').join``+c+r+c,l=a.length)

Casos de prueba

Arnauld
fuente
1

Perl 5 , 177 185 160 bytes

$s=$f=int((@t=<>)*1.5+.5);print" "x$f;print"_"x length$t[0];print"_
";$b=-int(@t/2);for(0..$#t){--$s;print$_==$s?"/":$_==$b?"\\":" " for 0..$f;print$t[$_];++$b}

Pruébalo en línea!

Registro de cambios:

  • necesitaba más bytes para corregir un error (asumía primero una entrada cuadrada )
  • solucionó otro error y usé algunos consejos de los comentarios (¡gracias Dada!)
Felix Palmen
fuente
Acortado a 132 bytes . Te dejo echar un vistazo a lo que hice. Las grandes líneas: en <>lugar de <STDIN>, en print" "x$flugar de for(1..$f){print" "}, usar en xxx for yyylugar de for(yyy){xxx}, usar $_en el bucle for en lugar de variables explícitas ( for$i(..){..}) ...
Dada
Hace mucho tiempo que no uso Perl, ¡gracias! Pero lo intenté x$fy no pude hacerlo funcionar: o intentándolo de nuevo ahora ...
Felix Palmen
Uh y acabo de encontrar un error en ambas versiones ... dame algo de tiempo para arreglar esto;)
Felix Palmen
0

C ++, 291 bytes

La función asume que todas las cadenas en el vector pasado como parámetro tienen la misma longitud

#include<vector>
#include<string>
#define S std::string
#define T size()
void f(std::vector<S>&c){c.insert(c.begin(),S(c[0].T+1,'_'));int i,j=0;for(i=1;i<c.T;++i){c[i]='/'+S(i,' ')+c[i];if(i>=c.T/2)c[i]='\\'+S((c.T-i-1)*2,' ')+c[i];}for(auto&a:c)j=j>a.T?j:a.T;for(auto&a:c)a=S(j-a.T,' ')+a;}
HatsuPointerKun
fuente
0

Dyalog APL, 95 bytes

{((' '/⍨y+x),'_'/⍨2+⊃⌽⍴⍵)⍪⍉(x-y)↓⍉(⊖(x(-x)↑⌽y y⍴'\',' '\⍨y←⌈x÷2),x x⍴'/',' '\⍨x←⊃⍴⍵),' ',⍵,' '}

Pruébalo en línea!

Uriel
fuente
0

C, 485 bytes

Este programa toma hasta 999 caracteres de la entrada estándar y los lee en una matriz. Los imprime 1 a la vez a la salida estándar con los cambios indicados por su desafío. Se supone que la entrada es rectangular.

#include<stdio.h>
#define p(a)putc(a,stdout);
#define P j+j/2+1
a[999],i,j,k,l,m,n,q;char c;pad(a){m=P;if(a&&!k){m-=1;}for(n=0;n!=m;n++){q=32;if((!a||k)&&n==c){c--;q=47;}else if((P-c+1)>j/2+1&&(P)/2-n==c-2){q=92;}p(q);}}int main(){k=i=j=0;x:if(read(0,&c,1)){if('\n'==(a[i++]=c)){if(!j){l=i;}j++;}goto x;}i--;if('\n'==a[i-1]){i--;}else{j++;}c=P-2;for(;k!=i;k++){if(!k||a[k]==10){if(a[k]==10){p(10);}pad(1);if(!k){l++;while(l-->0){p(95);}p(10);pad(0);}if(a[k]==10){continue;}}p(a[k]);}}
Eric Urban
fuente
0

Perl 5 , 159 bytes

@a=map{$m=(y///c)>$m?y///c:$m;$_}<>;$_=$"x($l=@a/2-.5).'\\/'.$"x@a;for$i(1..@a){$a[-$i]=$_.$a[-$i];s| \\|\\ |;s|/ | /|;$i>$l&&y/\\/ /}chop;say$_.'_'x++$m,$/,@a

Pruébalo en línea!

Xcali
fuente