Triangoli molto semplici


47

Scrivi un programma o una funzione che accetta un numero intero positivo (tramite stdin, riga di comando o arg funzione) e stampa o restituisce una stringa di molti di questi piccoli triangoli affiancati, alternando il modo in cui puntano:

 /\
/__\

Questo unico triangolo è l'output se l'input è 1.

Se l'ingresso è 2, l'uscita è

  ____
 /\  /
/__\/

Se l'ingresso è 3, l'uscita è

  ____
 /\  /\
/__\/__\

Se l'ingresso è 4, l'uscita è

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

E così via. Il programma deve supportare input fino a 2 16 - 1 = 65535.

Dettagli

  • Il triangolo più a sinistra punta sempre verso l'alto.
  • Potrebbero esserci spazi finali ma potrebbero non esserci spazi iniziali non necessari.
  • Potrebbe esserci una nuova riga finale opzionale.
  • Si noti che per 1l'output è lungo due righe ma per il resto sono tre. Questo è richiesto
  • Vince l' invio più breve in byte .

Risposte:


32

Pyth, 44 42

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

La prima linea:

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.

Le altre due linee sono generate notando che la seconda riga è composta " /"e "\ "alternando input + 1 volte, e la terza riga è composta "/"e "__\"alternata nello stesso modo.


158
eliminato 44 è ancora normale 44 :(
Ottimizzatore

4
42 . Ovviamente!
mbomb007,

48
@Optimizer: Trovo infinitamente divertente che la tua tristezza per l'apparenza di 44 abbia ricevuto più voti della domanda o di questa risposta.
Alex A.

6
Ho appena ricevuto 10 risposte in profondità nella catena 44 barrata
Leo,

3
@AlexA. Trovo infinitamente divertente che il tuo divertimento per la tristezza di Optimizer sull'aspetto di 44 abbia ricevuto più voti della domanda o di questa risposta.
isaacg,

24

SQL, 182 175 173 187 byte

Non che questo sarà mai il più breve, ma è comunque divertente provare a minimizzare sql;) lol L'ho fatto in Oracle 11, tuttavia, questi dovrebbero essere SQL di base. [modifica] come sottolineato, non ho applicato la regola input = 1 - mostra solo 2 righe. non riesco a pensare a un modo migliore per farlo, tuttavia, ho salvato un paio di byte modificando la logica v;) l'aggiunta di 2 in anticipo salva un paio di byte non dovendo ripeterlo in seguito [/ modifica]

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] ha rimosso alcuni spazi non necessari [/ edit1] [edit2] ha cambiato &&i in solo & i. Riduce 2 caratteri, ma costringe l'utente a inserire il numero di triangoli due volte ...: PI ha realizzato che le mie "buone abitudini di codifica" usando && costavano 2 byte !! L'orrore!! [/ EDIT2]

Spiegazione (nota: io uso && 1 in questa spiegazione, quindi viene richiesto solo una volta, il punto & 1 sopra salva lo spazio del codice, ma richiede più volte;))

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

Produzione

  SQL> accept i
  1
  SQL> /

   /\
  /__\


  SQL> accept i
  2
  SQL> /

    ____
   /\  /
  /__\/


  SQL> accept i
  3
  SQL> /

    ____
   /\  /\
  /__\/__\


  SQL> accept i
  12
  SQL> /

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


  SQL>

1
Funzionerebbe per rimuovere lo spazio dopo from? Se è così, questo ti farà risparmiare un byte.
Alex A.

oh buon dio .. è pazzesco. ho appena provato .. e poi "sono andato in città" mettendo a nudo quali spazi avrei potuto ... Oo Questo succhiatore è illeggibile ora .. ma funziona ancora;) lol (Non posso credere che gli alias funzionino ancora così .. Oo hehe )
Idem

Sono talmente confuso dai voti! Oo Non è da nessuna parte vicino alla dimensione più piccola .. ancora .. voti! Eeeek !!!
Idem

