Pierwiastek kwadratowy sztuki ASCII

30

Pracujesz jako stażysta dla matematyka, który naprawdę nienawidzi TeXa, LaTeXa itp. Do tego stopnia, że ​​postanowił porzucić wszelkie składanie i zmusić cię do formatowania w ASCII. Zmęczyło cię to po pewnym czasie i postanowiłeś rozpocząć automatyzację jego części, zaczynając od pierwiastków kwadratowych.

Oto jak powstaje pierwiastek kwadratowy:

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

I to wszystko!

Zasady

Masz stworzyć program lub funkcję, która pobiera ciąg, listę ciągów (tj. Wierszy) lub tablicę znaków i wyprowadza dane wejściowe przetworzone zgodnie z powyższym opisem (niekoniecznie w tej samej kolejności lub procesie)

Możesz założyć, że wejście jest prostokątne, jeśli jest to preferowane. Końcowe białe znaki nie są wymagane ani zabronione.

To jest , więc wygrywa najkrótsza odpowiedź w bajtach.

Przykłady:

Input:
40
Output:
  ____
\/ 40

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

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

Input:
#  # 
#  # 
#####
   # 
   # 
Output:
        _______
       / #  #  
      /  #  #  
\    /   ##### 
 \  /       #  
  \/        #  
DanTheMan
źródło
3
V ma się dobrze w tym jednym
Cairair coinheringaahing
16
matematyk, który naprawdę nienawidzi TeXa, LaTeXa itp. Prawie przestałem czytać
Luis Mendo,
5
Pracujesz , prawie przestałem czytać właśnie tam
Arnauld

Odpowiedzi:

7

Python 2 , 196 bajtów

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

Wypróbuj online!

-2 bajty dzięki Step Hen

-13 bajtów dzięki Jonathanowi Allanowi

HyperNeutrino
źródło
@StepHen Hm. Działa, ale /też działa. Dzięki.
HyperNeutrino,
To samo dotyczyi+l//2
Stephena
Podkreślenia muszą rozciągnąć dodatkowo jedną postać z każdej strony.
Neil
Możesz wziąć dane wejściowe jako listę ciągów (Python 2 input()ocenia dane wejściowe surowe). Też '_'*len(Q[0])+'__'jest '_'*(2+len(Q[0])).
Jonathan Allan
6

SOGL V0.12 , 27 bajtów

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

Wypróbuj tutaj! ( dodano dla łatwości użycia; program oczekuje danych wejściowych na stosie)

dzaima
źródło
5

Węgiel drzewny , 32 bajty

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

Wypróbuj online! Link jest do pełnej wersji kodu. Wersja 29-bajtowa, która przyjmuje dane prostokątne:

WS⊞υιP⪫υ¶↖P×_⁺²Lθ↙↙Lυ↑↖÷⁺¹Lυ²
Neil
źródło
3
@LuisMendo Charcoal się starzeje ...
Erik the Outgolfer
@EriktheOutgolfer D: stary jak
tylko ASCII
@ Tylko ASCII Cóż, SOGL jest nowszy i lepszy, więc ... bez obrazy dla węgla drzewnego, choć wciąż dużo wygrywa.
Erik the Outgolfer,
@EriktheOutgolfer, ale jak to jest lepsze :(
tylko ASCII
IMO to trochę jak powiedzenie, że Haskell jest nowszy i lepszy, więc Haskell> C #, chociaż wciąż dużo wygrywa
tylko ASCII
5

Python 3 , 138 147 bajtów

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

Zmienna „l” to lista ciągów, każdy ciąg linii. Wersja do odczytu:

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)

Tworzy symbol pierwiastka kwadratowego z pełnym V, a następnie odpowiednio goli lewą.

Wypróbuj online!

