Construir escaleras ASCII


28

Dada una entrada de dos enteros n y m , genera una escalera ASCII de longitud n y tamaño m .

Esta es una escalera ASCII de longitud 3 y tamaño 3:

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

Esta es una escalera ASCII de longitud 5 y talla 1:

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

Esta es una escalera ASCII de longitud 2 y tamaño 5:

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

Ser especifico:

  • La longitud ( n ) representa cuántos cuadrados está compuesta por la escalera.

  • El tamaño ( m ) representa el ancho y la altura del interior de, es decir, sin contar los "bordes", cada cuadrado.

  • Cada cuadrado está formado por el área interior llena de espacios, rodeada por -s en la parte superior e inferior, |s en la izquierda y derecha, +ys en las cuatro esquinas.

  • Las fronteras entre los cuadrados se fusionan, por lo que dos líneas seguidas se +--...--+fusionan en una sola.

  • Las esquinas de toda la escalera se reemplazan con el personaje o.

  • Opcionalmente, puede generar una nueva línea final.

La longitud de la escalera ( n ) siempre será ≥ 2, y el tamaño ( m ) siempre será ≥ 1.

La entrada se puede tomar como una cadena separada por comas / espacios en blanco, una matriz / lista / etc., o dos funciones / línea de comando / etc. argumentos Los argumentos se pueden tomar en el orden que sea más conveniente / más golfista.

Como se trata de , gana el código más corto en bytes.

Consejo: Los ejemplos anteriores también se pueden usar como casos de prueba.


¿Tenemos que tomar primero la longitud, luego el tamaño?
RK.

@RK. Puede tomarlos en el orden que sea más conveniente.
Pomo de la puerta

1
¿Puede haber una nueva línea líder ?
Conor O'Brien

1
@ CᴏɴᴏʀO'Bʀɪᴇɴ Uhh ... voy a ir con no en ese.
Pomo de la puerta

1
Vale: P Valió la pena intentarlo.
Conor O'Brien

Respuestas:


4

Pyth, 34 bytes

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

Banco de pruebas

Toma argumentos de nueva línea separados en STDIN.

Utiliza una función auxiliar :, que construye cada tipo de cadena vertical a partir de tres caracteres, luego se replica según sea necesario, se transpone y se une en nuevas líneas.


11

Rubí, 71

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

sin golf en el programa de prueba

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 haber problemas menores con la versión de golf: necesita ;después h=0, necesita espacio después puts. Pero su puntuación solo crece con 1 personaje, ya que hay un espacio adicional antes puts.
manatwork

@manatwork oops, gracias, arreglado. No sé cómo sucedió eso, debo haber jugado al golf y no correrlo después.
Level River St el

9

CJam, 43 42 bytes

No estoy satisfecho con el puntaje. Pero no soy Dennis, ¿verdad?

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

La entrada es de 2 elementos separados por espacios. Longitud primero

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

Explicación

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
Me gusta que lo hayas formulado como una pregunta. "No soy Dennis ... ¿verdad?"
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

Prueba

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>


¡No sabía que document.getElementById('elem').podría ser reemplazado por elem.! +1 para esto, pero por favor, ¿podría señalar algunos documentos sobre esto?
F. Hauri

2
@ F.Hauri funciona en casi todos los navegadores, pero debe evitarse (excepto cuando se codifica por diversión). Información y enlaces stackoverflow.com/questions/3434278/…
edc65

6

C #, 1412 bytes

... Mi primer intento de CodeGolf, no es probable que gane, pero funciona, así que aquí vamos:

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

99
¡Bienvenido a Programming Puzzles & Code Golf! Tiene mucho espacio en blanco en su código que puede eliminar para acortar su código, si desea más ayuda para jugar golf su código, puede consultar Consejos para jugar golf en C # .
Downgoat

