Construire des échelles ASCII

28

Étant donné une entrée de deux entiers n et m , sortez une échelle ASCII de longueur n et de taille m .

Il s'agit d'une échelle ASCII de longueur 3 et de taille 3:

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

Il s'agit d'une échelle ASCII de longueur 5 et de taille 1:

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

Il s'agit d'une échelle ASCII de longueur 2 et de taille 5:

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

Pour être précis:

  • La longueur ( n ) représente le nombre de carrés de l'échelle.

  • La taille ( m ) représente la largeur et la hauteur de l'intérieur - c'est-à-dire, sans compter les «bordures» - de chaque carré.

  • Chaque carré est composé de la zone intérieure remplie d'espaces, entourée de -s en haut et en bas, |s à gauche et à droite et +s aux quatre coins.

  • Les frontières entre les carrés fusionnent, donc deux lignes consécutives avec +--...--+fusion en une seule.

  • Les coins de l'échelle entière sont remplacés par le personnage o.

  • Vous pouvez éventuellement afficher une nouvelle ligne de fin.

La longueur de l'échelle ( n ) sera toujours ≥ 2 et la taille ( m ) sera toujours ≥ 1.

L'entrée peut être considérée comme une chaîne séparée par des espaces / virgules, un tableau / liste / etc., Ou deux fonctions / ligne de commande / etc. arguments. Les arguments peuvent être pris dans l'ordre le plus pratique / le plus golfique.

Puisqu'il s'agit de , le code le plus court en octets l'emporte.

Conseil: Les exemples ci-dessus peuvent également être utilisés comme cas de test.

Poignée de porte
la source
Faut-il d'abord prendre la longueur, puis la taille?
RK.
@RK. Vous pouvez les prendre dans l'ordre qui vous convient le mieux.
Poignée de porte
1
Peut-il y avoir une nouvelle ligne leader ?
Conor O'Brien
1
@ CᴏɴᴏʀO'Bʀɪᴇɴ Uhh ... Je vais y aller avec non sur celui-là.
Poignée de porte
1
D'accord: P Ça valait le coup.
Conor O'Brien

Réponses:

4

Pyth, 34 octets

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

Suite de tests

Prend les arguments de nouvelle ligne séparés sur STDIN.

Utilise une fonction d'assistance :, qui construit chaque type de chaîne verticale à partir de trois caractères, puis réplique si nécessaire, transpose et joint sur les nouvelles lignes.

isaacg
la source
11

Rubis, 71

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

non golfé dans le programme de test

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]
Level River St
la source
Il semble y avoir des problèmes mineurs avec la version golfée: besoin ;après h=0, besoin d'espace après puts. Mais vous marquez ne grandit qu'avec 1 caractère car il y a un espace supplémentaire avant puts.
manatwork
@manatwork oups, merci, corrigé. Je ne sais pas comment cela s'est produit, j'ai dû jouer au golf et ne pas le courir après.
Level River St
9

CJam, 43 42 octets

Je ne suis pas sastifié par le score. Mais je ne suis pas Dennis, non?

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

L'entrée consiste en 2 éléments séparés par des espaces. Longueur d'abord

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

Explication

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
Akangka
la source
1
J'aime que vous l'ayez formulé comme une question. "Je ne suis pas Dennis ... non?"
undergroundmonorail
7

JavaScript (ES6), 89

... répéter, répéter, répéter ...

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

Tester

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>

edc65
la source
Je ne savais pas que cela document.getElementById('elem').pourrait être remplacé par elem.! +1 pour cela, mais s'il vous plaît, pourriez-vous signaler quelques documents à ce sujet?
F.Hauri
2
@ F.Hauri cela fonctionne dans presque tous les navigateurs, mais devrait être évité (sauf lors du codage pour le plaisir). Informations et liens stackoverflow.com/questions/3434278/…
edc65
6

C #, 1412 octets

... Ma première tentative CodeGolf, pas susceptible de gagner, mais cela fonctionne alors nous y voilà:

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();
        }
    }
}
Reed Jones
la source
9
Bienvenue sur Programmation Puzzles & Code Golf! Vous avez beaucoup d'espaces dans votre code que vous pouvez supprimer pour raccourcir votre code, si vous souhaitez plus d'aide pour jouer à votre code, vous pouvez consulter les conseils pour jouer au golf en C # .
Downgoat
Je suis d'accord avec @ Doᴡɴɢᴏᴀᴛ ici. J'ai pu potentiellement jouer au golf à seulement 533 octets . Mais ça pourrait être mieux. (Avertissement: je ne programme pas en C #.)
user48538
Je suis descendu à 314 avecusing 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
Manqué quelques espaces donc 310 avecusing 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
Jusqu'à 270 sans changement dans l'approche utilisée: 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','-');}}. Cependant, il y a probablement plus de potentiel ici, simplement en changeant un peu la façon de faire les choses.
Joey
6

Julia, 87 octets

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)

Il s'agit d'une fonction qui accepte deux entiers et renvoie une chaîne.

Non 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
Alex A.
la source
5

pb - 147 octets

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

