Construir escadas ASCII


28

Dada uma entrada de dois números inteiros n e m , produza uma escada ASCII de comprimento n e tamanho m .

Esta é uma escada ASCII de comprimento 3 e tamanho 3:

o---o
|   |
|   |
|   |
+---+
|   |
|   |
|   |
+---+
|   |
|   |
|   |
o---o

Esta é uma escada ASCII de comprimento 5 e tamanho 1:

o-o
| |
+-+
| |
+-+
| |
+-+
| |
+-+
| |
o-o

Esta é uma escada ASCII de comprimento 2 e tamanho 5:

o-----o
|     |
|     |
|     |
|     |
|     |
+-----+
|     |
|     |
|     |
|     |
|     |
o-----o

Para ser específico:

  • O comprimento ( n ) representa quantos quadrados a escada é composta.

  • O tamanho ( m ) representa a largura e a altura do interior - isto é, sem contar as "bordas" - em cada quadrado.

  • Cada quadrado é constituído pela área interna cheia de espaços, cercada por -s na parte superior e inferior, |s na esquerda e direita e +s nos quatro cantos.

  • As bordas entre quadrados se fundem, portanto, duas linhas seguidas se +--...--+fundem em uma.

  • Os cantos de toda a escada são substituídos pelo personagem o.

  • Opcionalmente, você pode gerar uma nova linha à direita.

O comprimento da escada ( n ) será sempre ≥ 2 e o tamanho ( m ) será sempre ≥ 1.

A entrada pode ser tomada como uma cadeia de caracteres separada por espaço em branco / vírgula, uma matriz / lista / etc. Ou duas funções / linha de comando / etc. argumentos. Os argumentos podem ser tomados na ordem que for mais conveniente / mais golfista.

Como esse é o , o código mais curto em bytes vence.

Dica: Os exemplos acima também podem ser usados ​​como casos de teste.


Temos que levar o comprimento primeiro e depois o tamanho?
RK.

@RK. Você pode levá-los na ordem que for mais conveniente.
Maçaneta

1
Pode haver uma nova linha líder ?
Conor O'Brien

1
@ CᴏɴᴏʀO'Bʀɪᴇɴ Uhh ... eu vou sair sem essa.
Maçaneta

1
Okay: P Valia a pena tentar.
Conor O'Brien

Respostas:


4

Pitão, 34 bytes

.NjjNm*QTvz*2YjC:M++J"+|o"m"- -"QJ

Suíte de teste

Recebe argumentos nova linha separados em STDIN.

Usa uma função auxiliar :, que cria cada tipo de sequência vertical a partir de três caracteres, depois replica conforme necessário, transpõe e une as novas linhas.


11

Ruby, 71

->m,n{h=0;(?o+?+*(n-1)+?o).chars{|c|puts [?|+' '*m+?|]*h,c+?-*m+c;h=m}}

ungolfed no programa de teste

f=->m,n{
  h=0                             #The number of | above the 1st rung is 0
  (?o+?+*(n-1)+?o).chars{|c|      #Make a string of all the rung ends o++...++o and iterate through it
    puts [?|+' '*m+?|]*h,         #draw h vertical segments |  ...  |
      c+?-*m+c                    #and a rung with the correct ends
    h=m                           #The number of | above all rungs except the 1st is m
  }
}


f[gets.to_i,gets.to_i]

Parece haver pequenos problemas com a versão golfed: need ;after h=0, need space after puts. Mas sua pontuação cresce apenas com 1 caractere, pois há um espaço extra antes puts.
manatwork

@manatwork oops, obrigado, corrigido. Não sei como isso aconteceu, devo ter jogado golfe e não jogado depois.
Level River St

9

CJam, 43 42 bytes

Não estou satisfeito com a pontuação. Mas eu não sou Dennis, certo?

