ASCII艺术的平方根


30

您正在为真正讨厌TeX,LaTeX等的数学家做实习生。是如此之多,以至于他决定放弃所有排版,让您以ASCII格式进行所有格式化。过了一会儿,您对此感到厌倦,并决定从平方根开始开始自动化它的一部分。

这是制作平方根的方法:

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

就是这样!

规则

您将要编写一个程序或函数,以接收字符串,字符串列表(即行)或字符数组,并输出根据上述说明转换的输入(不一定按完全相同的顺序或过程)

如果需要,您可以假定输入为矩形。既不需要也不禁止尾随空格。

这是,因此最短的答案以字节为单位。

例子:

Input:
40
Output:
  ____
\/ 40

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

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

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

3
V会在这一节中做得很好
资深专家coheringaahing

16
一位真正讨厌TeX,LaTeX等的数学家,我几乎不喜欢在那里读书
Luis Mendo

5
您正在工作,我几乎停止在那里读书了
Arnauld

Answers:


7

Python 2,196个字节

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

在线尝试!

-2字节感谢Step Hen

-13字节归功于Jonathan Allan


@StepHen嗯。它有效,但/也可以。谢谢。
HyperNeutrino

同样适用于i+l//2
Stephen

下划线需要在任一侧额外延伸一个字符。
尼尔

您可以将输入作为字符串列表使用(Python 2 input()评估原始输入)。也'_'*len(Q[0])+'__'就是'_'*(2+len(Q[0]))
乔纳森·艾伦


5

木炭,32字节

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

在线尝试!链接是详细版本的代码。假定矩形输入的29字节版本:

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

3
@LuisMendo木炭正在变老...
Egg the Outgolfer '17

@EriktheOutgolfer D:旧的方式
仅ASCII码,

仅限@ASCII格式的SOGL较新且更好,因此...尽管对炭炭仍然有很多好处,但对木炭没有任何冒犯。
暴民埃里克(Erik the Outgolfer)'17年

@EriktheOutgolfer,但效果如何更好:(
仅ASCII码,

IMO有点像说Haskell是新的和更好的,所以Haskell> C#尽管它仍然赢得了很多
ASCII码,仅在2007年

5

Python 3中138个 147字节

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

变量“ l”是字符串列表,每个字符串一行。可读版本:

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)

形成一个带有完整V的平方根符号,然后相应地去除左边的阴影。

在线尝试!


2
嗨,欢迎来到PPCG。好的第一个答案,但这是一个片段,因为它假定变量l为输入。您还必须将l输入的部分包括在内,无论是作为函数参数还是input()函数等。(PS您的回答似乎也缺少一些空格填充。)
Officialaimm

2
@officialaimm,谢谢您的欢迎!为了实践对未来的问题我已经更新,其中包括TIO链接
康纳约翰斯顿

3

Python 2中 131个  130字节

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

一个完整的程序,将行列表作为输入,仅包含矩形的余量(实际上,第一行是最长的一行)。

在线尝试!


2

Java 8,244字节

一个很长的解决方案,但可能接近Java的最短解决方案。此lambda将输入行作为a String[]并返回a String。所有行的长度必须相同。

根据示例输出,我假设不需要在输入的每一行中都添加空格,因此程序不需要。

感谢乔纳森·艾伦提醒我有关的~运营商。

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

在线试用

不打高尔夫球

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

致谢

  • -2个字节,感谢Kevin Cruijssen

1
好答案+1。您可以通过h+a+h%2在代码中创建两次使用两次的变量来获得2个字节的高尔夫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;}。(我还在TIO链接中使用了页眉和页脚,因此您可以将实际的高尔夫球代码与测试代码隔离开来。)
Kevin Cruijssen


1

JavaScript(ES6),140个字节

将输入作为字符串数组/返回字符串数组。

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)

测试用例


1

Perl 5中177个 185 160字节

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

在线尝试!

变更日志:

  • 需要更多字节来修复错误(首先假设输入为正方形
  • 修复了另一个错误,并使用了注释中的一些技巧(感谢Dada!)

缩短为132个字节。我让你看看我做了什么。大行:<>代替<STDIN>print" "x$f代替for(1..$f){print" "},使用xxx for yyy代替for(yyy){xxx}$_在for循环中使用而不是显式变量(for$i(..){..})...
Dada

自从我使用perl很久以来,谢谢!但是我尝试了一下x$f,却无法使它起作用:o现在再尝试...
Felix Palmen

嗯,我刚刚在两个版本中都发现了一个错误……给我一些时间来解决这个问题;)
Felix Palmen

0

C ++,291个字节

该函数假定向量中作为参数传递的所有字符串的长度都相同

#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个字节

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

在线尝试!


0

C,485字节

该程序最多可从标准输入中提取999个字符,并将它们读入数组。它一次将1打印到标准输出,并显示您的挑战所指示的更改。假定输入为矩形。

#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个字节

@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

在线尝试!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.