Triângulos muito simples

47

Escreva um programa ou função que receba um número inteiro positivo (via stdin, linha de comando ou função arg) e imprima ou retorne uma sequência desses muitos pequenos triângulos lado a lado, alternando para onde apontam:

 /\
/__\

Este único triângulo é a saída se a entrada for 1.

Se a entrada for 2, a saída será

  ____
 /\  /
/__\/

Se a entrada for 3, a saída será

  ____
 /\  /\
/__\/__\

Se a entrada for 4, a saída será

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

E assim por diante. Seu programa deve suportar entradas de até 2 16 - 1 = 65535.

Detalhes

  • O triângulo mais à esquerda sempre aponta para cima.
  • Pode haver espaços à direita, mas pode não haver espaços à esquerda desnecessários.
  • Pode haver uma nova linha opcional à direita.
  • Observe que 1a saída tem duas linhas, mas, caso contrário, são três. Isso é necessário.
  • O menor envio em bytes vence.
Passatempos de Calvin
fonte

Respostas:

32

Pyth, 44 42

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

A primeira linha:

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.

As outras duas linhas são geradas observando que a segunda linha consiste em " /"e "\ "entrada alternada + 1 vezes, e a terceira linha consiste "/"e "__\"alterna da mesma maneira.

isaacg
fonte
158
riscado 44 ainda é normal 44 :(
Otimizador
4
42 . Claro!
mbomb007
48
@ Optimizer: Acho infinitamente divertido que sua tristeza pela aparência de 44 tenha recebido mais votos do que a pergunta ou esta resposta.
Alex A.
6
Só tenho 10 respostas profundas no riscado cadeia 44
Leo
3
@AlexA. Acho infinitamente divertido que seu divertimento com a tristeza do Optimizer pela aparência de 44 tenha recebido mais votos do que a pergunta ou esta resposta.
isaacg 11/01
24

SQL, 182 175 173 187 bytes

Não que isso nunca seja o mais curto, mas ainda assim é divertido tentar minimizar o sql;) lol, eu fiz isso no Oracle 11; no entanto, esses devem ser SQL básicos. [edit] como apontado, eu não apliquei a regra when input = 1 - apenas mostre 2 linhas. não consigo pensar em uma maneira melhor de fazê-lo, no entanto, salvei alguns bytes modificando a lógica v;) adicionar 2 antecipadamente economiza alguns bytes por não precisar repeti-lo mais tarde [/ 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] removeu alguns espaços desnecessários [/ edit1] [edit2] alterou && i para apenas & i. Ele reduz 2 caracteres, mas força o usuário a inserir o número de triângulos duas vezes ...: O PI percebeu meus "bons hábitos de codificação" usando & & i; estavam custando 2 bytes !! O horror!! [/ edit2]

Explicação (observação: eu uso && 1 nesta explicação, portanto, ele solicita apenas uma vez, o & 1 acima economiza espaço no código, mas solicita várias vezes;))

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

Resultado

  SQL> accept i
  1
  SQL> /

   /\
  /__\


  SQL> accept i
  2
  SQL> /

    ____
   /\  /
  /__\/


  SQL> accept i
  3
  SQL> /

    ____
   /\  /\
  /__\/__\


  SQL> accept i
  12
  SQL> /

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


  SQL>
Idem
fonte
1
Funcionaria para remover o espaço depois from? Nesse caso, você economizará um byte.
Alex A.
oh bom senhor .. isso é loucura. apenas tentei .. e então "fui para a cidade" retirando os espaços que eu podia ... Oo Esse otário está ilegível agora .. mas funciona ainda;) lol (não acredito que os apelidos ainda funcionam assim ... Oo hehe )
Idem
Estou tão confuso com os votos! Oo Não está nem perto do menor tamanho .. ainda .. upvotes! Oo uau.
Ditto
2
Os upvotes normalmente indicam que as pessoas gostam do seu envio porque é criativo, o idioma usado é incomum ou por vários motivos. Na minha experiência, é incomum que a resposta mais curta ao código de golfe também seja a mais votada. Portanto, embora essa não seja a resposta mais curta, a comunidade a considerou boa. :)
Alex A.
@Alex .. fresco, molho :) (eu vou ter que tentar isso no Excel próxima ... lol)
Ditto
11

