Terapkan kerning yang disederhanakan

24

pengantar

Kerning berarti menyesuaikan jarak antara huruf-huruf teks. Sebagai contoh, perhatikan kata yang Topditulis dengan tiga mesin terbang berikut:

##### ..... .....
..#.. ..... .....
..#.. ..##. .###.
..#.. .#..# .#..#
..#.. .#..# .#..#
..#.. ..##. .###.
..... ..... .#...
..... ..... .#...

Kita bisa mengisi celah di antara mesin terbang dengan titik-titik dan diselesaikan dengan itu, tetapi celah itu entah bagaimana terlihat terlalu lebar. Sebaliknya, kami menggeser mesin terbang ke kiri sehingga hampir menyentuh:

#####........
..#..........
..#..##..###.
..#.#..#.#..#
..#.#..#.#..#
..#..##..###.
.........#...
.........#...

Ini terlihat jauh lebih baik! Perhatikan bagaimana bilah Tdi atas batas kiri o. Dalam tantangan ini, tugas Anda adalah mengimplementasikan program kerning sederhana untuk mesin terbang persegi panjang tersebut.

Proses kerning

Pertimbangkan dua array karakter 2D persegi panjang .dan #dari bentuk yang sama. Dalam proses kerning sederhana kami, pertama-tama kami menempatkan array berdampingan, dengan satu kolom .s di antaranya. Kemudian, kita memindahkan masing-masing #dalam larik kanan satu langkah ke kiri, sampai beberapa #s larik kiri dan kanan berdekatan secara ortogonal atau diagonal. Hasil dari kerning adalah langkah sebelumnya kami memperkenalkan #s yang berdekatan . Tugas Anda adalah mengimplementasikan proses ini.

Mari kita ambil contoh:

Inputs:
..###
#....
#....
..##.

...#.
...##
..###
....#

Process:
..###....#.
#........##
#.......###
..##......#

..###...#.
#.......##
#......###
..##.....#

..###..#.
#......##
#.....###
..##....#

..###.#.
#.....##
#....###
..##...#

..####.
#....##
#...###
..##..#

Dalam array terakhir, kami memiliki pasangan #s yang berdekatan , sehingga array kedua-ke-terakhir adalah hasil dari proses kerning.

Masukan dan keluaran

Untuk mempermudah, Anda hanya perlu menangani kerning dua mesin terbang. Input Anda adalah dua array 2D persegi panjang, dalam salah satu format berikut:

  • 2D array integer, dengan 0 berdiri untuk .dan 1 untuk #.
  • String multiline berakhir .#.
  • Array string berakhir .#.
  • 2D array karakter .#.

Jika input diambil sebagai string tunggal, Anda dapat menggunakan pembatas yang masuk akal. Namun, pembatas harus berada di antara dua array, artinya Anda tidak diperbolehkan untuk mengambil dua input yang sudah dipasangkan baris-demi-baris.

Output Anda adalah hasil dari proses kerning yang diterapkan pada dua array ini, yang merupakan array 2D persegi panjang dalam format yang sama dengan input. Anda diizinkan untuk menambah atau menghapus sejumlah kolom .s terkemuka atau tertinggal , tetapi hasilnya harus persegi panjang dan memiliki ketinggian yang sama dengan input. Dijamin bahwa proses kerning berakhir sebelum tepi kiri input kedua meluncur di atas tepi kiri input pertama.

Aturan dan penilaian

Hitungan byte terendah dalam setiap bahasa pemrograman menang. Aturan standar berlaku.

Uji kasus

Untuk membantu dengan copy-paste, test case ini diberikan sebagai daftar string.

