ASCII Triangle Ripple

12

Ok, moje pierwsze pytanie w golfa. Proszę, bądź łagodny :) Wiem, że jest zbyt wiele zagadek ascii: P, ale proszę bardzo.

Zadanie jest proste, użyj ulubionego języka programowania, aby wydrukować tętnienie trójkąta. Dane wejściowe powinny mieć wielkość tętnienia.

Każdy trójkąt jest równomiernie rozmieszczony. Zasadniczo dodajesz trójkąty, dopóki nie będzie wystarczającej ilości miejsca dla najmniejszego trójkąta.

Dozwolone są białe miejsca w dowolnym miejscu, o ile zmarszczki są takie same jak w przykładzie o prawidłowym rozmiarze.

Przykład

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

Jak zwykle wygrywa najkrótszy kod :)

WooiKent Lee
źródło
2
Chociaż nie jest dokładnym duplikatem Sześciokąta Rysującego Koncentryczne ASCII , nie jestem pewien, czy dodaje wiele więcej.
Geobits
4
@Geobits IMO jest wystarczająco różny - specyfikacja wejściowa jest całkiem inna, metoda ustalania, ile kształtów ma być rysowanych, i trójkąty! = Sześciokąty ;-)
Digital Trauma
@WooiKent Teraz wątpię, czy poprawnie zrozumiałem pytanie. Co to jest zmarszczka? Czy to jeden koncentryczny zestaw trójkątów, czy coś innego?
Digital Trauma
2
fajne pytanie, ale jest nieokreślone. (1) Czytając tekst dosłownie, gdy dane wejściowe wynoszą 1,2 lub 3, zawsze powinniśmy wyprowadzać trzy trójkąty. (2) Przyjmuję za pewnik, że każdy zestaw trójkątów powinien być koncentryczny, i (3) wydaje się, że powinny również mieć dolne rogi na tej samej linii. (4) Czy separacja pozioma musi być dokładnie jedną przestrzenią, jak pokazano, czy też dozwolone są inne separacje? (5) Czy niepotrzebne białe znaki są dozwolone w (a, b, c, d) lewej, prawej, powyżej, poniżej?
Level River St
Myślę, że to raczej jasne, choć nie jednoznaczne. Zawsze rysujesz jeden trójkąt o danym rozmiarze, z zagnieżdżonymi trójkątami o rozmiarach n-3, n-6, n-9 itp.
Sparr

Odpowiedzi:

5

Pyth, 31 bajtów

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

Demonstracja.

Wyjaśnienie:

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
źródło
7

GNU sed -nr, 210

Początek:

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

Dane wejściowe są dodatnią liczbą całkowitą jednoargumentową za pośrednictwem STDIN, zgodnie z tym meta-pytaniem .

Wynik:

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

____
\  /
 \/

______
\    /
 \  /
  \/

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

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

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

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

$ 
Cyfrowa trauma
źródło
5

C, 165 bajtów

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

Przed etapami gry w golfa, które niszczą czytelność:

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

Zapętla to wszystkie znaki w prostokącie zawierającym figurę i ocenia równania liniowe oddzielające wnętrze trójkąta od zewnątrz, a także te, które oddzielają różne części trójkąta.

Reto Koradi
źródło
Dobra robota z matematyki. Powinieneś spróbować tego: 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

Siatkówka , 182 bajty

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

Traktuje dane wejściowe jako jednoargumentowe.

Każda linia powinna przejść do własnego pliku i #powinna zostać zmieniona na nową linię w plikach. Jest to niepraktyczne, ale możesz uruchomić kod w postaci jednego pliku z -sflagą, zachowując #znaczniki. Jeśli chcesz, możesz zmienić te #znaki wyjściowe na nowe wiersze w celu zwiększenia czytelności. Na przykład:

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

Kod nie jest jeszcze zbyt dobrze golfowany (jeszcze).

randomra
źródło
2

C - 206 bajtów

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

Przykładowe dane wyjściowe

Pauls-iMac:ppcg pvons$ for i in $(seq 1 7); do ./a.out $i; done
__
\/
____
\  /
 \/ 
______
\    /
 \  / 
  \/  
________
\  __  /
 \ \/ / 
  \  /  
   \/   
__________
\  ____  /
 \ \  / / 
  \ \/ /  
   \  /   
    \/    
____________
\  ______  /
 \ \    / / 
  \ \  / /  
   \ \/ /   
    \  /    
     \/     
______________
\  ________  /
 \ \  __  / / 
  \ \ \/ / /  
   \ \  / /   
    \ \/ /    
     \  /     
      \/      
paulvs
źródło
1
Możesz to trochę przyciąć. Korzystając ze starego stylu C, możesz deklarować zmienne bez typu, jeśli są int. Ponadto, jeśli zadeklarujesz je w zakresie globalnym, zostaną one automatycznie zainicjowane na 0. Zamiast posiadania wielu putchar()wywołań w różnych gałęziach, możesz użyć pojedynczego wywołania i zastąpić ifinstrukcje operatorami trójskładnikowymi. Oczywiście staje się to trudne do odczytania w ten sposób, ale w duchu tej witryny jest napisanie brzydkiego kodu, jeśli jest krótszy. :)
Reto Koradi,
Dzięki @RetoKoradi, zmniejszyłem go z 279 do 214 poprzez wdrożenie twoich sugestii :) Myślę, że muszę poprawić mój algorytm, aby uzyskać dalsze ulepszenia.
paulvs
Tak, gdy wyjdziesz poza mechanikę, kluczem jest znalezienie zasad, które w jak największym stopniu upraszczają logikę. Jeśli spojrzysz na moje rozwiązanie, które jest zasadniczo bardzo podobne, zauważyłem, że logika nieco się uprościła, umieszczając początek współrzędnej poziomej w środku trójkąta. W ten sposób mogłem skorzystać z symetrii. Inni prawdopodobnie znaleźli jeszcze lepsze podejścia. To naprawdę interesujące, ile można zrobić z problemem, który wygląda tak zwodniczo prosto.
Reto Koradi
1

JavaScript ( ES6 ) 165 180 204

Uruchom snippet w przeglądarce Firefox, aby przetestować. Jeśli zwracanie ciągu nie jest wystarczające, użycie alertu dla wyjścia to 2 znaki więcej.

// 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
źródło