Căn bậc hai của nghệ thuật ASCII


30

Bạn đang làm việc như một thực tập viên cho một nhà toán học thực sự ghét TeX, LaTeX, v.v ... đến nỗi anh ấy đã quyết định từ bỏ tất cả các kiểu sắp chữ và làm cho bạn thực hiện tất cả các định dạng trong ASCII. Bạn đã mệt mỏi với điều này sau một thời gian và quyết định bắt đầu tự động hóa các bộ phận của nó, bắt đầu với căn bậc hai.

Đây là cách một căn bậc hai được tạo ra:

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

Và đó là nó!

Quy tắc

Bạn phải tạo một chương trình hoặc hàm lấy một chuỗi, danh sách các chuỗi (tức là các dòng) hoặc mảng các ký tự và xuất ra đầu vào được chuyển đổi theo mô tả ở trên (không nhất thiết phải theo cùng một thứ tự hoặc quy trình)

Bạn có thể cho rằng đầu vào là hình chữ nhật nếu thích. Không gian trắng không cần thiết cũng không được phép.

Đây là , vì vậy câu trả lời ngắn nhất bằng byte sẽ thắng.

Ví dụ:

Input:
40
Output:
  ____
\/ 40

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

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

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

3
V sẽ làm tốt trong việc này
caird coinheringaahing

16
một nhà toán học thực sự ghét TeX, LaTeX, v.v. Tôi gần như bỏ đọc ngay tại đó
Luis Mendo

5
Bạn đang làm việc tôi gần như bỏ việc đọc ngay tại đó
Arnauld

Câu trả lời:


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

Hãy thử trực tuyến!

-2 byte nhờ Bước Hen

-13 byte nhờ Jonathan Allan


@StepHen Hừm. Nó hoạt động nhưng /sẽ làm việc quá. Cảm ơn.
HyperNeutrino

Tương tự choi+l//2
Stephen

Các dấu gạch dưới cần kéo dài thêm một ký tự ở hai bên.
Neil

Bạn có thể lấy đầu vào làm danh sách các chuỗi (Python 2's input()đánh giá đầu vào thô). Cũng '_'*len(Q[0])+'__''_'*(2+len(Q[0])).
Jonathan Allan


5

Than , 32 byte

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Phiên bản 29 byte giả định đầu vào hình chữ nhật:

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

3
@LuisMendo Than đang già đi ...
Erik the Outgolfer 26/07/17

@EriktheOutgolfer D: cũ như thế nào
ASCII chỉ

Chỉ có ASCII Well SOGL mới hơn và tốt hơn, vì vậy ... không có ý xúc phạm đến Char than mặc dù nó vẫn thắng rất nhiều.
Erik the Outgolfer

@EriktheOutgolfer nhưng làm thế nào tốt hơn :(
ASCII - chỉ

IMO giống như nói Haskell mới hơn và tốt hơn nên Haskell> C # mặc dù nó vẫn thắng rất nhiều
ASCII chỉ

5

Python 3 , 138 147 byte

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

Biến 'l' là danh sách các chuỗi, mỗi chuỗi một dòng. Phiên bản dễ đọc:

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)

Tạo thành một biểu tượng căn bậc hai với chữ V hoàn chỉnh sau đó tắt bên trái cho phù hợp.

Hãy thử trực tuyến!


2
Xin chào, Chào mừng đến với PPCG. Câu trả lời đầu tiên rất hay, nhưng đây là một đoạn trích, vì nó giả sử biến llà đầu vào. Bạn cũng phải bao gồm phần lđầu vào, như là một tham số chức năng hoặc hàm input (), v.v. (PS câu trả lời của bạn dường như cũng thiếu một vài phần đệm trắng.)
chính thức tuyên bố

2
@officialaimm, cảm ơn bạn đã chào đón! Để thực hành cho các vấn đề trong tương lai, tôi đã cập nhật và bao gồm liên kết 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:]

Một chương trình đầy đủ lấy danh sách các dòng làm đầu vào với phụ cấp chỉ có hình chữ nhật (thực tế là dòng đầu tiên là một trong những dòng dài nhất).

Hãy thử trực tuyến!


2

Java 8, 244 byte

Một giải pháp rất dài, nhưng có lẽ gần với giải pháp ngắn nhất cho Java. Lambda này lấy các dòng đầu vào là a String[]và trả về a String. Tất cả các dòng phải có cùng chiều dài.

Dựa trên các kết quả đầu ra mẫu, tôi giả định rằng không cần phải thêm khoảng trắng vào mỗi dòng trong đầu vào, vì vậy chương trình không có.

Nhờ Jonathan Allan cho nhắc tôi về ~điều hành.

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

Dùng thử trực tuyến

Ung dung

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ời cảm ơn

  • -2 byte nhờ Kevin Cruijssen

1
Câu trả lời hay +1. Bạn có thể chơi golf 2 byte bằng cách tạo một biến h+a+h%2mà bạn sử dụng hai lần trong mã của mình : 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;}. (Tôi cũng đã sử dụng tiêu đề & chân trang trong liên kết TIO, vì vậy bạn có thể tách mã golf thực tế của mình khỏi mã kiểm tra.)
Kevin Cruijssen

1

Japt , 46 byte


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

Dòng mới hàng đầu là một phần của chương trình. Đầu vào và đầu ra là một chuỗi các chuỗi đại diện cho các dòng.

Hãy thử trực tuyến! sử dụng -Rcờ để nối mảng kết quả với dòng mới.


@ETHproductions Đáng buồn là sẽ không hoạt động vì Ulà một mảng chứ không phải là một chuỗi.
Justin Mariner


1

JavaScript (ES6), 140 byte

Lấy đầu vào là một chuỗi các chuỗi / trả về một chuỗi các chuỗi.

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)

Các trường hợp thử nghiệm


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}

Hãy thử trực tuyến!

Thay đổi:

  • cần thêm byte để sửa lỗi ( trước tiên nó giả sử đầu vào vuông )
  • đã sửa một lỗi khác và sử dụng một số mẹo từ nhận xét (cảm ơn Dada!)

Rút ngắn xuống còn 132 byte . Tôi để bạn có một cái nhìn vào những gì tôi đã làm. Các dòng lớn: <>thay vì <STDIN>, print" "x$fthay vì for(1..$f){print" "}sử dụng xxx for yyythay vì for(yyy){xxx}sử dụng $_trong vòng lặp for thay vì các biến rõ ràng ( for$i(..){..}) ...
Dada

Lâu rồi tôi mới dùng perl, cảm ơn! Nhưng tôi đã thử x$fvà không thể làm cho nó hoạt động được: o thử lại ngay bây giờ ...
Felix Palmen

Uh và tôi vừa tìm thấy một lỗi trong cả hai phiên bản ... hãy cho tôi một chút thời gian để sửa lỗi này;)
Felix Palmen

0

C ++, 291 byte

Hàm giả định rằng tất cả các chuỗi trong vectơ được truyền dưới dạng tham số có cùng độ dài

#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

APL Dyalog, 95 byte

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

Hãy thử trực tuyến!


0

C, 485 byte

Chương trình này mất tới 999 ký tự từ đầu vào tiêu chuẩn và đọc chúng thành một mảng. Nó in chúng 1 lần vào đầu ra tiêu chuẩn với những thay đổi mà thách thức của bạn chỉ ra. Nó giả sử đầu vào là hình chữ nhật.

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.