2
Le votazioni in genere indicano che alle persone piace il tuo invio perché è creativo, il linguaggio utilizzato è insolito o qualsiasi numero di motivi. Nella mia esperienza non è raro che la risposta più breve al golf sia anche la più votata. Quindi, sebbene questa potrebbe non essere la risposta più breve, la comunità l'ha considerata buona. :)
Alex A.

@Alex .. cool, sugo :) (dovrò provare questo in Excel il prossimo ... lol)
Idem

11

Python 2, 89 88 87 85 83 con nome / 81 senza nome

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

(Grazie a @orlp per un byte e @xnor per altri tre)

Questa è una funzione che accetta un int ne restituisce i triangoli come stringa usando l'approccio riga per riga.

es. print f(10)

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

Per la prima riga, invece di (n>1)*usare 1%n*, poiché 1%nè 0 se n == 1e 1 se n > 1.


1
Puoi radere un personaggio, trasformandolo " /\\ "in " /\ ".
orlp

Questo lambda non funziona anche in Python 3?
mbomb007,

2
@ mbomb007 C'è una divisione di piano lì
dentro

@orlp Consentitemi ora, di aggiungere ulteriore confusione, ma eliminando il mio commento;)
FryAmTheEggman

Sono diffidente nei "\n".join()confronti di 3 elementi, anche se l'elenco viene utilizzato per rimuovere in modo condizionale il primo elemento. Forse qualcosa di simile b*(x+"\n")+y+"\n"+zè più breve?
xnor

7

JavaScript (ES6), 101 109

Troppo a lungo

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

Spiegazione

Utilizzo della freccia grassa per la definizione della funzione. Inoltre nessun {}blocco: il corpo della funzione è una singola espressione che è il valore restituito. f=(a,b,c)=>exprè equivalente a

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

All'interno di una singola espressione non è possibile utilizzare istruzioni come ifo var, ma

  • i parametri con valori predefiniti possono essere utilizzati come variabili locali
  • le espressioni condizionali ?:funzionano bene invece diif else
  • puoi aggiungere più sottoespressioni usando l'operatore virgola o anche meglio come parametro inutilizzato alle funzioni. In questo caso l'assegnazione di wè il secondo parametro (non utilizzato) alla funzionez

Possiamo riscrivere la ffunzione come

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

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

Produzione

 /\   
/__\ 

  ____
 /\  /
/__\/

  ____
 /\  /\   
/__\/__\ 

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

  ________________
 /\  /\  /\  /\  /\   
/__\/__\/__\/__\/__\ 

Ben fatto! Ieri ho trascorso troppo tempo cercando di accorciarlo e nella migliore delle ipotesi sono riuscito a riprodurre la 109 in modi diversi. -8 è piuttosto il salto.
DocMax,

Freddo. Potresti pubblicare una spiegazione? Non capisco fino in fondo l'uso diw
BadHorsie,

Aggiunta la spiegazione di @BadHorse (davvero, questa volta)
edc65

Per interesse ho provato a farlo senza spazi finali e ne ho trovato 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 (deliberatamente non usando stringhe di template ecc. Per abbinare la tua risposta).
Neil

6

CJam, 55 53 51 byte

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

Ho provato a eseguire il porting della mia risposta Python e si è rivelato essere più breve rispetto agli altri CJam.

Permalink .


6

Haskell 155 153 139 131 byte

Ho trovato un approccio leggermente diverso che si è rivelato più breve del mio metodo originale. Il mio tentativo originale è conservato di seguito. Come in passato, i suggerimenti per il golf sono apprezzati.

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

Grazie a Nimi per i suggerimenti sul golf.


Tentativo precedente 197 179 byte

t n=putStr.unlines.dropWhile(all(==' ')).z(flip(++))(if odd n then["","\\","__\\"]else repeat"").z(++)["  "," /","/"].map(take(4*div n 2).cycle)$["____","\\  /","__\\/"]
z=zipWith

4
Alcuni consigli per giocare a golf: (mod n 2)==0è even no meglio usare odd ne scambiare thene elseparte. concat.take(div n 2).repeatè take(4*div n 2).cycleperché tutti gli elementi dell'elenco sono di lunghezza 4. Assegnare nomi brevi alle funzioni con nomi lunghi, ad es. z=zipWith- quindi utilizzare z. Puoi eliminare alcuni spazi ...repeat""else[....
nimi

