ASCII-Dreieck-Welligkeit

12

Ok, meine erste Golffrage. Bitte sei sanft :) Ich weiß, dass es viel zu viele ASCII-Rätsel gibt: P, aber los geht's.

Die Aufgabe ist einfach: Verwenden Sie Ihre bevorzugte Programmiersprache, um eine Dreieckswellung zu drucken. Die Eingabe sollte die Größe der Welligkeit haben.

Jedes Dreieck ist gleichmäßig verteilt. Grundsätzlich fügen Sie die Dreiecke so lange hinzu, bis nicht mehr genügend Platz für das kleinste Dreieck vorhanden ist.

Sie dürfen überall Leerzeichen verwenden, solange die Wellen die gleichen sind wie im Beispiel mit der richtigen Größe.

Beispiel

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

Wie immer gewinnt der kürzeste Code :)

WooiKent Lee
quelle
2
Obwohl es kein genaues Duplikat von Draw Concentric ASCII Hexagons ist , bin ich mir nicht sicher, ob es das andere übertrifft .
Geobits
4
@ Geobits IMO es ist anders genug - die Eingabe-Spezifikation ist ganz anders, die Methode, um herauszufinden, wie viele Formen zu zeichnen ist anders, und Dreiecke! = Sechsecke ;-)
Digital Trauma
@WooiKent Ich bezweifle jetzt, ob ich die Frage richtig verstanden habe. Was ist eine Welligkeit? Ist es eine konzentrische Gruppe von Dreiecken oder etwas anderes?
Digital Trauma
2
schöne frage, aber es ist unterbestimmt. (1) Wenn Sie den Text wörtlich lesen, sollten Sie bei einer Eingabe von 1,2 oder 3 immer drei Dreiecke ausgeben . (2) Ich würde davon ausgehen, dass jeder Satz von Dreiecken konzentrisch sein sollte, und (3) es scheint, dass auch ihre unteren Ecken auf derselben Linie liegen sollten. (4) Muss der horizontale Abstand genau ein Leerzeichen betragen, oder sind andere Abstände zulässig? (5) Ist unnötiges Leerzeichen links, rechts, oben, unten (a, b, c, d) erlaubt?
Level River St
Ich denke, es ist ziemlich klar, wenn auch nicht explizit. Sie zeichnen immer ein Dreieck der angegebenen Größe mit verschachtelten Dreiecken der Größe n-3, n-6, n-9 usw.
Sparr

Antworten:

5

Pyth, 31 Bytes

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

Demonstration.

Erläuterung:

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

GNU sed -nr, 210

Ein Anfang:

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

Die Eingabe ist gemäß dieser Meta-Frage eine positive unäre Ganzzahl über STDIN .

Ausgabe:

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

____
\  /
 \/

______
\    /
 \  /
  \/

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

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

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

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

$ 
Digitales Trauma
quelle
5

C 165 Bytes

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

Vor den Golfschritten, die die Lesbarkeit zerstören:

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

Dies durchläuft alle Zeichen im Rechteck, das die Figur enthält, und wertet die Liniengleichungen aus, die die Innenseite des Dreiecks von der Außenseite trennen, sowie diejenigen, die die verschiedenen Teile des Dreiecks trennen.

Reto Koradi
quelle
Gute Arbeit mit Mathe. Sie sollten dies versuchen: 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

Netzhaut , 182 Bytes

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

Nimmt Eingaben als unär.

Jede Zeile sollte in eine eigene Datei gehen und #in den Dateien in eine neue Zeile geändert werden. Dies ist unpraktisch, aber Sie können den Code so wie er ist als eine Datei mit dem -sFlag ausführen , wobei die #Markierungen erhalten bleiben. Sie können die #Zeilenumbrüche in der Ausgabe zur besseren Lesbarkeit ändern , wenn Sie dies wünschen. Z.B:

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

Der Code ist (noch) nicht besonders gut.

randomra
quelle
2

C - 206 Bytes

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

Beispielausgabe

Pauls-iMac:ppcg pvons$ for i in $(seq 1 7); do ./a.out $i; done
__
\/
____
\  /
 \/ 
______
\    /
 \  / 
  \/  
________
\  __  /
 \ \/ / 
  \  /  
   \/   
__________
\  ____  /
 \ \  / / 
  \ \/ /  
   \  /   
    \/    
____________
\  ______  /
 \ \    / / 
  \ \  / /  
   \ \/ /   
    \  /    
     \/     
______________
\  ________  /
 \ \  __  / / 
  \ \ \/ / /  
   \ \  / /   
    \ \/ /    
     \  /     
      \/      
paulvs
quelle
1
Sie können dies ziemlich viel kürzen. Unter Verwendung des alten Stils C können Sie Variablen ohne Typ deklarieren, wenn dies der Fall ist int. Wenn Sie sie im globalen Bereich deklarieren, werden sie automatisch auf 0 initialisiert. Anstatt putchar()mehrere Anrufe in verschiedenen Zweigen zu tätigen, können Sie einen einzigen Anruf verwenden und den anderen ersetzenif Anweisungen durch ternäre Operatoren . Natürlich wird es schwierig, so zu lesen, aber es liegt ganz im Sinne dieser Site, hässlichen Code zu schreiben, wenn er kürzer ist. :)
Reto Koradi
Danke @RetoKoradi, ich habe es von 279 auf 214 reduziert, indem ich Ihre Vorschläge umgesetzt habe :) Ich denke, ich muss meinen Algorithmus verbessern, um weitere Verbesserungen zu erzielen.
Paulvs
Ja, sobald Sie die Mechanik hinter sich gelassen haben, müssen Sie Regeln finden, die die Logik so weit wie möglich vereinfachen. Wenn Sie sich meine Lösung ansehen, die im Grunde genommen sehr ähnlich ist, stellte ich fest, dass die Logik einiges vereinfacht wurde, indem der Ursprung der horizontalen Koordinate in der Mitte des Dreiecks platziert wurde. Auf diese Weise könnte ich die Symmetrie ausnutzen. Und andere fanden wahrscheinlich noch bessere Ansätze. Es ist wirklich interessant, wie viel an einem Problem getan werden kann, das so täuschend einfach aussieht.
Reto Koradi
1

JavaScript ( ES6 ) 165 180 204

Führen Sie zum Testen das Snippet in Firefox aus. Wenn die Rückgabe der Zeichenfolge nicht ausreicht, werden bei Verwendung von alert 2 Zeichen mehr ausgegeben.

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