Triangles très simples

47

Ecrivez un programme ou une fonction qui prend un entier positif (via stdin, une ligne de commande ou une fonction arg) et affiche ou renvoie une chaîne de ce grand nombre de ces petits triangles en mosaïque, en alternant leur direction:

 /\
/__\

Ce seul triangle est la sortie si l'entrée est 1.

Si l'entrée est 2, la sortie est

  ____
 /\  /
/__\/

Si l'entrée est 3, la sortie est

  ____
 /\  /\
/__\/__\

Si l'entrée est 4, la sortie est

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

Etc. Votre programme doit prendre en charge des entrées allant de 2 16 à 1 = 65535.

Détails

  • Le triangle le plus à gauche pointe toujours vers le haut.
  • Il peut y avoir des espaces de fuite mais il peut ne pas y avoir d’espaces de tête inutiles.
  • Il peut y avoir un retour à la ligne optionnel.
  • Notez que pour 1une sortie de deux lignes, sinon trois. Ceci est requis.
  • La soumission la plus courte en octets l' emporte.
Les passe-temps de Calvin
la source

Réponses:

32

Pyth, 44 42

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

La première ligne:

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.

Les deux autres lignes sont générées en remarquant que la seconde ligne est constituée de " /"et "\ "entrée alternatif + 1 fois, et la troisième ligne se compose de "/"et en "__\"alternance de la même façon.

isaacg
la source
158
barré 44 est toujours normal 44 :(
Optimizer
4
42 . Bien sûr!
mbomb007
48
@Optimizer: Je trouve sans cesse amusant que votre tristesse à propos de la comparution de 44 ait reçu plus de voix que la question ou cette réponse.
Alex A.
6
Je viens de recevoir 10 réponses au fond de la chaîne des 44 barrés
Leo
3
@Alexa. Je trouve extrêmement amusant que votre amusement face à la tristesse d’Optimizer lors de l’apparition de 44 ait reçu plus de votes que la question ou cette réponse.
isaacg
24

SQL, 182 175 173 187 octets

Non pas que ce soit jamais le plus court, mais il est toujours amusant d'essayer de minimiser sql;) lol Je l'ai fait dans Oracle 11, cependant, il devrait s'agir de SQL de base. [edit] comme indiqué, je n'ai pas appliqué la règle quand input = 1 - affichez seulement 2 lignes. Je ne peux pas penser à un meilleur moyen de le faire, cependant, j’ai économisé quelques octets en modifiant la logique v;) ajouter 2 à l’avance permet d’économiser quelques octets en évitant de le répéter plus tard [/ 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] a supprimé certains espaces inutiles [/ edit1] [edit2] a été modifié && i en juste & i. Il réduit 2 caractères, mais oblige l'utilisateur à saisir le nombre de triangles deux fois ...: PI a compris que mes "bonnes habitudes de codage" en utilisant && i coûtaient 2 octets !! L'horreur!! [/ edit2]

Explication (note: j'utilise && 1 dans cette explication, donc elle ne demande qu'une seule fois, le & 1 ci-dessus économise de l'espace de code, mais invite plusieurs fois;))

 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);

Sortie

  SQL> accept i
  1
  SQL> /

   /\
  /__\


  SQL> accept i
  2
  SQL> /

    ____
   /\  /
  /__\/


  SQL> accept i
  3
  SQL> /

    ____
   /\  /\
  /__\/__\


  SQL> accept i
  12
  SQL> /

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


  SQL>
Idem
la source
1
Cela fonctionnerait-il pour supprimer l'espace après from? Si c'est le cas, cela vous fera économiser un octet.
Alex A.
oh bon seigneur ... c'est dingue. juste essayé .. et ensuite "allé en ville" dépouillant quels espaces je pouvais ... Oo Cette ventouse est illisible maintenant .. mais ça marche toujours;) lol (je ne peux pas croire que les pseudonymes fonctionnent toujours comme ça .. Oo hehe )
Idem
Je suis tellement confus sur les votes positifs! Oo Il est loin d'être la plus petite taille .. encore .. upvotes! Oo wow.
Idem
2
Les upvotes indiquent généralement que les gens aiment votre soumission parce qu'elle est créative, que le langage utilisé est peu commun, ou pour un certain nombre de raisons. D'après mon expérience, il est rare que la réponse au code de golf la plus courte soit aussi la plus votée. Ainsi, bien que cette réponse ne soit peut-être pas la plus courte, la communauté l’a jugée bonne. :)
Alex A.
@Alex .. cool, sauce :) (je vais devoir essayer ceci dans Excel ensuite ... lol)
Idem
11

