ASCII Triangle Ripple

12

Ok, pertanyaan golf pertama saya. Harap bersikap lembut :) Saya tahu ada terlalu banyak teka-teki ascii: P tapi ini dia.

Tugasnya sederhana, gunakan bahasa pemrograman favorit Anda untuk mencetak riak segitiga. Inputnya harus seukuran riak.

Setiap segitiga diberi jarak secara merata. Pada dasarnya, Anda terus menambahkan segitiga sampai tidak ada cukup ruang untuk segitiga terkecil.

Anda diizinkan ruang putih di mana pun Anda inginkan asalkan riaknya sama dengan contoh dengan ukuran yang benar.

Contoh

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

Seperti biasa, kode terpendek menang :)

WooiKent Lee
sumber
2
Meskipun bukan duplikat yang tepat dari Hexagons Draw Concentric ASCII , saya tidak yakin ini menambah banyak yang lain.
Geobits
4
@ Geobits IMO cukup berbeda - spesifikasi input sangat berbeda, metode menentukan berapa banyak bentuk gambar yang berbeda, dan segitiga! = Segi enam ;-)
Digital Trauma
@ WooiKent Saya sekarang ragu apakah saya mengerti pertanyaan dengan benar. Apa itu riak? Apakah itu satu set segitiga konsentris, atau yang lain?
Digital Trauma
2
pertanyaan yang bagus, tetapi tidak ditentukan. (1) Membaca teks secara harfiah, ketika inputnya 1,2 atau 3, kita harus selalu menghasilkan tiga segitiga. (2) Saya akan menganggapnya sebagai mengingat bahwa setiap set segitiga harus konsentris, dan (3) tampaknya mereka juga harus memiliki sudut bawah pada garis yang sama. (4) Apakah pemisahan horizontal harus tepat satu ruang seperti yang ditunjukkan, atau apakah pemisahan lain diperbolehkan? (5) Apakah spasi putih yang tidak perlu diizinkan ke (a, b, c, d) kiri, kanan, atas, bawah?
Level River St
Saya pikir itu agak jelas, meskipun tidak eksplisit. Anda selalu menggambar satu segitiga dari ukuran yang diberikan, dengan segitiga bersarang dari ukuran n-3, n-6, n-9, dll.
Sparr

Jawaban:

5

Pyth, 31 byte

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

Demonstrasi.

Penjelasan:

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.
isaacg
sumber
7

GNU sed -nr, 210

Sebuah awal:

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

Input adalah bilangan bulat unary positif melalui STDIN, sesuai meta-pertanyaan ini .

Keluaran:

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

____
\  /
 \/

______
\    /
 \  /
  \/

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

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

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

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

$ 
Trauma Digital
sumber
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("");}}

Sebelum bermain golf, langkah-langkah yang merusak keterbacaan:

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

Ini loop semua karakter dalam persegi panjang yang berisi gambar, dan mengevaluasi persamaan garis yang memisahkan bagian dalam segitiga dari luar, serta yang memisahkan bagian-bagian yang berbeda dari segitiga.

Reto Koradi
sumber
Pekerjaan bagus dengan matematika. Anda harus mencoba yang ini: 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 byte

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

Mengambil input sebagai unary.

Setiap baris harus menuju ke file sendiri dan #harus diubah ke baris baru di file. Ini tidak praktis tetapi Anda dapat menjalankan kode seperti halnya satu file dengan -sbendera, menjaga #spidol. Anda dapat mengubah #'s ke baris baru di output untuk dibaca jika Anda inginkan. Misalnya:

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

Kode belum golf dengan baik (belum).

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

Contoh output

Pauls-iMac:ppcg pvons$ for i in $(seq 1 7); do ./a.out $i; done
__
\/
____
\  /
 \/ 
______
\    /
 \  / 
  \/  
________
\  __  /
 \ \/ / 
  \  /  
   \/   
__________
\  ____  /
 \ \  / / 
  \ \/ /  
   \  /   
    \/    
____________
\  ______  /
 \ \    / / 
  \ \  / /  
   \ \/ /   
    \  /    
     \/     
______________
\  ________  /
 \ \  __  / / 
  \ \ \/ / /  
   \ \  / /   
    \ \/ /    
     \  /     
      \/      
paulvs
sumber
1
Anda dapat memangkasnya sedikit. Dengan memanfaatkan gaya lama C, Anda dapat mendeklarasikan variabel tanpa tipe jika ada int. Juga, jika Anda mendeklarasikannya di lingkup global, mereka secara otomatis diinisialisasi ke 0. Daripada memiliki banyak putchar()panggilan di cabang yang berbeda, Anda dapat menggunakan satu panggilan dan mengganti ifpernyataan dengan operator ternary. Tentu saja menjadi sulit untuk membaca seperti itu, tetapi sepenuhnya dalam semangat situs ini untuk menulis kode yang jelek jika lebih pendek. :)
Reto Koradi
Terima kasih @RetoKoradi, saya menguranginya dari 279 menjadi 214 dengan menerapkan saran Anda :) Saya pikir saya perlu meningkatkan algoritma saya untuk mendapatkan perbaikan lebih lanjut.
paulvs
Ya, setelah Anda melampaui mekanika, kuncinya adalah menemukan aturan yang menyederhanakan logika sebanyak mungkin. Jika Anda melihat solusi saya, yang secara fundamental sangat mirip, saya menemukan bahwa logika disederhanakan sedikit dengan menempatkan asal koordinat horizontal di tengah segitiga. Dengan begitu, saya bisa memanfaatkan simetri. Dan yang lain mungkin menemukan pendekatan yang lebih baik. Sangat menarik seberapa banyak yang dapat dilakukan pada masalah yang tampak begitu sederhana.
Reto Koradi
1

JavaScript ( ES6 ) 165 180 204

Jalankan cuplikan di Firefox untuk menguji. Jika mengembalikan string tidak cukup, menggunakan waspada untuk output adalah 2 karakter lebih

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

edc65
sumber