@nimi Grazie per i tuoi suggerimenti! Usandoli, sono stato in grado di golf la mia soluzione originale a 179 byte. Riconsiderando il mio approccio, sono stato anche in grado di ridurre la mia soluzione a 155 byte.
Ankh-Morpork,

1
Suggerimenti, parte II: foldr z["","",""]è foldr1 z, perché l'elenco da piegare non è mai vuoto. Invece di all(==' ') te puoi usare ==" "(<- due spazi in mezzo), perché viene usato per rimuovere la riga vuota in caso di n = 1 e qui la prima riga è " ". La prima definizione di tpuò essere scritto in una sola riga: t n|odd....
nimi,

4

CJam, 73 68 63 62 60 byte

Questo ha sicuramente bisogno di golf ...

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

Provalo qui.

Spiegazione

"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 '__\'.";

4

Julia, 115 byte

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

Questo crea una funzione senza nome che accetta un numero intero e stampa i triangoli. Per chiamarlo, dagli un nome, ad es f=n->(...).

Ungolfed + spiegazione:

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

Esempio di output:

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

Sono piuttosto deluso dal fatto che sia così lungo. Sono sicuro che ci sono molte opportunità per giocare a golf, ma al momento non mi sono chiare. Fammi sapere se hai qualche suggerimento o se desideri ulteriori spiegazioni!


3

CJam, 68 62 60 byte

Per quanto posso vedere, questo è un approccio completamente diverso rispetto all'altra soluzione CJam. Questo può essere giocato molto a golf.

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

Provalo online qui


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

1
Bel lavoro! Nota che non è mai meglio usare un whileloop, piuttosto usare un forloop. In questo caso è possibile salvare 2 byte includendo la definizione di nell'inizializzazione del mciclo for e b=!bnell'ultima cosa come si chiama. Puoi anche risparmiare risparmiando sostituendo stringe boolcon var. Inoltre, non è necessario il "()" n>1clausole around , e nella s+=clausola è possibile utilizzare il non-corto circuito &piuttosto che in &&quanto non ci sono effetti collaterali o dereferenze per andare storto. Infine, 1>0è più breve di true;)
VisualMelon

3

C #, 257 183 byte

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

Modifica: grazie ai suggerimenti di @VisualMelon, salvato 74 byte.

So che è tutt'altro che la migliore lingua per giocare a golf, ma mi interessa soprattutto conoscere le varie sfumature di C #, piuttosto che vincere la competizione. Questa è fondamentalmente una porta di questa risposta Pyth.

Sto pensando che gli anelli for potrebbero essere ulteriormente giocati a golf, ma non sono sicuro di come, date le dichiarazioni terziarie incorporate al loro interno.

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

Mentre StringBuilders è veloce e adorabile, se vuoi un conteggio di byte basso, s+=è tuo amico. In effetti, sei per i loop può essere reso un po 'più compatto. La gioia / orrore degli operatori ++e --significa che puoi fare la maggior parte del lavoro nel controllo condizionale for(i=0;i++<=t;)(questo controlla se iè inferiore o uguale a t poi lo incrementa). Faresti bene a definire l' int iesterno del ciclo for, e riutilizzarlo, e poiché puoi garantire che inon sarà mai negativo, i%2==0puoi cambiarlo i%2<1. Con queste modifiche, si ottiene facilmente un punteggio inferiore a 200byte.
VisualMelon,

1
Inoltre, sospetto che tu l'abbia scritto in LINQPad o simili, perché l'accesso a di Enumerablesolito richiede una using System.Linqdirettiva, e penso che sia generalmente inteso che tali clausole siano incluse. Tuttavia , in questo caso l'unico LINQ può essere sostituito con il var s=" "+string.Join("____",new string[1+t/2])+n;quale non contiene LINQ, ed è più corto del codice corrente;) Unisce molte stringhe null con ciò a cui teniamo veramente, "____" (1 + t / 2 essendo perché abbiamo bisogno di un'altra stringa nulla per adattarci ad un altro "____" prima). La variabile nè dichiarata come "\ r \ n".
VisualMelon

