ASCII 삼각형 리플


12

좋아, 내 첫 골프 질문입니다. 부드럽게 해주세요 :) 아스키 퍼즐이 너무 많다는 것을 알고 있습니다 : P 그러나 여기에갑니다.

작업은 간단합니다. 좋아하는 프로그래밍 언어를 사용하여 삼각형 리플을 인쇄하십시오. 입력은 리플의 크기 여야합니다.

각 삼각형의 간격이 균등합니다. 기본적으로 가장 작은 삼각형을위한 공간이 충분하지 않을 때까지 삼각형을 계속 추가합니다.

잔물결이 올바른 크기의 예와 동일하다면 원하는 곳 어디에서나 공백이 허용됩니다.

q)g 1
__
\/
q)g 2
____
\  /
 \/
q)g 3
______
\    /
 \  /
  \/
q)g 4
________
\  __  /
 \ \/ /
  \  /
   \/
q)g 5
__________
\  ____  /
 \ \  / /
  \ \/ /
   \  /
    \/
q)g 6
____________
\  ______  /
 \ \    / /
  \ \  / /
   \ \/ /
    \  /
     \/
q)g 7
______________
\  ________  /
 \ \  __  / /
  \ \ \/ / /
   \ \  / /
    \ \/ /
     \  /
      \/
q)g 8
________________
\  __________  /
 \ \  ____  / /
  \ \ \  / / /
   \ \ \/ / /
    \ \  / /
     \ \/ /
      \  /
       \/

평소와 같이 가장 짧은 코드가 승리합니다. :)


2
Concentric ASCII Hexagons정확한 복제본은 아니지만 다른 것보다 많은 것이 있는지 잘 모르겠습니다.
Geobits 2016 년

4
@Geobits IMO 그것의 충분히 다른-입력 사양이 상당히 다르고, 그릴 모양이 얼마나 많은지 알아내는 방법과 삼각형! = 육각형 ;-)
Digital Trauma

@ WooiKent 나는 이제 질문을 올바르게 이해했는지 의심하고 있습니다. 잔물결이란 무엇입니까? 하나의 동심 삼각형 세트입니까, 아니면 다른 것입니까?
디지털 외상

2
좋은 질문이지만 지정되지 않았습니다. (1) 문자를 문자 그대로 읽으면 입력이 1, 2 또는 3 일 때 항상 3 개의 삼각형을 출력해야합니다 . (2) 각 삼각형 세트가 동심이어야하고 (3) 아래쪽 모서리가 같은 선에 있어야한다고 가정합니다. (4) 수평 분리는 그림과 같이 정확히 하나의 공간이어야합니까, 아니면 다른 분리가 허용됩니까? (5) (a, b, c, d) 왼쪽, 오른쪽, 위, 아래에 비정형 공백이 허용됩니까?
레벨 리버 St

분명하지는 않지만 다소 명확하다고 생각합니다. n-3, n-6, n-9 등의 중첩 삼각형을 사용하여 항상 주어진 크기의 삼각형 하나를 그립니다.
Sparr

답변:


5

Pyth, 31 바이트

VhQ+J<t+++*Nd*N"\ "d*Q\_Q_XJ"\/

데모.

설명:

VhQ+J<t+++*Nd*N"\ "d*Q\_Q_XJ"\/
                                   Implicit: Q = eval(input()), d = ' '
VhQ                                for N in range(Q + 1):
                                   Concatenate:
          *Nd                      N spaces
         +   *N"\ "                N of the string "\ "
        +          d               another space
       +            *Q\_           Q of the string "_"
                                   If N = 2 and Q = 7, the string so far is:
                                   "  \ \  _______" and we want
                                   " \ \  _" as the left half.
      t                            Remove the first character.
     <                  Q          Take the first Q characters remaining.
                                   This is the left half of the triangle ripple.
    J                              Store it in J.
                          XJ"\/    Translate \ to / in J.
                         _         Reverse it.
   +                               Concatenate the left and right halves and print.

7

GNU sed -nr, 210

시작 :

