일부 ASCII 상자 그리기


19

음이 아닌 정수의 두 목록을 가져 와서 아래 정의 된대로 ASCII 상자를 출력하십시오.

  • 모서리와 교차점은 플러스입니다. +(ASCII 코드 43)
  • 세로줄은 막대 |(ASCII 코드 124)
  • 수평선은 마이너스입니다 -(ASCII 코드 45).

첫 번째 입력 목록은 가로 방향으로 각 더하기 부호 사이의 마이너스 수를 지정합니다.

두 번째 입력 목록은 세로 방향으로 각 더하기 부호 사이의 막대 수를 지정합니다.

몇 가지 예를 들어 설명하기가 더 쉽습니다.

0    // No minuses between each + sign
0    // No bars between + signs

++
++

------------------
1 2   // First a single minus, then two minuses 
1 2   // First  one bar, then two bars

+-+--+
| |  |
+-+--+
| |  |
| |  |
+-+--+


------------------
1 0 3 0 2 0
2 1 0 0

+-++---++--++
| ||   ||  ||
| ||   ||  ||
+-++---++--++
| ||   ||  ||
+-++---++--++
+-++---++--++
+-++---++--++

설명 :

  • 입력 순서 및 형식은 선택 사항입니다
  • 상자 만 인쇄 / 표시해야하지만 후행 또는 줄 바꿈이 허용됩니다.
  • 더 편리한 경우 선택적으로 모든 입력 값에 1을 추가 할 수 있습니다. 두 번째 예는 다음과 같습니다 2 3; 2 3..

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


답변:


5

MATL , 25 22 21 바이트

'|-+ '2:"1tiYsQ(]E!+)

1추가 된 입력을 사용합니다 (챌린지에서 허용 함).

온라인으로 사용해보십시오!

설명

이 코드는 초기 1에 최종 결과에서 공백이 아닌 문자의 열 인덱스를 포함하는 배열을 작성합니다 0. 첫 번째 입력은 경우에 따라서 [2 1 4 1 3 1](것이다 [1 0 3 0 2 0]0 계 형식)이 배열 것

1 0 1 1 0 0 0 1 1 0 0 1 1

런 길이가 입력과 어떻게 관련되어 있는지 확인하십시오. 특히이 배열은 다음과 같이 빌드됩니다.

  1. 배열을 단일로 초기화합니다 1.
  2. 입력의 누적 합계를 계산하고 추가 1합니다. 이 예에서는 [3 4 8 9 12 13].
  3. 12 단계에서 제공 한 (1부터 시작) 인덱스를 사용하여 항목을 할당 하여 1 단계부터 배열을 확장하십시오 . 중간 항목은 자동으로로 설정됩니다 0.

행에 대해 유사한 배열이 작성됩니다. 두 번째 입력 [3 2 1 1](또는 [2 1 0 0 ])은

1 0 0 1 0 1 1 1

이제 두 번째 배열 2에을 곱하고 , 바꾼 다음 첫 번째에 브로드 캐스트를 추가합니다. 이것은 2D 배열을 제공합니다

3 2 3 3 2 2 2 3 3 2 2 3 3
1 0 1 1 0 0 0 1 1 0 0 1 1
1 0 1 1 0 0 0 1 1 0 0 1 1
3 2 3 3 2 2 2 3 3 2 2 3 3
1 0 1 1 0 0 0 1 1 0 0 1 1
3 2 3 3 2 2 2 3 3 2 2 3 3
3 2 3 3 2 2 2 3 3 2 2 3 3
3 2 3 3 2 2 2 3 3 2 2 3 3

문자열로 인덱싱 '|-+ '하면 최종 결과가 2D char 배열로 제공됩니다. 인덱싱은 모듈 식이며 1 기반이므로 인덱스 0는 마지막 요소 (공간)에 해당합니다.

'|-+ '                   % Push this string
      2:"       ]        % Do this twice
         1               % Push 1 (initial array)
          t              % Push another 1 (contents to be filled in)
           i             % Take input
            Ys           % Cumulative sum
              Q          % Add 1
               (         % Fill 1 into those entries of the array
                 E       % Multiply by 2
                  !      % Transpose
                   +     % Add, with broadcast
                    )    % Index (modular, 1-based) into the string

6

파이썬 2, 117 바이트

def f(h,v):r="+"+"+".join("-"*i for i in h)+"+\n";print r+r.join(("|"+"|".join(" "*i for i in h)+"|\n")*i for i in v)+r

아이디어로 사용해보십시오.

이것으로부터 너무 많이 기대하지 않습니다. 정말 간단합니다. 파이썬 조인과 문자열 곱셈을 사용하여 모든 것을 하나로 모으십시오.


6

자바 스크립트 (ES6), 83 바이트

(a,b,g=(a,[s,t])=>t+a.map(n=>s.repeat(n)+t).join``+`
`)=>g(b,[g(a,` |`),g(a,`-+`)])

