Ripple tam giác ASCII


12

Ok, câu hỏi golf đầu tiên của tôi. Xin hãy nhẹ nhàng :) Tôi biết có quá nhiều câu đố ascii: P nhưng chúng ta đi đây.

Nhiệm vụ rất đơn giản, sử dụng ngôn ngữ lập trình yêu thích của bạn để in một gợn tam giác. Đầu vào phải là kích thước của gợn.

Mỗi tam giác đều cách đều nhau. Về cơ bản, bạn tiếp tục thêm các hình tam giác cho đến khi không có đủ không gian cho hình tam giác nhỏ nhất.

Bạn được phép có khoảng trắng ở bất cứ đâu bạn muốn miễn là các gợn sóng giống như ví dụ với kích thước chính xác.

Thí dụ

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

Như thường lệ, mã ngắn nhất sẽ thắng :)


2
Mặc dù không phải là bản sao chính xác của các hình lục giác DrawII ASCII đồng tâm , tôi không chắc nó sẽ bổ sung nhiều thứ khác.
Geobits

4
@Geobits IMO đủ khác nhau - thông số kỹ thuật đầu vào khá khác biệt, phương pháp tìm ra có bao nhiêu hình để vẽ là khác nhau và hình tam giác! = Hexagons ;-)
Chấn thương kỹ thuật số

@WooiKent Bây giờ tôi nghi ngờ nếu tôi hiểu chính xác câu hỏi. Một gợn sóng là gì? Đây có phải là một bộ tam giác đồng tâm, hay cái gì khác không?
Chấn thương kỹ thuật số

2
Câu hỏi hay, nhưng nó chưa được xác định rõ. (1) Đọc văn bản theo nghĩa đen, khi đầu vào là 1,2 hoặc 3, chúng ta sẽ luôn xuất ra ba hình tam giác. (2) Tôi sẽ coi nó là một tập hợp các hình tam giác nên đồng tâm và (3) có vẻ như chúng cũng phải có các góc dưới cùng trên cùng một đường thẳng. (4) Việc phân tách ngang có phải chính xác một không gian như được hiển thị hay các phân cách khác được phép không? (5) Khoảng trắng không cần thiết được phép cho (a, b, c, d) trái, phải, trên, dưới?
Cấp sông St

Tôi nghĩ nó khá rõ ràng, mặc dù không rõ ràng. Bạn luôn vẽ một hình tam giác có kích thước đã cho, với các hình tam giác lồng nhau có kích thước n-3, n-6, n-9, v.v.
Sparr

Câu trả lời:


5

Bình thường, 31 byte

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

Trình diễn.

Giải trình:

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

Một khởi đầu:

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

Đầu vào là một số nguyên unary dương thông qua STDIN, theo câu hỏi meta này .

Đầu ra:

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

____
\  /
 \/

______
\    /
 \  /
  \/

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

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

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

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

$ 

5

C, 165 byte

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("");}}

Trước các bước chơi gôn phá hủy khả năng đọc:

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

Vòng lặp này trên tất cả các ký tự trong hình chữ nhật chứa hình và đánh giá các phương trình đường thẳng tách bên trong tam giác với bên ngoài, cũng như các phần tách các phần khác nhau của tam giác.


Làm tốt với môn toán. Bạn nên thử cái này: codegolf.stackexchange.com/q/51394/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

Võng mạc , 182 byte

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

Đưa đầu vào là unary.

Mỗi dòng nên đi đến tập tin riêng của mình và #nên được thay đổi thành dòng mới trong các tập tin. Điều này là không thực tế nhưng bạn có thể chạy mã dưới dạng một tệp với -scờ, giữ các #điểm đánh dấu. Bạn có thể thay đổi các #dòng thành dòng mới trong đầu ra để dễ đọc nếu bạn muốn. Ví dụ:

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

Mã này không được đánh golf quá tốt (chưa).


2

C - 206 byte

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("");
    }
}

Ví dụ đầu ra

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

1
Bạn có thể cắt nó xuống khá nhiều. Tận dụng kiểu C cũ, bạn có thể khai báo các biến mà không cần loại int. Ngoài ra, nếu bạn khai báo chúng ở phạm vi toàn cầu, chúng sẽ tự động được khởi tạo thành 0. Thay vì có một loạt các putchar()cuộc gọi trong các nhánh khác nhau, bạn có thể sử dụng một cuộc gọi duy nhất và thay thế các ifcâu lệnh bằng các toán tử tạm thời. Tất nhiên việc đọc theo cách đó trở nên khó khăn, nhưng hoàn toàn theo tinh thần của trang web này để viết mã xấu nếu nó ngắn hơn. :)
Reto Koradi

Cảm ơn @RetoKoradi, tôi đã giảm từ 279 xuống còn 214 bằng cách thực hiện các đề xuất của bạn :) Tôi nghĩ rằng tôi cần cải thiện thuật toán của mình để có những cải tiến hơn nữa.
paulvs

Vâng, một khi bạn vượt ra khỏi cơ học, điều quan trọng là tìm ra các quy tắc đơn giản hóa logic càng nhiều càng tốt. Nếu bạn nhìn vào giải pháp của tôi, về cơ bản rất giống nhau, tôi thấy rằng logic đã đơn giản hóa khá nhiều bằng cách đặt gốc tọa độ ngang ở giữa tam giác. Bằng cách đó, tôi có thể tận dụng sự đối xứng. Và những người khác có thể tìm thấy phương pháp thậm chí tốt hơn. Điều thực sự thú vị là có thể làm được bao nhiêu cho một vấn đề trông rất đơn giản.
Reto Koradi

1

JavaScript ( ES6 ) 165 180 204

Chạy đoạn trích trong Firefox để kiểm tra. Nếu trả về chuỗi là không đủ, sử dụng cảnh báo cho đầu ra là 2 ký tự nữa.

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

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.