ASCII 아트를 3 차원으로 가져 오기


11

이 도전에서는 ASCII 아트 (보통 2D)를 3D로 가져와야합니다!

어떻게?

이렇게

X X DD 
 X  D D
X X DD 

에...

  X X DD 
 X X DD D
X X DDDD 
 X XDDD
X X DD

그럼 어떻게 우리가 할 것을 ?

아스키 아트와을 고려하여 이번에도 N반복하십시오 N.

  • 모든 캐릭터에 대해 (우리는 이것을 호출 할 것입니다 A) :
  • B정확히 1에서 1까지의 문자를 보자.A
  • 경우는 B공백 또는 정의되지 않는다 :
  • 로 설정 B하십시오 A.

명세서

  • 첫 번째 입력은 개행 문자가 포함 된 문자열이거나 2D ASCII 아트를 나타내는 문자열 목록 일 수 있습니다.
  • %END%입력 끝을 태그하는 데 사용할 수 있지만 필수는 아닙니다.
  • 두 번째 입력은 N . 양의 정수가됩니다.
  • 줄의 모든 줄의 길이는 같습니다.

예

입력: ("###\n###",1)

산출:

 ###
####
###

규칙

기본 규칙이 적용됩니다.

또한 궁금한 점이 있으면 의견을 보내주십시오!


"공백"은 공간 (U + 0020)을 나타내거나 아무것도 나타내지 않을 수 있습니다.
— Leaky Nun

@LeakyNun 지금 수정 되었습니까?

여분의 공백이 허용됩니까?
— Leaky Nun

네, 허용됩니다.

1
각 줄의 길이가 같다고 가정 할 수 있습니까? (입력을 오른쪽에 공백으로 미리
— 채울 수

답변:


18

펄, 81 바이트

75 바이트 코드 + 6 -i -n0.
참고 것을 \e문자가 ASCII입니다 \x1b만\e 테스트의 용이성을 위해 사용된다.

이 솔루션은 ANSI 이스케이프 시퀀스를 사용하며 호환 가능한 터미널과 -i명령 행 인수를 사용하여 원하는 '치수'수를 전달해야합니다.

$n=s/^//mg-1;s/ /\e[1C/g;print(s/^/\e[${^I}C/grm."\e[${n}A"),--$^I for($_)x$^I

용법:

Linux 호환 터미널에서 PS1=프롬프트가 표시된 이미지를 덮어 쓰지 않도록 먼저 실행 하십시오.

perl -i10 -n0e '$n=s/^//mg-1;s/ /\e[1C/g;print(s/^/\e[${^I}C/grm."\e[${n}A"),--$^I for($_)x$^I' <<< ' 
ROFL:ROFL:ROFL:ROFL
         _^___
 L    __/   [] \    
LOL===__        \ 
 L      \________]
         I   I
        --------/
'

          ROFL:ROFL:ROFL:ROFL
         ROFL:ROFL:ROFL:ROFL
        ROFL:ROFL:ROFL:ROFL
       ROFL:ROFL:ROFL:ROFL\
      ROFL:ROFL:ROFL:ROFL\_]
     ROFL:ROFL:ROFL:ROFL\_]
    ROFL:ROFL:ROFL:ROFL\_]/
   ROFL:ROFL:ROFL:ROFL\_]/
  ROFL:ROFL:ROFL:ROFL\_]/
 ROFL:ROFL:ROFL:ROFL\_]/
   LOL==___^___]_\_\_]/
  LOL==__/ \_[]_\_\_]/
 LOL===__ \______\_]/
  L      \________]/
          I---I---/
         --------/

perl -i3 -n0e '$n=s/^//mg-1;s/ /\e[1C/g;print(s/^/\e[${^I}C/grm."\e[${n}A"),--$^I for($_)x$^I' <<< 'X X DD
 X  D D
X X DD
'
   X X DD
  X X DD D
 X X DDDD
  X XDDD
 X X DD

8

CJam, 25 24 바이트

