ASCII Üçgen Dalgalanma


12

Tamam, ilk golf sorum. Lütfen nazik olun :) Biliyorum çok fazla ascii bulmaca var: P ama işte başlıyoruz.

Görev basittir, üçgen dalgalanma yazdırmak için en sevdiğiniz programlama dilini kullanın. Giriş dalgalanma boyutu olmalıdır.

Her üçgen eşit aralıklarla yerleştirilir. Temel olarak, en küçük üçgen için yeterli alan kalmayana kadar üçgenleri eklemeye devam edersiniz.

Dalgalanmalar doğru boyuttaki örnekle aynı olduğu sürece, istediğiniz yerde beyaz boşluklara izin verilir.

Misal

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

Her zamanki gibi, en kısa kod kazanır :)


2
Değil iken kesin bir yinelenen Konsantrik ASCII Hexagons çizin , ben değilim emin çok diğeri üzerinde ekler.
Geobits

4
@Geobits IMO yeterince farklı - giriş spesifikasyonu oldukça farklı, çizilecek kaç şeklin farklı olduğunu belirleme yöntemi ve üçgenler! = Altıgenler ;-)
Dijital Travma

@WooiKent Soruyu doğru anladıysam şüphe ediyorum. Dalgalanma nedir? Eşmerkezli bir üçgen seti mi yoksa başka bir şey mi?
Dijital Travma

2
güzel bir soru, ama eksik. (1) Metni tam anlamıyla okumak, giriş 1,2 veya 3 olduğunda, her zaman üç üçgen çıkarmalıyız . (2) Her bir üçgen setinin eşmerkezli olması gerektiği düşünülürdüm ve (3) aynı çizgide alt köşeleri de olmalıdır. (4) Yatay ayırma, gösterildiği gibi tam olarak bir boşluk mu olmalı yoksa başka ayırmalara izin veriliyor mu? (5) Sol, sağ, yukarıda, aşağıda (a, b, c, d) gereksiz boşluklara izin verilir mi?
Level River St

Bence açık olmasa da oldukça açık. Her zaman belirtilen boyutta bir üçgen çizersiniz, n-3, n-6, n-9 vb. Boyutlarda iç içe üçgenler vardır.
Sparr

Yanıtlar:


5

Pyth, 31 bayt

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

Gösteri.

Açıklama:

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

Bir başlangıç:

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

Girdi, bu meta soruya göre STDIN üzerinden pozitif bir tekli tam sayıdır .

Çıktı:

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

____
\  /
 \/

______
\    /
 \  /
  \/

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

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

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

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

$ 

5

C, 165 bayt

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

Okunabilirliği yok eden golf adımlarından önce:

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

Bu, şekli içeren dikdörtgendeki tüm karakterlerin üzerinden geçer ve üçgenin iç kısmını dışarıdan ayıran çizgi denklemlerini ve üçgenin farklı kısımlarını ayıran çizgileri değerlendirir.


Matematik ile iyi iş. Bunu denemelisiniz: 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

Retina , 182 bayt

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

Girişi tek olarak alır.

Her satır kendi dosyasına gitmeli #ve dosyalardaki satırsonu olarak değiştirilmelidir. Bu pratik değildir, ancak işaretçileri -skoruyarak kodu bayraklı tek bir dosya gibi çalıştırabilirsiniz #. İsterseniz #okunabilirlik için çıktıları yeni satırlarla değiştirebilirsiniz . Örneğin:

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

Kod (henüz) çok iyi golf değil.


2

C - 206 bayt

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

Örnek çıktı

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

1
Bunu biraz kesebilirsiniz. Eski C stilinden yararlanarak değişkenleri bir tür olmadan açıklayabilirsiniz int. Ayrıca, bunları küresel kapsamda bildirirseniz, otomatik olarak 0 olarak başlatılırlar putchar(). Farklı dallarda bir grup çağrı yapmak yerine, tek bir çağrı kullanabilir ve ififadeleri üçlü operatörlerle değiştirebilirsiniz. Tabii ki bu şekilde okumak zorlaşıyor, ancak daha kısaysa çirkin kod yazmak tamamen bu sitenin ruhunda. :)
Reto Koradi

Teşekkürler @RetoKoradi, önerilerinizi uygulayarak 279'dan 214'e düşürdüm :) Sanırım daha fazla iyileştirme almak için algoritmamı geliştirmem gerekecek.
paulvs

Evet, mekaniğin ötesine geçtiğinizde, anahtar mantığı olabildiğince basitleştiren kurallar bulmaktır. Temelde çok benzer olan çözümüme bakarsanız, yatay koordinatın kökenini üçgenin ortasına yerleştirerek mantığın biraz basitleştirildiğini buldum. Bu şekilde simetriden faydalanabilirim. Ve diğerleri muhtemelen daha iyi yaklaşımlar buldular. Aldatıcı derecede basit görünen bir problemde ne kadar çok şey yapılabileceği gerçekten ilginç.
Reto Koradi

1

JavaScript ( ES6 ) 165180 204

Test etmek için Firefox'ta snippet'i çalıştırın. Dizeyi döndürmek yeterli değilse, çıktı için uyarı kullanmak 2 karakter daha fazladır.

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.