텍스트 그리드의 대각선 정렬


15

직사각형의 텍스트 격자가 주어지면 모든 대각선의 가장 오른쪽에있는 문자가 레벨에 있도록 왼쪽 상단에서 오른쪽 하단으로가는 대각선을 열로 정렬하십시오. 들여 쓰기에 공백을 사용하십시오.

예를 들어, 텍스트 입력 격자가

abcd
1234
WXYZ

다음 대각선을 줄 것 W, 1X, a2Y, b3z, c4, 그리고 d이 출력을 제공 열에 :

  ab
 123c
WXYZ4d

모든 대각선의 가장 오른쪽에있는 문자 WXYZ4d()는 같은 수준입니다.

세부

  • 텍스트 입력 격자의 크기는 최소 1 × 1이며 모든 줄의 길이는 같습니다.

  • 입력 그리드를 여러 줄 문자열 또는 한 줄 문자열 목록으로 사용할 수 있습니다.

  • 입력 그리드에는 인쇄 가능한 ASCII 문자 만 포함 됩니다 (공백 포함).

  • 출력에는 선택적으로 하나의 후행 줄 바꿈이있을 수 있지만 다른 빈 줄은 없어야합니다.

  • 출력 라인에는 선택적으로 후행 공백이있을 수 있지만 불필요한 선행 공백이 없어야합니다.

다른 예

빈 줄은 예제를 구분합니다. 각 입력 뒤에는 직접 출력이 나옵니다.

123
456
789

  1
 452
78963

123.?!
456??!
789!!!

  123.
 456???
789!!!!!

**@
@  

 **
@  @


/\/\
\/ /
/ /\
\/\/

   /
  \/\
 / / /
\/\/\/\

12
34
56
78
90

 7531
908642

Code

Code

G
O
L
F

FLOG

~

~

채점

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



입력이 2D 문자 배열 (문자 행렬) 일 수 있습니까?
Luis Mendo

입력의 첫 번째 열에 공백이 포함될 수 있습니까?
Kritixi Lithos

@LuisMendo 괜찮습니다.
Calvin 's Hobbies

@KritixiLithos 그렇습니다.
Calvin 's Hobbies

답변:


4

J , 12 바이트

|./.&.|:&.|.

익명 동사를 정의합니다. 온라인으로 사용해보십시오!

설명

|./.&.|:&.|.
|.            Reversed
  /.          anti-diagonals
    &.        under
      |:      transpose
        &.    under
          |.  reversal

J에서 u &. v(읽기 : u아래 v)는 "v, u, v의 역수"를 의미합니다. 반전 및 전치사는 자기 역이므로 프로그램은 실제로 "반전, 전치, 역 대각선 추출, 전치, 후진"을 의미합니다.

입력 예를 들면 다음과 같습니다.

abcd
1234
WXYZ

역:

WXYZ
1234
abcd

바꾸어 놓다:

W1a
X2b
Y3c
Z4d

역 대각선을 추출합니다 (공백이있는 패드).

W  
X1 
Y2a
Z3b
4c 
d  

바꾸어 놓다:

WXYZ4d
 123c 
  ab  

역:

  ab  
 123c 
WXYZ4d

2
부사의 능력의 우수한 데모
마일

2
나는 일어 났고 그것들이 실제로는 연결이라는 것을 기억했다.
마일

2

젤리 , 11 또는 10 바이트

ZŒDṙLUz⁶ṚUY

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

다른 솔루션과는 상당히 다른 알고리즘입니다. 이것은 수동으로 작업하는 대신 내장을 사용하여 대각선에 도달합니다.

설명:

ZŒDṙLUz⁶ṚUY
Z           transpose
 ŒD         diagonals, main diagonal first
    L       number of lines in the original array
   ṙ        rotate list (i.e. placing the short diagonal first)
     U      reverse inside lines
      z⁶    transpose, padding with spaces
        ṚU  rotate matrix 180 degrees
          Y (possibly unnecessary) join on newlines

대각선은 가능한 최악의 방향 (반복 된 전치, 반전 및 회전이 필요함)으로, 잘못된 순서로 나옵니다 (젤리는 기본 대각선을 먼저 출력하므로 일부 대각선을 끝에서 시작으로 이동하여 대각선으로 가져와야 함) 순서대로). 그러나 이것은 여전히 ​​다른 젤리 솔루션보다 짧습니다.


2

CJam , 29 바이트

qN/{)\z}h]2/{~W%+}%eeSf.*W%N*

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

설명

대각선을 추출하는 대신 끝에서 레이어를 벗겨 내고 왼쪽과 오른쪽을 번갈아 가며 놓습니다. 다음 입력을 고려하십시오.

GFDB
EEDB
CCCB
AAAA

도전 과제에 따라 대각선을 쓰면 다음과 같은 결과가 나타납니다.

   G
  EEF
 CCCDD
