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는이 일에서 잘 할 것입니다
caird coinheringaahing

16
정말 TeX, LaTeX 등을 미워하는 수학자 등 거의 다 읽지
Luis Mendo

5
당신은 내가 거의 거기에서 바로 독서를 끝내고 있습니다
Arnauld

답변:


7

파이썬 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))

온라인으로 사용해보십시오!

Step Hen 덕분에 -2 바이트

Jonathan Allan 덕분에 -13 바이트


@StepHen 흠. 작동하지만 /작동합니다. 감사.
HyperNeutrino

동일i+l//2
Stephen

밑줄은 한 쪽 문자를 추가로 늘려야합니다.
Neil

입력을 문자열 목록으로 취할 수 있습니다 (Python 2 input()는 원시 입력을 평가합니다). 또한 '_'*len(Q[0])+'__'입니다 '_'*(2+len(Q[0])).
Jonathan Allan


5

, 32 바이트

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

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 직사각형 입력을 가정하는 29 바이트 버전 :

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

3
@LuisMendo 숯이 늙어 가고 있습니다 ...
Outgolfer Erik

@EriktheOutgolfer D : 오래된 방법
ASCII 전용

@ ASCII-only Well SOGL은 더 새롭고 더 좋기 때문에 여전히 많은 승리를 거두지 만 차콜에 대한 위반은 없습니다.
아웃 골퍼 에릭

@EriktheOutgolfer 그러나 어떻게 더 나은 :(
ASCII 전용

IMO 그것은 Haskell이 더 새롭고 더 좋다고 말하는 것과 비슷합니다. Haskell> C #은 여전히 ​​많이

5

파이썬 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

파이썬 2 ,  131130  바이트

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

자바 8, 244 바이트

매우 긴 솔루션이지만 Java의 경우 가장 짧습니다. 이 람다는 입력 행을 a로 사용하여 a String[]를 반환합니다 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;
}

감사의 말

  • Kevin Cruijssen 덕분에 -2 바이트

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

자바 스크립트 (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(..){..}) ...
다다

펄을 사용한지 오랜만에 감사합니다! 그러나 나는 그것을 시도하고 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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.