Python 2, 89 88 87 85 83 nomeado / 81 sem nome

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

(Obrigado a @orlp por um byte e @xnor por mais três)

Esta é uma função que recebe um int ne retorna os triângulos como uma string usando a abordagem linha por linha.

por exemplo, print f(10)

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

Para a primeira linha, em vez de (n>1)*usar 1%n*, pois 1%né 0 se n == 1e 1 se n > 1.

Sp3000
fonte
1
Você pode raspar um personagem, transformando " /\\ "-o " /\ ".
orlp
Este lambda não funciona no Python 3 também?
mbomb007
2
@ mbomb007 Existe uma divisão de piso lá
Sp3000 24/03
@orlp Permita-me agora, para acrescentar mais confusão, mas excluindo meu comentário;)
FryAmTheEggman
Suspeito dos "\n".join()3 itens, mesmo que a lista seja usada para remover condicionalmente o primeiro elemento. Talvez algo como b*(x+"\n")+y+"\n"+zseja mais curto?
Xnor
7

JavaScript (ES6), 101 109

Muito longo

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

Explicação

Usando seta gorda para definição de função. Além disso, nenhum {}bloco: o corpo da função é uma expressão única que é o valor de retorno. f=(a,b,c)=>expré equivalente a

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

Dentro de uma única expressão, você não pode usar instruções como ifor var, mas

  • parâmetros com valores padrão podem ser usados ​​como variáveis ​​locais
  • expressões condicionais ?:funcionam bem em vez deif else
  • você pode adicionar mais subexpressões usando o operador vírgula ou, ainda melhor, como parâmetro não utilizado nas funções. Nesse caso, a atribuição de wé o segundo parâmetro (não utilizado) da funçãoz

Podemos reescrever a ffunção como

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

Teste no console Firefox / FireBug

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

Resultado

 /\   
/__\ 

  ____
 /\  /
/__\/

  ____
 /\  /\   
/__\/__\ 

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

  ________________
 /\  /\  /\  /\  /\   
/__\/__\/__\/__\/__\ 
edc65
fonte
Bem feito! Ontem passei muito tempo procurando encurtá-lo e, na melhor das hipóteses, consegui reproduzir os 109 de maneiras diferentes. -8 é o salto.
DocMax 25/03
Legal. Você poderia postar uma explicação? Eu não entendo completamente o uso dew
BadHorsie
@BadHorse explicação adicional (na verdade, desta vez)
edc65
Por interesse, tentei fazê-lo sem espaços à esquerda e criei o 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 (deliberadamente não usando seqüências de caracteres de modelo etc. para corresponder à sua resposta).
Neil
6

CJam, 55 53 51 bytes

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

Tentei portar minha resposta em Python e ela acabou sendo mais curta que os outros CJams.

Permalink .

Sp3000
fonte
6

Haskell 155 153 139 131 Bytes

Eu encontrei uma abordagem um pouco diferente que acabou sendo mais curta que o meu método original. Minha tentativa original é preservada abaixo. Como antes, as dicas de golfe são apreciadas.

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

Obrigado a Nimi pelas dicas de golfe.