Python 2, 89 88 87 85 83 nommé / 81 non nommé

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

(Merci à @orlp pour un octet et à @xnor pour trois autres)

C'est une fonction qui prend un int net retourne les triangles sous forme de chaîne en utilisant une approche ligne par ligne.

par exemple print f(10)donne

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

Pour la première ligne, au lieu de (n>1)*nous utilisons 1%n*, puisque 1%nvaut 0 si n == 1et 1 si n > 1.

Sp3000
la source
1
Vous pouvez raser un personnage et le transformer " /\\ "en " /\ ".
Orlp
Ce lambda ne fonctionne-t-il pas également dans Python 3?
mbomb007
2
@ mbomb007 Il y a une division de plancher là
Sp3000
@orlp Permettez-moi maintenant d'ajouter un peu de confusion, mais en supprimant mon commentaire;)
FryAmTheEggman
Je me méfie des "\n".join()3 éléments, même si la liste est utilisée pour supprimer conditionnellement le premier élément. Peut-être que quelque chose comme b*(x+"\n")+y+"\n"+zest plus court?
xnor
7

JavaScript (ES6), 101 109

Bien trop long

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

Explication

Utilisation de la grosse flèche pour la définition de la fonction. De plus aucun {}bloc: le corps de la fonction est une expression unique qui est la valeur de retour. f=(a,b,c)=>exprest équivalent à

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

Dans une seule expression, vous ne pouvez pas utiliser d'instructions telles que ifou var, mais

  • les paramètres avec des valeurs par défaut peuvent être utilisés comme variables locales
  • expressions conditionnelles ?:fonctionnent bien au lieu deif else
  • vous pouvez ajouter plus de sous-expressions en utilisant l'opérateur virgule ou même mieux en tant que paramètre inutilisé pour les fonctions. Dans ce cas, l'affectation de west le deuxième paramètre (non utilisé) de la fonctionz

Nous pouvons réécrire la ffonction en tant que

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 dans la console Firefox / FireBug

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

Sortie

 /\   
/__\ 

  ____
 /\  /
/__\/

  ____
 /\  /\   
/__\/__\ 

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

  ________________
 /\  /\  /\  /\  /\   
/__\/__\/__\/__\/__\ 
edc65
la source
Bien fait! Hier, j'ai passé beaucoup trop de temps à chercher à le raccourcir et, au mieux, j'ai réussi à reproduire le 109 de différentes manières. -8 est tout à fait le saut.
DocMax
Cool. Pourriez-vous poster une explication? Je ne comprends pas bien l'utilisation dew
BadHorsie
Explication de @BadHorse ajoutée (vraiment, cette fois-ci)
edc65
Par intérêt, j'ai essayé de le faire sans espaces de fin et je suis arrivé 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)à 119 (délibérément, en n'utilisant pas de chaînes de modèle, etc. pour correspondre à votre réponse).
Neil
6

CJam, 55 53 51 octets

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

J'ai essayé de porter ma réponse en Python et elle s'est avérée être plus courte que les autres CJams.

Lien permanent .

Sp3000
la source
6

Haskell 155 153 139 131 octets

J'ai trouvé une approche légèrement différente qui s'est avérée être plus courte que ma méthode d'origine. Ma tentative initiale est conservée ci-dessous. Comme avant, les astuces de golf sont appréciées.

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

Merci à Nimi pour les conseils de golf.


