그림의 출력 시각적 다이어그램


22

그림의 치수, 매트 폭 및 프레임 세로 사진의 프레임 폭을 입력하는 프로그램을 작성하십시오. 프로그램은 X그림, +매트 및 #프레임에 대한 기호 를 사용하여 다이어그램을 출력해야합니다 . 기호는 공백으로 구분해야합니다. 출력이 시각적으로 기준과 일치하는 한 후행 공백이 좋습니다. 입력은입니다 0.

입력 : 3 2 1 2 (폭, 높이, 매트 너비, 프레임 너비)

산출:

처음 3과 2는 그림 너비와 높이입니다.  1은 주위의 매트 너비입니다.  2는 전체 주위의 프레임 너비입니다.

텍스트 형태로 :

# # # # # # # # #
# # # # # # # # #
# # + + + + + # #
# # + X X X + # #
# # + X X X + # #
# # + + + + + # #
# # # # # # # # #
# # # # # # # # #

당첨 코드는 가능한 최소 바이트로 조건을 완료합니다.


2
좋은 도전! 미래의 문제에
대해서는

2
입력이 다른 순서로되어 있습니까?
vityavv

1
문자열 목록을 반환 할 수 있습니까?
MilkyWay90

5
입력이 0이 될 수 있습니까?
Laikoni

1
각 줄 끝에 공백이있을 수 있습니까?
Luis Mendo

답변:


5

파이썬 2 , 98 바이트

w,h,a,b=input()
a*='+'
b*='#'
for c in b+a+h*'X'+a+b:print' '.join(min(c,d)for d in b+a+w*'X'+a+b)

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

사양에 따라 공백으로 구분 된 격자를 인쇄합니다. 나는 즐겁게하고있어 *=변환하는 데 사용됩니다 ab문자열을 숫자에서.

파이썬 3은 ' '.joinf- 문자열과 대입 식을 사용 하여을 피함으로써 바이트를 절약 할 수 있습니다 . -2 바이트의 Jo King에게 감사합니다.

파이썬 3 , 93 바이트

def f(w,h,a,b):a*='+';b*='#';[print(*[min(c,d)for d in b+a+w*'X'+a+b])for c in b+a+h*'X'+a+b]

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


나는 outgolfed되었습니다! 좋은 직업, 꽤 골프 보인다
MilkyWay90

좋은 골프! 매우 영리한.
조지 해리스

4

자바 스크립트 (ES6)  118 113  107 바이트

(w,h,M,F)=>(g=(c,n)=>'01210'.replace(/./g,i=>c(i).repeat([F,M,n][i])))(y=>g(x=>'#+X'[x<y?x:y]+' ',w)+`
`,h)

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

댓글

(w, h, M, F) => (       // given the 4 input variables
  g = (                 // g = helper function taking:
    c,                  //   c = callback function returning a string to repeat
    n                   //   n = number of times the painting part must be repeated
  ) =>                  //
    '01210'             // string describing the picture structure, with:
    .replace(           //   0 = frame, 1 = matte, 2 = painting
      /./g,             // for each character in the above string:
      i =>              //   i = identifier of the current area
        c(i)            //   invoke the callback function
        .repeat         //   and repeat the result ...
        ([F, M, n][i])  //   ... either F, M or n times
    )                   // end of replace()
)(                      // outer call to g:
  y =>                  //   callback function taking y:
    g(                  //     inner call to g:
      x =>              //       callback function taking x:
        '#+X'           //         figure out which character to use
        [x < y ? x : y] //         according to the current position
        + ' ',          //         append a space
      w                 //       repeat the painting part w times
    )                   //     end of inner call
    + '\n',             //     append a line feed
  h                     //   repeat the painting part h times
)                       // end of outer call

3

MATL , 24 바이트

&l,ithYaQ]'#+X'w)TFX*cYv

입력은 높이, 너비, 매트 너비, 프레임 너비입니다.

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

설명

&l      % Take height and width implicitly. Push matrix of that size with all
        % entries equal to 1
,       % Do twice
  i     %   Take input
  th    %   Duplicate, concatenate: gives a 1×2 vector with the number repeated
  Ya    %   Pad matrix with those many zeros vertically and horizontally
  Q     %   Add 1 to each entry 
]       % End
'#+X'   % Push this string
w)      % Index into the string with the padded matrix
TF      % Push row vector [1 0]
X*      % Kronecker product. This inserts columns of zeros
c       % Convert to char again. Char 0 is will be displayed as space
Yv      % Remove trailing spaces in each line. Implicitly display


2

, 48 47 44 바이트

≔×NXθ≔×NXηFE+#×Nι«≔⁺ι⁺θιθ≔⁺ι⁺ηιη»Eη⪫⭆θ⌊⟦ιλ⟧ 

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 참고 : 후행 공간. 편집 : 이제 @xnor의 알고리즘을 사용합니다. 설명:

≔×NXθ≔×NXη

