Produza o lendário Yggdrasil


39

Sua tarefa é produzir uma representação da lendária árvore da vida, Yggdrasil .

Você deve escrever um programa cuja saída seja exatamente isso:

                                       /\
                                      /**\
                                     /****\
                                    /******\
                                    /******\
                                   /********\
                                  /**********\
                                 /************\
                                /**************\
                                 /************\
                                /**************\
                               /****************\
                              /******************\
                             /********************\
                            /**********************\
                              /******************\
                             /********************\
                            /**********************\
                           /************************\
                          /**************************\
                         /****************************\
                        /******************************\
                           /************************\
                          /**************************\
                         /****************************\
                        /******************************\
                       /********************************\
                      /**********************************\
                     /************************************\
                    /**************************************\
                        /******************************\
                       /********************************\
                      /**********************************\
                     /************************************\
                    /**************************************\
                   /****************************************\
                  /******************************************\
                 /********************************************\
                /**********************************************\
                     /************************************\
                    /**************************************\
                   /****************************************\
                  /******************************************\
                 /********************************************\
                /**********************************************\
               /************************************************\
              /**************************************************\
             /****************************************************\
            /******************************************************\
                  /******************************************\
                 /********************************************\
                /**********************************************\
               /************************************************\
              /**************************************************\
             /****************************************************\
            /******************************************************\
           /********************************************************\
          /**********************************************************\
         /************************************************************\
        /**************************************************************\
               /************************************************\
              /**************************************************\
             /****************************************************\
            /******************************************************\
           /********************************************************\
          /**********************************************************\
         /************************************************************\
        /**************************************************************\
       /****************************************************************\
      /******************************************************************\
     /********************************************************************\
    /**********************************************************************\
            /******************************************************\
           /********************************************************\
          /**********************************************************\
         /************************************************************\
        /**************************************************************\
       /****************************************************************\
      /******************************************************************\
     /********************************************************************\
    /**********************************************************************\
   /************************************************************************\
  /**************************************************************************\
 /****************************************************************************\
/******************************************************************************\
                                   |--------|
                                   |--------|
                                   |--------|
                                   |--------|
                                   |--------|
                                   |--------|
                                   |--------|
                                   |--------|
                                   |--------|
                                   |--------|
                                   |--------|
                                   |________|

Não há espaço em branco à direita. A nova linha final pode ser omitida.

Para facilitar a verificação, aqui estão as somas md5 da saída esperada:

  • 374899e56bc854d04639c43120642e37 - Sem nova linha no final.
  • 03afb81d960b8e130fe2f9e0906f0482 - Nova linha no final

Aplicam-se brechas padrão. Isso é código-golfe, então a menor entrada em bytes vence!


10
Relacionado: codegolf.stackexchange.com/q/15860/15599 . Nax, você deve trabalhar em marketing. Toda família vai querer um Yggdrasil neste Natal. Vejo que você respondeu à pergunta do número de Graham também. Você deve gostar de coisas pontudas. Vamos ter novos nomes para "foguete" e "casquinha de sorvete".
Level River St


4
@Nax: uma vez que a árvore do mundo tem frutas, e angiospermas não, e que é claramente um confiner de alguma descrição, infelizmente, parece que você tirou uma foto da árvore errada: P
naught101

@Nax Hmm. Você está certo. O pedante (eu) é guincho em seu próprio petardo. Os md5sums foram alterados.
Scott Leadley

11
Erg, ponto de ordem, Yggdrasil é definitivamente uma freixo nas eddas, não um abeto. Meio assim .
Alex P

Respostas:


22

Golfscript, 84 77 76 75 72 caracteres

Abordagem diferente da de Howard . Clique na contagem de caracteres para experimentá-lo.

10,{.)4*,\3*>{.39\-' '*'/'@2*'*'*'\
'}/}/12,{' '35*'|'@11<'_-'1/=8*1$n}/

Obrigado a Howard por salvar 3 caracteres!

Explicação :

Esta é mais ou menos uma porta direta da minha solução Python . Tomando algumas liberdades expressivas (usando variáveis ​​nomeadas em vez de manter o controle das posições da pilha e printrealmente manter as coisas na pilha, não imprimindo):

10,{...}/            # for i in range(10):
   .                 #    x = i
   )4*,              #    Y = range((i+1)*4)
   \3*               #    x *= 3
   >                 #    Y = Y[x:]  # y is now range(3*i, (i+1)*4)
   {...}/            #    for j in Y:
      .39\-          #        q = 39 - j
      ' '*           #        print ' '*q  # print right number of spaces
      '/'            #        print '/'
      @2*            #        j *= 2
      '*'*           #        print '*'*j
      '\<NEWLINE>'   #        print "\\\n"
12,{...}/            # for i in range(12):
    ' '35*           #    print ' '*35
    '|'              #    print '|'
    @11<             #    i = i < 11
    '_-'1/=          #    z = "_-"[i] # pick "-" if i < 11, else pick "_"
    8*               #    print z*8
    1$               #    print '|' # (copy from earlier in the stack)
    n                #    print "\n"

11
Você pode usar o mesmo truque de quebra de linha da minha solução. Em vez de '\\'npuxar a nova linha para a sequência (+/- 0 caracteres) e agora a barra invertida não precisa mais ser escapada (caractere -1).
Howard

11
Mais dois: 4*4+é o mesmo )4*e '_-'[=]pode ser escrito, o '_-'1/=que torna o último +obsoleto.
Howard

3
uma explicação pode ser útil ...? é pedir muito?

@professorfish: Chegando logo!
Claudiu

Você não precisa de um ';' Aqui? Caso contrário, haverá duas novas linhas à direita, já que golfscript, por padrão, adiciona uma.
Nabb

21

Haml & Sass

37 + 277 = 314

Haml:

%link(rel="stylesheet" href="s")
%pre

Sass:

pre:after{$l:"";@for$k from0 to10{@for$i from0 to4+$k{@for$j from0 to40-($k*6+$i*2)/2{$l:$l+' ';}$l:$l+'/';@for$j from0 to$k*6+$i*2{$l:$l+'*';}$l:$l+"\\\a ";}}@for$i from0 to12{@for$j from0 to35{$l:$l+" ";}@if$i<11{$l:$l+"|--------|\a ";}@else{$l:$l+"|________|";}}content:$l;}

* Sass permite diretivas de controle, concatenação e desreferência variável. Tudo isso é útil ao estilizar, mas detalhado ao jogar golfe.


é gerado em:

HTML:

<link rel="stylesheet" href="s" /><pre></pre>

CSS:

pre:after {
  content: "                                        /\\\a                                        /**\\\a                                       /****\\\a                                      /******\\\a                                      /******\\\a                                     /********\\\a                                    /**********\\\a                                   /************\\\a                                  /**************\\\a                                   /************\\\a                                  /**************\\\a                                 /****************\\\a                                /******************\\\a                               /********************\\\a                              /**********************\\\a                                /******************\\\a                               /********************\\\a                              /**********************\\\a                             /************************\\\a               
             /**************************\\\a                           /****************************\\\a                          /******************************\\\a                             /************************\\\a                            /**************************\\\a                           /****************************\\\a                          /******************************\\\a                         /********************************\\\a                        /**********************************\\\a                       /************************************\\\a                      /**************************************\\\a                          /******************************\\\a                         /********************************\\\a                        /**********************************\\\a                       /************************************\\\a                      /**************************************\\\a                     /******************************
**********\\\a                    /******************************************\\\a                   /********************************************\\\a                  /**********************************************\\\a                       /************************************\\\a                      /**************************************\\\a                     /****************************************\\\a                    /******************************************\\\a                   /********************************************\\\a                  /**********************************************\\\a                 /************************************************\\\a                /**************************************************\\\a               /****************************************************\\\a              /******************************************************\\\a                    /******************************************\\\a                   /**********************************
**********\\\a                  /**********************************************\\\a                 /************************************************\\\a                /**************************************************\\\a               /****************************************************\\\a              /******************************************************\\\a             /********************************************************\\\a            /**********************************************************\\\a           /************************************************************\\\a          /**************************************************************\\\a                 /************************************************\\\a                /**************************************************\\\a               /****************************************************\\\a              /******************************************************\\\a             /*****************************************************
***\\\a            /**********************************************************\\\a           /************************************************************\\\a          /**************************************************************\\\a         /****************************************************************\\\a        /******************************************************************\\\a       /********************************************************************\\\a      /**********************************************************************\\\a              /******************************************************\\\a             /********************************************************\\\a            /**********************************************************\\\a           /************************************************************\\\a          /**************************************************************\\\a         /****************************************************************\\\a        /*********
*********************************************************\\\a       /********************************************************************\\\a      /**********************************************************************\\\a     /************************************************************************\\\a    /**************************************************************************\\\a   /****************************************************************************\\\a  /******************************************************************************\\\a                                    |--------|\a                                    |--------|\a                                    |--------|\a                                    |--------|\a                                    |--------|\a                                    |--------|\a                                    |--------|\a                                    |--------|\a                                    |--------|\a                                    
|--------|\a                                    |--------|\a                                    |________|"; }

a página resultante


11
Você não vê muitas soluções HTML / CSS no CodeGolf. Bom trabalho.
Mordred

16

CJam , 62 bytes

A,{I4+,{I3*J+_39\-S*'/@2*'**'\N}fJ}fI{35S*'|'-8*'|N++}C*'-/'_*

Experimente online!

Como funciona

A,           " Push [ 0  …  9 ].                                                   ";
{            " For each I in that array:                                           ";
  I4+,       " Push [ 0  …  I + 3 ].                                               ";
  {          " For each J in that array:                                           ";
    I3*J+_   " Push K := 3 * I + J twice.                                          ";
    39\-S*   " Push a string consisting of 39 - K spaces.                          ";
    '/       " Push a slash.                                                       ";
    @2*'**   " Push a string consisting of 2 * K asterisks.                        ";
    '\N      " Push a backslash and a linefeed.                                    ";
  }fJ        "                                                                     ";
}fI          "                                                                     ";
{            " Do the following 12 times:                                          ";
  35S*       " Push a string consisting of 35 spaces.                              ";
  '|         " Push a vertical bar.                                                ";
  '-8*'|++   " Push the string '--------|\n'.                                      ";
}C*          "                                                                     ";
'-/'_*       " Replace the hyphen-minus signs of the last string with underscores. ";

2
Eu tenho que começar a usar CJam vez de GolfScript ...
Claudiu

O que torna o código CJam tão compacto? São apenas características usuais que combinam bem ou há algum truque? Ou na verdade não é CJam, mas programadores CJam, é?
Vi.

2
@ Vi: É uma mistura de ambos. 1. O CJam é baseado em pilha, então você geralmente foge sem usar nenhuma variável. 2. Os nomes de todos os integrados têm no máximo dois caracteres. Por esse motivo, você não precisa de espaço em branco, exceto em alguns casos especiais. 3. Mesmo envios em idiomas de golfe não são eles próprios. Meus programas GolfScript / CJam são muito mais curtos agora do que costumavam ser.
Dennis

A sugestão para o CJam seria usar os códigos ASCII 128-256 para todo um outro conjunto de componentes internos. tenho algum editor especial que
Claudiu

@ Claudiu: Bem, isso é com seu criador. Se eu projetasse minha própria linguagem de golfe, acho que a tornaria baseada em bits ou codificaria todas as instruções aritmeticamente.
Dennis

15

GolfScript, 79 caracteres

10,{:^4+,{2*^6*+'*'*.,2/~40+' '*'/'@'\
'}/}/[' '35*]12*'|--------|
'*'||''_'8**

Experimente o código aqui . Observe que as quebras de linha não são opcionais neste código


24
Uma solução GolfScript de várias linhas? Não achei que veria o dia!
Ingo Bürk

12

Python, 148 129 126 121 caracteres

R=range
for i in R(10):
 for j in R(i*3,4+i*4):print' '*(39-j)+'/'+'**'*j+'\\'
for c in'-'*11+'_':print' '*35+'|'+c*8+'|'

Agradecemos a Falko por salvar 3 caracteres e ao flornquake por salvar brilhantemente outros 5!


11
Multiplicação personagem de Python é um pouco demasiado perfeito para este desafio ...
Sean Latham

Espere até você ver minha solução golfscript ... = P
Claudiu

2
Use '**'*jpara salvar 3 caracteres. Além disso, minha solução converge para exatamente o mesmo código. :)
Falko

11
Você pode diminuir a última linha escrevendo for c in'-'*11+'_':print' '*35+'|'+c*8+'|'.
Flornquake

@flornquake: nice! muito inteligente
Claudiu

11

Bater, 236 197 193

10 bytes de código + nome de arquivo com 1 byte + arquivo de dados com 182 bytes = total de 193 bytes

zcat y 2>j

Explicação

yé um arquivo que contém o Yggdrasil, sem uma nova linha à direita, compactada com o algoritmo zopfli (chamado como zopfli --i64) e depois com os últimos 8 bytes removidos. O zopfli é compatível com o gzip, para que eu possa descompactar o arquivo com os utilitários Bash padrão projetados para o gzip. O tamanho do arquivo de dados é 182 bytes (229 bytes quando o gzip normal é usado). O tamanho do Yggdrasil original, sem a nova linha à direita, é 5876 bytes.

A remoção dos últimos 8 bytes causa mensagens de erro, que são suprimidas enviando erro padrão para um arquivo chamado j. Se jexistir, será substituído.

A base64 de yé (use base64 -dpara obter o arquivo original):

H4sIAAAAAAACA+3SMQoCURDA0N5TWC+IFxK8yD/8Nul9hfDRnamT6J+du83zdUPwOACNNDb0+3Bs
tMPhSscDvusHgM9wIcUNclL+5r/luJXkmlh5rM3r8txkMdVNcEn1Nc2a1AU72XWz3Xd91r5z7eZD
AQKQgAI0PDFf8xJfExpQgQhkpAIdz8ytzK3AQMg6UMIQpLQELU/NQc5B/thBegtqHpOc16jHOX/v
x1mPZg19MfrdrBM=

E o md5sum é:

4a049a80241160cdde0a3cbca323b7f2

2
Meu dedo estava ansioso para apertar o botão "excluir" quando vi o código, até ler a contagem e a explicação de caracteres. : P
Maçaneta

2
Você pode salvar cerca de 30 bytes usando o zopfli para criar o arquivo compactado. "zopfli --i100 y" produz um arquivo de 190 bytes que o zcat pode descompactar.
precisa saber é o seguinte

11
E mais alguns, se você excluir os últimos 10 bytes e fechar o STDERR.
Dennis

@ GlennRanders-Pehrson obrigado por apontar isto, eu também editou a minha resposta para 'massas molares dos compostos' codegolf.stackexchange.com/a/35613/16402 usar zopfli, economizando 37 bytes

@ Dennis acabou por ser de 8 bytes (mais e pedaços de tronco do Yggdrasil estaria faltando), graças

7

C, 169

i;j;p(a,b){while(b--)putchar(a);}main(){for(;i++<10;)for(j=i*3-4;++j<i*4;p(32,39-j),p(47,1),p(42,j*2),puts("\\"));for(++i;i--;p(32,35),p(124,1),p(i?45:95,8),puts("|"));}

Ungolfed (e ligeiramente desembaraçado):

int i;
int j;
void p(a,b) {
  while (b--) putchar(a);
}
void main() {
  for (;i++<10;) {
    for (j=i*3-4;++j<i*4;) {
      p(32,39-j);
      p(47,1);
      p(42,j*2);
      puts("\\");
    }
  }
  for (++i;i--;) {
    p(32,35);
    p(124,1);
    p(i?45:95,8);
    puts("|");
  }
}

7

Ruby - 100

puts (0..21).map{|i|i>9??\ *35+?|+(i>20??_:?-)*8+?|:(0..i+3).map{|y|?\ *(39-z=y+3*i)+?/+?**z*2+?\\}}

Coloca nivelamento automático, para que possamos coletar todas as linhas, mesmo em matrizes aninhadas. Precisa de Ruby 1.9

Tente ideone


Eu acho que precisa de alguns espaços principais. Além disso, funciona com Ruby 1.9, mas não na 1.8.
Scott Leadley

7

PowerShell 104 101

0..9|%{(3*$_)..(3+$_*4)|%{" "*(39-$_)+"/"+"*"*2*$_+"\"}};0..11|%{" "*35+"|"+("-","_")[$_-eq11]*8+"|"}

6

C # 258 234bytes

Obrigado a algum usuário irritante pelas edições sugeridas, fazendo bom uso do método String.PadLeft!

using System;class G{static void Main(){Action<string>p=Console.WriteLine;int i=0,j;for(;i++<10;)for(j=i*3-3;j++<i*4;)p("/".PadLeft(41-j)+"\\".PadLeft(2*j-1,'*'));while(i-->0)p("|--------|".PadLeft(45));p("|________|".PadLeft(45));}}

O código é bastante simples, não resta muito para o golfe.

Código formatado:

using System;
class G
{
    static void Main()
    {
        Action<string> p = Console.WriteLine;
        int i = 0, j;
        for(; i++ < 10 ;)
            for(j = i*3 - 3; j++ < i*4;)
                p("/".PadLeft(41 - j) + "\\".PadLeft(2*j - 1,'*'));
        while(i-- > 0)
            p("|--------|".PadLeft(45));
        p("|________|".PadLeft(45));
    }
}

Usar \ré inútil aqui. Isso é código de golfe.
precisa saber é o seguinte

3
@ nyuszika7h de fato, mas ele está incluído na cópia formatado para uma boa medida para que as pessoas que usam o bloco de notas pode ver mais facilmente a glória do Yggdrasil (não está incluído na pontuação)
VisualMelon

Ah eu vejo. Windows ... Sinta-se à vontade para corrigir minha edição.
precisa saber é o seguinte

@ nyuszika7h Obrigado por apontar o Syntax Highlighting não era certo
VisualMelon

6

J, 98 88 84 75

(85 11 1#3 4$' /*\ |-| |_|')#"1~(39&-,1,+:,1:)"0(12$4),~85(-4&+#-:*>:)&i.10

4

Perl, 127

for$i(0..9){for$j($i*3..3+$i*4){print" "x(39-$j),"/","*"x($j*2),"\\\n";}}for$i(0..11){print" "x35,"|",($i>10?"_":"-")x8,"|\n";}

Ungolfed:

for $i (0..9) {
  for $j ($i*3..3+$i*4) {
    print " "x(39-$j) , "/" , "*"x($j*2) , "\\\n";
  }
}
for $i (0..11) {
  print " "x35 , "|" , ($i>10?"_":"-")x8 , "|\n";
}

Substitua $ i por $ _ e salve 4 caracteres.
choroba

4

Ruby - 139 129 126 123 123 121

Hoisted "coloca" fora da criação da matriz (sugestão do bitpwner).

puts (0..9).map{|i|(i*3...(i+1)*4).map{|j|"/#{'**'*j}\\".rjust(41+j,' ')}}+["%45s"%'|--------|']*11<<'%45s'%'|________|'


Sem Golfe ("coloca" sem suspensão):


# print fill patterns from the intervals
# [0..3, 3..7, 6..11, 9..15, 12..19, 15..23, 18..27, 21..31, 24..35, 27..39]
# centered on columns 81-82
(0..9).each { |i|
  (i*3...(i+1)*4).each { |j|    # x...y vs x..y-1 saves a char
    puts "/#{'**'*j}\\".rjust(41+j,' ')
  }
}
# print the stump
puts ("%45s\n" % '|--------|') * 11
puts '%45s' % '|________|'

@bitpwner Acho que isso merece sua própria resposta. Vá em frente.
Scott Leadley

4

PHP 223 202 181 160 156

Editar Eu descobri como criar um apelido para uma função com uma variável e fui capaz de cortar mais alguns caracteres. Essa str_repeatfunção era realmente detalhada

Edit 2: Obrigado a todos pelas sugestões!

Golfe:

<?$s=str_repeat;for($i=-1;$i++<9;)for($j=$i*3;$j<4+$i*4;)echo$s(' ',39-$j).'/'.$s('**',$j++)."\\
";for($i=12;$i--;)echo$s(' ',35),'|'.$s($i?'-':'_',8)."|
";

Legível:

    <?

$s=str_repeat;

for($i=-1;$i++<9;)
{
    for($j=$i*3;$j<4+$i*4;)
    {
        echo$s(' ',39-$j).'/'.$s('**',$j++)."\\
        ";
    }
}

for($i=12;$i--;)
{
    echo$s(' ',35),'|'.$s($i?'-':'_',8)."|
    ";
}

Saída: http://brobin.me/yggdrasil.php


Você pode salvar 6 caracteres removendo parênteses (39-$j), ($j*2)e ($i==11). -2 substituindo por \ncaracteres reais de nova linha (o PHP permite isso em literais). -5 caracteres substituindo (ambos) for($i=0;$i<12;$i++)por for($i=12;$i-->0;)e $i==11com $i==0.
precisa saber é o seguinte

Depois disso, você também pode substituir $s(($i==0?'_':'-'),8)por $s($i?'-':'_',8). (==> -5 caracteres)
sebcap26

-1 Caractere substituindo $s('*',$j*2)por $s('**',$j). Eu acho que é a última melhoria que posso encontrar.
precisa saber é o seguinte

-2 mudança ($j*2)no interior para a ($j++*2)e remoção $j++de for()argumentos
Avall

@ sebcap26 for($i=12;$i-->0;)pode ser reduzido para for($i=12;$i--;)- mais 2 caracteres.
avall

3

Delphi 429

Tentará melhorar mais tarde.
Golfe

uses strutils,SysUtils,Classes;const a='|----';b='|____';c:array [0..9,0..1]of int32=((0,3),(3,7),(6,11),(9,15),(12,19),(15,23),(18,27),(21,31),(24,35),(27,39));var t:TStrings;i,j:integer;begin t:=tstringlist.Create;for I:=0to 9do for J:=c[i,0]to c[i,1]do t.Add('/'+StringOfChar('*',j));for I:=0to 10do t.Add(a);t.Add(b);for I:=0to t.Count-1do t[i]:=t[i].PadLeft(40)+ReverseString(t[i]).Replace('/','\');write(T.TEXT);readln;end.

destroçado

uses
  strutils,SysUtils,Classes;
const
  a='|----';
  b='|____';
  c:array [0..9,0..1]of int32=((0,3),(3,7),(6,11),(9,15),(12,19),(15,23),(18,27),(21,31),(24,35),(27,39));
var
  t:TStrings;
  i,j:integer;
begin
  t:=tstringlist.Create;
  for I:=0to 9do
    for J:=c[i,0]to c[i,1]do
      t.Add('/'+StringOfChar('*',j));
  for I:=0to 10do
    t.Add(a);
  t.Add(b);
  for I:=0to t.Count-1do
    t[i]:=t[i].PadLeft(40)+ReverseString(t[i]).Replace('/','\');
  write(T.TEXT);
  readln;
end.

3

Javascript, 288 281

O Chrome oculta console.logs duplicados , use o IE.

function t(w){s="";for(i=0;i++<39-w;)s+=" ";s+="/";for(i=0;i++<w*2;)s+="*";return s+"\\"}function r(l){s="";for(i=0;i++<36;)s+=" ";s+="|";for(i=0;i++<8;)s+=l;return s+"|"}w=0;c=console;for(h=0;h++<10;){for(j=0;j++<3+h;)c.log(t(w++));w-=h}for(j=0;j++<11;)c.log(r('-'));c.log(r('_'))

Ungolfed:

function t(w)
{
    s="";
    for(i=0;i++<39-w;)
        s+=" ";
    s+="/";
    for(i=0;i++<w*2;)
        s+="*";
    return s+"\\"
}
function r(l)
{
    s="";
    for(i=0;i++<36;)
        s+=" ";
    s+="|";
    for(i=0;i++<8;)
        s+=l;
    return s+"|"
}

w=0;
c=console;
for(h=0;h++<10;)
{
    for(j=0;j++<3+h;)
        c.log(t(w++));
    w-=h;
}
for(j=0;j++<11;)
    c.log(r('-'));
c.log(r('_'))

Use em for(i=0;i++<39-w;)vez de for(i=0;i<39-w;++i)e assim por diante. Além disso, em p=console.logvez de c=consolee em pvez de c.log(embora eu só tenha testado o último no Node.js, ele não funciona no Firefox). Isso economiza 12 bytes.
precisa saber é o seguinte

c=console.logtambém não funcionou no Chrome, então não o usei. Os truques do loop for economizam 7 bytes.
21814 Sean Latham

Eu geralmente sou muito cauteloso em qualquer coisa incentivando -me a usar MSIE ...

É possivelmente a primeira vez que vi a frase "use o IE". O_o No entanto, você pode suprimir o comportamento do Chrome simplesmente executando esse código no console, e não em uma página da web.
Maçaneta

A execução em uma página e no console produz os mesmos resultados para mim no Firefox e no Chrome.
Sean Latham

3

JavaScript (console.log), 168 166

(Espaço em branco apenas para legibilidade)

for(i=c=0;i<11;i++)
  for(j=0;j<4+i&!c;j++)
    l=i*13+j,
    a=Array(n=i-10?3*i+j+1:5).join("*-_"[k=(l>129)+(c=l==141)]),
    console.log(Array(41-n).join(" ")+'/||'[k]+a+a+'\\||'[k])

3

C (219)

Obrigado a todos pelas dicas de golfe - consegui reduzi-lo para 219. Não pense que vai diminuir muito.

w,W,s,S,i,r;main(){char T[78];memset(T,42,78);for(r=4,s=39;r<14;++r,s-=3,w+=6)for(i=0,S=s,W=w;i<r;++i,W+=2,--S)printf("%*s/%.*s\\\n",S,"",W,T);for(i=0;i<11;i++)printf("%35s|--------|\n","");printf("%35s|________|","");}

Necessário inclui:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

Se ele estiver disposto a usar o C89, também poderá omitir todas as inclusões. Não há nenhum caso neste código em que a declaração implícita na chamada estraga tudo.
1937 Joshua

@Nax; isso me leva a 263 - e eu puxei inclui. Obrigado.
DreamWarrior 19/08

@ Josué - sistemas de 64 bits e memset podem ser problemáticos, mas ... caso contrário, talvez não. De qualquer forma, a maioria das pessoas remove as inclusões, e eu também removi.
DreamWarrior 19/08

Na verdade, são 262 caracteres, você não precisa da nova linha à direita.
usar o seguinte código

Você pode usar 32em vez de ' 'e 42em vez de '*':)
Quentin

3

Haskell, 153 148

Direto, sem truques, apenas golfe:

(a:b:c)%n=(39-n)&' '++a:(2*n)&b++c
n#m=[n..m]++(n+3)#(m+4)
(&)=replicate
main=putStr$unlines$map("/*\\"%)(take 85$0#3)++map("|-|"%)(11&4)++["|_|"%4]

O %operador desenha uma única linha, cujo primeiro argumento é o Stringcomprimento 3, contendo as bordas e os caracteres de preenchimento nessa linha (agora assumindo exatamente 3 Chars, economizando 5 bytes), o segundo Int, especifica metade do número de caracteres de preenchimento. A correspondência de padrões, consoantes e anexos é usada em conjunto para salvar bytes, cuidando da "cola" entre Chare String. Nesta segunda versão, eu também tornei #infinito e introduzi um take 85para torná-lo finito novamente (sem bytes salvos, infelizmente).

O #operador cria a sequência para o nargumento %necessário para a árvore: [0..3], [3..7], ...concatenada.

&é apenas uma abreviação de infix para replicate, que ocorre três vezes.

A árvore é montada na última linha e as novas linhas são adicionadas por unlines.



2

Lua - 164

a=' 'for i=0,9 do for j=i*3,3+i*4 do print(a:rep(39-j)..'/'..(('*'):rep(j*2))..'\\')end end for i=0,11 do print(a:rep(35)..'|'..((i>10 and'_'or'-'):rep(8))..'|')end

2

Mathematica 191 178

Certamente não é a melhor solução:

n=Nest;
t=Table;
""<>
    t[
        {n[#<>" "&,"",39-i],"/",n[#<>"*"&,"",2i],"\\\n"}
    ,
        {i,Flatten@t[Range[j+4]-1+3j,{j,0,9}]}
    ]
<>
    t[
        n[#<>" "&,"",35]<>If[i==12,"|________|\n","|--------|\n"]
    ,
        {i,12}
    ]

Sem contar novas linhas. O Mathematica inclina a saída, pois não tem a mesma largura para um espaço em branco que para "*" e "/". Mas o resultado está correto.


(é minha primeira golfe)
freddieknets

2

Java - 286

Meu primeiro golfe.

Golfe:

class M{public static void main(String[]args){int i=0,a,f=0;String s="";for(;i++<11;){for(a=i*3-4;++a<i*4;){if(i>10){a=4;if(++f>12)break;}s+=s.format("%"+(40-a)+"s"+(a>0?"%0"+a+"d":"")+"%3$s",f>0?"|":"/",0,f>0?"|":"\\").replace("0",f<1?"**":f>11?"__":"--")+"\n";}}System.out.println(s);}}

Ungolfed:

class M {
    public static void main(String[] args) {
        int i=0,a,f=0;
        String s = "";
        for(;i++<11;){
            for(a=i*3-4;++a<i*4;a++){
                if(i>10){
                    a=4;
                    if(++f>12)break;
                }
                s+=s.format("%"+(40-a)+"s"+(a>0?"%0"+a+"d":"")+"%3$s",f>0?"|":"/", 0,f>0?"|":"\\").replace("0", f<1?"**":f>11?"__":"--")+"\n";
            }
        }
        System.out.println(s);
    }
}

Teste aqui


2

Python 2, 117

j=0
while j<40:j-=j/4;exec(j/3+4)*r"print' '*(39-j)+'/'+'**'*j+'\\';j+=1;"
for c in'-'*11+'_':print' '*35+'|'+c*8+'|'

Outras versões que tentei incluem:

# 118
for i in range(10):j=i*3;exec(i+4)*r"print' '*(39-j)+'/'+'**'*j+'\\';j+=1;"
for c in'-'*11+'_':print' '*35+'|'+c*8+'|'

# 118
i=j=4
while j:j=52-3*i;exec"j-=1;print' '*j+'/'+'**'*(39-j)+'\\\\';"*i;i+=1
for c in'-'*11+'_':print' '*35+'|'+c*8+'|'

# 118
j=0
for b in'\\'*10:j-=j/4;exec(j/3+4)*"print' '*(39-j)+'/'+'**'*j+b;j+=1;"
for c in'-'*11+'_':print' '*35+'|'+c*8+'|'

# 119
s=40
while s:s+=10-s/4;exec(52-s)/3*r"s-=1;print' '*s+'/'+'**'*(39-s)+'\\';"
for c in'-'*11+'_':print' '*35+'|'+c*8+'|'

2

Pitão, 101 100 99 90 81 bytes

J0Km/*+d7d2S9V85FTKI!-TN=hZ=+JZ))+*d-39-NJ++\/*"**"-NJ\\)Va*]\-11\_+++*d35\|*N8\|

Experimente online!

Tradução Python 3:
Z=0
d=" "
J=0
K=list(map(lambda d:((d+7)*d)//2,range(1,10)))
for N in range(85):
    for T in K:
        if not T-N:
            Z+=1
            J+=Z
    print(d*(39-(N-J))+"/"+"**"*(N-J)+"\\")
for N in ["-"]*11+["_"]:
    print(d*35+"|"+N*8+"|")

A afunção definida no seu Python não é equivalente a +nas listas?
Esolanging Fruit

@EsolangingFruit Está perto, mas não exatamente: <list>+<str>não é uma operação válida, mas eu poderia usar com a mesma facilidade ["-"]*11+["_"]. Decidi definir minha própria função para traduzir com mais precisão o que Pyth está realmente fazendo.
hakr14

Ok, isso faz sentido.
Esolanging Fruit

2

PowerShell, 88 bytes

0..9|%{(3*$_)..(3+$_*4)|%{' '*(39-$_)+"/$('**'*$_)\"}}
,'-'*10+'_'|%{' '*35+"|$($_*8)|"}

1

Groovy 118

10.times{(it*3).upto 3+it*4,{println' '*(39-it)+'/'+'*'*it*2+'\\'}};12.times{println' '*35+'|'+(it>10?'_':'-')*8+'|'}

11
Por que não estou surpreso ao ver uma solução Groovy bastante curta. Minha impressão do Groovy foi que foi feito por um programador Java que odiava digitar.
Almo

1

C, 194

Este código é uma bagunça quente e definitivamente pode ser jogado mais. Ainda assim, foi uma oportunidade de experimentar algumas coisas que nunca fiz antes: usar um literal para uma sequência de asteriscos e usar o especificador de largura *com uma sequência printf.

i,j=5,k=5,n;
main(){
  char d[]={[0 ...77]=42,0};
  for(;i<85;i++)k--,j+=!k,k+=(j-1)*!k,n=39-i+(j-5)*(j-4)/2,printf("%*s/%s\\\n",n,"",d+n*2);
  for(;i<97;i++)printf("%*s|\n",44,i-96?"|--------":"|________");
}

1

Raquete 223 220 211 204 198

Golfe:

(for-each display(flatten(let([m make-list])`(,(for*/list([i 10][j(range(* i 3)(* 4(+ 1 i)))])`(,(m(- 39 j)" ")"/",(m j"**")"\\\n")),(for/list([c`(,@(m 11"-")"_")])`(,(m 35" ")"|",(m 8 c)"|\n"))))))

Ungolfed:

(for-each display
     (flatten
      (let([m make-list])
        `(,(for*/list([i 10][j(range(* i 3)(* 4(+ 1 i)))])
             `(,(m(- 39 j)" ")"/",(m j"**")"\\\n"))
          ,(for/list([c`(,@(m 11"-")"_")])
             `(,(m 35" ")"|",(m 8 c)"|\n"))))))

1

Montagem (MIPS, SPIM) , 768 671 659 655 654 bytes

.text
.globl main
main:
li $8 32
li $9 47
li $t2 42
li $t3 92
li $t4 10
li $t5 42
addi $sp -4
move $4 $sp
la $s6 q
la $s5 w
li $t8 0
li $s0 10
li $t9 0
li $s3 40
li $s2 39
q:
sub $s3 $s3 $t8
add $s2 $s2 $t8
addi $t7 $t8 3
addi $t8 1
blt $s0 $t8 e
r:
sw $0 ($4)
blt $t9 $s2 t
beq $t9 $s2 y
beq $t9 $s3 u
beqz $t7 i
sb $t2 ($4)
p:
li $2 4
syscall
addi $t9 1
ble $t9 $s3 r
move $t9 $0
j $s5
o:
addi $t7 -1
bgez $t7 r
jr $s6
w:
addi $s2 -1
addi $s3 1
j o
t:
sb $8 ($4)
j p
y:
sb $9 ($4)
j p
u:
sb $t4 1($4)
sb $t3 ($4)
j p
i:
sb $t5 ($4)
j p
e:
li $t1 124
li $t3 124
li $t2 45
li $t5 95
li $t7 11
la $s6 a
la $s5 o
li $s2 35
li $s3 44
j r
a:
li $2 10
syscall

Experimente online!

Edit: Salvo ~ 100 bytes codificando cada caractere em um registro e simplesmente escrevendo na pilha, abusando do fato de o MIPS não ter tipos, de modo que a palavra implícita na string ascii é permitida.
Editar 2: removida a alocação de pilha duplicada. ( addi $sp -4) Opa!
Edit 3: ao reescrever, acidentalmente fez o toco de árvore 1 caractere muito curto. (36 em vez de 35). Fixo.
Edite 4: -4 bytes usando $ 8 e $ 9 em vez de $ t0 e $ t1. eles significam a mesma coisa, mas $ t0 é mais fácil de ler. infelizmente, todos os outros registradores t têm o mesmo tamanho quando escritos de maneira adequada ($ t2 == $ 10, mas ambos são 3 caracteres); portanto, o restante é uma lavagem. Eu poderia (em teoria) usar os demais registros 'a' (5-7. Print syscall usa 4), mas depois o comportamento não é definido quando se usa syscall.
-1 Byte, definindo t8 como 0 e ramificando em menor que em vez de igual. também exigiu que eu reorganizasse as operações adicionais, o que infelizmente fez com que o tempo de execução levasse mais três códigos opcionais.

Não é o melhor no MIPS, mas depois de esclarecer isso na meta-discussão, eu os envio. O MIPS não foi projetado para isso (sem saída, sem loops), mas é bem divertido fazer isso, apesar disso.

Infelizmente, não criei uma versão comentada para esta nova solução, mas você pode visualizar a versão antiga, com a documentação completa aqui

Sinta-se livre para receber o crédito e melhorar esta resposta, se puder vencê-la - provavelmente estou perdendo algumas otimizações aqui e ali.


Como essa solução não requer .data, é possível converter em binário (compilado) e salvar vários bytes. no entanto, o SPIM não o suporta, então c'est la vie.
Andrew Baumher

Além disso, não tenho certeza se a abreviação addi $sp -4que realmente addi $sp $sp -4é do SPIM ou MIPS em geral, portanto, se alguém o fizer, informe-me.
Andrew Baumher 04/09

0

Cobra - 166 228 260

class P
    def main
        for x in 10,for n in 4+x,print' '.repeat(39-x*3-n)+'/['**'.repeat(x*3+n)]\\'
        w=' '.repeat(35)
        print'[w]|--------|\n'.repeat(11)+w+'|________|'
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.