Tentative précédente 197 179 octets

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
la source
4
Quelques astuces pour le golf: (mod n 2)==0est even nou mieux utiliser odd net échanger la thenet elsepartie. concat.take(div n 2).repeatEn take(4*div n 2).cycleeffet, tous les éléments de la liste ont une longueur de 4. Attribuez des noms abrégés à des fonctions portant des noms longs, par exemple z=zipWith, puis utilisez z. Vous pouvez supprimer quelques espaces ...repeat""else[....
nimi
@nimi Merci pour vos conseils! En les utilisant, j'ai pu reproduire ma solution originale à 179 octets. En reconsidérant mon approche, j'ai également pu réduire ma solution à 155 octets.
Ankh-Morpork
1
Astuces, partie II: foldr z["","",""]c'est foldr1 zparce que la liste à plier n'est jamais vide. Au lieu de all(==' ') vous pouvez utiliser ==" "(<- deux espaces entre-deux), car il est utilisé pour supprimer la ligne vide dans le cas de n = 1 et ici la première ligne est " ". La première définition tpeut être écrit en une seule ligne: t n|odd....
nimi
4

CJam, 73 68 63 62 60 octets

Cela a certainement besoin de jouer au golf ...

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

Testez-le ici.

Explication

"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
la source
4

Julia, 115 octets

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

Cela crée une fonction non nommée qui accepte un entier et imprime les triangles. Pour l'appeler, donnez-lui un nom, par exemple f=n->(...).

Ungolfed + explication:

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

Exemple de sortie:

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

Je suis assez déçu que ce soit si long. Je suis sûr qu'il y a de nombreuses opportunités de jouer au golf mais elles ne me sont pas claires pour le moment. Faites-moi savoir si vous avez des suggestions ou si vous souhaitez des explications supplémentaires!

Alex A.
la source
3

CJam, 68 62 60 octets

Autant que je sache, cette approche est complètement différente de celle de l'autre solution de CJam. Cela peut être beaucoup joué au golf.

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

Essayez-le en ligne ici

Optimiseur
la source
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
la source
1
Bon travail! Notez qu'il n'est jamais préférable d'utiliser une whileboucle, utilisez plutôt une forboucle. Dans ce cas, vous pouvez économiser 2 octets en incluant la définition de mdans l'initialisation de la boucle for et b=!bdans la dernière chose, peu importe le nom. Vous pouvez également faire des économies en remplaçant stringet boolavec var. Vous n'avez pas non plus besoin des n>1clauses "()" autour des clauses et s+=vous pouvez utiliser la clause sans court-circuit &plutôt que l' &&absence d'effets secondaires ou de déréférences pouvant aller mal. Enfin, 1>0est plus court que true;)
VisualMelon
3

C #, 257 183 octets

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

Edit: Merci aux conseils de @VisualMelon, enregistré 74 octets.

Je sais que le golf n’est pas la meilleure langue pour jouer au golf, mais je suis surtout intéressé à en apprendre davantage sur les diverses nuances de C #, plutôt que de remporter la compétition. Ceci est fondamentalement un port de cette réponse Pyth.

Je pense que les boucles for pourraient être jouées plus loin, mais je ne sais pas trop comment, étant donné les déclarations tertiaires qui y sont incorporées.

Exemple (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
la source
Bien que StringBuilders soit rapide et agréable, si vous voulez un nombre d'octets faible, s+=votre ami est-il? En effet, vos boucles peuvent être un peu plus compactes. La joie / horreur des opérateurs ++et --signifie que vous pouvez effectuer la plupart du travail dans le contrôle conditionnel for(i=0;i++<=t;)(ceci vérifie si iest inférieur ou égal à t puis l' incrémente). Vous feriez bien de définir l’ int iextérieur de la boucle for et de la réutiliser, et puisque vous pouvez garantir que icela ne sera jamais négatif, vous i%2==0pouvez l’échanger i%2<1. Avec ces changements, un score inférieur à 200 octets est facilement atteint.
VisualMelon
1
De plus, je suppose que vous avez écrit cela dans LINQPad ou similaire, car l'accès à Enumerablerequiert généralement une using System.Linqdirective, et je pense qu'il est généralement prévu que de telles clauses soient incluses. Cependant , dans ce cas, le seul LINQ pouvant être remplacé par un var s=" "+string.Join("____",new string[1+t/2])+n;non-LINQ, et est plus court que le code actuel;) Il joint beaucoup de chaînes nulles à ce qui nous importe vraiment, "____" (le 1 + t / 2 étant donné que nous avons besoin d’une autre chaîne nulle pour un autre "____" avant) La variable nest déclarée comme "\ r \ n".
VisualMelon
Bons conseils! J'ai oublié qu'Enumerable aurait besoin de System.Linq, je fais à peine attention ces jours-ci. Le bout de boucle est pratique!
Trent
Un peu en retard, mais vous pourriez économiser 4 octets en utilisant à la Console.Writeplace deConsole.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;}