s/1/__/g
p
s#_(.*)_#\\\1/#
s#\\__#\\  #
s#__/#  /#
ta
:a
p
s#(.*) _{6}(_*) # \1\\  \2  /#;ta
s#(.*)  (  )# \1\2#;
s#(.*) _(_*)_ # \1\\\2/#
y/_/ /
Tc
:b
p
:c
s#(.*)((\\)  ( *)(/)|()()()\\/)# \1\3\4\5#;tb

이 메타 질문에 따라 STDIN을 통한 입력 양의 정수 입니다.

산출:

$ for i in 1 11 111 1111 11111 111111 1111111; do sed -rnf triripple.sed <<< $i; done
__
\/

____
\  /
 \/

______
\    /
 \  /
  \/

________
\  __  /
 \ \/ /
  \  /
   \/

__________
\  ____  /
 \ \  / /
  \ \/ /
   \  /
    \/

____________
\  ______  /
 \ \    / /
  \ \  / /
   \ \/ /
    \  /
     \/

______________
\  ________  /
 \ \  __  / /
  \ \ \/ / /
   \ \  / /
    \ \/ /
     \  /
      \/

$ 

5

C, 165 바이트

n,x,y,b,c;main(c,v)char**v;{for(n=atoi(v[1]);y<=n;++y){for(x=-n;x<n;++x){b=2*n-abs(2*x+1);c=b-2*y+2;b-=6*y;putchar(b>0?95:b<-4&c>0&c%4==1?"/\\"[x<0]:32);}puts("");}}

가독성을 파괴하는 골프 단계 전에 :

#include <stdio.h>
#include <stdlib.h>

int main(int c, char** v) {
    int n = atoi(v[1]);
    for (int y = 0; y <= n; ++y) {
        for (int x = -n; x < n; ++x) {
            int b = 2 * n - abs(2 * x + 1);
            int c = b - 2 * y + 2;
            b -= 6 * y;
            putchar(b > 0 ? 95 : 
                    b < -4 && c > 0 && c % 4 == 1 ? "/\\"[x<0] : 32);
        }
        puts("");
    }
}

이것은 그림을 포함하는 사각형의 모든 문자를 반복하고 삼각형의 내부를 외부와 분리하는 선 방정식과 삼각형의 다른 부분을 분리하는 선 방정식을 평가합니다.


수학 잘 했어요. 이것을 시도해야합니다 : codegolf.stackexchange.com/q/51396/21348
edc65

156 :n,x,y,b,c;main(c,v)char**v;{for(n=atoi(v[1]);y<=n;++y)for(x=-n;x<=n;putchar(x++-n?b>6*y?95:b<6*y-4&c>0&c%4==1?"/\\"[x<1]:32:10))c=(b=2*n-abs(2*x+1))-2*y+2;}
edc65

4

레티 나 182 바이트

