Sejajarkan Diagonals dari Kotak Teks

15

Diberikan kisi-kisi teks persegi panjang, sejajarkan diagonal yang bergerak dari kiri atas ke kanan bawah ke dalam kolom sehingga karakter paling kanan-kanan semua diagonal berada pada level. Gunakan spasi untuk lekukan.

Misalnya, jika kisi input teks adalah

abcd
1234
WXYZ

maka Anda akan berbaris Diagonal W, 1X, a2Y, b3z, c4, dan ddi kolom memberikan output ini:

  ab
 123c
WXYZ4d

Perhatikan bahwa karakter paling kanan-kanan dari semua diagonal WXYZ4d,, berada pada level yang sama.

Detail

  • Kotak input teks akan berukuran minimal 1 × 1 dan semua garis akan memiliki panjang yang sama.

  • Anda dapat menggunakan kisi input sebagai string multiline atau sebagai daftar string baris tunggal.

  • Kisi masukan hanya akan berisi karakter ASCII yang dapat dicetak (termasuk spasi).

  • Output secara opsional dapat memiliki satu baris tambahan, tetapi seharusnya tidak ada baris kosong lainnya.

  • Garis-garis output secara opsional dapat memiliki spasi tambahan, tetapi seharusnya tidak memiliki spasi utama yang tidak perlu.

Contoh lain

Baris kosong memisahkan contoh. Setiap input langsung diikuti oleh outputnya.

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

~

~

Mencetak gol

Kode terpendek dalam byte menang.

Hobi Calvin
sumber
Bisakah input menjadi array char 2D (matriks karakter)?
Luis Mendo
Bisakah kolom pertama dari input berisi spasi?
Kritixi Lithos
@LuisMendo Kedengarannya ok.
Calvin Hobbies
@ KritixiLithos Ya, mungkin saja.
Calvin Hobbies

Jawaban:

4

J , 12 byte

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

Mendefinisikan kata kerja anonim. Cobalah online!

Penjelasan

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

Dalam J, u &. v(baca: di ubawah v) berarti "v, lalu u, lalu kebalikan dari v". Pembalikan dan transpos adalah inversi sendiri, sehingga program ini benar-benar berarti "membalikkan, transpos, mengekstrak anti-diagonal terbalik, transpos, mundur".

Dengan input contoh:

abcd
1234
WXYZ

Membalikkan:

WXYZ
1234
abcd

Mengubah urutan:

W1a
X2b
Y3c
Z4d

Ekstrak anti-diagonal terbalik (dan pad dengan spasi):

W  
X1 
Y2a
Z3b
4c 
d  

Mengubah urutan:

WXYZ4d
 123c 
  ab  

Membalikkan:

  ab  
 123c 
WXYZ4d
Zgarb
sumber
2
Demonstrasi luar biasa dari kekuatan kata keterangan
mil
2
Saya bangun dan ingat itu sebenarnya konjungsi.
mil
2

Jelly , 11 atau 10 byte

ZŒDṙLUz⁶ṚUY

Cobalah online!

Algoritma yang cukup berbeda dari solusi saya yang lain; yang ini menggunakan builtin untuk mendapatkan diagonal, daripada melakukan hal-hal secara manual.

Penjelasan:

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

Diagonal keluar dalam kemungkinan orientasi terburuk (membutuhkan transposisi berulang, pembalikan, dan rotasi), dan dalam urutan yang salah (Jelly mengeluarkan diagonal utama terlebih dahulu, jadi kita harus memindahkan beberapa diagonal dari ujung ke awal untuk mendapatkannya) dalam urutan). Namun, ini masih lebih pendek dari solusi Jelly saya yang lain.


sumber
2

CJam , 29 byte

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

Cobalah online!

Penjelasan

Alih-alih mengekstraksi diagonal, kami melepas lapisan dari ujung, bergantian ke kiri dan kanan. Pertimbangkan input berikut:

GFDB
EEDB
CCCB
AAAA

Jika kita menulis diagonal seperti yang dipersyaratkan oleh tantangan, kita mendapatkan:

   G
  EEF
 CCCDD
AAAABBB

Perhatikan bahwa ini hanyalah (dari bawah ke atas), baris paling bawah, disatukan dengan kolom paling kanan. Definisi ini juga berfungsi jika input berbentuk persegi panjang.

{      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.
Martin Ender
sumber
Hati-hati, itu ]akan membungkus seluruh tumpukan! Saya pikir fungsi harus bekerja terlepas dari isi tumpukan di bawah input, dan Anda tampaknya setuju ^^
Lynn
@ Lynn whoops, lupa bahwa saya menggunakan ]ketika saya mengubahnya ke suatu fungsi.
Martin Ender
Saya pikir Anda bisa melakukan [{)\z}h]dan menyimpannya fungsi, selama 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>

