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:
        _______
       / #  #  
      /  #  #  
\    /   ##### 
 \  /       #  
  \/        #  

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


@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υ²

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!


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!


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

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.


@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


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

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;}

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!


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

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!

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.