Implémenter le crénage simplifié

24

introduction

Le crénage signifie ajuster l'espacement entre les lettres d'un texte. Par exemple, considérons le mot Topécrit avec les trois glyphes suivants:

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

Nous pourrions simplement combler les lacunes entre les glyphes avec des points et en finir avec cela, mais les lacunes semblent en quelque sorte trop larges. Au lieu de cela, nous glissons les glyphes vers la gauche afin qu'ils touchent presque:

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

Cela semble beaucoup mieux! Notez comment la barre de se Ttrouve en haut de la bordure gauche de o. Dans ce défi, votre tâche consiste à implémenter un programme de crénage simple pour de tels glyphes rectangulaires.

Le processus de crénage

Considérons deux tableaux de caractères 2D rectangulaires de .et #de même forme. Dans notre processus de crénage simple, nous plaçons d'abord les tableaux côte à côte, avec une colonne de .s entre les deux. Ensuite, nous déplaçons chacun #dans le tableau de droite d'un pas vers la gauche, jusqu'à ce que certains #s du tableau de gauche et de droite soient orthogonalement ou diagonalement adjacents. Le résultat du crénage est l'étape avant d' introduire le #s adjacent . Votre tâche consiste à mettre en œuvre ce processus.

Prenons un exemple:

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

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

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

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

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

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

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

Dans le dernier tableau, nous avons de nouvelles paires adjacentes de #s, donc l'avant-dernier tableau est le résultat du processus de crénage.

Entrée et sortie

Pour plus de simplicité, il vous suffit de gérer le crénage de deux glyphes. Vos entrées sont deux tableaux 2D rectangulaires, dans l'un des formats suivants:

  • Tableaux 2D d'entiers, avec 0 pour .et 1 pour #.
  • Chaînes multilignes terminées .#.
  • Tableaux de cordes .#.
  • Tableaux 2D des personnages .#.

Si les entrées sont prises comme une seule chaîne, vous pouvez utiliser n'importe quel délimiteur raisonnable. Cependant, le délimiteur doit aller entre les deux tableaux, ce qui signifie que vous n'êtes pas autorisé à prendre les deux entrées déjà appariées ligne par ligne.

Votre sortie est le résultat du processus de crénage appliqué à ces deux tableaux, qui est un tableau 2D rectangulaire au même format que les entrées. Vous êtes autorisé à ajouter ou supprimer n'importe quel nombre de colonnes de début ou de fin de .s, mais la sortie doit être rectangulaire et avoir la même hauteur que les entrées. Il est garanti que le processus de crénage se termine avant que le bord gauche de la deuxième entrée ne glisse sur le bord gauche de la première entrée.

Règles et notation

Le nombre d'octets le plus bas dans chaque langage de programmation gagne. Les règles de standard s'appliquent.

Cas de test

Pour faciliter le copier-coller, ces cas de test sont donnés sous forme de listes de chaînes.

["#"] ["#"] -> ["#.#"]
["#.","..",".#"] ["##","..","##"] -> ["#..##",".....",".#.##"]
["..#","#..","#.."] ["...","..#","###"] -> ["..#..","#...#","#.###"]
["###.","##..","#...","...."] ["....","...#","..#.",".#.."] -> ["###..","##..#","#..#.","..#.."]
["..##...","#......","#......"] [".....##",".....##",".#...#."] -> ["..##..##","#.....##","#.#...#."]
["...#.",".....",".....",".....","....#"] [".....","....#","#....",".....","....."] -> ["...#..",".....#",".#....","......","....#."]
["..#..",".....",".....",".....","....#"] [".....","....#","#....",".....","....."] -> ["..#..","....#","#....",".....","....#"]
["######","#.....","#.....","#.....","######"] ["......",".....#",".#...#",".....#","......"] -> ["######..","#......#","#..#...#","#......#","######.."]
["######","#.....","#.....","#.....","######"] ["......","......",".#....","......","......"] -> ["######","#.....","#.#...","#.....","######"]
["#...#","#..#.","#.#..","##...","#.#..","#..#.","#...#"] ["...#.","..#..",".#...",".#...",".#...","..#..","...#."] -> ["#...#..#","#..#..#.","#.#..#..","##...#..","#.#..#..","#..#..#.","#...#..#"]
Zgarb
la source
Visualiseur . Le cas de test 5 semble erroné.
user202729
@ user202729 Merci, c'est résolu maintenant. Je suis passé par plusieurs tours de réparation des cas de test dans le bac à sable, et apparemment manqué celui-ci.
Zgarb
De plus, si les deux personnages se "croisent", que doit faire le programme?
user202729
@ user202729 Vous pouvez supposer que cela ne se produira pas. Voir la dernière phrase de la section "Entrée et sortie".
Zgarb

Réponses:

2

Python 3 , 154 octets

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

Essayez-le en ligne!

récursif
la source
2

Rétine , 223 octets

+`(.+)¶(¶(.+¶)*)(\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

Essayez-le en ligne! Le lien inclut des cas de test et un script d'en-tête pour les reformater dans son format d'entrée préféré de deux chaînes délimitées par des sauts de ligne. Cela semble trop long, mais il y a probablement un cas de bord que j'ai négligé, mais il réussit au moins tous les cas de test maintenant. Explication:

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

Joignez les deux tableaux d'entrée ensemble en utilisant une lettre icomme séparateur. (Cela permet l'utilisation de \Wet \bplus tard.)

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

Remplacez tous les .s par is lors de la jointure.

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

Remplacez tous les is sous #s par @s.

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

Remplacez tous les is au-dessus de #s par @s.

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

Remplacez tous les @s par .s, plus tous les is adjacents à @s ou #s.

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

S'il n'y a pas #après un i, changez ensuite le .dos adjacent en an i.

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

S'il y a une ligne sans is, changez tous les is en .s, car il n'y a rien à faire ici.

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

Calculez le nombre minimum de is sur n'importe quelle ligne.

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

Propager aux autres lignes.

i

Supprimez le is, réalisant ainsi le crénage requis.

Neil
la source