Sắp xếp các đường chéo của một lưới văn bản


15

Đưa ra một lưới văn bản hình chữ nhật, sắp xếp các đường chéo đi từ phía trên bên trái sang dưới cùng bên phải vào các cột sao cho các ký tự ngoài cùng bên phải thấp nhất của tất cả các đường chéo nằm trên một mức. Sử dụng không gian để thụt lề.

Ví dụ: nếu lưới đầu vào của văn bản là

abcd
1234
WXYZ

sau đó bạn muốn xếp hàng các đường chéo W, 1X, a2Y, b3z, c4, và dtrong các cột cho kết quả này:

  ab
 123c
WXYZ4d

Lưu ý rằng các ký tự ngoài cùng bên phải thấp nhất của tất cả các đường chéo, WXYZ4d , đều ở cùng cấp độ.

Chi tiết

  • Lưới đầu vào của văn bản sẽ có kích thước tối thiểu 1 × 1 và tất cả các dòng sẽ có cùng độ dài.

  • Bạn có thể lấy lưới đầu vào dưới dạng chuỗi nhiều dòng hoặc làm danh sách các chuỗi dòng đơn.

  • Lưới đầu vào sẽ chỉ chứa các ký tự ASCII có thể in (bao gồm khoảng trắng).

  • Đầu ra có thể tùy chọn có một dòng mới nhưng không nên có dòng trống nào khác.

  • Các dòng của đầu ra có thể tùy ý có các khoảng trắng ở cuối nhưng không nên có các khoảng trắng ở đầu không cần thiết.

Những ví dụ khác

Dòng trống ví dụ riêng biệt. Mỗi đầu vào được theo dõi trực tiếp bởi đầu ra của nó.

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

~

~

Chấm điểm

Mã ngắn nhất tính bằng byte thắng.



Đầu vào có thể là một mảng char 2D (một ma trận ký tự) không?
Luis Mendo

Cột đầu tiên của đầu vào có thể chứa khoảng trắng không?
Kritixi Lithos

@LuisMendo Nghe có vẻ ổn.
Sở thích của Calvin

@KritixiLithos Vâng, nó có thể.
Sở thích của Calvin

Câu trả lời:


4

J , 12 byte

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

Xác định một động từ ẩn danh. Hãy thử trực tuyến!

Giải trình

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

Trong J, u &. v(đọc: udưới v) có nghĩa là "v, sau đó u, sau đó nghịch đảo của v". Đảo ngược và hoán vị là tự đảo ngược, vì vậy chương trình thực sự có nghĩa là "đảo ngược, chuyển vị, trích xuất các đường chéo ngược, chuyển vị, đảo ngược".

Với ví dụ đầu vào:

abcd
1234
WXYZ

Đảo ngược:

WXYZ
1234
abcd

Chuyển đổi:

W1a
X2b
Y3c
Z4d

Trích xuất các đường chéo ngược (và pad có khoảng trắng):

W  
X1 
Y2a
Z3b
4c 
d  

Chuyển đổi:

WXYZ4d
 123c 
  ab  

Đảo ngược:

  ab  
 123c 
WXYZ4d

2
Trình diễn tuyệt vời của sức mạnh của trạng từ
dặm

2
Tôi thức dậy và nhớ đó là những liên kết thực sự.
dặm

2

Jelly , 11 hoặc 10 byte

ZŒDṙLUz⁶ṚUY

Hãy thử trực tuyến!

Một thuật toán khá khác với giải pháp khác của tôi; cái này sử dụng một nội trang để lấy tại các đường chéo, thay vì làm mọi thứ bằng tay.

Giải trình:

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

Các đường chéo đi ra có thể là hướng xấu nhất có thể (yêu cầu chuyển vị, đảo ngược và xoay) lặp lại và theo thứ tự sai (Jelly xuất ra đường chéo chính trước, vì vậy chúng ta phải di chuyển một số đường chéo từ đầu đến cuối để có được chúng theo thứ tự). Tuy nhiên, điều này vẫn xuất hiện ngắn hơn so với giải pháp Jelly khác của tôi.


2

CJam , 29 byte

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

Hãy thử trực tuyến!

Giải trình

Thay vì trích xuất các đường chéo, chúng tôi bóc lớp từ cuối, xen kẽ trái và phải. Hãy xem xét các đầu vào sau:

GFDB
EEDB
CCCB
AAAA

Nếu chúng ta viết ra các đường chéo theo yêu cầu của thử thách, chúng ta sẽ nhận được:

   G
  EEF
 CCCDD
AAAABBB

Lưu ý rằng điều này chỉ đơn giản (từ dưới lên trên), hàng dưới cùng, được nối với cột ngoài cùng bên phải. Định nghĩa này cũng hoạt động nếu đầu vào là hình chữ nhật.

{      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.

Cẩn thận, ]sẽ bao bọc toàn bộ ngăn xếp! Tôi nghĩ rằng các chức năng nên hoạt động bất kể nội dung ngăn xếp bên dưới đầu vào và bạn có vẻ đồng ý ^^
Lynn

@Lynn rất tiếc, quên rằng tôi đã sử dụng ]khi tôi thay đổi nó thành một chức năng.
Martin Ender

Tôi nghĩ bạn có thể làm [{)\z}h]và giữ cho nó một hàm, trong 27 byte.
Lynn

2

JavaScript, 116 101 byte

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>

