ASCII 래더 작성


28

두 개의 정수 nm 을 입력하면 길이 n 과 크기 m 의 ASCII 래더를 출력합니다 .

이것은 길이 3과 크기 3의 ASCII 래더입니다.

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

길이가 5이고 크기가 1 인 ASCII 래더입니다.

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

길이 2와 크기 5의 ASCII 래더입니다.

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

구체적으로 :

  • 길이 ( n )는 사다리가 구성된 사각형의 수를 나타냅니다.

  • 크기 ( m )는 각 사각형의 내부, 즉 "테두리"를 세지 않는 폭과 높이를 나타냅니다.

  • 각 정사각형은 공간으로 채워진 내부 영역으로 구성되어 있으며 -, 위쪽과 아래쪽에 |s, 왼쪽과 오른쪽에 +s , 그리고 네 모퉁이 에 s로 둘러싸여 있습니다.

  • 사각형 사이의 경계는 서로 합쳐 지므로 한 줄에있는 두 줄이 +--...--+하나로 합쳐집니다.

  • 전체 사다리의 모서리가 문자로 바뀝니다 o.

  • 선택적으로 후행 줄 바꿈을 출력 할 수 있습니다.

사다리의 길이 ( n )는 항상 2 이상 이고 크기 ( m )는 항상 1 이상입니다.

입력은 공백 / 쉼표로 구분 된 문자열, 배열 / 목록 등 또는 두 개의 함수 / 명령 줄 등으로 사용할 수 있습니다. 인수. 가장 편리한 / 골프적인 순서로 인수를 취할 수 있습니다.

이것은 이므로 바이트 단위의 가장 짧은 코드가 이깁니다.

팁 : 위의 예는 테스트 사례로도 사용할 수 있습니다.


먼저 길이를 가져와야합니까?
RK.

@RK. 더 편리한 순서로 가져갈 수 있습니다.
Doorknob

1
주요 개행 이있을 수 있습니까?
코너 O'Brien

1
@ CᴏɴᴏʀO'Bʀɪᴇɴ Uhh ... 나는 그 중 하나에 갈거야.
Doorknob

1
알았어.
Conor O'Brien

답변:


4

Pyth, 34 바이트

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

테스트 스위트

STDIN에서 분리 된 인수 개행을 취합니다.

:세 문자에서 각 유형의 세로 문자열을 빌드 한 다음 필요에 따라 복제하고 줄 바꾸기에서 조인하고 조인 하는 도우미 함수를 사용합니다 .


11

루비, 71

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

테스트 프로그램에서 ungolfed

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]

골프 버전에는 사소한 문제가있는 것 같습니다 : ;after after h=0, space after puts. 그러나 이전에 여분의 공간이 있으므로 점수는 1 자로 만 증가합니다 puts.
manatwork

@manatwork 죄송합니다. 어떻게되는지 모르겠습니다. 골프를 쳤고 나중에는 달리지 않아야합니다.
레벨 리버 St

9

CJam, 43 42 바이트

나는 점수에 불만이 없습니다. 하지만 난 데니스가 아니에요

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

입력은 2 개의 공백으로 구분 된 항목입니다. 먼저 길이

2 3
o---o
|   |
|   |
|   |
+---+
|   |
|   |
|   |
o---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
나는 당신이 질문으로 말한 것을 좋아합니다. "나는 데니스가 아니야 ... 맞지?"
undergroundmonorail

7

자바 스크립트 (ES6), 89

... 반복, 반복, 반복 ...

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

테스트

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>


나는 그것을 document.getElementById('elem').대체 할 수 있다는 것을 몰랐다 elem.! +1이지만 이에 대한 문서를 알려 주시겠습니까?
F. Hauri

2
@ F.Hauri는 거의 모든 브라우저에서 작동하지만 피해야합니다 (재미를 위해 코딩 할 때 제외). 정보 및 링크 stackoverflow.com/questions/3434278/…
edc65

6

C #, 1412 바이트

... 내 첫 CodeGolf 시도, 이길 가능성은 없지만 여기에서 작동합니다.

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
프로그래밍 퍼즐 및 코드 골프에 오신 것을 환영합니다! 코드에 공백을 많이 사용하여 코드를 줄이려고 제거 할 수 있습니다. 코드를 골프에 추가로 도움이 필요하면 C #에서 골프를위한 팁을 확인하십시오 .
Downgoat