Tentativa anterior 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
fonte
4
Algumas dicas para golfe: (mod n 2)==0é even nou utilização melhor odd ne trocar o thene elseparte. concat.take(div n 2).repeaté take(4*div n 2).cycleporque todos os elementos da lista são de comprimento 4. Atribua nomes abreviados a funções com nomes longos, por exemplo z=zipWith- e use z. Você pode expulsar alguns espaços ...repeat""else[....
nimi
@nimi Obrigado por suas dicas! Utilizando-os, consegui jogar com golfe minha solução original em 179 bytes. Ao reconsiderar minha abordagem, também pude reduzir minha solução para 155 bytes.
Ankh-morpork 25/03/2015
1
Dicas, parte II: foldr z["","",""]é foldr1 z, porque a lista a dobrar nunca está vazia. Em vez de all(==' ') você pode usar ==" "(<- dois espaços no meio), porque é usado para remover a linha vazia no caso de n = 1 e aqui está a primeira linha " ". A primeira definição de tpodem ser escritos em uma única linha: t n|odd....
N
4

CJam, 73 68 63 62 60 bytes

Definitivamente, isso precisa de golfe ...

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

Teste aqui.

Explicação

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

Isso cria uma função sem nome que aceita um número inteiro e imprime os triângulos. Para chamá-lo, dê um nome, por exemplo f=n->(...).

Ungolfed + explicação:

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

Exemplo de saída:

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

Estou muito chateado que isso seja tão longo. Tenho certeza de que existem muitas oportunidades de golfe, mas elas não estão claras para mim no momento. Deixe-me saber se você tem alguma sugestão ou se você gostaria de alguma explicação adicional!

Alex A.
fonte
3

CJam, 68 62 60 bytes

Tanto quanto posso ver, essa é uma abordagem completamente diferente da outra solução CJam. Isso pode ser muito praticado.

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

Experimente online aqui

Optimizer
fonte
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
fonte
1
Bom trabalho! Observe que nunca é melhor usar um whileloop, use um forloop. Nesse caso, você pode salvar 2 bytes, incluindo a definição de mna inicialização do loop for e, b=!bfinalmente, como quer que seja chamado. Você também pode economizar ao substituir stringe boolpor var. Você também não precisa das n>1cláusulas "()" , e na s+=cláusula você pode usar o não-curto-circuito em &vez de &&não haver efeitos colaterais ou desreferências para dar errado. Por fim, 1>0é mais curto que true;)
VisualMelon 27/03
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);}

Editar: Graças às dicas do @VisualMelon, foram salvos 74 bytes.

Sei que está longe de ser o melhor idioma para jogar golfe, mas estou mais interessado em aprender sobre as várias nuances do C #, em vez de vencer a competição. Esta é basicamente uma porta desta resposta Pyth.

Eu estou pensando que os loops for poderiam ser ainda mais jogados, mas não sei bem como, dadas as declarações terciárias incorporadas neles.

Exemplo (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
fonte
Enquanto StringBuilders são rápidos e adoráveis, se você deseja uma baixa contagem de bytes, s+=é seu amigo. Na verdade, você pode fazer loops um pouco mais compactos. A alegria / horror dos operadores ++e --significa que você pode fazer a maior parte do trabalho na verificação condicional for(i=0;i++<=t;)(isso verifica se ié menor ou igual a t então o incrementa). Você faria bem em definir o int ilado de fora do loop for e reutilizá-lo, e como você pode garantir que inunca será negativo, i%2==0pode ser trocado i%2<1. Com essas alterações, uma pontuação de sub 200 bytes é facilmente alcançada.
VisualMelon 27/03
1
Além disso, suspeito que você tenha escrito isso no LINQPad ou similar, porque o acesso a Enumerablegeralmente requer uma using System.Linqdiretiva e acho que geralmente se pretende que essas cláusulas sejam incluídas. No entanto , nesse caso, o único LINQ pode ser substituído pelo var s=" "+string.Join("____",new string[1+t/2])+n;que não contém LINQ e é mais curto que o código atual;) Ele une muitas seqüências nulas junto com o que realmente interessamos, "____" (o 1 + t / 2 porque precisamos de outra string nula para ajustar outro "____" antes). A variável né declarada como "\ r \ n".
VisualMelon
Ótimas dicas! Eu esqueci que o Enumerable precisaria do System.Linq, eu mal presto atenção hoje em dia. A ponta do loop for é útil!
Trent
Um pouco tarde, mas você poderia salvar 4 bytes usando Console.Writeem vez 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;}

