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

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


@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


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

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!


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!


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

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.


@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


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

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

0

Dyalog APL, 95 bajtów

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

Wypróbuj online!


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

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!

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.