Saya hanya ingin menggunakan /.$|\n?(?!.*\n)..+/gmide pola regex ini . ( https://regex101.com/r/mjMz9i/2 )

Rasa regex JavaScript mengecewakan, saya harus menggunakan (?!.*\n)karena tidak \Zditerapkan, dan entah bagaimana saya tidak bisa menggunakannya \0.

  • Off 15 byte terima kasih @Neil.
Washington Guedes
sumber
Saya suka pendekatan ini, tetapi Anda dapat menggunakan .alih-alih [^]karena Anda hanya perlu melewati karakter non-baris baru untuk menemukan baris baru, yang menghemat 2 byte.
Neil
Saya tidak berpikir ^itu perlu di regex akhir, karena \nsudah ada di awal string, sehingga menghemat byte lain.
Neil
Saya telah menemukan cara untuk bermain golf '$&'+' '.repeat(n). Pada dasarnya ungkapan itu hanyalah $&tetapi dengan ruang yang ditambahkan setiap panggilan, yang mudah untuk diterapkan secara rekursif - ganti n=0dengan r='$&'dan f(z,n+1)dengan f(z,r+' ')dan kemudian radalah string pengganti yang diinginkan. Jika saya sudah menghitung dengan benar itu menghemat 12 byte.
Neil
@Neil. Itu luar biasa !!, terima kasih
Washington Guedes
1

Jeli , 15 atau 14 byte

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

Cobalah online!

Ini adalah algoritma yang tidak menggunakan built-in Jelly untuk diagonal. Melakukan itu mungkin membuatnya lebih pendek; Saya mungkin akan mencobanya nanti.

Begini cara algoritma bekerja. Mari kita mulai dengan input ini:

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

Kita mulai dengan L’⁶x;\. L’memberi kita panjang input minus 1 (dalam hal ini, 2). Kemudian ⁶xmemberi kita serangkaian ruang dengan panjang itu ( " "dalam hal ini); dan;\ memberi kita hasil kumulatif ketika menggabungkannya (segitiga spasi). Kami kemudian membalikkan segitiga dan menggabungkannya ke sisi kiri aslinya ( ;"menggabungkan elemen daftar yang sesuai,µ secara paksa menyebabkan penguraian dalam penguraian dan dengan demikian menggunakan input asli sebagai daftar kedua secara default), memberi kami ini:

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

Ini hampir merupakan solusi yang kita inginkan, tetapi kita perlu memindahkan elemen ke bawah untuk menjadi rata dengan string terakhir. Itu masalah transposing ( Z), membalikkan di dalam setiap baris ( U), transposing lagi ( Z), dan membalikkan garis () ):

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

mengubah urutan

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

mundur dalam baris

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

mengubah urutan

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

membalikkan baris

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

Akhirnya, Ybergabung dengan baris baru. Tidak jelas bagi saya apakah ini diperlukan atau tidak untuk memenuhi spesifikasi (yang memungkinkan input sebagai daftar string, tetapi tidak mengatakan hal yang sama tentang output), sehingga jumlah byte yang tepat tergantung pada apakah itu termasuk atau dihilangkan.


sumber
1

Pyth, 16 byte

j_.t_M.Tm+*;l=tQ

Big Pyth :

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

Karena orang mengatakan bahasa golf sulit dibaca, saya merancang Big Pyth, yang mudah dibaca dan mudah diterjemahkan ke Pyth. File yang ditautkan menerjemahkan aliran input Big Pyth ke Pyth. Setiap token Big Pyth yang dipisahkan dengan spasi putih berhubungan dengan token Pyth, baik karakter atau a. diikuti oleh karakter. Pengecualiannya adalahimplicit token, yang tersirat dalam kode Pyth.

Saya ingin melihat seberapa bagus format penjelasan Big Pyth, jadi saya tidak akan memberikan penjelasan lain. Tanyakan kepada saya apakah Anda ingin sesuatu dijelaskan.

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

Mengambil input dan output sebagai array string. Juga menerima input array karakter dua dimensi, dan menyimpan 7 byte jika output array karakter dua dimensi dapat diterima. Penjelasan: Tinggi hasil madalah minimum tinggi hdan lebar warray asli, sedangkan lebarnya hanya satu kurang dari jumlah tinggi dan lebar array asli. Baris sumber untuk karakter pada bagian utama hasil datang langsung dari baris yang sesuai dari array asli, menghitung dari bawah, sedangkan pada bagian tambahan dari hasil baris sumber bergerak naik satu baris untuk setiap kolom tambahan. Kolom sumber untuk kedua bagian hasil ternyata sama dengan kolom tujuan yang dipindahkan satu kolom ke kiri untuk setiap baris sumber di atas bagian bawah.

Neil
sumber
0

Oktaf, 57 byte

@(A){B=spdiags(A),C=B>0,D='  '(C+1),D(sort(C))=B(C),D}{5}
Rainer P.
sumber
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')`
Cormac
sumber
Spasi tidak berguna di 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])

Mengambil input sebagai daftar string.

Arfie
sumber
0

Clojure, 194 byte

Diterapkan dengan cara yang sulit dengan mengelompokkan karakter ke Gdan kemudian menghasilkan garis.

#(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"]))))

Mengambil input sebagai vecdari vecs seperti [[\a \b \c \d] [\1 \2 \3 \4] [\W \X \Y \Z]]. Contoh:

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

  ab
 c123
d4WXYZ
NikoNyrh
sumber