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

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


@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


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

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!


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!


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

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.


@ 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


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

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

0

Dyalog APL, 95 byte

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

Cobalah online!


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

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!

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.