AAAABBB

이것은 맨 오른쪽 열과 연결된 맨 아래 행에 불과합니다 (아래에서 맨 위). 이 정의는 입력이 직사각형 인 경우에도 작동합니다.

{      e# Run this loop while there are still lines left in the input.
  )    e#   Pull off the bottom-most row.
  \    e#   Swap with the remaining rows.
  z    e#   Transpose the grid so that the next iteration pulls off the last
       e#   column instead. However, it should be noted that transposing
       e#   effectively reverses the column, so the second half of each output
       e#   line will be the wrong way around. We'll fix that later.
}h     e# When the loop is done, we'll have all the individual layers on the
       e# stack from bottom to top, alternating between horizontal and vertical
       e# layers. There will be an empty string on top.
]      e# Wrap all those strings in a list.
2/     e# Split into pairs. There may or may not be a trailing single-element
       e# list with the empty string.
{      e# Map this block over each pair...
  ~    e#   Dump the pair on the stack.
  W%   e#   Reverse the second element.
  +    e#   Append to first element.
       e#   If there was a trailing single-element list, this will simply
       e#   add the empty string to the previous pair, which just removes
       e#   the empty string.
}%
ee     e# Enumerate the list, which pairs each string (now containing both halves)
       e# of an output line from bottom to top) with its index.
Sf.*   e# Turn those indices X into strings of X spaces, to get the correct
       e# indentation.
W%     e# Reverse the list of strings so the longest line ends up on the bottom.

조심 ]해서 스택 전체를 감쌀 것입니다! 입력 아래의 스택 내용에 관계없이 함수가 작동해야한다고 생각합니다. 동의합니다. ^^
Lynn

@Lynn whoops, ]내가 그것을 함수로 바꿀 때 사용한 것을 잊었다 .
Martin Ender

[{)\z}h]27 바이트 동안 함수를 수행 하고 유지할 수 있다고 생각합니다 .
Lynn

2

자바 스크립트, 116101 바이트

f=(s,r='$&',l='',z=s.replace(/.$|\n?(?!.*\n)..+/gm,x=>(l=x+l,'')))=>l?f(z,r+' ')+l.replace(/\n?/,r):l


G.onclick=()=>O.textContent=f(I.value);
<textarea id=I style=height:100px>/\/\
\/ /
/ /\
\/\/</textarea><button id=G>Go</button><pre id=O></pre>