Ottimi consigli! Dimenticavo che Enumerable avrebbe avuto bisogno di System.Linq, faccio a malapena attenzione in questi giorni. La punta del ciclo for è utile!
Trento,

Un po 'in ritardo, ma è possibile salvare 4 byte utilizzando Console.Writeinvece diConsole.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;}

Spiegazione

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

2

C # - 151 146 141 138

Ispirato dalla risposta di @ 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;
    }

1
Bello, non sono sicuro di come mi sia perso questo prima di commentare le altre risposte! Quel sovraccarico new Stringè nuovo per me! Sembra che tu abbia perso il tuo t=""dalla versione golf, anche se una cosa migliore da fare sarebbe inizializzare tcome "\ n". È possibile salvare un paio di byte aggiungendo a tcui si ribalta b, salvando il "{}" sul ciclo for: t+=(b=!b)?"/":"__\\".
VisualMelon,

1
@è possibile salvarne un altro paio se lo si definisce tprima se si aggiunge talla stringa anziché "\n";)
VisualMelon

1

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

L'unico vero trucco qui (e non è nemmeno buono) sta usando 3 accumulatori in modo da poter condensare la soluzione fino a 1 loop.

Il codice può essere eseguito qui: http://play.golang.org/p/urEO1kIjKv


usa semplicemente c += `__\` invece diif i<n{c+="_"}
MarcDefiant il

@MarcDefiant Aggiornato, grazie
Kristoffer Sall-Storgaard il

1

> <> (Pesce) , 215 183 156 byte

Modifica: Notepad ++ mi stava dando 5 byte extra a causa di CR, quindi il conteggio modificato di conseguenza

Leggermente più golfato, ma finora è il mio primo programma di pesca> _ <Il requisito di non avere una prima riga vuota per 1 triangolo ha raddoppiato la dimensione del programma.

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-

Può provare su http://fishlanguage.com/ (Int sullo stack iniziale per lunghezza)

Spiegazione:

       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

1
Interprete simpatica! L'hai fatto tu stesso?
Sp3000,

Neanche leggermente. : PI l'ha usato ampiamente per insegnarmi la lingua ... e per eseguire il debug. Ho appena visto la lingua fluttuare e ho pensato che fosse molto interessante (voglio anche provare Marmi).
Fongoid

1

perl 109 108 106

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

Penso che questo vada bene per il mio primo golf, ho usato la sezione di Vynce per la prima linea, con il resto del mio codice per superare il problema della nuova linea con 1 triangolo.

Ora per vedere se posso accorciarlo :)

Modifica : spazi bianchi

Modifica 2 : sostituito "\n"con$/

1:
 /\
/__\

4:
  ________
 /\  /\  /
/__\/__\/

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

Una versione non golfata:

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

L'output:

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

Lo stack trabocca se entro 65535(ma non se lo compili -O3!), Ma teoricamente dovrebbe funzionare ;-)

modifica: il programma ora soddisfa il requisito che dovrebbero essere emesse solo due righe se 1viene passato al programma modifica 2: utilizzare int*invece dichar*


Si potrebbe dichiarare maincome main(c,v)**v;se funziona.
FUZxxl

Mi chiedevo se potevi salvare qualcosa avendo co ncome variabile globale, quindi non devi passare quel parametro a r(). Non credo che la tua risposta sia conformeNote that for 1 the output is two lines long but otherwise it's three. This is required.
Level River St

@FUZxxl sfortunatamente non funziona :-(error: expected declaration specifiers before ‘*’ token main(c,v)**v;{
MarcDefiant

@steveverrill ha risolto il problema, ma avevo bisogno di allungare il codice. Impossibile trovare una soluzione con un globale no cche sia più breve.
MarcDefiant,

@MarcDefiant Sei stato in grado di passare un int**?
FUZxxl,

1

C ++ stdlib, 194 byte

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

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

1

Bash, 166 127 125 119 105 byte

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

In una funzione:

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

Con alcune presentazioni:

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

Può eseguire il rendering (se è installato Figlet ):

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

Salva 2 caratteri se input da variabile anziché $1: 103

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

Nel ciclo:

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

Renderà (circa) lo stesso:

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


 _ _ _ 
(_|_|_)

    _____       ____________________________________________________________
   |__ / |     /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  
    |_ \ |    /__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\
   |___/_|    
  _______       ________________________________________________________________
 |__ /_  )     /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /
  |_ \/ /     /__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/
 |___/___|    
  ________      ________________________________________________________________
 |__ /__ /     /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  
  |_ \|_ \    /__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\
 |___/___/    
 _____ _        ____________________________________________________________________
|__ / | |      /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /
 |_ \_  _|    /__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/
|___/ |_|     

1
Dovresti pubblicare una domanda su un codegolf di implementazione di figlet!
sergiol,

1

Carbone , 27 byte (non competitivo)

Non competitiva perché la lingua postdatizza la sfida.

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

Provalo online! Il collegamento è alla versione dettagliata del codice. Spiegazione:

FEN﹪鲫

Genera un elenco di bit di lunghezza alternati ne passaci sopra.

P×⁴_

Disegna ____senza muovere il cursore.

↗⊗¬ι↓

Sul primo e su ogni altro triangolo, disegna il /lato sinistro .

P↘²

Disegna il \lato senza spostare il cursore.

↘⊗ι↑

Sul secondo e su ogni altro triangolo, disegna \nuovamente il lato sinistro per spostare il cursore.

P↗⊗ι

Sul secondo e su ogni altro triangolo, disegna il /lato destro , senza spostare il cursore.


1
Le risposte non devono più essere contrassegnate come non concorrenti
Jo King

1

PowerShell , 116 95 byte

Grazie mille a Mazzy e ASCII-Only per aver salvato 21 byte

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

Provalo online!

Non consentire una riga vuota per n = 1 ha mangiato fino a 14 10 byte. Questa soluzione è piuttosto cerebrale ora molto più intelligente con una quantità minima di codice ripetuto. L'arrotondamento del banco è ancora il vero diavolo.


Una riga vuota non è consentita ???
ASCII il

@ Solo ASCII Leggere il quarto punto elenco dall'OP.
Veskah,


1
@ Interruzioni solo ASCII su x = 3 La sostituzione della stringa è il modo in cui eludere l'arrotondamento del
banco

1
@mazzy non puoi generare una prima riga, altrimenti sarebbe 102
solo ASCII il

0

C, 368 byte

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

È più se conti le #includeaffermazioni, ma è compilato su gcc, anche se con avvertimenti, senza di esse. So che non è di gran lunga la più breve, ma mi piace ancora che l'ho fatto in C.


La macro #define p(c)printf(c)è più corta della tua funzione. È possibile omettere i tipi restituiti nelle funzioni (per impostazione predefinita int). Puoi anche definire la funzione in uno C89stile come questo main(c,v)char**v;{}. Questo è l'abbreviazione diint main(int c, char** v){}
MarcDefiant,

0

Perl (semplice) 131 125 120

primo passaggio abbastanza semplice:

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

oh chi ha bisogno di esplicito int?

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

0

Prolog, 126 byte

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

Invocare come $3.

Più leggibile:

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

Esempio:

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

0

C #: 1 riga LINQ, 198 byte

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

0

Retina , 88 byte (non competitiva)

Non competitiva perché la lingua postdatizza la sfida.

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

Provalo online! Spiegazione:

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

Sostituisci l'input con una coppia di triangoli.

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

Moltiplica i triangoli per l'input originale.

%`(.+)\1$
$1

Dividi i triangoli per 2.

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

Rimuovere il mezzo triangolo rimasto.

G`\S

Rimuovere la prima riga se ora è vuota.


0

Perl 6 , 83 byte

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

Provalo online!

Blocco di codice anonimo che accetta un numero e restituisce una stringa.



0

05AB1E , 37 byte

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

Provalo online o verifica le prime 10 uscite .

Spiegazione:

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)

0

Java 11, 122 byte

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

Provalo online.

Spiegazione:

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.