Conner Johnston
źródło
2
Cześć, witamy w PPCG. Dobra pierwsza odpowiedź, ale jest to fragment, ponieważ przyjmuje on zmienną ljako dane wejściowe. Musisz również obejmować część, gdzie ljest wejście, albo jako parametr funkcji lub funkcji input () itp (PS odpowiedź również wydaje się być brak kilku white-space-dopełnienie).
officialaimm
2
@officialaimm, dziękuję za powitanie! Aby ćwiczyć na przyszłe problemy, zaktualizowałem i włączyłem link TIO
Conner Johnston,
3

Python 2 ,  131  130 bajtów

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

Pełny program przyjmujący listę wierszy jako dane wejściowe z naddatkiem tylko prostokątnym (w rzeczywistości pierwszy wiersz jest jednym z najdłuższych).

Wypróbuj online!

Jonathan Allan
źródło
2

Java 8, 244 bajty

Bardzo długie rozwiązanie, ale prawdopodobnie zbliżone do najkrótszego dla Java. Ta lambda przyjmuje linie danych wejściowych jako a String[]i zwraca a String. Wszystkie linie muszą mieć tę samą długość.

Na podstawie przykładowych danych wyjściowych założyłem, że nie ma potrzeby dodawania spacji do każdej linii na wejściu, więc program nie.

Podziękowania dla Jonathana Allana za przypomnienie mi o ~operatorze.

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

Wypróbuj online

Bez golfa

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

Podziękowanie

  • -2 bajty dzięki Kevin Cruijssen
Jakob
źródło
1
Dobra odpowiedź +1. Można golf 2 bajty tworząc zmienną dla h+a+h%2którego używasz dwa razy w kodzie: 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;}. (Użyłem również nagłówka i stopki w łączu TIO, abyś mógł odizolować swój rzeczywisty kod golfowy od kodu testowego.)
Kevin Cruijssen
1

Japt , 46 bajtów


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

Wiodąca nowa linia jest częścią programu. Dane wejściowe i wyjściowe to tablica ciągów znaków reprezentujących linie.

Wypróbuj online! używając -Rflagi, aby połączyć wynikową tablicę z nowymi liniami.

Justin Mariner
źródło
@ETHproductions Niestety, to nie zadziała, ponieważ Ujest tablicą, a nie łańcuchem.
Justin Mariner
Ach,
cholera
1

JavaScript (ES6), 140 bajtów

Pobiera dane wejściowe jako tablicę ciągów / zwraca tablicę ciągów.

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)

Przypadki testowe

Arnauld
źródło
1

Perl 5 , 177 185 160 bajtów

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

Wypróbuj online!

Dziennik zmian:

  • potrzebował więcej bajtów, aby naprawić błąd ( najpierw zakładał kwadratowe wejście)
  • naprawiono kolejny błąd i wykorzystałem kilka wskazówek z komentarzy (dzięki Dada!)
Felix Palmen
źródło
Skrócono do 132 bajtów . Pozwalam wam spojrzeć na to, co zrobiłem. Duże linie: <>zamiast <STDIN>, print" "x$fzamiast , zamiast for(1..$f){print" "}, xxx for yyyzamiast for(yyy){xxx}, użycie $_w pętli for zamiast zmiennych jawnych ( for$i(..){..}) ...
Dada
Dawno nie korzystałem z Perla, dzięki! Ale próbowałem x$fi nie mogłem go uruchomić: o próbuję teraz ...
Felix Palmen
Uh i właśnie znalazłem błąd w obu wersjach ... daj mi trochę czasu, aby to naprawić;)
Felix Palmen
0

C ++, 291 bajtów

Funkcja zakłada, że ​​wszystkie ciągi w wektorze przekazane jako parametr mają tę samą długość

#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
źródło
0

Dyalog APL, 95 bajtów

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

Wypróbuj online!

Uriel
źródło
0

C, 485 bajtów

Ten program pobiera do 999 znaków ze standardowego wejścia i odczytuje je w tablicy. Drukuje je pojedynczo na standardowym wyjściu ze zmianami wskazanymi przez wyzwanie. Zakłada się, że wejście jest prostokątne.

#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
źródło
0

Perl 5 , 159 bajtów

@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

Wypróbuj online!

Xcali
źródło