출력에는 두 개의 후행 줄 바꿈이 포함됩니다.


와. 그래서 비슷한 답변이 거의 동시에 게시되었습니다. ;)
Arnauld

(하지만 당신은 2 분 2 바이트만큼 나를 이겼습니다.)
Arnauld

@Arnauld 당신은 당신의 데모에 시간을 낭비 ;-)
Neil

맞아, 그런가 봐. ^^ 흥미롭게도 내 버전은 두 줄 바꿈 줄이있는 81 바이트입니다.
Arnauld



1

하스켈, 55 바이트

f[a,b]x=a:do n<-x;(b<$[1..n])++[a]
g x=f[f"+-"x,f"| "x]

g두 개의 입력 목록을 가져 와서 출력 행이 포함 된 목록을 반환 하는 함수 를 정의합니다.


0

PowerShell v2 +, 89 바이트

param($a,$b)($x="+$(($a|%{'-'*$_})-join'+')+")
$b|%{,"|$(($a|%{' '*$_})-join'|')|"*$_;$x}

Dang, 내가 JavaScript를 잘 잡을 수 있다고 생각하지 않습니다.

입력 소요 $a$b명시 적 배열로합니다. $x루프 스루 $a및 일부 문자열 연결 을 기반으로 variable 을 상자의 맨 위 행으로 설정합니다 . 그것은 parens로 캡슐화되어 파이프 라인에 배치됩니다. 그런 다음, 반복 할 $b때마다 반복 할 때마다 동일한 스타일 문자열이지만 공백과 |하이픈 대신 및 +, 및 두 개의 문자열이 파이프 라인에 배치됩니다 $x. 이러한 문자열은 모두 Write-Output프로그램 완료시 암시 적으로 파이프 라인에서 수집 되며 기본 줄 바꿈이 있습니다.

PS C:\Tools\Scripts\golfing> .\make-some-ascii-boxes.ps1 @(0) @(0)
++
++

PS C:\Tools\Scripts\golfing> .\make-some-ascii-boxes.ps1 @(1,0,3,0,2,0) @(2,1,0,0)
+-++---++--++
| ||   ||  ||
| ||   ||  ||
+-++---++--++
| ||   ||  ||
+-++---++--++
+-++---++--++
+-++---++--++

PS C:\Tools\Scripts\golfing> .\make-some-ascii-boxes.ps1 @(1,4,1) @(1,2,1)
+-+----+-+
| |    | |
+-+----+-+
| |    | |
| |    | |
+-+----+-+
| |    | |
+-+----+-+

0

루비, 66 바이트

->x,y{d=->c,m,z=x{c+z.map{|w|m*w}*c+c+$/}
d[d[?+,?-],d[?|,' '],y]}

0

젤리 , 30 26 바이트

Ḣị“+-“| ”ị@
1;+\Ṭ
Ç€,€/Ñ€Y

TryItOnline 에서 테스트

어떻게?

입력은 두 목록의 목록이며 [vertical, horizontal]증가 된 옵션을 사용합니다
.-예 3에서는 [[3,2,1,1], [2,1,4,1,3,1]]
각각이 rowType 또는 rowCharacterType을 나타내는 부울 배열로 변환됩니다. 예를 들어 [[1,0,0,1,0,1,1,1], [1,0,1,1,0,0,0,1,1,0,0,1,1]]
상자는 즉 ROWTYPE 식별 중 - ROWTYPE 및 rowCharacterType 조합에 의해 식별되는 문자 "+-"또는 "| "과 rowCharacterType 식별이 두 문자 중 하나.

Ḣị“+-“| ”ị@ - Link 1, create a row: [rowType, [rowCharaterTypes]]
Ḣ           - head - get the rowType
  “+-“| ”   - list of strings ["+-", "| "]
 ị          - index into (if rowType is 1 "+-"; if rowType is 0 "| ")
         ị@ - index into with reversed operands (index into that from rowCharaterTypes)
                (replace each 1 in rowCharaters with "+" or "|" and each 0 with "-" or " ")

1;+\Ṭ - Link 2, create the Type lists from the inputs: int[] nCharacters
1;    - 1 concatenated with the input
  +\  - reduce with addition (accumulation provides the indices)
    Ṭ - boolean array with 1s at those indices
            As an example take the vertical of example 3:
            [3,2,1,1] -> [1,3,2,1,1] -> [1,4,6,7,8] -> [1,0,0,1,0,1,1,1]
            each of which will be passed as a rowType for Link 1

Ç€,€/Ñ€Y - Main link, takes one argument: [Vertical, Horizontal] (incremented option)
Ç€       - call the last link (2) for each of the two lists in the input
  ,€/    - pair each and reduce (making a list of [rowtype [rowCharacterTypes]])
     р  - call the next link (1) for each
       Y - join on line feeds
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.