["#"] ["#"] -> ["#.#"]
["#.","..",".#"] ["##","..","##"] -> ["#..##",".....",".#.##"]
["..#","#..","#.."] ["...","..#","###"] -> ["..#..","#...#","#.###"]
["###.","##..","#...","...."] ["....","...#","..#.",".#.."] -> ["###..","##..#","#..#.","..#.."]
["..##...","#......","#......"] [".....##",".....##",".#...#."] -> ["..##..##","#.....##","#.#...#."]
["...#.",".....",".....",".....","....#"] [".....","....#","#....",".....","....."] -> ["...#..",".....#",".#....","......","....#."]
["..#..",".....",".....",".....","....#"] [".....","....#","#....",".....","....."] -> ["..#..","....#","#....",".....","....#"]
["######","#.....","#.....","#.....","######"] ["......",".....#",".#...#",".....#","......"] -> ["######..","#......#","#..#...#","#......#","######.."]
["######","#.....","#.....","#.....","######"] ["......","......",".#....","......","......"] -> ["######","#.....","#.#...","#.....","######"]
["#...#","#..#.","#.#..","##...","#.#..","#..#.","#...#"] ["...#.","..#..",".#...",".#...",".#...","..#..","...#."] -> ["#...#..#","#..#..#.","#.#..#..","##...#..","#.#..#..","#..#..#.","#...#..#"]
Zgarb
sumber
Visualizer . Test case 5 tampaknya salah.
user202729
@ user202729 Terima kasih, sudah diperbaiki sekarang. Saya telah melalui beberapa putaran memperbaiki kasus uji di kotak pasir, dan tampaknya melewatkan yang itu.
Zgarb
Juga jika dua karakter "jatuh melalui" satu sama lain apa yang harus dilakukan program?
user202729
@ user202729 Anda dapat menganggap itu tidak akan terjadi. Lihat kalimat terakhir dari bagian "Input dan output".
Zgarb

Jawaban:

2

Python 3 , 154 byte

lambda a,b,p=".":[c.rstrip(p)+d.lstrip(p).rjust(max(len((d+c).strip(p))for(c,d)in zip((a*3)[1:],b[:-1]+b+b[1:]))+1-len(c.rstrip(p)),p)for(c,d)in zip(a,b)]

Cobalah online!

rekursif
sumber
2

Retina , 223 byte

+`(.+)¶(¶(.+¶)*)(\W+(¶|$))
$2$1i$4
T`.`i`\.*i\.*
+`(¶(.)*#.*i.*¶(?<-2>.)*)i
$1@
+`(¶(.)*)i(.*¶(?<-2>.)*(?(2)(?!))#.*i)
$1@$3
T`i@`.`i*[#@]+i
mT`.`i`\.+i+$
msT`i`.`.*^\W+$.*
+`(\b(i+)\W+\2i*)i
$1.
+s`\bi((i+).+\b\2\b)
.$1
i

Cobalah online! Tautan mencakup kotak uji dan skrip tajuk untuk memformatnya kembali ke format input pilihan dua string yang dibatasi-baris baru. Ini tampaknya terlalu lama namun mungkin ada kasus tepi yang saya abaikan, tetapi setidaknya melewati semua kasus uji sekarang. Penjelasan:

+`(.+)¶(¶(.+¶)*)(\W+(¶|$))
$2$1i$4

Gabungkan dua array input bersama-sama menggunakan huruf isebagai pemisah. (Ini memungkinkan penggunaan \Wdan \bnanti.)

T`.`i`\.*i\.*

Ubah semua .s ke is saat bergabung.

+`(¶(.)*#.*i.*¶(?<-2>.)*)i
$1@

Ubah semua is di bawah ini #menjadi @s.

+`(¶(.)*)i(.*¶(?<-2>.)*(?(2)(?!))#.*i)
$1@$3

Ubah semua is di atas #menjadi @s.

T`i@`.`i*[#@]+i

Ubah semua @s ke .s, ditambah semua is yang berdekatan dengan @s atau #s.

mT`.`i`\.+i+$

Jika tidak ada #setelah i, maka ubah .kembali berdekatan ke ilagi.

msT`i`.`.*^\W+$.*

Jika ada garis tanpa is, ubah semua is menjadi ., karena tidak ada yang dilakukan di sini.

+`(\b(i+)\W+\2i*)i
$1.

Hitung jumlah minimum is pada baris apa pun.

+s`\bi((i+).+\b\2\b)
.$1

Sebarkan ke jalur lain.

i

Hapus is, sehingga melakukan kerning yang diperlukan.

Neil
sumber