Explicação

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
fonte
2

C # - 151 146 141 138

Inspirado pela resposta 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
fonte
1
Bom, não sei como eu perdi isso antes de comentar sobre as outras respostas! Essa sobrecarga de new Stringé uma nova para mim! Você parece ter perdido o seu t=""da versão golfed, embora uma coisa melhor a fazer seria inicializar tcomo "\ n". Você pode salvar um par de bytes anexando para tonde virar b, salvando o "{}" no para-loop: t+=(b=!b)?"/":"__\\".
VisualMelon 27/03
1
@tis você pode salvar um casal mais se você definir tantes se adicionar tpara a cadeia em vez de "\n";)
VisualMelon
1

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

O único truque real aqui (e nem sequer é bom) é usar 3 acumuladores para que eu possa condensar a solução em até 1 loop.

O código pode ser executado aqui: http://play.golang.org/p/urEO1kIjKv

Kristoffer Sall-Storgaard
fonte
simplesmente use em c += `__\` vez doif i<n{c+="_"}
MarcDefiant 25/15/15
@MarcDefiant Atualizado, obrigado
Kristoffer Sall-Storgaard
1

> <> (Peixe) , 215 183 156 bytes

Edit: O Notepad ++ estava me fornecendo 5 bytes extras devido ao CR, então a contagem modificada de acordo

Um pouco mais jogado, mas é o meu primeiro programa de pesca até agora> _ <O requisito de não ter uma primeira linha em branco para 1 triângulo dobrou o tamanho do programa.

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-

Pode testar em http://fishlanguage.com/ (Int na pilha inicial para o comprimento)

Explicação:

       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
fonte
1
Bom intérprete! Você fez isso sozinho?
Sp3000 25/03
Nem um pouco. : O PI o usou extensivamente para me ensinar o idioma ... e para depurar. Acabei de ver a linguagem flutuando e achei muito interessante (também quero experimentar o Marbles).
Fongoid 26/03
1

perl 109 108 106

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

Acho que está tudo bem no meu primeiro golfe, usei a seção de Vynce para a primeira linha, com o restante do meu código para superar o problema da nova linha com 1 triângulo.

Agora, para ver se consigo diminuí-lo :)

Editar : espaço em branco

Edição 2 : substituído "\n"por$/

1:
 /\
/__\

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

Uma versão não destruída:

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

A saída:

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

A pilha transborda se eu entrar 65535(mas não se você compilar com -O3!), Mas teoricamente deve funcionar ;-)

edit: o programa agora preenche o requisito de que somente duas linhas devem ser exibidas se 1for passada para o programa edit 2: use em int*vez dechar*

MarcDefiant
fonte
Você pode declarar maincomo main(c,v)**v;se isso funcionasse.
FUZxxl
Eu queria saber se você poderia salvar algo tendo cou ncomo uma variável global, para que você não precise passar esse parâmetro para r(). Eu não acho que sua resposta está em conformidadeNote that for 1 the output is two lines long but otherwise it's three. This is required.
Level River St
@FUZxxl infelizmente isso não funcionar :-(error: expected declaration specifiers before ‘*’ token main(c,v)**v;{
MarcDefiant
@steveverrill o corrigiu, mas eu precisava prolongar o código. Não foi possível encontrar uma solução global nou cmais curta.
MarcDefiant
@MarcDefiant Você conseguiu passar um 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;}

Programa de teste:

#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
fonte
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

Em uma função:

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

Com algumas apresentações:

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

Pode renderizar (se você tiver o figlet instalado):

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

Salve 2 caracteres se a entrada for variável em vez de $1: 103

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

No loop:

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

Renderizará (aproximadamente) o mesmo:

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


 _ _ _ 
(_|_|_)

    _____       ____________________________________________________________
   |__ / |     /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  
    |_ \ |    /__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\
   |___/_|    
  _______       ________________________________________________________________
 |__ /_  )     /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /
  |_ \/ /     /__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/
 |___/___|    
  ________      ________________________________________________________________
 |__ /__ /     /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  
  |_ \|_ \    /__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\
 |___/___/    
 _____ _        ____________________________________________________________________
|__ / | |      /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /
 |_ \_  _|    /__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/
|___/ |_|     
F. Hauri
fonte
1
Você deve postar uma pergunta sobre um codegolf de implementação de figlet!
sergiol 15/02
1

Carvão , 27 bytes (não competitivo)

Não-concorrente porque o idioma pós-desafio.

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

Experimente online! Link é a versão detalhada do código. Explicação:

FEN﹪鲫

Gere uma lista de bits alternados de comprimento ne faça um loop sobre eles.

P×⁴_

Desenhe ____sem mover o cursor.

↗⊗¬ι↓

No primeiro e em qualquer outro triângulo, desenhe o /lado esquerdo .

P↘²

Desenhe o \lado sem mover o cursor.

↘⊗ι↑

No segundo e em qualquer outro triângulo, desenhe o \lado esquerdo novamente para mover o cursor.

P↗⊗ι

No segundo e em qualquer outro triângulo, desenhe o /lado direito , sem mover o cursor.

Neil
fonte
1
As respostas não precisam mais ser marcadas como não concorrentes
Jo King
1

PowerShell , 116 95 bytes

Muito obrigado a Mazzy e ASCII-Only por economizar 21 bytes

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

Experimente online!

Não permitir que uma linha vazia para n = 1 comeu como 14 10 bytes. Essa solução está com uma morte cerebral bastante agora muito mais inteligente com uma quantidade mínima de código repetido. O arredondamento dos banqueiros ainda é o diabo.

Veskah
fonte
Uma linha vazia não é permitida ???
somente ASCII
@ Somente ASCII Leia o quarto ponto do OP.
Veskah 15/01
damnit
apenas ASCII
1
@ Quebras somente ASCII em x = 3 A substituição da cadeia é como você ignora o arredondamento dos banqueiros
Veskah 15/01
1
@mazzy você não pode gerar uma primeira linha, caso contrário seria 102
somente 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");}

É mais se você contar as #includeinstruções, mas compilou no gcc, embora com avisos, sem elas. Sei que não é o mais curto de longe, mas ainda gosto de fazê-lo em C.

HeyLlama
fonte
A macro #define p(c)printf(c)é mais curta que a sua função. Você pode omitir tipos de retorno em funções (eles assumem o padrão int). Você também pode definir a função em um C89estilo como este main(c,v)char**v;{}. Isso é curto paraint main(int c, char** v){}
MarcDefiant
0

Perl (simples) 131 125 120

primeiro passe bastante simples:

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

oh quem precisa de int explícito?

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

Invocar como $3.

Mais legível:

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

Exemplo:

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

C #: LINQ de 1 linha, 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
fonte
0

Retina , 88 bytes (não competitivo)

Não-concorrente porque o idioma pós-desafio.

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

Experimente online! Explicação:

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

Substitua a entrada por um par de triângulos.

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

Multiplique os triângulos pela entrada original.

%`(.+)\1$
$1

Divida os triângulos por 2.

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

Remova o meio triângulo da esquerda.

G`\S

Remova a primeira linha se ela estiver em branco agora.

Neil
fonte
0

Perl 6 , 83 bytes

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

Experimente online!

Bloco de código anônimo que pega um número e retorna uma string.

Brincadeira
fonte
0

05AB1E , 37 bytes

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

Experimente online ou verifique as 10 primeiras saídas .

Explicação:

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

Experimente online.

Explicação:

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
fonte