1
_
^
#$_
((`#([^#]*?)( ?)_(_*)_( ?)([^#]*?)$
$0# $1\$3/$5
+)`\\( ?)_(_*)_( ?)/(?=[^#]*$)
\ $1$2$3 /
#( *(\\ )*\\ *)  ( *(/ )*/)$
$0# $1$3
)`#( *(\\ )*)\\/(( /)*)$
$0# $1$3
# 
#
^#
<empty line>

입력을 단항으로 사용합니다.

각 줄은 자체 파일로 이동 #해야하며 파일 에서 줄 바꿈으로 변경되어야합니다. 이것은 실용적이지 않지만 마커를 사용하여 -s플래그를 사용하여 하나의 파일처럼 코드를 실행할 수 있습니다 #. #원하는 경우 가독성을 위해 출력에서를 개행으로 변경할 수 있습니다 . 예 :

> echo -n 1111|retina -s triangle|tr # '\n'
________
\  __  /
 \ \/ /
  \  /
   \/

코드가 골프화되지 않았습니다 (아직).


2

C — 206 바이트

i,j,m,k,a,b;main(i,v)char**v;{m=atoi(v[1])*2;while(k<m*(m/2+1)){i=k/m;j=k%m;a=i*3,b=(i+j)%2;putchar("_\\/ "[j>=a&&j<m-a?0:j>i-2&&b&&j<i*3-1&&j<m/2?1:j<=m-i&&!b&&j>m-a&&j>=m/2?2:3]);if(j==m-1)puts("");k++;};}

 x,m,i,j,a,b;
int main(x,v)char**v;{
    m=atoi(v[1])*2;
    for(i=0;i<m/2+1;i++){
        for(j=0;j<m;j++){
            a=i*3,b=(i+j)%2;
            j>=a&&j<m-a?a=0:j>=i-1&&b&&j<i*3-1&&j<m/2?a=1:j<=m-i&&!b&&j>m-a&&j>=m/2?a=2:(a=3);putchar("_\\/ \n"[a]);
        }
        puts("");
    }
}

출력 예

Pauls-iMac:ppcg pvons$ for i in $(seq 1 7); do ./a.out $i; done
__
\/
____
\  /
 \/ 
______
\    /
 \  / 
  \/  
________
\  __  /
 \ \/ / 
  \  /  
   \/   
__________
\  ____  /
 \ \  / / 
  \ \/ /  
   \  /   
    \/    
____________
\  ______  /
 \ \    / / 
  \ \  / /  
   \ \/ /   
    \  /    
     \/     
______________
\  ________  /
 \ \  __  / / 
  \ \ \/ / /  
   \ \  / /   
    \ \/ /    
     \  /     
      \/      

1
이 부분을 상당히 줄일 수 있습니다. 이전 스타일 C를 활용하면 변수가없는 경우 변수를 유형없이 선언 할 수 있습니다 int. 또한 전역 범위에서 선언하면 자동으로 0으로 초기화됩니다 putchar(). 서로 다른 분기에 여러 번의 호출을하는 대신 단일 호출을 사용하고 if명령문을 3 진 연산자로 바꿀 수 있습니다 . 물론 그런 방식으로 읽기가 어려워 지지만,이 사이트의 핵심은 더 짧으면 못생긴 코드를 작성하는 것입니다. :)
Reto Koradi

@RetoKoradi 덕분에 제안을 구현하여 279에서 214로 줄였습니다. :) 더 개선하려면 알고리즘을 개선해야한다고 생각합니다.
paulvs 2016 년

예, 일단 역학을 넘어 서면 핵심은 가능한 한 논리를 단순화하는 규칙을 찾는 것입니다. 근본적으로 매우 유사한 내 솔루션을 보면 삼각형의 중심에 수평 좌표의 원점을 배치하여 논리가 상당히 단순화 된 것을 알았습니다. 그렇게하면 대칭을 활용할 수 있습니다. 그리고 다른 사람들은 아마도 더 나은 접근법을 발견했을 것입니다. 매우 기만적으로 보이는 문제에 대해 얼마나 많은 일을 할 수 있는지 정말 흥미 롭습니다.
Reto Koradi 2016 년

1

자바 스크립트 ( ES6 ) 165 180 204

Firefox에서 스 니펫을 실행하여 테스트하십시오. 문자열 반환이 충분하지 않으면 출력에 대한 경고 사용이 2 자 이상입니다.

// 165 - return the string
F=n=>
  (i=>{
    for(r='__'[R='repeat'](m=n);i<n;)
      r+=`\n`+' '[R](i)
       +('\\ '[R](t=-~(m>3?i:~-n/3))+' ').slice(0,n-i)
       +'__'[R](m>3?m-=3:0)
       +(' '+' /'[R](t)).slice(i++-n)
  })(0)||r


// 167 - output the string
A=n=>{
  for(i=0,r='__'[R='repeat'](m=n);i<n;)
    r+=`\n`+' '[R](i)
     +('\\ '[R](t=-~(m>3?i:~-n/3))+' ').slice(0,n-i)
     +'__'[R](m>3?m-=3:0)
     +(' '+' /'[R](t)).slice(i++-n);
  alert(r)
}

// TEST
out=x=>O.innerHTML += x+'\n' 

for(k=1;k<13;k++)out(k+'\n'+F(k))
<pre id=O></pre>

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