나는이 정규식 패턴 /.$|\n?(?!.*\n)..+/gm아이디어 를 사용하고 싶었습니다 . ( https://regex101.com/r/mjMz9i/2 )

JavaScript 정규 표현식의 맛은 실망스럽고 구현 (?!.*\n)되지 않았기 때문에 사용해야 \Z했지만 어쨌든 사용하지 못했습니다 \0.

  • @Neil 덕분에 15 바이트 할인.

나는이 접근법을 좋아하지만 개행 문자를 건너 뛰기 만하면 2 바이트를 절약하므로 개행 문자를 건너 뛸 필요가 있기 때문에 .대신 사용할 수 있습니다 [^].
Neil

어쨌든 문자열의 시작 부분에 이미 ^있기 때문에 \n다른 바이트를 절약 하기 때문에 최종 정규식에 필요 하다고 생각하지 않습니다 .
Neil

골프를 치는 방법을 찾았습니다 '$&'+' '.repeat(n). 기본적으로 표현 단지이라고 $&하지만 공간이 재귀 적으로 구현하는 사소한 호출 할 때마다 추가로 - 교체 n=0와 함께 r='$&'f(z,n+1)함께 f(z,r+' ')다음과 r원하는 대체 문자열입니다. 올바르게 계산하면 12 바이트가 절약됩니다.
Neil

@ 닐. 감사합니다
Washington Guedes

1

젤리 , 15 또는 14 바이트

L’⁶x;\Ṛ;"µZUZṚY

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

이것은 Jelly의 내장 대각선을 사용하지 않는 알고리즘입니다. 그렇게하면 짧아 질 수 있습니다. 다음에 시도해 볼 수도 있습니다.

알고리즘 작동 방식은 다음과 같습니다. 이 입력부터 시작하겠습니다 :

["abc",
 "def",
 "ghi"]

우리는 시작합니다 L’⁶x;\. L’입력에서 1을 뺀 길이 (이 경우 2)를 제공합니다. 그런 다음 ⁶x해당 길이의 문자열을 제공합니다 ( " "이 경우). 및 ;\(공간 삼각형)을 연접 때 우리의 누적 결과를 제공한다. 그런 다음 삼각형을 뒤집어 원래의 왼쪽에 연결합니다 ( ;"목록의 해당 요소를 연결하고 µ강제로 구문 분석을 중단하여 기본적으로 원래 입력을 두 번째 목록으로 사용함).

["  abc",
 " def",
 "ghi"]

이것은 우리가 원하는 거의 솔루션이지만 마지막 문자열과 같은 높이가되도록 요소를 아래쪽으로 이동해야합니다. 즉 이조 (의 문제 Z(각 라인 내에서 반전) U다시 (조옮김) Z) 및 (줄을 반전 ) :

["  abc",
 " def",
 "ghi"]

바꾸어 놓다

["  g",
 " dh",
 "aei",
 "bf",
 "c"]

행 내에서 반대로

["g  ",
 "hd ",
 "iea",
 "fb",
 "c"]

바꾸어 놓다

["ghifc",
 " deb",
 "  a"]

행을 반대로

["  a",
 " deb",
 "ghifc"]

마지막으로 줄 Y바꿈에 참여합니다. 이것이 사양 (문자열 목록으로 입력을 허용하지만 출력에 대해서는 동일하게 말하지 않음)을 준수 해야하는지 여부는 확실하지 않으므로 정확한 바이트 수는 포함 여부에 따라 다릅니다.


1

Pyth, 16 바이트

j_.t_M.Tm+*;l=tQ

빅 피스 :

join-on-newline
reverse transpose-and-fill-with-spaces reverse func-map transpose-justified
map
  plus
    times innermost-var
      length assign tail input
    implicit-innermost-var
  implicit-input

사람들은 골프 언어를 읽기 어렵다고 말하기 때문에 쉽게 읽을 수 있고 쉽게 번역 할 수있는 Big Pyth를 Pyth로 디자인했습니다. 링크 된 파일은 Big Pyth의 입력 스트림을 Pyth로 변환합니다. 공백으로 구분 된 각 Big Pyth 토큰은 Pyth 토큰 (문자 또는 a)에 해당합니다.. 뒤에 오는 . implicitPyth 코드에 내재 된 토큰 은 예외 입니다.

Big Pyth에 대한 설명 형식이 얼마나 좋은지 알고 싶기 때문에 다른 설명은하지 않겠습니다. 그러나 설명이 필요한지 물어보십시오.


0

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

a=>[...Array(m=(h=a.length)<(w=a[0].length)?h:w)].map((_,i)=>[...Array(h+w-1)].map((_,j)=>(a[x=i+h-m-(++j>w&&j-w)]||``)[x+j-h]||` `).join``)

입력 및 출력을 문자열 배열로 취합니다. 또한 2 차원 문자 배열 입력을 허용하고 2 차원 문자 배열 출력이 허용되는 경우 7 바이트를 저장하십시오. 설명 : 결과 m의 높이는 원래 배열 의 높이 h와 너비 w의 최소값이고 너비는 단순히 원래 배열의 높이와 너비의 합계의 1보다 작습니다. 결과의 주요 부분에있는 문자의 소스 행은 맨 아래부터 계산하여 원래 배열의 해당 행에서 직접 가져 오며 결과의 추가 부분에서는 소스 행이 추가 열마다 한 행씩 이동합니다. 결과의 양쪽 절반에 대한 소스 열이 맨 아래 위의 각 소스 행에 대해 하나의 열을 왼쪽으로 이동 한 대상 열과 같습니다.


0

옥타브, 57 바이트

@(A){B=spdiags(A),C=B>0,D='  '(C+1),D(sort(C))=B(C),D}{5}

0

파이썬 3, 247 바이트

def a(s):
 s=s.split('\n')
 for i,l in enumerate(s):r=len(s)-i-1;s[i]=' '*r+l+' '*(len(s)-r-1)
 print(*[''.join(i) for i in list(zip(*[''.join(a).rstrip([::-1].ljust(min(len(s),len(s[0])))for a in zip(*[list(i)for i in s])]))[::-1]],sep='\n')`

에 쓸모없는 공백이 join(i) for있습니다.
Yytsi

0

파이썬 2, 150 바이트

def f(l):w=len(l[0]);h=len(l);J=''.join;R=range;print'\n'.join(map(J,zip(*['%%-%ds'%h%J(l[h+~i][j-i]for i in R(h)if-w<i-j<1)for j in R(h-~w)]))[::-1])

문자열 목록으로 입력을받습니다.


0

클로저, 194 바이트

문자를 그룹화 G한 다음 줄을 생성 하여 어려운 방법을 구현했습니다 .

#(let[n(count %)m(count(% 0))G(group-by first(for[i(range n)j(range m)][(min(- n i)(- m j))((% i)j)]))](apply str(flatten(for[k(reverse(sort(keys G)))][(repeat(dec k)" ")(map last(G k))"\n"]))))

A와 입력을 받아 vecvec추천 S [[\a \b \c \d] [\1 \2 \3 \4] [\W \X \Y \Z]]. 예:

(def f #( ... ))
(print (str "\n" (f (mapv vec(re-seq #".+" "abcd\n1234\nWXYZ")))))

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