너비와 높이를 입력하고 Xs 문자열로 변환하십시오 .

FE+#×Nι

문자 +와를 반복 #하여 나머지 두 입력에 의해 주어진 길이의 문자열로 변환합니다. 그런 다음 두 문자열을 반복하십시오.

«≔⁺ι⁺θιθ≔⁺ι⁺ηιη»

매트와 프레이밍을위한 줄로 그림에 접두사와 접미사를 붙입니다.

Eη⪫⭆θ⌊⟦ιλ⟧ 

문자열을 반복하여 가로 및 세로 문자를 최소화 한 다음 행 간격을 두 줄로 지정하여 각 행을 암시 적으로 자체 행에 인쇄합니다.


2

05AB1E (레거시) / 05AB1E --no-lazy , 32 31 바이트

и'Xׄ+#vyI©×UεX.ø}®FDнgy×.ø]€S»

순서대로 입력을 height, width, matte, frame받습니다. 챌린지에 지정된 입력 순서가 엄격한 경우 (아직 확인을 위해 OP를 기다리는 중 s) +1 바이트에 대해 선행 (스왑)을 추가 할 수 있습니다.

--no-lazyElixir는 중첩 된 맵 / 루프에 대한 지연 평가 ( 여기서는이 플래그가없는 결과) 로 인해 이상한 동작을하기 때문에 새 버전의 05AB1E에 Elixir 컴파일러 플래그가 필요했습니다 .

기존 버전의 05AB1E에서 온라인으로 사용해보십시오. 플래그
가 추가 된 새 버전의 05AB1E에서 온라인으로 사용해보십시오 --no-lazy.

설명:

и              # Repeat the second (implicit) input the first (implicit) input amount of
               # times as list
 'X×          '# Repeat "X" that many times
„+#v           # Loop `y` over the characters ["+","#"]:
    y          #  Push character `y`
     I         #  Push the next input (matte in the first iteration; frame in the second)
      ©        #  And store it in the register (without popping)
       ×       #  Repeat character `y` that input amount of times
        U      #  Pop and store that string in variable `X`
    εX.ø}      #  Surround each string in the list with string `X`
    ®F         #  Inner loop the value from the register amount of times:
      Dнg      #   Get the new width by taking the length of the first string
         y×    #   Repeat character `y` that many times
             #   And surround the list with this leading and trailing string
   ]           # Close both the inner and outer loops
    S         # Convert each inner string to a list of characters
      »        # Join every list of characters by spaces, and then every string by newlines
               # (and output the result implicitly)




1

파이썬 3.8 (시험판) , 116 (115) 113 바이트

lambda a,b,c,d:"\n".join((g:=['#'*(a+2*c+2*d)]*d+[(h:='#'*d)+'+'*(a+c*2)+h]*c)+[h+'+'*c+'X'*a+'+'*c+h]*b+g[::-1])

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

골프에서의 첫 시도는 곧 개선 될 것입니다. a너비, b높이, c매트 너비 및d 프레임 너비입니다.

사용 바이트 -1 :=정의하는 오퍼레이터 h로서e * d

Jo King 덕분에 e 및 f 매개 변수를 제거 할 것을 제안하는 -2 바이트

설명:

lambda a,b,c,d:          Define a lambda which takes in arguments a, b, c, and d (The width of the painting, the height of the painting, the padding of the matte, and the padding of the frame width, respectively).
    "\n".join(                       Turn the list into a string, where each element is separated by newlines
        (g:=                         Define g as (while still evaling the lists)...
            ['#'*(a+2*c+2*d)]*d+       Form the top rows (the ones filled with hashtags)
            [(h:='#'*d)+'+'*(a+c*2)+h]*c Form the middle-top rows (uses := to golf this section)
        )+
        [h+'+'*c+'X'*a+'+'*c+h]*b+       Form the middle row
        g[::-1]                      Uses g to golf the code (forms the entire middle-bottom-to-bottom)
    )

e과제를 제거 하면 2 바이트 f가 절약 되고 과제는 아무것도 절약하지 않습니다.
Jo King

오 와우 @JoKing, 난을 제거하는 것을 잊었다 ef 발견 후 할당을 g바로 가기
MilkyWay90

0

자바 스크립트, 158 바이트

(w,h,m,f)=>(q="repeat",(z=("#"[q](w+2*(m+f)))+`
`)[q](f))+(x=((e="#"[q](f))+(r="+"[q](m))+(t="+"[q](w))+r+e+`
`)[q](m))+(e+r+"X"[q](w)+r+e+`
`)[q](h)+x+z)

아마 약간 다듬을 수 있습니다

f=

(w,h,m,f)=>(q="repeat",(z=("# "[q](w+2*(m+f))+`
`)[q](f))+(x=((e="# "[q](f))+(r="+ "[q](m))+(t="+ "[q](w))+r+e+`
`)[q](m))+(e+r+"X "[q](w)+r+e+`
`)[q](h)+x+z)

