Akar kuadrat dari seni ASCII

30

Anda bekerja sebagai magang untuk ahli matematika yang benar - benar membenci TeX, LaTeX, dll. Sedemikian rupa sehingga dia telah memutuskan untuk meninggalkan semua pengaturan huruf apa pun dan membuat Anda melakukan semua pemformatan di ASCII. Anda bosan dengan ini setelah beberapa saat dan memutuskan untuk mulai mengotomatisasi bagian-bagiannya, dimulai dengan akar kuadrat.

Inilah cara membuat akar kuadrat:

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

Dan itu dia!

Aturan

Anda harus membuat program atau fungsi yang mengambil string, daftar string (yaitu baris), atau array karakter, dan menampilkan input yang diubah sesuai dengan deskripsi di atas (tidak harus dengan urutan atau proses yang sama persis)

Anda dapat berasumsi bahwa input berbentuk persegi panjang jika diinginkan. Trailing whitespace tidak diperlukan atau dianulir.

Ini adalah , jadi jawaban tersingkat dalam byte menang.

Contoh:

Input:
40
Output:
  ____
\/ 40

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

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

Input:
#  # 
#  # 
#####
   # 
   # 
Output:
        _______
       / #  #  
      /  #  #  
\    /   ##### 
 \  /       #  
  \/        #  
DanTheMan
sumber
3
V akan baik-baik saja dalam yang satu ini
caird coinheringaahing
16
seorang ahli matematika yang sangat membenci TeX, LaTeX dll. Saya hampir berhenti membaca di sana
Luis Mendo
5
Anda bekerja, saya hampir berhenti membaca di sana
Arnauld

Jawaban:

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

Cobalah online!

-2 byte berkat Langkah Hen

-13 byte terima kasih kepada Jonathan Allan

HyperNeutrino
sumber
@LangkahHen Hm. Ini bekerja tetapi /akan bekerja juga. Terima kasih.
HyperNeutrino
Sama untuki+l//2
Stephen
Garis bawah perlu merentangkan satu karakter ekstra di kedua sisi.
Neil
Anda dapat mengambil input sebagai daftar string (Python 2 input()mengevaluasi input mentah). Juga '_'*len(Q[0])+'__'adalah '_'*(2+len(Q[0])).
Jonathan Allan
6

SOGL V0.12 , 27 byte

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

Coba Di Sini! ( ditambahkan untuk kemudahan penggunaan; program mengharapkan input pada stack)

dzaima
sumber
5

Arang , 32 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Versi 29-byte yang mengasumsikan input persegi panjang:

WS⊞υιP⪫υ¶↖P×_⁺²Lθ↙↙Lυ↑↖÷⁺¹Lυ²
Neil
sumber
3
@LuisMendo Charcoal semakin tua ...
Erik the Outgolfer
@EriktheOutgolfer D: old how
ASCII-only
@ ASCII-only Well SOGL lebih baru dan lebih baik, jadi ... jangan tersinggung Charcoal meskipun masih banyak menang.
Erik the Outgolfer
@EriktheOutgolfer tetapi bagaimana ini lebih baik :(
ASCII-satunya
IMO itu agak seperti mengatakan Haskell lebih baru dan lebih baik sehingga Haskell> C # meskipun masih banyak menang
ASCII-hanya
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)]))

Variabel 'l' adalah daftar string, setiap string adalah garis. Versi yang Dapat Dibaca:

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)

Membentuk simbol akar kuadrat dengan V lengkap kemudian mencukur dari kiri sesuai.

Cobalah secara Online!

Conner Johnston
sumber
2
Hai, Selamat datang di PPCG. Jawaban pertama yang bagus, tapi ini potongan, karena mengasumsikan variabel lsebagai input. Anda juga harus memasukkan bagian di mana linput, baik sebagai parameter fungsi atau fungsi input (), dll. (PS jawaban Anda juga tampaknya kurang memiliki beberapa ruang-bantalan putih.)
officialaimm
2
@officialaimm, terima kasih atas sambutannya! Untuk berlatih untuk masalah di masa depan, saya telah memperbarui dan menyertakan tautan 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:]

Program lengkap mengambil daftar garis sebagai input dengan tunjangan hanya persegi panjang (sebenarnya bahwa baris pertama adalah salah satu yang terpanjang).

Cobalah online!

Jonathan Allan
sumber
2

Java 8, 244 byte

Solusi yang sangat panjang, tetapi mungkin paling dekat dengan Java. Lambda ini mengambil garis input sebagai a String[]dan mengembalikan a String. Semua garis harus memiliki panjang yang sama.

Berdasarkan contoh output, saya berasumsi bahwa tidak perlu menambahkan spasi untuk setiap baris dalam input, sehingga program tidak.

Terima kasih kepada Jonathan Allan untuk mengingatkan saya tentang ~operator.

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

Cobalah secara Online

Tidak disatukan

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

Ucapan Terima Kasih

  • -2 byte terima kasih kepada Kevin Cruijssen
Jakob
sumber
1
Jawaban bagus +1. Anda dapat golf 2 byte dengan menciptakan sebuah variabel untuk h+a+h%2yang Anda menggunakan dua kali dalam kode Anda: 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;}. (Saya juga menggunakan header & footer di tautan TIO, sehingga Anda dapat mengisolasi kode
golf
1

Japt , 46 byte


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

Memimpin baris baru adalah bagian dari program. Input dan output adalah array string yang mewakili garis.

Cobalah online! menggunakan -Rbendera untuk bergabung dengan array yang dihasilkan dengan baris baru.

Justin Mariner
sumber
@ ETHproductions Sayangnya itu tidak akan berfungsi karena Uarray dan bukan string.
Justin Mariner
Ah,
sial
1

JavaScript (ES6), 140 byte

Mengambil input sebagai array string / mengembalikan array string.

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)

Uji kasus

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

Cobalah online!

Changelog:

  • membutuhkan lebih banyak byte untuk memperbaiki bug (diasumsikan input persegi pertama)
  • memperbaiki bug lain dan menggunakan beberapa tips dari komentar (terima kasih Dada!)
Felix Palmen
sumber
Dipendekkan menjadi 132 byte . Saya membiarkan Anda melihat apa yang saya lakukan. Garis besar: <>alih-alih <STDIN>, print" "x$falih-alih for(1..$f){print" "}, menggunakan xxx for yyyalih-alih for(yyy){xxx}, menggunakan $_dalam for for alih-alih variabel eksplisit ( for$i(..){..}) ...
Dada
Sudah lama sejak saya menggunakan perl, terima kasih! Tetapi saya mencoba x$fdan tidak berhasil: o mencoba lagi sekarang ...
Felix Palmen
Uh dan saya baru saja menemukan bug di kedua versi ... beri saya waktu untuk memperbaikinya;)
Felix Palmen
0

C ++, 291 byte

Fungsi ini mengasumsikan bahwa semua string dalam vektor dilewatkan sebagai parameter memiliki panjang yang sama

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

Dyalog APL, 95 byte

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

Cobalah online!

Uriel
sumber
0

C, 485 byte

Program ini membutuhkan hingga 999 karakter dari input standar dan membacanya menjadi sebuah array. Ini mencetak mereka 1 pada satu waktu ke output standar dengan perubahan yang ditunjukkan oleh tantangan Anda. Ini mengasumsikan input berbentuk persegi panjang.

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

Cobalah online!

Xcali
sumber