ASCIIトライアングルリップル


12

OK、私の最初のゴルフの質問。優しくしてください:)アスキーパズルが多すぎることはわかっています: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
されていないが、正確なの複製同心ASCII六角形を描くが、私はありません確かに、多くの他の上に追加されます。
ジオビット

4
@Geobits IMOは十分に異なります-入力仕様はまったく異なり、描画する図形の数を計算する方法は異なり、三角形!=六角形;-)
デジタルトラウマ

@WooiKent私は今、質問を正しく理解したかどうか疑問に思っています。リップルとは何ですか?同心円状の三角形のセットなのか、それとも何か他のものなのか?
デジタル外傷

2
いい質問ですが、それは指定不足です。(1)テキストを文字どおりに読み取り、入力が1、2または3の場合、常に3つの三角形を出力する必要があります。(2)三角形の各セットは同心である必要があると考えられます。(3)三角形の底部コーナーも同じ線上にある必要があります。(4)水平方向の間隔は、示されているように正確に1スペースでなければなりませんか、または他の間隔は許可されますか?(5)(a、b、c、d)の左、右、上、下に不要な空白は許可されますか?
レベルリバーセント

明確ではありませんが、かなり明確だと思います。与えられたサイズの三角形を常に1つ描画し、サイズn-3、n-6、n-9などのネストされた三角形を使用します。
15年

回答:


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フラグを付けたまま1つのファイルとしてコードを実行し、#マーカーを保持できます。#読みやすくするために、出力のを改行に変更できます。例えば:

> 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ステートメントを三項演算子に置き換えることができます。もちろん、そのように読むのは難しくなりますが、それより短い場合、いコードを書くことは完全にこのサイトの精神です。:)
レトコラディ

@RetoKoradiに感謝します。あなたの提案を実装することで279から214に減らしました:)さらに改善するには、アルゴリズムを改善する必要があると思います。
paulvs

はい、メカニズムを超えたら、ロジックをできるだけ単純化するルールを見つけることが重要です。基本的に非常によく似た私のソリューションを見ると、水平座標の原点を三角形の中心に置くことで、ロジックがかなり単純化されていることがわかりました。そうすれば、対称性を利用できます。そして、他の人はおそらくもっと良いアプローチを見つけたでしょう。一見単純に見える問題に対してどれだけ多くのことができるのか、とても興味深いです。
レトコラディ

1

JavaScriptの(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.