Tôi chỉ muốn sử dụng /.$|\n?(?!.*\n)..+/gmý tưởng mẫu regex này. ( https://regex101.com/r/mjMz9i/2 )

Hương vị regex JavaScript thật đáng thất vọng, tôi đã phải sử dụng (?!.*\n) vì nó không được \Ztriển khai và bằng cách nào đó tôi đã không được sử dụng \0.

  • Giảm 15 byte cảm ơn @Neil.

Tôi chỉ thích cách tiếp cận này, nhưng bạn có thể sử dụng .thay [^]vì bạn chỉ cần bỏ qua các ký tự không phải dòng mới để tìm một dòng mới, giúp tiết kiệm 2 byte.
Neil

Tôi không nghĩ rằng điều ^này là cần thiết trong regex cuối cùng, bởi vì bất kỳ cái nào \ncũng đã ở đầu chuỗi, vì vậy sẽ tiết kiệm được một byte khác.
Neil

Tôi đã nghĩ ra một cách để chơi gôn '$&'+' '.repeat(n). Về cơ bản biểu thức đó chỉ là $&nhưng với một khoảng trắng được thêm vào mỗi cuộc gọi, điều này không quan trọng để thực hiện đệ quy - thay thế n=0bằng r='$&'f(z,n+1)bằng f(z,r+' ')và sau đó rlà chuỗi thay thế mong muốn. Nếu tôi đếm đúng mà tiết kiệm được 12 byte.
Neil

@Neil. Thật tuyệt vời !!, cảm ơn bạn
Washington Guedes

1

Thạch , 15 hoặc 14 byte

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

Hãy thử trực tuyến!

Đây là một thuật toán không sử dụng tích hợp sẵn của Jelly cho các đường chéo. Làm điều đó có thể làm cho nó ngắn hơn; Tôi cũng có thể thử điều đó tiếp theo.

Đây là cách thuật toán hoạt động. Hãy bắt đầu với đầu vào này:

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

Chúng tôi bắt đầu với L’⁶x;\. L’cung cấp cho chúng tôi độ dài của đầu vào trừ 1 (trong trường hợp này là 2). Sau đó ⁶xcung cấp cho chúng ta một chuỗi các khoảng trống có độ dài đó ( " "trong trường hợp này); và ;\cho chúng ta kết quả tích lũy khi nối nó (một tam giác không gian). Sau đó, chúng tôi đảo ngược hình tam giác và nối nó sang bên trái của bản gốc ( ;"nối các phần tử tương ứng của danh sách, µbuộc phải phá vỡ phân tích cú pháp và do đó sử dụng đầu vào ban đầu làm danh sách thứ hai theo mặc định), cho chúng tôi điều này:

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

Đây gần như là giải pháp mà chúng ta muốn, nhưng chúng ta cần di chuyển các phần tử xuống dưới để được tuôn ra với chuỗi cuối cùng. Đó là vấn đề hoán vị ( Z), đảo ngược bên trong mỗi dòng ( U), hoán vị lại ( Z) và đảo ngược các dòng ( ):

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

hoán vị

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

đảo ngược trong hàng

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

hoán vị

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

đảo ngược các hàng

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

Cuối cùng, Ytham gia vào dòng mới. Tôi không rõ liệu điều này có bắt buộc phải tuân thủ đặc tả hay không (cho phép nhập vào dưới dạng danh sách các chuỗi, nhưng không nói giống nhau về đầu ra), do đó, số byte chính xác phụ thuộc vào việc nó được bao gồm hay bỏ qua.


1

Bình thường, 16 byte

j_.t_M.Tm+*;l=tQ

Kim tự tháp lớn :

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

Vì mọi người nói ngôn ngữ chơi golf rất khó đọc, tôi đã thiết kế Big Pyth, vừa dễ đọc vừa dễ dịch sang Pyth. Tệp được liên kết dịch một luồng đầu vào của Big Pyth sang Pyth. Mỗi mã thông báo Big Pyth được phân tách bằng khoảng trắng tương ứng với mã thông báo Pyth, là ký tự hoặc ký tự. theo sau là một ký tự. Các ngoại lệ là các implicitmã thông báo, được ẩn trong mã Pyth.

Tôi muốn xem định dạng giải thích Big Pyth tốt như thế nào, vì vậy tôi sẽ không đưa ra bất kỳ lời giải thích nào khác. Hãy hỏi tôi nếu bạn muốn một cái gì đó giải thích, tuy nhiên.


0

JavaScript (ES6), 140 byte

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``)

Lấy đầu vào và đầu ra dưới dạng các chuỗi của chuỗi. Đồng thời chấp nhận đầu vào mảng ký tự hai chiều và lưu 7 byte nếu đầu ra mảng ký tự hai chiều được chấp nhận. Giải thích: Chiều cao của kết quả mlà tối thiểu về chiều cao hvà chiều rộng wcủa mảng ban đầu, trong khi chiều rộng chỉ đơn giản là một ít hơn tổng chiều cao và chiều rộng của mảng ban đầu. Hàng nguồn cho các ký tự trên phần chính của kết quả đến trực tiếp từ hàng thích hợp của mảng ban đầu, đếm từ dưới lên, trong khi ở phần thêm của kết quả, hàng nguồn di chuyển lên một hàng cho mỗi cột bổ sung. Cột nguồn cho cả hai nửa kết quả hóa ra bằng với cột đích đã di chuyển một cột bên trái cho mỗi hàng nguồn phía trên dưới cùng.


0

Octave, 57 byte

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

0

Python 3, 247 byte

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')`

Khoảng trắng vô dụng tại join(i) for.
Yytsi

0

Python 2, 150 byte

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

Lấy đầu vào là danh sách các chuỗi.


0

Clojure, 194 byte

Đã thực hiện một cách khó khăn bằng cách nhóm các ký tự Gvà sau đó tạo các dòng.

#(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 đầu vào như một vecsố vecgiống như [[\a \b \c \d] [\1 \2 \3 \4] [\W \X \Y \Z]]. Thí dụ:

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

  ab
 c123
d4WXYZ
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.