59 votes

correspondance d'expressions rationnelles "verticales" dans une "image" ASCII

Note : Il s'agit d'une question sur les possibilités des saveurs modernes de regex. Il ne s'agit pas de la meilleure façon de résoudre ce problème en utilisant d'autres méthodes. C'est inspiré par une question précédente mais celle-ci n'est pas limitée aux regex.

Le problème

Dans un ASCII "image"/art/map/string comme :

....X.......
..X..X...X....
X.X...X..X.....
X....XXXXXX.....
X..XXX...........
.....X..........
..............X
..X...........X....
..X...........X....X...
....X.....

J'aimerais trouver une simple formation de ligne verticale de trois X s :

X
X
X

Le nombre de lignes est variable dans l'image, et la largeur de l'image est variable. chaque est également variable.

La ou les questions

Avec regex (PCRE/PHP, Perl, .NET ou similaire) est-il possible de :

  1. Déterminer si une telle formation existe
  2. Comptez le nombre de formations de ce type / faites correspondre le point de départ de chacune d'entre elles (4 dans l'exemple ci-dessus).

0 votes

Quelqu'un peut-il utiliser PHP (fonctions internes) pour calculer N lignes, et la longueur de chacune ? Il existe peut-être un moyen de générer "automatiquement" une regex comme je l'ai fait. ici sous la rubrique "briser les lois de l'expression géographique" ?

1 votes

@HamZa, cela devrait être à propos d'une seule expression régulière générale qui est indépendante de l'entrée. De telles astuces seraient donc de la triche ;-)

1 votes

Sans modifier l'entrée (rotation par exemple) et sans générer "automatiquement" des solutions, je dirais que bonne chance :-)

3voto

Andomar Points 115404

Vous pourriez faire pivoter l'image, et ensuite rechercher XXX .

1 votes

Bon point, mais ne répond pas à la question (solution regex). A moins que vous ne puissiez faire tourner une telle image avec regex aussi peut-être ;-)

1 votes

@Qtax : Si on ne peut pas faire de rotation, l'expression régulière devra chercher trois X avec le même nombre de caractères entre lui et le saut de ligne précédent. Il est possible de faire cela pour des tailles d'image limitées, mais ce n'est pas pratique.

0 votes

La taille des images n'est pas limitée (ou vous ne pouvez pas supposer une telle limite dans l'expression).

1voto

Cobra_Fast Points 5531

Mon approche pour faire correspondre des modèles verticaux en utilisant PHP.

Tout d'abord, faisons pivoter notre entrée de 90° :

// assuming $input contains your string
$input = explode("\n", $input);
$rotated = array();
foreach ($input as $line)
{
    $l = strlen($line);
    for ($i = 0; $i < $l; $i++)
    {
        if (isset($rotated[$i]))
            $rotated[$i] .= $line[$i];
        else
            $rotated[$i] = $line[$i];
    }
}
$rotated = implode("\n", $rotated);

Il en résulte

..XXX.....
..........
.XX....XX.
....X.....
X...X....X
.X.XXX....
..XX......
...X......
...X......
.XXX......
...X.....
.........
........
........
....XXX
.....
...
..
..
X
.
.
.

Cela peut sembler étrange, mais en fait, cela nous rapproche, car nous pouvons maintenant simplement preg_match_all() par-dessus :

if (preg_match_all('/\bXXX\b/', $rotated, $m))
var_dump($m[0]);

et voilà :

array(4) {
  [0] =>
  string(3) "XXX"
  [1] =>
  string(3) "XXX"
  [2] =>
  string(3) "XXX"
  [3] =>
  string(3) "XXX"
}

Si vous souhaitez également faire correspondre le même motif horizontal, il suffit d'utiliser la même expression sur l'entrée non tournée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X