C'est le genre de défi auquel, par droits, pb devrait être vraiment bon. Dessiner des images simples avec des personnages est exactement ce pour quoi pb a été conçu. Hélas, c'est juste un langage verbeux, je suppose.

Prend d'abord la longueur d'entrée, suivie de la taille. Prend l'entrée sous la forme de valeurs d'octets, par exemple:python -c 'print(chr(5) + chr(7))' | ./pbi.py ladder.pb

Regardez, une animation amusante!

Avec commentaires:

^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 '+')
métro monorail
la source
5

Pure bash, 132 130 128 127 octets

Oui, je pourrais supprimer 1 octet de plus en remplaçant le dernier ${p% *}, mais je préfère ceci:

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

Échantillon:

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
F. Hauri
la source
4

Haskell, 100 97 octets

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

Exemple d'utilisation:

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

Comment ça marche:

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 a trouvé 3 octets. Merci!

nimi
la source
m=init$[1..l]>>("|"!" "<$u)++["+"!"-"](_:m)=[1..l]>>["+"!"-"]++("|"!" "<$u)
Correspondance de motifs
Étonnamment _:m=[1..l]>>["+"!"-"]++("|"!" "<$u)fonctionne
Akangka
@ChristianIrwan: bien repéré! Merci!
nimi
3

brainfuck - 334 octets

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

Je m'attendais à ce que ce soit beaucoup plus court.

Cela met en place une "chaîne" qui ressemble | (...) |et celle qui ressemble+----(...)----+ , en imprimant chacune si nécessaire, avec un boîtier spécial pour les os en haut et en bas.

Nécessite un interprète qui utilise des cellules 8 bits et vous permet d'aller à gauche de la cellule 0 (que ce soit dans des cellules négatives ou en boucle). D'après mon expérience, ce sont les paramètres par défaut les plus courants.

Avec commentaires:

,[<+<<<<+>>>>>-]<[[>>]+[<<]>>-] 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
métro monorail
la source
3

PowerShell, 77 80

param($l,$s)$a='-'*$s
($c="o$a`o")
(($b=,"|$(' '*$s)|"*$s)+"+$a+")*--$l
$b
$c
Joey
la source
77 octets
Veskah
2

Jolf, 36 octets

Essayez-le ici!

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

Explication

ρ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 -...-
Conor O'Brien
la source
2

Perl, 98 octets

($n,$m)=@ARGV;print$h="o"."-"x$m."o\n",((("|".(" "x$m)."|\n")x$m.$h)x$n)=~s{o(-+)o(?=\n.)}{+$1+}gr
ZILjr
la source
1
Une excellente première réponse. Mais je ne vois aucun +signe dans votre code, avez-vous considéré que les barreaux intermédiaires ont des +signes à chaque extrémité?
Level River St
Merci pour le commentaire très bien rédigé - j'ai totalement espacé les signes plus! Ça m'a coûté pas mal d'espace aussi; toujours en train de penser à comment je peux le raccourcir ... en plus d'omettre le ($n,$m)=@ARGV;et de supposer que ceux-ci sont déjà définis - je ne sais pas si c'est dans l'esprit ou non. Je vais devoir chercher.
ZILjr
Sauf indication contraire dans la question, la règle est ici meta.codegolf.stackexchange.com/a/2422/15599 . Vous ne pouvez pas simplement supposer que les variables sont définies, mais vous pouvez écrire une fonction au lieu d'un programme, si cela vous aide. Je ne fais pas Perl mais je suppose que cela pourrait vous sauver la @ARGV. De plus, lorsque vous répondez à quelqu'un, n'oubliez pas d'inclure @username afin qu'il reçoive une alerte. Je n'ai pas besoin de le faire car c'est votre message.
Level River St
1

C, 122 octets

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

Essayez-le en ligne .

grc
la source
1

Tcl, 187 octets

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}

Ce code est conçu pour être placé dans un fichier contenant des arguments sur la ligne de commande. fournir le nombre de boîtes et la largeur dans cet ordre.

Cjolly
la source
1

PHP, 81 octets

Attend 2 arguments, passés lors de l'appel direct de la commande PHP. Le premier est la taille et le second est le nombre d'étapes.

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

Peut nécessiter quelques améliorations.

Ismael Miguel
la source
0

Python 2, 94 octets

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)
TFeld
la source
0

Perl 5 , 91 + 1 (-a) = 92 octets

$_='|'.$"x$F[1].'|';push@a,y/| /+-/r,($_)x$F[1]while$F[0]--;$a[0]=y/| /o-/r;say for@a,$a[0]

Essayez-le en ligne!

Xcali
la source
0

Pip -l , 35 octets

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

Essayez-le en ligne!

Explication

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

Quelques autres versions

J'ai essayé beaucoup d'approches différentes en essayant d'attraper 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

J'aime particulièrement t**bceux qui utilisent les mathématiques pour générer le motif vertical de l'échelle:

        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

Le 1000200020001peut ensuite être utilisé pour générer les motifs o|||+|||+|||oet - - - -, qui composent l'échelle. Malheureusement, je n'ai pas pu obtenir que cette approche soit plus courte que l'approche join / wrap.

DLosc
la source