console.log(f(3,2,1,2))


0

펄 6 , 98 바이트

{map(&min,[X] map (($_='#'x$^d~'+'x$^c)~'X'x*~.flip).comb,$^a,$^b).rotor($b+2*($c+$d)).join("\n")}

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

이것은 포트입니다 xnor의 Python answer .

펄 6 , 115 바이트

->\a,\b,\c,\d{$_=['#'xx$!*2+a]xx($!=c+d)*2+b;.[d..^*-d;d..^a+$!+c]='+'xx*;.[$!..^*-$!;$!..^a+$!]='X'xx*;.join("
")}

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

Perl 6의 다차원 목록 할당을 사용하는 대략적인 익명의 코드 블록. 예를 들어 목록에서 색인 2가있는 요소에 색인 1 @a[1;2] = 'X';이 할당 'X'되고 @a[1,2,3;3,4,5]='X'xx 9;모든 요소가 색인으로 바뀝니다.3,4,5 이있는 이있는 색인 1,2,3으로 바뀝니다 'X'.

설명:

첫째, 우리는 같은리스트를 초기화 a+2*(c+d)b+2*(c+d)의 사각형 #의.

$_=['#'xx$!*2+a]xx($!=c+d)*2+a;
State:
# # # # # # # # #
# # # # # # # # #
# # # # # # # # #
# # # # # # # # #
# # # # # # # # #
# # # # # # # # #
# # # # # # # # #
# # # # # # # # #

그런 다음 +s 의 내부 사각형을 할당합니다

.[d..^*-d;d..^a+$!+c]='+'xx*;
State:
# # # # # # # # #
# # # # # # # # #
# # + + + + + # #
# # + + + + + # #
# # + + + + + # #
# # + + + + + # #
# # # # # # # # #
# # # # # # # # #

마지막으로 Xs 의 가장 안쪽 사각형입니다 .

.[$!..^*-$!;$!..^a+$!]='X'xx*;
# # # # # # # # #
# # # # # # # # #
# # + + + + + # #
# # + X X X + # #
# # + X X X + # #
# # + + + + + # #
# # # # # # # # #
# # # # # # # # #

0

젤리 , 35 31 28 24 바이트

Dịx@“#+X+#”
⁽-Fç«þ⁽-ȥç$G

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

순서 프레임, 매트, 너비, 높이로 입력을받습니다. 쉼표로 구분됩니다. 프레임과 매트를 사용하여 ASCII 아트 그림을 출력합니다. 입력 순서가 엄격한 경우 원래 게시물에 따라 더 많은 바이트를 추가해야합니다.

@EriktheOutgolfer의 답변을 기반으로 한 골프 커플; 나는 문자가 ASCII 순서라는 것을 깨달았지만 그것을 최대한 활용하는 방법을 생각하지 않았고 잊어 버렸습니다 G. 그래도 그의 대답은 여전히 ​​낫습니다!


나는 Jelly로 프로그래밍하지 않지만 반드시 43134,43234를 압축 할 수 있습니까? 편집 : 나는 읽는 법을 배울 필요가 있습니다. 실제로 4 바이트로 인코딩 할 수 있다고 언급했습니다. 그러나 이러한 숫자를 인코딩 할 수 있는지 여부와 관련하여 입력 순서는 무엇입니까? : S
Kevin Cruijssen

@KevinCruijssen은 2 바이트 구문을 사용하여 인코딩 할 수있는 최대 정수는 32250입니다. 둘 다 바이트를 저장할 수 없다는 것을 초과하기 때문입니다. 지금은 물건을 바꾸고 허용되지 않으면 되돌릴 수 있다고 가정합니다!
Nick Kennedy

아 알 겠어요 431343 개의 인코딩 문자가 필요합니다. 여기에는 선행 / 트레일 문자를 포함하여 인코딩 된 바이트도 5 바이트임을 나타냅니다. 그리고 Jelly는 두 번째 숫자가 첫 번째 숫자보다 100이 커서 어떤 종류의 복제본을 가지고 있습니까? Jelly 에서 동작이 43134를 밀고, 복제하고, 100을 밀고, 더할 수 있는지 , 더 짧은 지 확실하지 않습니까?
케빈 크루이 센

@KevinCruijssen 원래 +0,100을 사용하여 아무것도 저장하지 않았습니다. 나는 nilad 체인을 사용하여 nilad ³가 100이라는 사실을 사용할 수 있다고 생각하지만, 입력을 재정렬 할 수 있다면 기본 250 정수가 더 좋습니다
Nick Kennedy

0

펄 5, 115 바이트

$_=(X x$F[0].$/)x$F[1];sub F{s,^|\z,/.*/;$_[0]x"@+".$/,ge,s/^|(?=
)/$_[0]/gm while$_[1]--}F('+',$F[2]);F('#',$F[3])

TIO


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