Radice quadrata di arte ASCII


30

Stai lavorando come stagista per un matematico che odia davvero TeX, LaTeX, ecc. Tanto che ha deciso di abbandonare qualsiasi tipo di composizione e di farti fare tutta la formattazione in ASCII. Ti sei stancato di questo dopo un po 'e hai deciso di iniziare ad automatizzare parti di esso, iniziando con radici quadrate.

Ecco come viene creata una radice quadrata:

###  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 questo è tutto!

Regole

Devi creare un programma o una funzione che accetta una stringa, un elenco di stringhe (cioè righe) o una matrice di caratteri e genera l'input trasformato secondo la descrizione sopra (non necessariamente con lo stesso ordine o processo esatto)

Si può presumere che l'ingresso sia rettangolare, se si preferisce. Gli spazi bianchi finali non sono richiesti né vietati.

Questo è , quindi vince la risposta più breve in byte.

Esempi:

Input:
40
Output:
  ____
\/ 40

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

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

Input:
#  # 
#  # 
#####
   # 
   # 
Output:
        _______
       / #  #  
      /  #  #  
\    /   ##### 
 \  /       #  
  \/        #  

3
V sta andando bene in questo
caird coinheringaahing il

16
un matematico che odia davvero TeX, LaTeX ecc. Ho quasi smesso di leggere proprio lì
Luis Mendo,

5
Stai lavorando, ho quasi smesso di leggere proprio lì
Arnauld,

Risposte:


7

Python 2 , 196 byte

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

Provalo online!

-2 byte grazie a Step Hen

-13 byte grazie a Jonathan Allan


@StepHen Hm. Funziona ma /funzionerebbe anche. Grazie.
HyperNeutrino,

Lo stesso vale peri+l//2
Stephen

I caratteri di sottolineatura devono allungare un carattere in più su entrambi i lati.
Neil,

Puoi prendere l'input come un elenco di stringhe (Python 2 input()valuta l'input non elaborato). Lo '_'*len(Q[0])+'__'è anche '_'*(2+len(Q[0])).
Jonathan Allan,


5

Carbone , 32 byte

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

Provalo online! Il collegamento è alla versione dettagliata del codice. Versione a 29 byte che assume un input rettangolare:

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

3
@LuisMendo Charcoal invecchia ...
Erik the Outgolfer,

@EriktheOutgolfer D: old how
ASCII-only

@ Solo ASCII Beh, SOGL è più recente e migliore, quindi ... senza offesa per il carbone, anche se vince ancora molto.
Erik the Outgolfer

@EriktheOutgolfer ma come va meglio :(
ASCII il

IMO è un po 'come dire che Haskell è più recente e migliore quindi Haskell> C # anche se vince ancora molto
solo ASCII

5

Python 3 , 138 147 byte

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 variabile 'l' è un elenco di stringhe, ciascuna stringa una riga. Versione leggibile:

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 simbolo di radice quadrata con una V completa, quindi si rade di conseguenza a sinistra.

Provalo online!


2
Ciao, benvenuto in PPCG. Bella prima risposta, ma questo è uno snippet, dato che assume la variabile lcome input. Devi anche includere la parte in cui lviene inserito, come parametro di funzione o funzione di input (), ecc. (PS, la tua risposta sembra mancare anche di alcuni spazi vuoti).
officialaimm,

2
@officialaimm, grazie per il benvenuto! Per fare pratica per problemi futuri ho aggiornato e incluso il collegamento TIO
Conner Johnston,

3

Python 2 ,  131  130 byte

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 programma completo che prende un elenco di righe come input con l'indennità solo rettangolare (in realtà la prima riga è una delle più lunghe).

Provalo online!


2

Java 8, 244 byte

Una soluzione molto lunga, ma probabilmente vicina alla più breve per Java. Questo lambda prende le linee di input come a String[]e restituisce aString . Tutte le linee devono avere la stessa lunghezza.

Sulla base degli output di esempio, ho ipotizzato che non fosse necessario aggiungere uno spazio a ciascuna riga nell'input, quindi il programma no.

Grazie a Jonathan Allan per avermi ricordato circa l' ~operatore.

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

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

Ringraziamenti

  • -2 byte grazie a Kevin Cruijssen

1
Bella risposta +1. Si può golf 2 byte con la creazione di una variabile per h+a+h%2cui si utilizzano due volte nel codice: 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;}. (Ho anche usato l'intestazione e il piè di pagina nel link TIO, così puoi isolare il tuo vero codice golf dal codice di test.)
Kevin Cruijssen,

1

Japt , 46 byte


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

Newline leader fa parte del programma. Input e output sono una matrice di stringhe che rappresentano le linee.

Provalo online! usando il -Rflag per unire l'array risultante con le nuove righe.


@ETHproductions Purtroppo non funzionerà poiché Uè un array e non una stringa.
Justin Mariner,

Ah, maledizione ....
ETHproductions,

1

JavaScript (ES6), 140 byte

Accetta l'input come una matrice di stringhe / restituisce una matrice di stringhe.

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)

Casi test


1

Perl 5 , 177 185 160 byte

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

Provalo online!

changelog:

  • servivano più byte per correggere un bug (presupponeva prima un input quadrato )
  • risolto un altro bug e usato alcuni suggerimenti dai commenti (grazie Dada!)

Ridotto a 132 byte . Ti lascio dare un'occhiata a quello che ho fatto. Le grandi linee: <>invece di <STDIN>, print" "x$finvece di for(1..$f){print" "}, usando xxx for yyyinvece di for(yyy){xxx}, usando $_nel ciclo for invece delle variabili esplicite ( for$i(..){..}) ...
Dada,

Molto tempo da quando ho usato il perl, grazie! Ma ci ho provato x$fe non sono riuscito a farlo funzionare: o riprovare ora ...
Felix Palmen,

Uh e ho appena trovato un bug in entrambe le versioni ... dammi un po 'di tempo per risolvere questo problema;)
Felix Palmen,

0

C ++, 291 byte

La funzione presuppone che tutte le stringhe nel vettore passate come parametro abbiano la stessa lunghezza

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

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

Provalo online!


0

C, 485 byte

Questo programma accetta fino a 999 caratteri dall'input standard e li legge in un array. Li stampa 1 alla volta sull'output standard con le modifiche indicate dalla sfida. Presuppone che l'input sia rettangolare.

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

@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

Provalo online!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.