Raiz quadrada da arte ASCII

30

Você está trabalhando como estagiário para um matemático que realmente odeia TeX, LaTeX, etc. Tanto que ele decidiu abandonar toda a tipografia e fazer com que você fizesse toda a formatação em ASCII. Você se cansou disso depois de um tempo e decidiu começar a automatizar partes dele, começando com raízes quadradas.

Aqui está como uma raiz quadrada é feita:

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

E é isso!

Regras

Você deve criar um programa ou função que inclua uma string, lista de strings (ou seja, linhas) ou matriz de caracteres e produza a entrada transformada de acordo com a descrição acima (não necessariamente pela mesma ordem ou processo exato)

Você pode assumir que a entrada é retangular, se preferir. O espaço em branco à direita não é necessário nem proibido.

Isso é , então a resposta mais curta em bytes vence.

Exemplos:

Input:
40
Output:
  ____
\/ 40

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

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

Input:
#  # 
#  # 
#####
   # 
   # 
Output:
        _______
       / #  #  
      /  #  #  
\    /   ##### 
 \  /       #  
  \/        #  
DanTheMan
fonte
3
V vai fazer bem neste caso
caird coinheringaahing
16
um matemático que realmente odeia TeX, LaTeX etc eu quase desisti de ler ali mesmo
Luis Mendo
5
Você está trabalhando eu quase desisti de ler ali mesmo
Arnauld

Respostas:

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

Experimente online!

-2 bytes graças ao Step Hen

-13 bytes graças a Jonathan Allan

HyperNeutrino
fonte
@StepHen Hm. Funciona, mas /funcionaria também. Obrigado.
HyperNeutrino
Mesmo parai+l//2
Stephen
Os sublinhados precisam esticar um caractere extra de cada lado.
26417 Neil
Você pode usar a entrada como uma lista de strings (o Python 2 input()avalia a entrada bruta). Também '_'*len(Q[0])+'__'é '_'*(2+len(Q[0])).
Jonathan Allan
6

SOGL V0.12 , 27 bytes

1w⁄2+╔*00žl»╚;lH╚@Κ№↕h┼№↕;┼

Experimente aqui! ( adicionado para facilitar o uso; o programa espera a entrada na pilha)

dzaima
fonte
5

Carvão , 32 bytes

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

Experimente online! Link é a versão detalhada do código. Versão de 29 bytes que assume entrada retangular:

WS⊞υιP⪫υ¶↖P×_⁺²Lθ↙↙Lυ↑↖÷⁺¹Lυ²
Neil
fonte
3
@LuisMendo carvão está ficando velho ...
Erik o Outgolfer
@EriktheOutgolfer D: old how
ASCII-
@ Somente ASCII Bem, o SOGL é mais novo e melhor, então ... nenhuma ofensa ao carvão, apesar de ainda ganhar muito.
Erik the Outgolfer
@EriktheOutgolfer, mas como é melhor :(
ASCII-only
IMO é meio como dizer Haskell é mais recente e melhor para Haskell> C # embora ainda ganha um monte
ASCII-only
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)]))

A variável 'l' é uma lista de cadeias, cada cadeia uma linha. Versão legível:

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 um símbolo de raiz quadrada com um V completo e raspa a esquerda de acordo.

Experimente Online!

Conner Johnston
fonte
2
Olá, Bem-vindo ao PPCG. Ótima primeira resposta, mas esse é um trecho, pois está assumindo a variável lcomo entrada. Você também deve incluir a parte em que lé recebido, quer como um parâmetro de função ou função input (), etc. (PS sua resposta também parece faltar algumas-espaço-preenchimento branco.)
officialaimm
2
@officialaimm, obrigado pela recepção! Para a prática para problemas futuros Eu atualizei e incluiu ligação 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:]

Um programa completo que recebe uma lista de linhas como entrada com a permissão somente retangular (na verdade, a primeira linha é uma das mais longas).

Experimente online!

Jonathan Allan
fonte
2

Java 8, 244 bytes

Uma solução muito longa, mas provavelmente a mais curta para Java. Este lambda recebe linhas de entrada como a String[]e retorna a String. Todas as linhas devem ter o mesmo comprimento.

Com base nas saídas de exemplo, presumi que não havia necessidade de acrescentar um espaço a cada linha da entrada, portanto o programa não.

Agradeço a Jonathan Allan por me lembrar sobre o ~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;}

Experimente Online

Ungolfed

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

Agradecimentos

  • -2 bytes graças a Kevin Cruijssen
Jakob
fonte
1
Boa resposta +1. Você pode golfe 2 bytes através da criação de uma variável para h+a+h%2que você usa duas vezes em seu 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;}. (Eu também usei o cabeçalho e rodapé no link TIO, assim você pode isolar o código Golfed real do código de teste.)
Kevin Cruijssen
1

Japonês , 46 bytes


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

A nova linha líder faz parte do programa. Entrada e saída é uma matriz de seqüências representando linhas.

Experimente online! usando o -Rsinalizador para ingressar na matriz resultante com novas linhas.

Justin Mariner
fonte
@ETHproductions Infelizmente, isso não funcionará, pois Ué uma matriz e não uma string.
Justin Mariner
Ah,
caramba
1

JavaScript (ES6), 140 bytes

Recebe a entrada como uma matriz de strings / retorna uma matriz de strings.

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 teste

Arnauld
fonte
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}

Experimente online!

Changelog:

  • precisava de mais bytes para corrigir um erro (assumia uma entrada quadrada primeiro)
  • corrigido outro bug e usado algumas dicas de comentários (obrigado Dada!)
Felix Palmen
fonte
Encurtado para 132 bytes . Eu deixei você dar uma olhada no que eu fiz. As grandes linhas: em <>vez de <STDIN>, em print" "x$fvez de for(1..$f){print" "}, usar em xxx for yyyvez de for(yyy){xxx}, usar $_no loop for em vez de variáveis ​​explícitas ( for$i(..){..}) ...
Dada
Muito tempo desde que usei o perl, obrigado! Mas eu tentei com x$fe não consegui fazê-lo funcionar: o tentando novamente agora ...
Felix Palmen
Uh e eu só encontrei um bug em ambas as versões ... dá-me algum tempo para corrigir isso;)
Felix Palmen
0

C ++, 291 bytes

A função assume que todas as seqüências de caracteres do vetor transmitidas como parâmetro têm o mesmo comprimento

#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
fonte
0

Dyalog APL, 95 bytes

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

Experimente online!

Uriel
fonte
0

C, 485 bytes

Este programa pega até 999 caracteres da entrada padrão e os lê em uma matriz. Imprime-os 1 de cada vez na saída padrão com as alterações indicadas pelo seu desafio. Assume que a entrada é retangular.

#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
fonte
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

Experimente online!

Xcali
fonte