Sehr einfache Dreiecke

47

Schreiben Sie ein Programm oder eine Funktion, die eine positive Ganzzahl (über stdin, Befehlszeile oder Funktionsargument) einliest und eine Zeichenfolge aus so vielen kleinen Dreiecken ausgibt oder zurückgibt, die nebeneinander angeordnet sind.

 /\
/__\

Dieses einzige Dreieck ist die Ausgabe, wenn die Eingabe ist 1.

Wenn der Eingang ist 2, ist der Ausgang

  ____
 /\  /
/__\/

Wenn der Eingang ist 3, ist der Ausgang

  ____
 /\  /\
/__\/__\

Wenn der Eingang ist 4, ist der Ausgang

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

Und so weiter. Ihr Programm muss Eingaben bis zu 2 16 - 1 = 65535 unterstützen.

Einzelheiten

  • Das linke Dreieck zeigt immer nach oben.
  • Möglicherweise sind nachgestellte Leerzeichen vorhanden, es dürfen jedoch keine unnötigen führenden Leerzeichen vorhanden sein.
  • Es kann eine optionale nachgestellte Newline geben.
  • Beachten Sie, dass 1die Ausgabe zwei Zeilen lang ist, ansonsten jedoch drei. Dies ist erforderlich.
  • Die kürzeste Übermittlung in Bytes gewinnt.
Calvins Hobbys
quelle

Antworten:

32

Pyth, 44 42

ItQpdd*\_*4/Q2)jbms<*dQhQ,c" /\ "2,\/"__\\

Die erste Zeile:

ItQpdd*\_*4/Q2)
ItQ           )    If the input is not 1
   pdd             Print two spaces
      *\_*4/Q2     Then groups of 4 underscores, repeated input/2 times.

Die anderen beiden Zeilen werden erzeugt, indem bemerkt wird, dass die zweite Zeile aus " /"und "\ "abwechselnder Eingabe + 1-mal besteht und die dritte Zeile aus "/"und "__\"abwechselnd auf die gleiche Weise besteht.

isaacg
quelle
158
44 durchgestrichen ist immer noch normal 44 :(
Optimizer
4
42 . Na sicher!
mbomb007
48
@Optimizer: Ich finde es unendlich amüsant, dass Ihre Traurigkeit über das Erscheinen von 44 mehr Stimmen erhalten hat als die Frage oder diese Antwort.
Alex A.
6
Gerade 10 Antworten tief in der durchgestrichenen 44-Kette
Leo
3
@AlexA. Ich finde es unendlich amüsant, dass Ihre Belustigung über Optimizers Traurigkeit über das Erscheinen von 44 mehr Stimmen erhalten hat als die Frage oder diese Antwort.
isaacg
24

SQL, 182 175 173 187 Bytes

Nicht, dass dies jemals die kürzeste sein wird, aber es ist immer noch amüsant, zu versuchen, sql zu minimieren;) lol Ich habe dies in Oracle 11 getan, dies sollte jedoch grundlegendes SQL sein. [edit] Wie bereits erwähnt, habe ich die Regel when input = 1 nicht angewendet - nur 2 Zeilen anzeigen. Ich kann mir keinen besseren Weg vorstellen, dies zu tun, aber ich habe ein paar Bytes durch Modifizieren der v-Logik gespart;) Das Hinzufügen von 2 im Voraus spart ein paar Bytes, da ich es später nicht wiederholen muss [/ edit]

select decode(&i,1,'',rpad('  ',v,'____')||z)||rpad(' /',v,'\  /')||decode(y,1,'\')||z||rpad('/',v-1,'__\/')||decode(y,1,'__\')from(select 2+floor(&i/2)*4v,mod(&i,2)y,chr(10)z from dual);

[edit1] entfernt einige unnötige Leerzeichen [/ edit1] [edit2] geändert && i zu nur & i. Es reduziert 2 Zeichen, zwingt den Benutzer jedoch, die Anzahl der Dreiecke zweimal einzugeben ...: PI erkannte, dass meine "guten Codierungsgewohnheiten" mit && 2 Byte kosteten !! Der Horror!! [/ edit2]

Erläuterung (Hinweis: Ich verwende && 1 in dieser Erklärung, sodass nur eine Eingabeaufforderung angezeigt wird. Die obige & 1 spart Code-Platz, fordert jedoch mehrere Eingabeaufforderungen auf;))

 select  -- line 1
     decode(&&1,1,'',   -- don't need line 1 if input is 1
     rpad('  ',v,'____') || z ) || -- every pair of triangles
     -- line 2
     rpad(' /',v,'\  /') ||  -- every pair of triangles
          decode(y,1,'\') || z || -- add the final triangle, input: 1,3,5 etc.
     -- line 3
     rpad('/',v-1,'__\/') ||  -- every pair of triangles
          decode(y,1,'__\')   -- add the final triangle, input: 1,3,5 etc.
from (select 2+floor(&&i/2)*4 v,   -- common multiplier. 4 extra chars for every triangle pair
             mod(&&i,2) y,  -- Flag for the final triangle (odd inputs, 1,3,5, etc)
             chr(10) z  -- CR, here to save space.
        from dual);

Ausgabe

  SQL> accept i
  1
  SQL> /

   /\
  /__\


  SQL> accept i
  2
  SQL> /

    ____
   /\  /
  /__\/


  SQL> accept i
  3
  SQL> /

    ____
   /\  /\
  /__\/__\


  SQL> accept i
  12
  SQL> /

    ________________________
   /\  /\  /\  /\  /\  /\  /
  /__\/__\/__\/__\/__\/__\/


  SQL>
Dito
quelle
1
Würde es funktionieren, den Raum danach zu entfernen from? Wenn ja, sparen Sie ein Byte.
Alex A.
Oh mein Gott ... das ist verrückt. habe es gerade ausprobiert .. und bin dann "in die Stadt gegangen", um mir die Lücken zu entledigen ... Oo Dieser Trottel ist jetzt unlesbar .. aber es funktioniert immer noch;) lol (Ich kann NICHT glauben, dass die Aliase immer noch so funktionieren .. Oo hehe )
Ditto
Ich bin sooo verwirrt über die Upvotes! Oo, es ist bei weitem nicht die kleinste Größe. Oo wow.
Gleiche gilt für den
2
Upvotes bedeuten in der Regel, dass Personen Ihre Einsendung mögen, weil sie kreativ ist, eine ungewöhnliche Sprache verwendet wird oder aus einer Reihe von Gründen. Nach meiner Erfahrung ist es ungewöhnlich, dass die kürzeste Code-Golf-Antwort auch die höchste Bewertung erhält. Das ist vielleicht nicht die kürzeste Antwort, aber die Community hat sie für gut befunden. :)
Alex A.
@ Alex .. cool, Soße :) (ich werde das nächste in Excel versuchen haben ... lol)
Ditto
11