Explication

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
la source
2

C # - 151 146 141 138

Inspiré par la réponse de @ 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
la source
1
Bien, je ne sais pas comment j'ai raté ça avant de commenter les autres réponses! Cette surcharge de new Stringest une nouvelle pour moi! Vous semblez avoir manqué votre t=""version golfée, bien que la meilleure chose à faire serait d’initialiser tcomme "\ n". Vous pouvez enregistrer deux octets en ajoutant à l' tendroit où vous feuilletez b, sauver la « {} » sur la boucle for: t+=(b=!b)?"/":"__\\".
VisualMelon
1
@tis, vous pouvez en sauvegarder deux autres si vous définissez tavant set ajoutez tà la chaîne plutôt que "\n";)
VisualMelon
1

Aller, 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)
}

Le seul véritable truc ici (et ce n’est même pas bon) consiste à utiliser 3 accumulateurs pour que je puisse condenser la solution en une boucle.

Le code peut être exécuté ici: http://play.golang.org/p/urEO1kIjKv

Kristoffer Sall-Storgaard
la source
utilisez simplement c += `__\` au lieu de laif i<n{c+="_"}
MarcDefiant
@MarcDefiant Mis à jour, merci
Kristoffer Sall-Storgaard
1

> <> (Poisson) , 215 183 156 octets

Edit: Notepad ++ me donnait 5 octets supplémentaires à cause de la CR, donc le compte modifié en conséquence

Un peu plus de golf, mais c'est mon premier programme de pêche jusqu'à présent> _ <L'obligation de ne pas avoir une première ligne vierge pour 1 triangle double la taille du programme.

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-

Peut tester à http://fishlanguage.com/ (Int sur la pile initiale pour la longueur)

Explication:

       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
Fongoïde
la source
1
Bon interprète! L'avez-vous fait vous-même?
Sp3000
Pas même un peu. : PI l'a utilisé abondamment pour apprendre moi-même la langue ... et pour déboguer. Je viens de voir la langue qui flottait et je pensais que c'était très intéressant (je veux aussi essayer des billes).
Fongoid
1

perl 109 108 106

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

Je pense que ça va pour mon premier golf. J'ai utilisé la section de Vynce pour la première ligne, avec le reste de mon code pour résoudre le problème de la nouvelle ligne avec 1 triangle.

Maintenant pour voir si je peux le raccourcir :)

Edit : espaces blancs

Edit 2 : remplacé "\n"par$/

1:
 /\
/__\

4:
  ________
 /\  /\  /
/__\/__\/
Caek
la source
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);}

Une version non-golfée:

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

Le résultat:

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

La pile déborde si j'entre 65535(mais pas si vous compilez avec -O3!), Mais théoriquement ça devrait marcher ;-)

edit: le programme satisfait maintenant à l'exigence voulant que seules deux lignes soient générées si elles 1sont transmises au programme edit 2: use int*au lieu dechar*

MarcDefiant
la source
Vous pouvez déclarer mainque main(c,v)**v;si cela fonctionne.
FUZxxl
Je me demandais si vous pouviez enregistrer quelque chose en ayant cou en ntant que variable globale, afin de ne pas avoir à passer ce paramètre à r(). Je ne pense pas que votre réponse soit conformeNote that for 1 the output is two lines long but otherwise it's three. This is required.
Level River St
@FUZxxl malheureusement cela ne fonctionne pas :-(error: expected declaration specifiers before ‘*’ token main(c,v)**v;{
MarcDefiant
@steveverrill a corrigé le problème, mais il me fallait allonger le code. Impossible de trouver une solution globale nou cplus courte non plus.
MarcDefiant
@MarcDefiant Avez-vous réussi à passer un int**?
FUZxxl
1

Stdlib C ++, 194 octets

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;}

Programme de test:

#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
la source
1

Bash, 166 127 125 119 105 octets

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

Dans une fonction:

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

Avec quelques présentations:

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

Peut rendre (si vous avez installé figlet ):

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

Sauvegarde 2 caractères si entrée de variable au lieu de $1: 103

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

Dans la boucle:

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

Rendra (environ) la même chose:

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


 _ _ _ 
(_|_|_)

    _____       ____________________________________________________________
   |__ / |     /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  
    |_ \ |    /__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\
   |___/_|    
  _______       ________________________________________________________________
 |__ /_  )     /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /
  |_ \/ /     /__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/
 |___/___|    
  ________      ________________________________________________________________
 |__ /__ /     /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  
  |_ \|_ \    /__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\
 |___/___/    
 _____ _        ____________________________________________________________________
|__ / | |      /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /
 |_ \_  _|    /__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/
|___/ |_|     
F. Hauri
la source
1
Vous devriez poser une question sur un codegolf de mise en oeuvre de figlet!
sergiol
1

Fusain , 27 octets (sans compétition)

Non compétitif car le langage postdate le défi.

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

Essayez-le en ligne! Le lien est vers la version verbeuse du code. Explication:

FEN﹪鲫

Générez une liste de bits alternés de longueur net passez-les en boucle.

P×⁴_

Dessiner ____sans déplacer le curseur.

↗⊗¬ι↓

Sur le premier triangle et sur tous les autres, tracez le /côté gauche .

P↘²

Dessinez le \côté sans déplacer le curseur.

↘⊗ι↑

Sur le deuxième triangle et sur tous les autres, tracez \à nouveau le côté gauche pour déplacer le curseur.

P↗⊗ι

Sur le deuxième triangle et sur tous les autres, tracez le /côté droit sans déplacer le curseur.

Neil
la source
1
Les réponses ne doivent plus être considérées comme non concurrentes
Jo King
1

PowerShell , 116 95 octets

Un grand merci à Mazzy et ASCII-Only pour avoir économisé 21 octets

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

Essayez-le en ligne!

Ne pas permettre une ligne vide pour n = 1 mangé comme 14 10 octets. Cette solution est assez cérébrale, beaucoup plus intelligente maintenant avec un minimum de code répété. L'arrondi bancaire est toujours le diable.

Veska
la source
Une ligne vide n'est-elle pas autorisée ???
ASCII seulement
@ ASCII uniquement Lisez la 4ème puce du PO.
Veska
damnit
ASCII seulement
1
@ ASCII uniquement Pause sur x = 3 Le remplacement de chaîne est le moyen de contourner l'arrondi du banquier
Veskah
1
@mazzy vous ne pouvez pas générer de première ligne, sinon ce serait 102
ASCII seulement
0

C, 368 octets

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

C’est plus si vous comptez les #includedéclarations, mais elles sont compilées sur gcc, bien qu’avec des avertissements, sans elles. Je sais que ce n'est pas le plus court de loin, mais j'aime toujours le fait que je l'ai fait en C.

HeyLlama
la source
La macro #define p(c)printf(c)est plus courte que votre fonction. Vous pouvez omettre les types de retour sur les fonctions (leur valeur par défaut est int). Vous pouvez également définir une fonction dans un C89style comme celui-ci main(c,v)char**v;{}. C'est court pourint main(int c, char** v){}
MarcDefiant
0

Perl (simple) 131 125 120

premier passage assez simple:

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

oh qui a besoin d'int explicite?

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

Prolog, 126 octets

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].

Invoquer comme $3.

Plus lisible:

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]).

Exemple:

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

C #: 1 ligne LINQ, 198 octets

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
la source
0

Rétine , 88 octets (sans compétition)

Non compétitif car le langage postdate le défi.

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

Essayez-le en ligne! Explication:

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

Remplacez l'entrée par une paire de triangles.

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

Multipliez les triangles par l'entrée d'origine.

%`(.+)\1$
$1

Divisez les triangles par 2.

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

Supprimez le demi-triangle restant.

G`\S

Supprimez la première ligne si elle est maintenant vide.

Neil
la source
0

Perl 6 , 83 octets

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

Essayez-le en ligne!

Bloc de code anonyme qui prend un nombre et retourne une chaîne.

Jo King
la source
0

05AB1E , 37 octets

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

Essayez-le en ligne ou vérifiez les 10 premières sorties .

Explication:

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
la source
0

Java 11, 122 octets

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

Essayez-le en ligne.

Explication:

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
la source