Estoy de acuerdo con @ Doᴡɴɢᴏᴀᴛ aquí. Potencialmente pude jugar golf a solo 533 bytes . Pero podría ser mejor. (Advertencia: no
programo

Tengo que bajar a 314, conusing 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
Perdí algunos espacios, así que 310 conusing 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
Hasta 270 sin cambios en el enfoque utilizado: 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','-');}}. Sin embargo, es muy probable que haya más potencial aquí, simplemente cambiando un poco la forma de hacer las cosas.
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 es una función que acepta dos enteros y devuelve una cadena.

Sin golf:

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]

Este es el tipo de desafío que, por derecho, pb debería ser realmente bueno. Dibujar imágenes simples con personajes es exactamente para lo que se diseñó pb. Por desgracia, supongo que es solo un lenguaje prolífico.

Primero toma la longitud de entrada, seguida del tamaño. Toma datos en forma de valores de bytes, por ejemplo:python -c 'print(chr(5) + chr(7))' | ./pbi.py ladder.pb

Mira, una animación divertida!

Con comentarios:

^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

Golpe puro, 132 130 128 127 bytes

Sí, podría dejar 1 byte más reemplazando el último ${p% *}, pero prefiero esto:

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

Muestra:

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]

Ejemplo de uso:

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

Cómo 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]

Editar: @Christian Irwan encontró 3 bytes. ¡Gracias!


m=init$[1..l]>>("|"!" "<$u)++["+"!"-"](_:m)=[1..l]>>["+"!"-"]++("|"!" "<$u)
Coincidencia de patrones

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

@ChristianIrwan: ¡bien visto! ¡Gracias!
nimi

3

brainfuck - 334 bytes

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

Esperaba que esto fuera mucho más corto.

Esto configura una "cadena" que se parece | (...) |y una que parece +----(...)----+, imprimiendo cada una según sea necesario, con una carcasa especial para elo s en la parte superior e inferior.

Requiere un intérprete que use celdas de 8 bits y le permite ir a la izquierda desde la celda 0 (ya sea en celdas negativas o en bucle). En mi experiencia, estas son las configuraciones predeterminadas más comunes.

Con comentarios:

,[<+<<<<+>>>>>-]<[[>>]+[<<]>>-] 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

Pruébalo aquí!

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

Explicación

ρ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
Una excelente primera respuesta. Pero no veo ningún +signo en su código, ¿ha considerado que los peldaños intermedios tienen +signos en cada extremo?
Level River St

Gracias por el comentario muy bien redactado: ¡espaciado totalmente los signos más! También me costó bastante espacio; sigo pensando en cómo puedo acortarlo ... además de omitir ($n,$m)=@ARGV;y asumir que ya están configurados, no estoy seguro de si eso está en el espíritu o no. Tendré que buscarlo.
ZILjr

A menos que se especifique lo contrario en la pregunta, la regla está aquí meta.codegolf.stackexchange.com/a/2422/15599 . No puede simplemente asumir que las variables están establecidas, sino que puede escribir una función en lugar de un programa, si eso ayuda. No hago Perl pero supongo que eso podría salvarte @ARGV. Además, cuando responda a alguien, recuerde incluir @username para que reciba una alerta. No necesito hacerlo ya que esta es tu publicación.
Level River St el

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

Pruébalo en línea .


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 está hecho para ponerlo en un archivo con argumentos ingresados ​​en la línea de comando. proporcione el número de cajas y el ancho en ese orden.


1

PHP, 81bytes

Espera 2 argumentos, pasados ​​al llamar al comando PHP directamente. El primero es el tamaño y el segundo es el número de pasos.

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

Puede requerir algunas mejoras.


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)

'No golfista':

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

Pruébalo en línea!

Explicación

(^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

Algunas otras versiones

Intenté muchos enfoques diferentes tratando de atrapar a 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

Soy particularmente aficionado a t**blos que usan las matemáticas para generar el patrón vertical de la escalera:

        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

La 1000200020001continuación pueden utilizarse para generar los patrones o|||+|||+|||oy - - - -, que componen la escalera. Desafortunadamente, no pude hacer que este enfoque fuera más corto que el enfoque de unión / ajuste.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.