{{' 1$f+La@+..{sS@er}}*}

문자열 목록과 스택의 반복 횟수를 예상하고 대신 새 문자열 목록을 남기는 명명되지 않은 블록입니다.

여기에서 테스트하십시오.편의상 STDIN에서 문자열을 읽는 테스트 랩퍼를 포함합니다.

설명

{       e# Repeat this block N times...
  '     e#   Push a space character.
  1$    e#   Copy the current grid.
  f+    e#   Prepend the space to each line of the grid.
  La    e#   Push [[]].
  @+    e#   Pull up the other copy of the grid and prepend the [].
        e#   We've now got two copies of the grid, one shifted right by
        e#   a cell and one shifted down by a cell. We now want to replace
        e#   spaces in the latter with the corresponding character in the
        e#   former.
  ..{   e#   For each pair of characters in corresponding positions...
    s   e#     Turn the character in the down-shifted grid into a string.
    S   e#     Push " ".
    @   e#     Pull up the character from the right-shifted grid.
    er  e#     Replace spaces with that character.
  }
}*

5
10 개의 장난 꾸러기! goo.gl/PEK4iB

S초기 공간 에서는 왜 작동하지 않습니까? 또한 함수에서 변수를 덮어 쓸 수 있습니까?
— Luis Mendo

@LuisMendo S는 작동하지 않습니다 f. 대신 해당 문자열을 매핑 하기 때문 입니다. Re 함수는 "정상적인"언어에서 호출 사이에 훼손되지 않은 전역에 의존하는 많은 함수 제출도 있다고 생각합니다.
— 마틴 엔더

감사. CJam의 문자가 한 문자 문자열과 같지 않다는 것을 잊었습니다.
— Luis Mendo

1
convex를 사용하면 2 문자 대신 1 문자 음역 연산자를 사용할 수 있으므로 Convex를 사용하여 1 바이트를 절약 할 수 있습니다. convex.tryitonline.net/… (shameless plug)
— GamrCorps

4

APL, 49 바이트

{⎕UCS 32⌈{s+(s=0)×1⊖¯1⌽s←0⍪⍵,0}⍣⍺⊣(32∘≠×⊣)⎕UCS↑⍵}

입력 : 문자형 벡터로 구성된 벡터입니다. 예:

      2 {⎕UCS 32⌈{s+(s=0)×1⊖¯1⌽s←0⍪⍵,0}⍣⍺⊣(32∘≠×⊣)⎕UCS↑⍵} 'X X DD' ' X  D D' 'X X DD'
  X X DD 
 X X DD D
X X DDDD 
 X XDDD  
X X DD   

작동 방식 :

  • ↑⍵ 인수를 문자 행렬로 변환
  • ⎕UCS 문자에서 정수로
  • (32∘≠×⊣) 공백 (32)을 0으로 바꾸십시오
  • ...⍣⍺⊣ 왼쪽의 함수에 ⍺ (왼쪽 인수) 곱하기
  • s←0⍪⍵,0 인수의 상단과 오른쪽에 0이있는 경계
  • 1⊖¯1⌽ 1을 오른쪽으로 1 회전
  • s+(s=0)× 원래 버전의 이동 된 버전과 합하지만 원래 0의 맨 위에 만
  • 32⌈ 0을 32로 되돌립니다.
  • ⎕UCS 정수에서 문자까지

4

MATL , 24 바이트

:"ct32>*TTYatFTEqYSy~*+c

입력 형식은

2
{'X X DD', ' X  D D', 'X X DD'}

다른 예는

1
{'###', '###'}

출력에 추가 공백이 포함되어 있으며이 공백은 챌린지에 의해 허용됩니다.

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


2D char 배열이 입력으로 허용 가능한 경우 (OP에 두 번 요청했습니다 ...) 첫 번째 바이트를c 제거 할 수 있으므로 23 바이트 :

:"t32>*TTYatFTEqYSy~*+c

이 경우 입력 형식은 다음과 같습니다 (모든 문자열의 길이가 동일하므로 공백이있는 오른쪽 여백이 필요할 수 있음).

2
['X X DD '; ' X  D D'; 'X X DD ']

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


설명

:        % Input number n implicitly. Generate [1 2 ... n]
"        % For loop: repeat n times
  c      %   Convert to char array. In the first iteration it inputs a cell array of
         %   strings implicitly and converts to a 2D char array, right-padding with
         %   spaces. In the next iterations it does nothing, as the top of the stack
         %   is already a 2D char array
  t32>*  %   Convert characters below 32 into 0
  TT     %   Push array [1 1]
  Ya     %   Pad the 2D char array with one zero in the two directions (up/down,
         %   left/right), on both sides
  t      %   Duplicate
  FTEq   %   Push array [-1 1]
  YS     %   Circularly shift the 2D char array one unit up and one unit right
  y      %   Push a copy of the non-shifted 2D array
  ~      %   Logical negate: nonzero entries become 0, zero entries become 1. This
         %   will be used as a mask for entries that need to be changed. Since the
         %   values at those entries are zero, we can simply add the new values. We do
         %   that by multiplying the mask by the shifted array and adding to the
         %   non-shifted array
  *      %   Multiply element-wise
  +      %   Add element-wise
  c      %   Convert the 2D array back to char
         % End for
         % Implicitly display

3

볼록 , 23 바이트

바이트 수는 CP-1252 인코딩을 가정합니다.

{{' 1$f+La@+..{sS@Ë}}*}

문자열 목록과 스택의 반복 횟수를 예상하고 대신 새 문자열 목록을 남기는 명명되지 않은 블록입니다.

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

이것은 CJam에 대한 Convex (CJam에 크게 기반)에 대한 직접적인 포트입니다 . 유일한 차이점은 음역 Ë대신 Convex가 사용 er하여 1 바이트를 절약 한다는 것입니다 . 알려 주신 GamrCorps에게 감사드립니다.


2

Pyth, 54 33 바이트

ju+++dhG.bsmh|-d;;.t,Y+dNdtGGeG.*

테스트 스위트.


왜 두 개가 필요 ;합니까?
— Ven

프로그래밍 언어 ;에서는 @ven 이 일반적이지 않습니다 ;.
— Leaky Nun

;변수입니다.
— Leaky Nun

아 pyth 과부하 ;람다에서 ...
— 벤

당신이 Pyth 함께 얻을 때 @ven, 당신이 사용하는 것 I, .?, V, F, ;, (명시 적 문)은 매우 이하, 그들은에 의해 대체 될 것이다 ?, m, u, F, M, L, R, #, ...
— 새는 수녀

2

JavaScript (ES6), 128 바이트

f=(a,n)=>n?f((a=[``,...a].map(s=>[...s||` `])).map((b,i)=>i--&&b.map((c,j)=>a[i][++j]>' '?0:a[i][j]=c))&&a.map(b=>b.join``),n-1):a

문자열 배열을 수락하고 반환하고 출력에 추가 행을 추가하고 각 행에 최소한 공백이 있는지 확인하고 모두 공백으로 문자를 분할하고 문자를 위의 행과 열의 오른쪽에 복사하려고 시도하지만 루프합니다. 루프를 완료하기 위해 재귀 적으로 호출합니다.


2

파이썬 2, 116 바이트

S=' '
def f(a,d):e=[S*len(`a`)];exec"a=[''.join(t[t[1]>S]for t in zip(S+x,y+S))for x,y in zip(a+e,e+a)];"*d;return a

더 빨리 골프하겠습니다.


확실 lambda하지 않습니까?
— wizzwizz4

e거기에 과제가 필요합니다 . 또한 exec성명서이므로 람다에있을 수 없습니다.
— Lynn

확인. 그냥 확인하십시오.
— wizzwizz4

2

루비, 95 바이트

->a,n{n.downto(0){|i|f="<Esc>[1C"
$><<a.gsub(/^/,f*i).gsub(" ",f)+(i>0?"<Esc>[#{a.lines.size-1}A":"")}}

각각 <Esc>은 문자 그대로의 ESC 문자 ( 0x1b)입니다.

용법

람다를 변수에 할당하십시오 (예 :) func.

art = <<END
X X DD
 X  D D
X X DD
END

func[art, 2]
# Prints:
#   X X DD
#  X X DD D
# X X DDDD
#  X XDDD
# X X DD

언 골프

->(art, num) {
  num.downto(0) do |i|
    forward = "\e[1C"
    $> << art.gsub(/^/, forward * i).gsub(" ", forward) +
            (i > 0 ? "\e[#{art.lines.size - 1}A" : "")
  end
}

forward이스케이프 시퀀스는 \e[1C앞으로 커서 (오른쪽) 한 공간 이동과 \e[<n>A이동을 닫 n라인. 기본적으로이 코드는 "레이어"를 앞뒤로 인쇄 forward하여 다른 레이어를 공백으로 덮어 쓰지 않도록 공백을 시퀀스로 바꿉니다 .


1
당신은 실수로 골프 버전에서 f=앞에 넣어 ->. -2 바이트 동안 제거하십시오.
— wizzwizz4
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.