q~:Z;'-'o{[\Z*1$N]}:X~['-_'+X\'|XZ*]@*1>1$

A entrada é 2 itens separados por espaço. Comprimento primeiro

2 3
o---o
|   |
|   |
|   |
+---+
|   |
|   |
|   |
o---o

Explicação

q~:Z;'-'o{[\Z*1$N]}:X~['-_'+X\'|XZ*]@*1>1$
q~                                         e# read input
  :Z;                                      e# Record the size in Z and discard
     '-'o{[\Z*1$N]}:X~                     e# Create the initial line (and final). also creates a shorcut to do this later
           \                               e# Capture two arguments
            Z*                             e# The separator is repeated size times
              1$                           e# Repeat the first argument
                N                          e# Add newline
                                           e# X is a function to create line in a ladder
                      ['-_'+X\'|XZ*]       e# Design the repeating part
                                    @*     e# Repeat the pattern n times
                                      1>   e# Discard the initial
                                        1$ e# Since the final line is same than the initial, we just write it.
                                           e# Implicit printing

1
Eu gosto que você tenha formulado uma pergunta. "Eu não sou Dennis ... certo?"
undergroundmonorail

7

JavaScript (ES6), 89

... repetir, repetir, repetir ...

(n,m,R=x=>x.repeat(m),b=R(`|${R(' ')}|
`),d=`o${c=R('-')}o
`)=>d+R(b+`+${c}+
`,m=n-1)+b+d

Teste

F=(n,m,R=x=>x.repeat(m),b=R(`|${R(' ')}|
`),d=`o${c=R('-')}o
`)=>d+R(b+`+${c}+
`,m=n-1)+b+d

// Less golfed
U=(n,m)=>
{
  var R=x=>x.repeat(m),
      a=R(' '),
      b=R(`|${a}|\n`);
      c=R('-'),
      d=`o${c}o\n`;
  m=n-1;
  return d+R(b+`+${c}+\n`)+b+d
}

function test() {
  var i=I.value.match(/\d+/g)
  if (i) O.textContent=F(+i[0],+i[1])
  console.log(i,I.value)
}  
 
test()
N,M: <input id=I value="3,5" oninput=test()>
<pre id=O></pre>


Eu não sabia que document.getElementById('elem').poderia ser substituído por elem.! +1 para isso, mas, por favor, você poderia apontar alguns documentos sobre isso?
F. Hauri 10/01

2
@ F.Hauri ele funciona em quase todos os navegadores, mas deve ser evitado (exceto quando se codifica por diversão). Informações e links stackoverflow.com/questions/3434278/…
edc65

6

C #, 1412 bytes

... Minha primeira tentativa do CodeGolf, não é provável que ganhe, mas funciona, então aqui vamos nós:

using System;

namespace Ascii_Ladders
{
    class Program
    {
        static void Main(string[] args)
        {
            int n = 0;
            int m = 0;

            Console.Write("Please enter Height: ");
            n = int.Parse(Console.ReadLine());
            Console.Write("Please Enter Width: ");
            m = int.Parse(Console.ReadLine());

            Console.Write("o");
            for (int i = 0; i < m; i++)
            {
                Console.Write("-");
            }
            Console.WriteLine("o");

            for (int k = 0; k < n; k++)
            {
                for (int i = 0; i < m; i++)
                {
                    Console.Write("|");
                    for (int j = 0; j < m; j++)
                    {
                        Console.Write(" ");
                    }
                    Console.WriteLine("|");
                }
                if (k != n - 1)
                {
                    Console.Write("+");
                    for (int i = 0; i < m; i++)
                    {
                        Console.Write("-");
                    }
                    Console.WriteLine("+");
                }
            }

            Console.Write("o");
            for (int i = 0; i < m; i++)
            {
                 Console.Write("-");
            }
            Console.WriteLine("o");

            Console.ReadKey();
        }
    }
}

9
Bem-vindo à programação de quebra-cabeças e código de golfe! Você tem muito espaço em branco no seu código que pode ser removido para abreviá-lo. Se você precisar de mais ajuda para jogar seu código, consulte Dicas para jogar golfe em C # .
Downgoat

Eu concordo com @ Doᴡɴɢᴏᴀᴛ aqui. Consegui potencialmente jogar golfe com apenas 533 bytes . Mas poderia ser melhor. (Aviso: eu não faço programa em C #.)
user48538

Eu tenho-o para 314 comusing System;class P{static int m;static void Main(){int n = int.Parse(Console.ReadLine());m = int.Parse(Console.ReadLine());M('o','-');for(int k=0;k<n;k++){for(int i=0;i<m;i++){M('|',' ');}if(k!=n-1){M('+','-');}}M('o','-');Console.ReadKey();}static void M(char x,char y){Console.WriteLine(x+new string(y,m)+x);}}
RedLaser

3
Perdeu alguns espaços para 310 comusing System;class P{static int m;static void Main(){int n=int.Parse(Console.ReadLine());m=int.Parse(Console.ReadLine());M('o','-');for(int k=0;k<n;k++){for(int i=0;i<m;i++){M('|',' ');}if(k!=n-1){M('+','-');}}M('o','-');Console.ReadKey();}static void M(char x,char y){Console.WriteLine(x+new string(y,m)+x);}}
RedLaser

2
Para baixo para 270, sem mudanças na abordagem utilizada: using C=System.Console;class P{static void Main(){int i,k,n=int.Parse(C.ReadLine()),m=int.Parse(C.ReadLine());System.Action<char,char> M=(x,y)=>C.WriteLine(x+new string(y,m)+x);M('o','-');for(k=0;k<n;k++){for(i=0;i<m;i++){M('|',' ');}if(k<n-1){M('+','-');}}M('o','-');}}. Provavelmente, há mais potencial aqui, simplesmente mudando um pouco as coisas.
Joey

6

Julia, 87 bytes

f(n,m)=(g(x)=(b=x[1:1])x[2:2]^m*b*"\n";(t=g("o-"))join([g("| ")^m for i=1:n],g("+-"))t)

Esta é uma função que aceita dois números inteiros e retorna uma string.

Ungolfed:

function f(n::Int, m::Int)
    # Create a function g that takes a string of two characters and
    # constructs a line consisting of the first character, m of the
    # second, and the first again, followed by a newline.
    g(x) = (b = x[1:1]) * x[2:2]^m * b * "\n"

    # Assign t to be the top and bottom lines. Construct an array
    # of length n where each element is a string containing the
    # length-m segment of the interior. Join the array with the
    # ladder rung line. Concatenate all of this and return.
    return (t = g("o-")) * join([g("| ")^m for i = 1:n], g("+-")) * t
end

5

pb - 147 bytes

^t[B]>>[B]vw[T!0]{b[43]<[X]b[43]>w[B=0]{b[45]>}v[X-1]w[B=0]{b[124]^}v[X]t[T-1]}t[111]b[T]<w[X!0]{b[45]<}b[T]w[Y!0]{w[B!0]{^}b[124]^}b[T]^>>[B]vb[T]

Esse é o tipo de desafio em que, por direito, o pb deve ser realmente bom. Desenhar imagens simples com caracteres é exatamente o que o pb foi projetado. Infelizmente, é apenas um idioma prolixo, eu acho.

Pega primeiro o comprimento da entrada, seguido pelo tamanho. Recebe entrada na forma de valores de bytes, por exemplo:python -c 'print(chr(5) + chr(7))' | ./pbi.py ladder.pb

Olha, uma animação divertida!

Com comentários:

^t[B]            # Save length to T
>>[B]v           # Go to X=size+1, Y=0

w[T!0]{          # While T is not 0:
    b[43]            # Write a '+'
    <[X]b[43]        # Write a '+' on the left side as well
    >w[B=0]{b[45]>}  # Travel back to the right '+', writing '-' on the way
    v[X-1]           # Go down by X-1 (== size)
    w[B=0]{b[124]^}  # Travel back up to the '+', writing '|' on the way
    v[X]             # Go down by X (== size + 1, location of next '+')
    t[T-1]           # Decerement T
}

t[111]           # Save 'o' to T (it's used 4 times so putting it
                 # in a variable saves bytes)

b[T]             # Write an 'o' (bottom right)

<w[X!0]{         # While not on X=0:
    b[45]<           # Travel left, writing '-' on the way
}

b[T]             # Write an 'o' (bottom left)

w[Y!0]{          # While not on Y=0:
    w[B!0]{^}        # Skip nonempty spaces
    b[124]           # Write a '|'
    ^                # Travel up
}

b[T]             # Write an 'o' (top left, replaces existing '+')

^>>[B]v          # Go back to where the size is saved and go to X=size+1, Y=0

b[T]             # Write an 'o' (top right, replaces existing '+')

5

Festa pura, 132 130 128 127 bytes

Sim, eu poderia deixar cair mais 1 byte substituindo por último ${p% *}, mas prefiro o seguinte:

p=printf\ -v;$p a %$1s;$p b %$2s;o="|$a|\n";h=+${a// /-}+\\n v=${a// /$o}
a=${b// /$h$v}${h//+/o};a=${a/+/o};${p% *} "${a/+/o}"

Amostra:

ladders() {
    p=printf\ -v;$p a %$1s;$p b %$2s;o="|$a|\n";h=+${a// /-}+\\n v=${a// /$o}
    a=${b// /$h$v}${h//+/o};a=${a/+/o};${p% *} "${a/+/o}"
}

ladders 3 4
o---o
|   |
|   |
|   |
+---+
|   |
|   |
|   |
+---+
|   |
|   |
|   |
+---+
|   |
|   |
|   |
o---o

ladders 2 1
o--o
|  |
|  |
o--o

4

Haskell, 100 97 bytes

l#s=unlines$t:m++[t]where _:m=[1..l]>>["+"!"-"]++("|"!" "<$u);t="o"!"-";o!i=o++(u>>i)++o;u=[1..s]

Exemplo de uso:

*Main> putStr $ 4 # 3
o---o
|   |
|   |
|   |
+---+
|   |
|   |
|   |
+---+
|   |
|   |
|   |
+---+
|   |
|   |
|   |
o---o

Como funciona:

l#s=unlines$t:m++[t]         -- concat top line, middle part and end line
                             -- with newlines between every line
  where                      -- where
  _:m=                       -- the middle part is all but the first line of
     [1..l]>>                -- l times
         ["+"!"-"]           --    a plus-dashes-plus line
         ++("|"!" "<$u)      --    followed by s times a bar-spaces-bar line

  t="o"!"-"                  -- very first and last line
  o!i=o++(u>>i)++o           -- helper to build a line
  u=[1..s]

Edit: @Christian Irwan encontrou 3 bytes. Obrigado!


Patternmatching para -1 score m=init$[1..l]>>("|"!" "<$u)++["+"!"-"]=>(_:m)=[1..l]>>["+"!"-"]++("|"!" "<$u)
Akangka

Surpreendentemente _:m=[1..l]>>["+"!"-"]++("|"!" "<$u)funciona
Akangka

@ChristianIrwan: bem localizado! Obrigado!
nimi

3

brainfuck - 334 bytes

,[<+<<<<+>>>>>-]<[[>>]+[<<]>>-]<----[>---<----]--[>[+>>]<<[<<]>++++++]>[+.>>]-[<+>---]<+++++++>>--[<+>++++++]->---[<------->+]++++++++++[<++<]+++++[>[++++++>>]<<[<<]>-]>[-]>.-<<----[>>+++<<----]--[>+<--]>---<<<<++++++++++.,[>[>+>+<<-]>[<+>-]>[<<<<[>>>>>>[.>>]<<[<<]>>-]>>>>>[.>>]<<[<<]>-]<<<<+>-]>>>>[-]----[>---<----]>+.[>]<<<<<[.<<]

Eu esperava que isso fosse muito menor.

Isso configura uma "string" que se parece | (...) |e que se parece com +----(...)----+, imprimindo cada uma delas conforme necessário, com um invólucro especial para os os na parte superior e inferior.

Requer um intérprete que use células de 8 bits e permita que você vá para a esquerda da célula 0 (seja em células negativas ou em loop). Na minha experiência, essas são as configurações padrão mais comuns.

Com comentários:

,[<+<<<<+>>>>>-]<[[>>]+[<<]>>-] Get m from input; make a copy
                      Turn it into m cells containing 1 with empty cells between

<----[>---<----]      Put 67 at the beginning (again with an empty cell between)

--[>[+>>]<<[<<]>++++++]  Add 43 to every nonempty cell

>[+.>>]               Add 1 to each cell and print it

-[<+>---]<+++++++    Put 92 after the last 45 (no empty cell!)

>>--[<+>++++++]      Put 43 immediately after the 92

->---[<------->+]    Put 234 after 43

++++++++++           And 10 after that

[<++<]             Add two to the 234; 92; the empty spaces; and left of the 111

+++++[>[++++++>>]<<[<<]>-] Add 30 to each 2; the 94; and the 236

>[-]>.-<<----[>>+++<<----] Erase leftmost 32; Print 111; subtract 68 from it

--[>+<--]>---        Put 124 where the 32 was

<<<<++++++++++.,     Print a newline; override the cell with n from input

[                    n times:

  >[>+>+<<-]>[<+>-]    Make a copy of m

  >[                   m times:

    <<<<                 Look for a flag at a specific cell

    [                    If it's there:

      >>>>>>[.>>]          Go to the 43; print it and every second cell after

      <<[<<]>>-            Clear the flag

    ]

    >>>>>[.>>]           Go to the 124; print it and every second cell after

    <<[<<]>              Go back to the copy of m

  -]

  <<<<+>               Plant the flag

-]

>>>>

[-]----[>---<----]>+ Erase the 124; add 68 to 43

.[>]                 Print it; then head to the end

<<<<<[.<<] Go to the last 45; print it; then print every second cell to the left


2

Jolf, 36 bytes

Experimente aqui!

ρpi,a+2J+2J"o-| "j"o(.+)o
o.+o'+$1+

Explicação

ρpi,a+2J+2J"o-| "j"o(.+)o\no.+o'+$1+
 pi              j                   repeat vertically j times
   ,a+2J+2J"o-| "                    a box with dimensions 2+J
ρ                 "o(.+)p\np.+o'     replace with regex
                                +$1+ with the -...-

2

Perl, 98 bytes

($n,$m)=@ARGV;print$h="o"."-"x$m."o\n",((("|".(" "x$m)."|\n")x$m.$h)x$n)=~s{o(-+)o(?=\n.)}{+$1+}gr

1
Uma excelente primeira resposta. Mas não vejo +sinais no seu código, você considerou que os degraus intermediários têm +sinais em cada extremidade?
Level River St

Obrigado pelo comentário muito bem redigido - espaçei totalmente os sinais de mais! Também me custou um pouco de espaço; ainda pensando em como posso encurtá-lo ... além de omitir ($n,$m)=@ARGV;e presumir que já estão definidos - não tenho certeza se isso está no espírito ou não. Vou ter que procurar.
ZILjr

Salvo indicação em contrário na pergunta, a regra está aqui meta.codegolf.stackexchange.com/a/2422/15599 . Você não pode simplesmente assumir que as variáveis ​​estão definidas, mas pode escrever uma função em vez de um programa, se isso ajudar. Eu não faço Perl, mas presumo que isso possa te salvar @ARGV. Além disso, ao responder a alguém, lembre-se de incluir @username para receber um alerta. Não preciso fazer isso, pois esta é sua postagem.
Level River St

1

C, 122 bytes

f(int m,int n,char*s){int i=0,w=3+m++;for(;i<w*m*n+w;++i)*s++=i%w>m?10:" |-+-o"[!(i/w%m)*2+!(i%w%m)+!(i/w%(m*n))*2];*s=0;}

Experimente online .


1

Tcl, 187 bytes

lassign $argv n w
set c 0
while { $c < [expr {($w * $n) + ($n + 2)}]} {if {[expr {$c % ($n + 1)}] == 0} {puts "o[string repeat "-" $w ]o"} else {puts "|[string repeat " " $w ]|"}
incr c}

Este código é criado para colocar em um arquivo com argumentos introduzidos na linha de comando. forneça o número de caixas e a largura nessa ordem.


1

PHP, 81bytes

Espera 2 argumentos, transmitidos ao chamar o comando PHP diretamente. O primeiro é o tamanho e o segundo é o número de etapas.

$R=str_repeat;echo$P="o{$R('-',$W=$argv[1])}o
",$R("|{$R(' ',$W)}|
$P",$argv[2]);

Pode exigir algumas melhorias.


0

Python 2, 94 bytes

def F(n,m):a,b,c,d='o|+-';r=[a+d*m+a]+([b+' '*m+b]*m+[c+d*m+c])*n;r[-1]=r[0];print'\n'.join(r)

'Ungolfed':

def F(n,m):
 # 'o---o'
 r = ['o'+'-'*m+'o']
 # ('|   |'*m+'+---+') n times
 r += (['|'+' '*m+'|']*m+['+'+'-'*m+'+'])*n
 # replace last +---+ with o---o
 r[-1] = r[0]
 print '\n'.join(r)


0

Pip -l , 35 bytes

(^YsXbRLaJW'-)XbWR^('|XbRLaJ'+)WR'o

Experimente online!

Explicação

(^YsXbRLaJW'-)XbWR^('|XbRLaJ'+)WR'o
                                     a is length, b is size, s is space (implicit)
   sXb                               String containing b spaces
      RLa                            List containing a copies of that string
         JW'-                        Join on "-" and wrap the result in "-" as well
  Y                                  Necessary for operator precedence reasons
 ^                                   Split into a list of characters
(            )Xb                     String-repeat each character in the list b times
                                     This list represents the central columns of the ladder

                    '|Xb             String containing b pipe characters
                        RLa          List containing a copies of that string
                           J'+       Join on "+"
                   (          )WR'o  Wrap in "o"
                  ^                  Split into a list of characters
                                     This list represents the outer columns of the ladder

                WR                   Wrap the left list in the right list, vectorizing

Algumas outras versões

Eu tentei várias abordagens diferentes tentando pegar Pyth ...

[Y'-XbWR'o;@>(sXbWR'|RLbPE'-XbWR'+RL:a)y]  41
Y^(t**b.1*:t**bX--a.1)" --"@yXbWR"|o+"@y   40
Y'|XbRLaJ'+YyWR'o;Z:sXbRLaJW'-RLbPEyAEy    39
t**:b(" |-o-+"<>2)@_@^t.1M$*Y[ttXa-1].1    39
J*Z:sXbRLaJW'-RLbWR:^('|XbRLaJ'+)WR'o      37
Y^$*Y[t**:btXa-1].1" --"@yXbWR"|o+"@y      37

Gosto particularmente dos t**bque usam matemática para gerar o padrão vertical da escada:

        b           Size; e.g. 3
    t               Preset variable for 10
     **:            Set t to t**b (e.g. 1000)
           a        Length; e.g. 3
            -1      2
         tX         String-repeat (the new value of) t 2 times: 10001000
   [          ]     Put t and the above into a list: [1000; 10001000]
               .1   Append 1 to both of them: [10001; 100010001]
$*(              )  Fold on multiplication: 1000200020001

O 1000200020001pode então ser usado para gerar os padrões o|||+|||+|||oe - - - -, que compõem a escada. Infelizmente, não consegui que essa abordagem fosse mais curta que a abordagem de junção / quebra automática.

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.