Python 2, 89 88 87 85 83 benannt / 81 unbenannt

f=lambda n:1%n*("  "+n/2*4*"_"+"\n")+(" /\ "*n)[:2+2*n]+"\n"+("/__\\"*n)[:n-~n+n%2]

(Danke an @orlp für ein Byte und @xnor für weitere drei)

Dies ist eine Funktion, die eine Ganzzahl aufnimmt nund die Dreiecke nach dem zeilenweisen Ansatz als Zeichenfolge zurückgibt.

zB print f(10)gibt

  ____________________
 /\  /\  /\  /\  /\  /
/__\/__\/__\/__\/__\/

Für die erste Zeile verwenden (n>1)*wir anstelle von 1%n*, da 1%nist 0 if n == 1und 1 if n > 1.

Sp3000
quelle
1
Sie können ein Zeichen abrasieren, Drehen " /\\ "in " /\ ".
Orlp
Funktioniert dieses Lambda nicht auch in Python 3?
mbomb007
2
@ mbomb007 Da ist eine
Bodendivision
@orlp Erlauben Sie mir jetzt, weitere Verwirrung hinzuzufügen, aber meinen Kommentar zu löschen;)
FryAmTheEggman
Ich bin misstrauisch gegenüber den "\n".join()for 3-Elementen, auch wenn die Liste zum bedingten Entfernen des ersten Elements verwendet wird. Vielleicht ist sowas b*(x+"\n")+y+"\n"+zkürzer?
Xnor
7

JavaScript (ES6), 101 109

Viel zu lang

f=(n,z=a=>a.repeat(n/2))=>(n>1?'  '+z('____')+'\n ':' ')+z('/\\  ',w=' /'[++n&1]+'\n')+w+z('/__\\')+w

Erläuterung

Fettpfeil zur Funktionsdefinition verwenden. Außerdem kein {}Block: Der Funktionskörper ist ein einzelner Ausdruck, der den Rückgabewert darstellt. f=(a,b,c)=>exprist äquivalent zu

function f(a,b,c)
{
  return expr;
}

Innerhalb eines einzelnen Ausdrucks können Sie keine Anweisungen wie ifoder var, aber verwenden

  • Parameter mit Standardwerten können als lokale Variablen verwendet werden
  • Bedingte Ausdrücke ?:funktionieren gut anstelle vonif else
  • Sie können weitere Unterausdrücke hinzufügen, indem Sie den Komma-Operator verwenden oder sogar Funktionen als nicht verwendeten Parameter hinzufügen. In diesem Fall ist die Zuweisung von wder Funktion der zweite (nicht verwendete) Parameterz

Wir können die fFunktion als umschreiben

