ASCII三角波纹


12

好吧,我的第一个高尔夫问题。请轻柔:)我知道可能有太多的ascii难题: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
虽然不是Draw Concentric ASCII Hexagons精确复制,但我不确定它是否比其他增加了很多。
Geobits,2015年

4
@Geobits IMO足够不同-输入规格非常不同,弄清楚要绘制多少个形状的方法也不同,三角形!=六角形;-)
Digital Trauma 2015年

@WooiKent我现在怀疑我是否正确理解了这个问题。什么是涟漪?是一组同心三角形,还是其他?
Digital Trauma

2
很好的问题,但是它没有被指定。(1)从字面上看文本,当输入为1,2或3时,我们应始终输出三个三角形。(2)假定每组三角形应该是同心的,并且(3)看起来它们的底角也应该在同一条线上。(4)水平间距是否必须如图所示恰好是一个空格,还是允许其他间距?(5)在(a,b,c,d)的左,右,上,下是否允许不必要的空格?
级圣河

我认为这很明确,尽管不是很明确。你总是绘制给定大小的一个三角形,具有大小为n-3的嵌套的三角形,N-6,N-9,等等
SPARR

Answers:


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用三元运算符替换语句,而不必在不同的分支中进行大量调用。当然,用这种方式很难读懂,但是如果篇幅较短,编写丑陋的代码完全符合本网站的精神。:)
Reto Koradi

感谢@RetoKoradi,通过实施您的建议,我将其从279减少到214 :)我认为我需要改进算法以获得进一步的改进。
paulvs 2015年

是的,一旦您超越了技巧,关键是要找到尽可能简化逻辑的规则。如果您看一下我的解决方案,该解决方案在本质上非常相似,那么我发现通过将水平坐标的原点放在三角形的中心可以大大简化逻辑。这样,我就可以利用对称性。其他人可能找到了更好的方法。有趣的是,看起来如此简单的问题可以完成多少工作,这真的很有趣。
Reto Koradi

1

的JavaScript(ES6)165 180 204

在Firefox中运行代码段进行测试。如果返回的字符串不够用,则使用alert作为输出还要多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>

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.