여기 @ Doᴡɴɢᴏᴀᴛ에 동의합니다. 잠재적으로 533 바이트로 골프를 칠 수있었습니다 . 그러나 더 나을 수 있습니다. (경고 : C #으로 프로그램하지 않습니다.)
user48538

나는 314에 그것을 아래로 가지고using 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
310와 몇 공간을 using 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);}}
그리워

2
사용 된 접근 방식을 변경하지 않고 270까지 감소 : 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','-');}}. 그러나 일을 조금하는 방법을 바꾸는 것만으로도 더 많은 가능성이 있습니다.
Joey

6

줄리아, 87 바이트

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)

두 개의 정수를 허용하고 문자열을 반환하는 함수입니다.

언 골프 드 :

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 바이트

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

이것은 권리에 의해 pb가 정말로 잘되어야하는 일종의 도전이다. 문자로 간단한 그림을 그리는 것은 pb를위한 것입니다. 아아, 그것은 내가 생각하는 말로 표현하는 언어 일뿐입니다.

입력 길이를 먼저 취한 다음 크기를 가져옵니다. 바이트 값의 형태로 입력을받습니다 (예 :python -c 'print(chr(5) + chr(7))' | ./pbi.py ladder.pb

이봐, 재미있는 애니메이션!

의견 :

^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

순수 배쉬, 132130128 127 바이트

${p% *}, 마지막 바이트를 1 바이트 더 떨어 뜨릴 수는 있지만 이것을 선호합니다.

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() {
    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

하스켈, 100 97 바이트

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

사용 예 :

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

작동 방식 :

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]

편집 : @Christian Irwan은 3 바이트를 찾았습니다. 감사!


-1 점수에 대한 m=init$[1..l]>>("|"!" "<$u)++["+"!"-"](_:m)=[1..l]>>["+"!"-"]++("|"!" "<$u)
패턴 일치

놀랍게도 _:m=[1..l]>>["+"!"-"]++("|"!" "<$u)작동
Akangka

@ChristianIrwan : 잘 발견되었습니다! 감사!
nimi

3

brainfuck-334 바이트

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

나는 이것이 훨씬 짧을 것으로 예상했다.

이렇게 하면 위와 아래에있는 특수한 케이싱과 함께 필요에 따라 각각 인쇄 | (...) |되는 것처럼 보이는 "스트링" 과 하나 의 "스트링"이 설정됩니다 .+----(...)----+o

8 비트 셀을 사용하고 셀 0에서 왼쪽으로 이동할 수있는 인터프리터가 필요합니다 (음수 셀 또는 루핑으로). 내 경험상 가장 일반적인 기본 설정입니다.

의견 :

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

줄프, 36 바이트

여기 사용해보십시오!

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

설명

ρ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
An excellent first answer. But I don't see any + signs in your code, have you considered that the intermediate rungs have + signs at each end?
Level River St

Thank you for the very nicely worded comment--I totally spaced the plus signs! Cost me quite a bit of space, too; still thinking of how I can shorten it... besides omitting the ($n,$m)=@ARGV; and assuming those are set already--not sure if that's in the spirit or not. I'll have to look it up.
ZILjr

Unless otherwise specified in the question, the rule is here meta.codegolf.stackexchange.com/a/2422/15599 . You can't just assume the variables are set, but you can write a function instead of a program, if that helps. I don't do Perl but I assume that might save you the @ARGV. Also, when replying to someone remember to include @username so they get an alert. I don't need to do it as this is your post.
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;}

Try it 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}

This code is made to put into a file with arguments input on the command line. provide number of boxes and width in that order.


1

PHP, 81bytes

Expects 2 arguments, passed when calling the PHP command directly. The first one is the size and the 2nd one is the number of steps.

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

May require some improvements.


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

Try it online!

Explanation

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

Some other versions

I tried a lot of different approaches trying to catch 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

I'm particularly fond of the t**b ones, which use math to generate the ladder's vertical pattern:

        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

The 1000200020001 can then be used to generate the patterns o|||+|||+|||o and - - - -, which make up the ladder. Unfortunately, I couldn't get this approach to be shorter than the join/wrap approach.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.