f = function(n) {
  var z = function(a) { // use current value of n (that changes)
    return a.repeat(n/2);
  };
  var result;
  if (n > 1) {
    result = '  ' + z('____') + '\n '; // top row if more than 1 triangle
  else
    result = ' '; // else just the blank
  ++n; // increase n, so invert even/odd
  w = ' /'[n&1]+'\n'; //  blank if n is now even, else '/' if n is now odd
  // the next rows will end in "/\" or "\  /" based on n even/odd
  result +=  z('/\\  ') + w; // offset by the blank char added before
  result += z('/__\\') + w;
  return result;
}

Test in der Firefox / FireBug-Konsole

console.log(f(1),f(2),f(3),f(4),f(9))

Ausgabe

 /\   
/__\ 

  ____
 /\  /
/__\/

  ____
 /\  /\   
/__\/__\ 

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

  ________________
 /\  /\  /\  /\  /\   
/__\/__\/__\/__\/__\ 
edc65
quelle
Schön gemacht! Ich habe gestern viel zu lange nach einer Verkürzung gesucht und es allenfalls geschafft, die 109 auf unterschiedliche Weise zu reproduzieren. -8 ist schon der Sprung.
DocMax
Cool. Könnten Sie eine Erklärung abgeben? Ich verstehe die Verwendung vonw
BadHorsie 30.03.15
@ BadHorse Erklärung hinzugefügt (wirklich, diesmal)
edc65
Aus Interesse habe ich versucht, es ohne Leerzeichen zu tun, und bin n=>(n>1?' '+'____'.repeat(n/2)+'\n':'')+' /\\ '.repeat(n).slice(0,n*2+2-n%2)+'\n'+'/__\\'.repeat(n).slice(0,n*2+1+n%2)auf 119 gekommen (absichtlich ohne Template-Strings usw., um Ihrer Antwort zu entsprechen).
Neil,
6

CJam, 55 53 51 Bytes

SSri:I2/4*'_*N]I1>*" /\ "I*I)2*<N"/__\\"I*I2*)I2%+<

Ich habe versucht, meine Python-Antwort zu portieren, und es stellte sich heraus, dass sie kürzer war als die anderen CJams.

Permalink .

Sp3000
quelle
6

Haskell 155 153 139 131 Bytes

Ich fand einen etwas anderen Ansatz, der sich als kürzer als meine ursprüngliche Methode herausstellte. Mein ursprünglicher Versuch ist unten erhalten. Golftipps sind nach wie vor willkommen.

m n=unlines.dropWhile(=="  ").z["  "," /","/"].foldr1 z$map t[1..n]
t n|odd n=["","\\","__\\"]
t _=["____","  /","/"]
z=zipWith(++)

Danke an Nimi für die Golftipps.


Vorheriger Versuch 197 179 Bytes

t n=putStr.unlines.dropWhile(all(==' ')).z(flip(++))(if odd n then["","\\","__\\"]else repeat"").z(++)["  "," /","/"].map(take(4*div n 2).cycle)$["____","\\  /","__\\/"]
z=zipWith
Ankh-Morpork
quelle
4
Einige Hinweise für den Golfsport: (mod n 2)==0ist even noder eine bessere Nutzung odd nund die tauschen thenund elseTeil. Dies concat.take(div n 2).repeatliegt take(4*div n 2).cycledaran, dass alle Listenelemente die Länge 4 haben. Weisen Sie Funktionen mit langen Namen Kurznamen zu, z . B. z=zipWith- und verwenden Sie dann z. Sie können ein paar Räume rausschmeißen ...repeat""else[....
Nimi
@nimi Danke für deine Hinweise! Mit ihnen konnte ich meine ursprüngliche Lösung auf 179 Bytes erweitern. Durch erneutes Überdenken meines Ansatzes konnte ich meine Lösung auch auf 155 Bytes reduzieren.
Ankh-Morpork
1
Hinweise, Teil II: foldr z["","",""]ist foldr1 z, weil die zu faltende Liste niemals leer ist. Anstelle von können all(==' ') Sie ==" "(<- zwei Leerzeichen dazwischen) verwenden, da bei n = 1 die leere Zeile entfernt wird und hier die erste Zeile ist " ". Die erste Definition tkann in einer einzigen Zeile geschrieben werden: t n|odd....
Nimi
4

CJam, 73 68 63 62 60 Bytes

Das braucht auf jeden Fall etwas Golf ...

S2*l~:I2/'_4**N]I(g*S"\\  /"'\{I2md@*@@*'/\@}:F~N"__\\/"_W<F

Teste es hier.

Erläuterung

"Print the first line:";
S2*l~:I2/'_4**N]I(g*

S2*                  "Push a string with 2 spaces.";
   l~:I              "Read and eval the input, store it in I.";
       2/            "Divide by two to get the number of top segments.";
         '_4**       "Push '____' and repeat it by the number of segments.";
              N]     "Push a newline and wrap everything in an array.";
                I(g* "Get sign(I-1) and repeat the array that often. This is a no-op
                      for I > 1 but otherwise empties the array.";

"Print the other two lines. The basic idea is to define block which takes as arguments
 a repeatable 4-character string as well as another string which only gets printed for
 even I.";
S"\\  /"'\{I2md@*@@*'/\@}:F~N"__\\/"_W<F

S                                        "Push a space.";
 "\\__/"'\                               "Push the string '\__/' and the character \.";
          {             }:F~             "Store this block in F and evaluate it.";
           I2md                          "Get I/2 and I%2 using divmod.";
               @*                        "Pull up the second argument and repeat it I%2
                                          times. This turns it into an empty string for
                                          even I.";
                 @@                      "Pull up I/2 and the 4-character string.";
                   *                     "Repeat the string I/2 times.";
                    '/\@                 "Push a / and reorder the three line parts.";
                            N            "Push a newline.";
                             "__\\/"_W<F "Call F again, with '__\/' and '__\'.";
Martin Ender
quelle
4

Julia, 115 Bytes

n->(m=2;p=println;k=n%2>0?m+1:m;e=m<k?"":"/";t=" /\\ ";b="/__\\";if n>1 p("  "*"_"^4m)end;p(t^k*" "*e);p(b^k*e))

Dadurch wird eine unbenannte Funktion erstellt, die eine Ganzzahl akzeptiert und die Dreiecke druckt. Um es zu nennen, geben Sie ihm einen Namen, z f=n->(...).

Ungolfed + Erklärung:

function f(n)

    m = n ÷ 2                    # Number of upside down triangles
    p = println                  # Store println function to save space
    k = n % 2 > 0 ? m + 1 : m    # Number of right side up triangles
    e = m < k ? "" : "/"         # n even? End lines with a /

    # Top of the triangle
    t = " /\\ "

    # Bottom of the triangle
    b = "/__\\"

    # Print the bottoms of any upside down triangles
    # * performs string concatenation
    # ^ performs string repetition
    if n > 1
        println("  " * "_"^4m)
    end

    # Print the triangle tops (these have two trailing spaces
    # if the last triangle isn't upside down)
    println(t^k * " " * e)

    # Print the triangle bottoms
    println(b^k * e)
end

Beispielausgabe:

julia> for i = 1:10 f(i) end
 /\  
/__\
  ____
 /\  /
/__\/
  ____
 /\  /\  
/__\/__\
  ________
 /\  /\  /
/__\/__\/
  ________
 /\  /\  /\  
/__\/__\/__\
  ____________
 /\  /\  /\  /
/__\/__\/__\/
  ____________
 /\  /\  /\  /\  
/__\/__\/__\/__\
  ________________
 /\  /\  /\  /\  /
/__\/__\/__\/__\/
  ________________
 /\  /\  /\  /\  /\  
/__\/__\/__\/__\/__\
  ____________________
 /\  /\  /\  /\  /\  /
/__\/__\/__\/__\/__\/

Ich bin ziemlich verblüfft, dass das so lang ist. Ich bin mir sicher, dass es viele Möglichkeiten zum Golfen gibt, aber sie sind mir im Moment nicht klar. Lassen Sie mich wissen, wenn Sie Vorschläge haben oder weitere Erklärungen wünschen!

Alex A.
quelle
3

CJam, 68 62 60 Bytes

Soweit ich sehen kann, ist dies ein völlig anderer Ansatz als die andere CJam-Lösung. Dies kann viel Golf gespielt werden.

"/__\\ /\\"4/]ri:R(['/"  /"'_4*"__\\"'\L]3/R*<+zR1>SS+*\W%N*

Probieren Sie es hier online aus

Optimierer
quelle
3

C # 190

void f(int n){string s=(n>1)?"\n  ":"",t=" /",u = "/";bool b=true;int m=n;while(m-->0){s+=(n>1&&b&&m>0)?"____":"";t+=b?"\\":"  /";u+=b?"__\\":"/";b=!b;}Console.Write("{0}\n{1}\n{2}",s,t,u);}

Ungolfed

void f(int n)
{
string s = (n > 1) ? "\n  " : "", t = " /", u = "/";
bool b = true;
int m = n;
while(m-->0)
{
s += (n > 1 && b && m>0) ? "____" : "";
t += b ? "\\" : "  /";
u += b ? "__\\" : "/";
b = !b;
}
Console.Write("{0}\n{1}\n{2}",s,t,u);
}
Bacchusbeale
quelle
1
Gute Arbeit! Beachten Sie, dass es niemals besser ist, eine whileSchleife zu verwenden, sondern eine forSchleife. In diesem Fall können Sie 2 Bytes einsparen, indem Sie die Definition von min die for-Schleifeninitialisierung aufnehmen und b=!bals letztes, was auch immer es heißt. Sie können auch Einsparungen durch den Austausch stringund boolmit var. Sie brauchen auch nicht die "()" um n>1Klauseln, und in der s+=Klausel können Sie das Nicht-Kurzschließen verwenden, &anstatt &&dass es keine Nebenwirkungen oder Dereferenzen gibt, die schief gehen. Schließlich 1>0ist kürzer als true;)
VisualMelon
3

C #, 257 183 Bytes

void C(int t){int i;var n="\r\n";var s="  "+string.Join("____",new string[1+t/2])+n;for(i=0;i++<=t;)s+=i%2<1?"\\ ":" /";s+=n;for(i=0;i++<=t;)s+=i%2<1?"__\\":"/";Console.WriteLine(s);}

Bearbeiten: Dank der Tipps von @VisualMelon, 74 Bytes gespeichert.

Ich weiß, dass es nicht die beste Sprache ist, in der man Golf spielen kann, aber ich bin hauptsächlich daran interessiert, die verschiedenen Nuancen von C # kennenzulernen, anstatt den Wettbewerb zu gewinnen. Dies ist im Grunde ein Port dieser Pyth-Antwort.

Ich denke, die for-Loops könnten weiter golfen werden, aber ich bin mir angesichts der darin eingebetteten tertiären Aussagen nicht ganz sicher, wie.

Beispiel (1, 2, 3, 10):

 /\   
/__\  
  ____
 /\  /
/__\/
  ____
 /\  /\ 
/__\/__\
  ____________________
 /\  /\  /\  /\  /\  /
/__\/__\/__\/__\/__\/

Ungolfed:

void C2(int t)
{
    int i;
    var n="\r\n";
    var s="  "+string.Join("____",new string[1+t/2])+n;
    for(i=0;i++<=t;)
        s+=i%2<1?"\\ ":" /";
    s+=n;
    for(i=0;i++<=t;)
        s+=i%2<1?"__\\":"/";
    Console.WriteLine(s);
}
Trent
quelle
Während StringBuilder schnell und gut sind, s+=ist Ihr Freund , wenn Sie eine niedrige Byteanzahl möchten . In der Tat, Sie sind für Schleifen können ein bisschen kompakter gemacht werden. Die Freude / der Schrecken der ++und ---Operatoren bedeutet, dass Sie den größten Teil der Arbeit in der bedingten Prüfung erledigen können for(i=0;i++<=t;)(diese prüft, ob sie ikleiner oder gleich ist t und erhöht sie dann). Es empfiehlt sich, die int iäußere for-Schleife zu definieren und wiederzuverwenden, und da Sie garantieren können, dass isie niemals negativ ist, i%2==0kann sie gegen eine ausgetauscht werden i%2<1. Mit diesen Änderungen wird leicht eine Unter-200-Byte-Bewertung erreicht.
VisualMelon
1
Ich vermute auch, dass Sie dies in LINQPad oder ähnlichem geschrieben haben, da der Zugriff auf Enumerablenormalerweise eine using System.LinqDirektive erfordert , und ich denke, es ist allgemein beabsichtigt, dass solche Klauseln enthalten sind. In diesem Fall kann jedoch der einzige LINQ ersetzt werden, var s=" "+string.Join("____",new string[1+t/2])+n;der keinen LINQ enthält und kürzer als der aktuelle Code ist. Er verbindet viele Nullzeichenfolgen mit dem, was uns wirklich wichtig ist, "____" (1 + t / 2) weil wir einen anderen Null-String brauchen, um vorher auf ein anderes "____" zu passen). Die Variable nwird als "\ r \ n" deklariert.
VisualMelon
Tolle Tipps! Ich habe vergessen, dass Enumerable System.Linq benötigt. Der for Loop Tip ist praktisch!
Trent
Ein bisschen zu spät, aber Sie könnten 4 Bytes sparen, indem Sie Console.Writeanstelle vonConsole.WriteLine
Metoniem
2

Java, 185

String f(int n){int i;String s="";if(n>1){s="  ";for(i=0;i<n/2;i++)s+="____";s+='\n';}for(i=0;i<=n;)s+=i++%2<1?" /":"\\ ";s+='\n';for(i=0;i<=n;i++)s+=i%2<1?i<n?"/_":"/":"_\\";return s;}

Erläuterung

String f(int n) {
    int i;
    String s = "";
    if (n > 1) {
        s = "  ";
        for (i = 0; i < n / 2; i++) {
            s += "____";
        }
        s += '\n';
    }
    for (i = 0; i <= n; i++) {
        s += i % 2 < 1 ? " /" : "\\ ";
    }
    s += '\n';
    for (i = 0; i <= n; i++) {
        s += i % 2 < 1 ? i < n ? "/_" : "/" : "_\\";
    }
    return s;
}
Ypnypn
quelle
2

C # - 151 146 141 138

Inspiriert von der Antwort von @ bacchusbeale

string f(int n){string t="\n",s=n>1?"  "+new string('_',n/2*4)+t:"";for(var b=n<0;n-->=0;t+=b?"__\\":"/",b=!b)s+=b?"\\ ":" /";return s+t;}

Ungolfed

    string f(int n)
    {
        string t = "\n", s = n > 1 ? "  " + new string('_', n / 2 * 4) + t : "";
        for (var b = n < 0; n-- >= 0; t += b ? "__\\" : "/", b = !b)
            s += b ? "\\ " : " /";
        return s + t;
    }
tia
quelle
1
Schön, nicht sicher, wie ich das verpasst habe, bevor ich die anderen Antworten kommentierte! Diese Überladung von new Stringist eine neue für mich! Sie scheinen Ihre t=""von der Golf-Version vermisst zu haben , obwohl eine bessere Sache zu tun wäre, tals "\ n" zu initialisieren . Sie können durch Anhängen ein paar Bytes speichern , two Sie drehen b, das Speichern der „{}“ auf der for-Schleife: t+=(b=!b)?"/":"__\\".
VisualMelon
1
@tis Sie ein paar mehr sparen können , wenn Sie definieren tvor sund fügen Sie tauf den String statt "\n";)
VisualMelon
1

Gehen, 156 144

func f(n int){a,b,c:="  ","","";for i:=0;i<=n;i++{if i<n/2{a+="____"};if i%2<1{b+=" /";c+="/"}else{b+=`\ `;c+=`__\`}};print(a+"\n"+b+"\n"+c)}

Ungolfed:

func f(n int) {
    a, b, c := "  ", "", ""   // Initialize 3 accumulators
    for i := 0; i <= n; i++ { // For each required triangle
        if i < n/2 {          // Yay integer math
            a += "____"
        }
        if i%2 < 1 {          // Even, uneven, (are we drawing up or downslope?)
            b += " /"
            c += "/"
        } else {
            b += `\ `
            c += `__\`
        }
    }
    print(a + "\n" + b + "\n" + c)
}

Der einzige wirkliche Trick hier (und es ist nicht einmal ein guter Trick) ist die Verwendung von 3 Akkus, damit ich die Lösung auf 1 Schleife zusammenfassen kann.

Der Code kann hier ausgeführt werden: http://play.golang.org/p/urEO1kIjKv

Kristoffer Sall-Storgaard
quelle
einfach c += `__\` anstelle vonif i<n{c+="_"}
MarcDefiant 25.03.15
@MarcDefiant Aktualisiert, danke
Kristoffer Sall-Storgaard
1

> <> (Fisch) , 215 183 156 Bytes

Bearbeiten: Notepad ++ gab mir 5 zusätzliche Bytes aufgrund von CR, also entsprechend geändert zählen

Etwas mehr Golf, aber es ist mein erstes Fischprogramm.> _ <Die Anforderung, für 1 Dreieck keine leere erste Zeile zu haben, hat die Größe des Programms verdoppelt.

99+0{:}1=?.~~"  "oo:2,:1%-v
-1  oooo  "____"  v!?  )0:/!
" /"oa~~.?=1}:{24~/:oo
v!?)0:-1o"\"v!?)0:/!-1ooo"  /"
/v   ~o"/"oa/!
!\:0)?!;"\__"ooo1-:0)?!;"/"o1-

Kann unter http://fishlanguage.com/ getestet werden (Int auf dem ersten Stack für die Länge)

Erläuterung:

       Start with initial stack as input number
99+0   Push 18 and 0 to the top of the stack
{:}    Shift the stack to the left (wraps), copy the top value, and shift it back to the left (i.e. copy bottom of stack to the top)
1=     Check to see if the top of the stack is equal to 1, pushes 1 for true, 0 for false
?.     If top of stack is zero, skip the ., otherwise jumps to x,y coordinates on top of stack (18,0). This skips the next 8 instructions
~~     Pop the top 2 values from the stack (if they're not popped by the jump)
"  "   Push the string literal "  " onto the stack
oo     Pop the top two values of stack and output them as characters
:2,    Copy top value of stack, ad divide by 2
:1%-   Since ><> uses float division, and doesn't have >= notation, remove the decimal part (if exists)
v      Redirect pointer down
/      Redirect pointer left
:0)    Copy top of stack, and see if its greater than 0 (1 for true, 0 for false)
?!v    If top of stack is non-zero, then ! is executed, which skips the next instruction (redirect), otherwise, code is redirected
"____" Push the literal "____" to the stack
oooo   Pop the top four values of stack and output them as characters
1-     Decrement the top of the stack by 1
!/     Ignore the redirect action.
       When the loop gets to 0, it goes to next line, and gets redirected to the left.
~      Pops the top of the stack (0 counter)
42     Pushes 4 and 2 to the stack
{:}    As before, copies the bottom of the stack to the top
1=?.   Also as before, if the initial value is 1, jump to (2,4) (skipping next 4 instructions
~~     Pop 2 values from stack if these instructions haven't been skipped
ao     Push 10 onto the stack and output it as a character (LF)
"/ "oo Push the literal "/ " onto the stack and output it
://    Copies the top of the stack then redirects to the line below, which then redirects to the left
:0)    Copies top of the stack and compares if its greater than 0
?!v    If it is, redirect to next line
"\"o   Push "\" to stack, then output it as a character
1-     Decrement top value of stack
:0)?!v If loop is not greater than 0, redirect to next line
       Either mode of redirect will loop to the left, and (potentially) skip the far right redirect because of the !
ao     Push 10 to stack and output it as a character (LF)
"/"o~  Push "/" to stack, then output it as a character. Pop top value of stack (the 0 from previous loop)
v      Redirects to next line, which then redirects to the right
:0)?!; If the top of the stack is not greater than 0, terminate (;)
"\__"  Pushes "\__" to the stack
ooo    Outputs top 3 stack values as characters ("__\")
1-     Decrement top of stack by 1
:0)?!; If the top of the stack is not greater than 0, terminate (;)
"/"o   Push "/" to top of stack then output it as a character
1-     Decrement top of stack by 1
!\     Ignore the redirect
Fongoid
quelle
1
Netter Dolmetscher! Hast du das selbst gemacht?
Sp3000,
Nicht einmal geringfügig. : PI hat es ausgiebig benutzt, um mir die Sprache beizubringen ... und um Fehler zu beheben. Ich habe die Sprache gesehen und fand sie sehr interessant (ich möchte auch Marbles ausprobieren).
Fongoid
1

perl 109 108 106

$i=<>;$t=join$/,$i-1?"  "."_"x($i/2)x4:(),$m.=(" /")[$_&1]||"\\ ",$b.=("/")[$_&1]||"__\\"for 0..$i;print$t

Ich denke, das ist in Ordnung für mein erstes Golfspiel. Ich habe Vynces Abschnitt für die erste Zeile verwendet und den Rest meines Codes, um das Problem mit der neuen Zeile mit einem Dreieck zu überwinden.

Nun, um zu sehen, ob ich es kürzen kann :)

Edit : Leerzeichen

Edit 2 : ersetzt "\n"durch$/

1:
 /\
/__\

4:
  ________
 /\  /\  /
/__\/__\/
Caek
quelle
1

C89, 150

r(p,q,n)int*p,*q;{n?printf(p),r(q,p,n-1):puts(p);}main(c,v)int**v;{c=atoi(v[1]);if(c>1)printf("  "),r("","____",c-1);r(" /","\\ ",c);r("/","__\\",c);}

Eine ungolfed Version:

r(p, q, n) char *p, *q; {
    if(n > 0) {
        printf(p);
        r(q, p, n-1); /* swap p and q */
    } else {
        puts(p);
    }
}

main(c, v) char**v; {
    c = atoi(v[1]);
    if(c>1) {
        printf("  ");
        r("", "____", c - 1);
    }
    r(" /", "\\ ", c);
    r("/", "__\\", c);
}

Die Ausgabe:

$ seq 1 3 10 | xargs -n1 ./triangles
 /\
/__\
  ________
 /\  /\  /
/__\/__\/
  ____________
 /\  /\  /\  /\
/__\/__\/__\/__\
  ____________________
 /\  /\  /\  /\  /\  /
/__\/__\/__\/__\/__\/

Der Stack läuft über, wenn ich eintrete 65535(aber nicht, wenn du mit compilierst -O3!), Aber theoretisch sollte es funktionieren ;-)

edit: program erfüllt nun die Anforderung, dass nur zwei Zeilen ausgegeben werden sollen, wenn 1an das Programm edit 2 übergeben wird: use int*stattchar*

MarcDefiant
quelle
Sie könnten erklären, mainals main(c,v)**v;ob das funktioniert.
FUZxxl
Ich habe mich gefragt, ob Sie etwas mit coder nals globale Variable speichern können, damit Sie diesen Parameter nicht übergeben müssen r(). Ich glaube nicht, dass Ihre Antwort mitNote that for 1 the output is two lines long but otherwise it's three. This is required.
Level River St
@FUZxxl leider funktioniert dies nicht :-(error: expected declaration specifiers before ‘*’ token main(c,v)**v;{
MarcDefiant
@steveverrill reparierte es, aber ich musste den Code verlängern. Konnte keine Lösung mit einem globalen noder cdas ist auch kürzer.
MarcDefiant
@MarcDefiant Konnten Sie eine bestanden int**?
FUZxxl
1

C ++ stdlib, 194 Bytes

string f(int n){char* p[]={"____"," /\\ ","/__\\"};int x[]={(n-n%2)*2,n*2+2-n%2,n*2+1+n%2},i,j;string s=n>1?"  ":"";for (i=n>1?0:1;i<3;s+=++i<3?"\n":"")for (j=0;j<x[i];)s+=p[i][j++%4];return s;}

Testprogramm:

#include <string>
#include <iostream>

using namespace std;

string f(int n)
{
    char* p[]={"____"," /\\ ","/__\\"};
    int x[]={(n-n%2)*2,n*2+2-n%2,n*2+1+n%2},i,j;
    string s=n>1?"  ":"";
    for (i=n>1?0:1;i<3;s+=++i<3?"\n":"")
        for (j=0;j<x[i];)
            s+=p[i][j++%4];
    return s;
}

int main(int argc, char* argv[])
{
    cout << f(10);
    return 0;
}
Oleg
quelle
1

Bash, 166 127 125 119 105 Bytes

printf -v l %$[$1/2]s;(($1%2))&&r= j=$l\ ||r=/ j=$l;echo "  ${l// /____}
${j// / /\ } $r
${j// //__\\}"$r

In einer Funktion:

triangle() {
    printf -v l %$[$1/2]s;(($1%2))&&r= j=$l\ ||r=/ j=$l;echo "  ${l// /____}
${j// / /\ } $r
${j// //__\\}"$r
}

Mit einigen Präsentationen:

for i in {1..5} 10 31;do
    paste -d\  <(
        figlet -fsmall $i |
             sed 's/^/         /;s/^ *\(.\{10\}\)$/\1  /;$d'
    ) <(triangle $i)
  done

Darf rendern (wenn du figlet installiert hast ):

        _      
       / |    /\  
       | |   /__\
       |_|   
      ___      ____
     |_  )    /\  /
      / /    /__\/
     /___|   
      ____     ____
     |__ /    /\  /\  
      |_ \   /__\/__\
     |___/   
     _ _       ________
    | | |     /\  /\  /
    |_  _|   /__\/__\/
      |_|    
      ___      ________
     | __|    /\  /\  /\  
     |__ \   /__\/__\/__\
     |___/   
   _  __       ____________________
  / |/  \     /\  /\  /\  /\  /\  /
  | | () |   /__\/__\/__\/__\/__\/
  |_|\__/    
    _____      ____________________________________________________________
   |__ / |    /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  
    |_ \ |   /__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\
   |___/_|   

Speichern Sie 2 Zeichen, wenn Sie eine Eingabe von einer Variablen anstelle von $1103 vornehmen

printf -v l %$[i/2]s;((i%2))&&r= j=$l\ ||r=/ j=$l;echo "  ${l// /____}
${j// / /\ } $r
${j// //__\\}"$r

In die Schleife:

for i in {1..3} {31..34};do
    [ $i == 31 ] && figlet -fsmall ...
    paste -d\  <(
        figlet -fsmall $i |
            sed 's/^/         /;s/^ *\(.\{10\}\)$/\1   /;$d'
    ) <(
        printf -v l %$[i/2]s;((i%2))&&r= j=$l\ ||r=/ j=$l;echo "  ${l// /____}
${j// / /\ } $r
${j// //__\\}"$r
    )
  done

Wird (ungefähr) gleich rendern:

        _       
       / |     /\  
       | |    /__\
       |_|    
      ___       ____
     |_  )     /\  /
      / /     /__\/
     /___|    
      ____      ____
     |__ /     /\  /\  
      |_ \    /__\/__\
     |___/    


 _ _ _ 
(_|_|_)

    _____       ____________________________________________________________
   |__ / |     /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  
    |_ \ |    /__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\
   |___/_|    
  _______       ________________________________________________________________
 |__ /_  )     /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /
  |_ \/ /     /__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/
 |___/___|    
  ________      ________________________________________________________________
 |__ /__ /     /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  
  |_ \|_ \    /__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\
 |___/___/    
 _____ _        ____________________________________________________________________
|__ / | |      /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /
 |_ \_  _|    /__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/
|___/ |_|     
F. Hauri
quelle
1
Sie sollten eine Frage zu einem Figlet Implementation Codegolf stellen!
Sergiol
1

Kohle , 27 Bytes (nicht konkurrierend)

Nicht konkurrierend, weil die Sprache die Herausforderung datiert.

FEN﹪鲫P×⁴_↗⊗¬ι↓P↘²↘⊗ι↑P↗⊗ι

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:

FEN﹪鲫

Generieren Sie eine Liste abwechselnder Längenbits nund durchlaufen Sie diese.

P×⁴_

Zeichnen, ____ohne den Cursor zu bewegen.

↗⊗¬ι↓

Zeichnen Sie auf dem ersten und jedem zweiten Dreieck die linke /Seite.

P↘²

Zeichnen Sie die \Seite, ohne den Cursor zu bewegen.

↘⊗ι↑

Zeichnen Sie im zweiten und in jedem zweiten Dreieck \erneut die linke Seite, um den Cursor zu bewegen.

P↗⊗ι

Zeichnen Sie im zweiten und in jedem zweiten Dreieck die rechte /Seite, ohne den Cursor zu bewegen.

Neil
quelle
1
Antworten müssen nicht mehr als nicht mehr konkurrierend markiert werden
Jo King,
1

PowerShell , 116 95 Bytes

Ein großes Dankeschön an Mazzy und ASCII-Only für die Einsparung von 21 Bytes

param($n)@("  "+"_"*4*($x=$n-shr1))[$n-eq1]
" /"+"\  /"*$x+"\"*($a=$n%2)
"/"+"__\/"*$x+"__\"*$a

Probieren Sie es online!

Wenn für n = 1 keine leere Zeile zulässig ist, entspricht dies 14 10 Byte. Diese Lösung ist ziemlich hirntot jetzt viel schlauer mit einer minimalen Menge von wiederholtem Code. Banker's Rounding ist immer noch der eigentliche Teufel.

Veskah
quelle
Ist eine Leerzeile nicht erlaubt ???
Nur ASCII
@ Nur ASCII Lesen Sie den 4. Aufzählungspunkt aus dem OP.
Veskah
verdammt
ASCII
1
@ ASCII-only Breaks on x = 3 Beim Ersetzen der Zeichenfolge wird die Rundung des
Bankers
1
@mazzy du kannst keine erste Zeile generieren, sonst wäre es 102
ASCII
0

C, 368 Bytes

void p(char* c){printf(c);}
int x(int s,int f){int t=0,p=s;for(int i=0;i<f;i++){if(p==1){t++;p=0;}else{p=1;}}return t;}
int main(int argc,char* argv[]){int t=atoi(argv[1]);if(t>1){p("  ");for(int i=0;i<x(0,t);i++)
{p("____");}p("\n");}for(int i=0;i<x(1,t);i++){p(" /\\ ");}if(t%2==0){p(" /");}p("\n");
for(int i=0;i<x(1,t);i++){p("/__\\");}if(t%2==0){p("/");}p("\n");}

Es ist mehr, wenn Sie die #includeAussagen zählen, aber sie wurden auf gcc kompiliert, wenn auch mit Warnungen, ohne sie. Ich weiß, dass es bei weitem nicht die kürzeste ist, aber ich mag es immer noch, dass ich es in C gemacht habe.

HeyLlama
quelle
Das Makro #define p(c)printf(c)ist kürzer als Ihre Funktion. Sie können Rückgabetypen für Funktionen weglassen (standardmäßig int). Sie können die Funktion auch in diesem C89Stil definieren main(c,v)char**v;{}. Das ist die int main(int c, char** v){}
Abkürzung
0

Perl (einfach) 131 125 120

ziemlich einfacher erster Durchgang:

$i=<>;print join"\n",$i-1?"  "."_"x(4*int($i/2)):(),join("",map{(" /","\\ ")[$_%2]}0..$i),join"",map{("/","__\\")[$_%2]}0..$i

oh wer braucht explizite int?

$i=<>;print join"\n",$i-1?"  "."_"x($i/2)x4:(),join("",map{(" /","\\ ")[$_%2]}0..$i),join"",map{("/","__\\")[$_%2]}0..$i
Vynce
quelle
0

Prolog, 126 Bytes

A+B:-writef(A,B).
$N:-(N>1,"  %r\n"+['____',N//2];!),(0is N/\1,T='/';T='')," %r%w\n"+['/\\  ',N/2,T],"%r%w\n"+['/__\\',N/2,T].

Rufe wie auf $3.

Besser lesbar:

triangle(N):-
    (   N > 1
    ->  writef("  %r\n", ['____', N//2])
    ;   true
    ),
    (   0 is N mod 2
    ->  T = '/'
    ;   T = ''
    ),
    writef(" %r%w\n", ['/\\  ', N/2, T]),
    writef("%r%w\n", ['/__\\', N/2, T]).

Beispiel:

?- findall(N,between(1,10,N),NN), maplist($, NN), !.
 /\  
/__\
  ____
 /\  /
/__\/
  ____
 /\  /\  
/__\/__\
  ________
 /\  /\  /
/__\/__\/
  ________
 /\  /\  /\  
/__\/__\/__\
  ____________
 /\  /\  /\  /
/__\/__\/__\/
  ____________
 /\  /\  /\  /\  
/__\/__\/__\/__\
  ________________
 /\  /\  /\  /\  /
/__\/__\/__\/__\/
  ________________
 /\  /\  /\  /\  /\  
/__\/__\/__\/__\/__\
  ____________________
 /\  /\  /\  /\  /\  /
/__\/__\/__\/__\/__\/
NN = [1, 2, 3, 4, 5, 6, 7, 8, 9|...].
Kay
quelle
0

C #: 1 Zeile LINQ, 198 Bytes

string f(int n){return(n>1?"  ":"")+string.Join("\n",new[]{"____"," /\\ ","/__\\"}.Zip(new[]{(n-n%2)*2,n*2+2-n%2,n*2+1+n%2},(s,l)=>string.Join(s,new string[n+1]).Substring(0,l)).Where(x=>x.Any()));}
Oleg
quelle
0

Netzhaut , 88 Bytes (nicht konkurrierend)

Nicht konkurrierend, weil die Sprache die Herausforderung datiert.

K`  ____¶ /\  /¶/__\/
%`....$
$+*$&
%`(.+)\1$
$1
(  (____)*)__(¶.*)  /(¶.*)/
$1$3$4
G`\S

Probieren Sie es online! Erläuterung:

K`  ____¶ /\  /¶/__\/

Ersetzen Sie die Eingabe durch ein Paar Dreiecke.

%`....$
$+*$&

Multiplizieren Sie die Dreiecke mit der ursprünglichen Eingabe.

%`(.+)\1$
$1

Teilen Sie die Dreiecke durch 2.

(  (____)*)__(¶.*)  /(¶.*)/
$1$3$4

Entfernen Sie das übrig gebliebene halbe Dreieck.

G`\S

Entfernen Sie die erste Zeile, wenn sie jetzt leer ist.

Neil
quelle
0

Perl 6 , 83 Bytes

{~["  {'____'x$_/2-.5}
"x($_>2),'/\  'x$_/2~($!='/'x$_%2),"
"~'/__\\'x$_/2~$!]}o*+1

Probieren Sie es online!

Anonymer Codeblock, der eine Zahl annimmt und eine Zeichenfolge zurückgibt.

Scherzen
quelle
0

05AB1E , 37 Bytes

≠iðð'_I2÷4*×J}„ /„\ ‚I>∍J'/…__\‚I>∍J»

Probieren Sie es online aus oder überprüfen Sie die ersten 10 Ausgänge .

Erläuterung:

i            } # If the (implicit) input is NOT 1:
                #   i.e. 1 → 0 (falsey)
                #   i.e. 5 → 1 (truthy)
  ðð            #  Push two spaces "  "
    '_         '#  Push string "_"
      I         #  Push the input
       2÷       #  Integer-divide it by 2
                #   i.e. 5 → 2
         4*     #  And then multiply it by 4
                #   i.e. 2 → 8
           ×    #  Repeat the "_" that many times
                #   i.e. "_" and 8 → "________"
            J   #  Join everything on the stack together to a single string
                #   i.e. "  ________"
 /             # Push string " /"
   \           # Push string "\ "
               # Pair them together: [" /","\ "]
      I>        # Push the input+1
               # Extend the list to that size
                #  i.e. [" /","\ "] and 2 → [" /","\ "]
                #  i.e. [" /","\ "] and 6 → [" /","\ "," /","\ "," /","\ "]
         J      # Join the list together to a single string
                #  i.e. [" /","\ "] → " /\ "
                #  i.e. [" /","\ "," /","\ "," /","\ "] → " /\  /\  /\ "
'/             '# Push string "/"
  __\          # Push string "__\"
               # Pair them together: ["/","__\"]
       I>       # Push the input+1
               # Extend the list to that size
                #  i.e. ["/","__\"] and 2 → ["/","__\"]
                #  i.e. ["/","__\"] and 6 → ["/","__\","/","__\","/","__\"]
          J     # Join the list together to a single string
                #  i.e. ["/","__\"] → "/__\"
                #  i.e. ["/","__\","/","__\","/","__\"] → "/__\/__\/__\"
»               # Join the entire stack with a newline delimiter
                #  i.e. " /\ " and "/__\" → " /\ \n/__\"
                #  i.e. "  ________", " /\  /\  /\ " and "/__\/__\/__\"
                #   → "  ________\n /\  /\  /\ \n/__\/__\/__\"
                # (and output the result implicitly)
Kevin Cruijssen
quelle
0

Java 11, 122 Bytes

n->(n>1?"  "+"_".repeat(n/2*4)+"\n":"")+" /\\ ".repeat(n).substring(0,++n*2)+"\n"+"/__\\".repeat(n).substring(0,n/2*4+n%2)

Probieren Sie es online aus.

Erläuterung:

n->                   // Method with integer parameter and String return-type
  (n>1?               //  If the input is larger than 1:
    "  "              //   Return two spaces
    +"_".repeat(      //   Appended with "_" repeated the following amount of times:
          n/2         //    The input integer-divided by 2
             *4)      //    And then multiplied by 4
    +"\n"             //   Appended with a newline
   :                  //  Else:
    "")               //   Return nothing
  +" /\\ ".repeat(n)  //  Appended with " /\ " repeated the input amount of times
    .substring(0,     //   After which we only leave the first `x` characters, where `x` is:
      ++n             //    Increase the input by 1 first with `++n`
         *2)          //    And then multiply it by 2
                      //     i.e. For input 1, `x` becomes 4 here
                      //     i.e. For input 6, `x` becomes 14 here
  +"\n"               //  Appended with a newline
  +"/__\\".repeat(n)  //  Appended with "/__\" repeated the input amount of times
    .substring(0,     //   After which we only leave the first `y` characters, where `y` is:
      n/2             //    The input+1 integer-divided by 2
         *4           //    Then multiplied by 4
           +n%2)      //    And then the input+1 modulo-2 added
                      //     i.e. For input 1, `y` becomes 4 here
                      //     i.e. For input 6, `y` becomes 13 here
Kevin Cruijssen
quelle