Trouvez l'intérieur d'une boucle

14

Tâche

Étant donné un diagramme ASCII d'une boucle

par exemple

....................
......@@@@@.........
......@...@.........
.....@@...@@@@@.....
....@@........@.....
....@........@@.....
....@@@@@@@@@@......
....................
....................

Et un emplacement sur la boucle

par exemple

(7,1)

Vous devez trouver l'intérieur et l'extérieur de la boucle

par exemple

00000000000000000000
00000011111000000000
00000011111000000000
00000111111111100000
00001111111111100000
00001111111111100000
00001111111111000000
00000000000000000000
00000000000000000000

Caractéristiques

  • Vous pouvez prendre l'entrée pour le diagramme comme une chaîne séparée par des sauts de ligne ou un équivalent évident

  • Vous recevrez une coordonnée sur la boucle (0 ou 1 indexée) dans le cadre de votre entrée. Vous pouvez placer votre origine à n'importe quel endroit de votre choix. Vous pouvez prendre cette coordonnée dans (<row>, <column>), (<column>, <row>)ou la position linéaire sur la chaîne. Vous pouvez recevoir ces données par toute méthode raisonnable. Tous les caractères de la boucle seront identiques à ceux de cet index.

  • La sortie préférée est un tableau bidimensionnel de valeurs véridiques et fausses, cependant les chaînes de 1et 0séparées par des sauts de ligne ou tout équivalent évident des deux dernières sont acceptées. L'intérieur et l'extérieur doivent avoir des valeurs de vérité différentes mais peu importe qui est lequel.

  • Une boucle est définie comme un groupe de caractères tels qu'ils sont tous le même caractère ( par exemple@ ) et de sorte que chaque caractère de la boucle ait un chemin vers le caractère d'origine (le caractère à la coordonnée d'entrée) qui ne passe que par ce même caractère (géométrie Taxicab sans diagonales ).

  • L'intérieur est toute la boucle elle-même et les endroits qui ne peuvent pas atteindre le bord du diagramme sans traverser la boucle.

  • L'extérieur est partout ailleurs

  • C'est du

Cas de test

PasteBin

Post Rock Garf Hunter
la source
Pouvons-nous également prendre les coordonnées comme coordonnées linéaires dans la chaîne?
flawr
@flawr Vous le pouvez.
Post Rock Garf Hunter
Sommes-nous autorisés à prendre le diagramme comme une matrice de caractères, qc. comme [['.', '.'],['.', '@']]au lieu d'une chaîne avec des sauts de ligne?
hbaderts
@hbaderts C'est un équivalent évident
Post Rock Garf Hunter
1
@WheatWizard Merci pour le cas de test supplémentaire! Je recommanderais cependant de les mettre dans un extrait ou dans un gist / pastebin, afin de rendre le défi un peu plus simple =)
flawr

Réponses:

6

MATLAB, 163159146 78 octets

function m=f(m,y,x);[~,i]=bwfill(m~=m(y,x),x,y,8);m=m*0;m(i)=1;m=bwfill(m,'h')

Merci @ rahnema1 pour -66 octets !!!

Maintenant, cela fonctionne sur Essayez-le en ligne! MAIS quelques ajustements ont été nécessaires, car MATLAB et Octave ne sont pas entièrement compatibles.

Explication

D'abord, nous créons une image binaire qui masque simplement tous les caractères égaux au caractère initial. Ensuite, nous déterminons le composant connecté dans lequel se trouve le caractère initial.

% determine the connected component that is contains initial character

[~,i]=bwfill(m~=m(y,x),x,y,8);     % i contains the indices of the connected component
m=m*0;m(i)=1;                      % create an image of the connected component

Après cela, nous créons une image de ce composant connecté et appliquons remplir tous les "trous" de l'image.

m=bwfill(m,'h')
flawr
la source
Je pense que pour jouer au golf, Octave est meilleur, vous pouvez donc le réduire à au moins 72 octets
rahnema1
@ rahnema1 J'ai déjà commencé dans MATLAB, donc je ne vais pas changer cette soumission maintenant, mais merci pour la suggestion =)
flawr
5

MATLAB: 67 octets

function A=f(A,r,c),A=bwlabel(A==A(r,c),4);A=imfill(A==A(r,c),'h');

Quelques mises en garde:

  • A est supposé être un tableau de caractères.
  • Les indices dans MATLAB sont basés sur 1, les lignes étant indexées en premier. Il est supposé que ces modifications seraient apportées à l'entrée de la fonction (c'est-à-dire que l'exemple de question serait appelé comme output = f(A,2,8)).
  • bwlabelet imfillfont partie de la boîte à outils de traitement d'image.
gnovice
la source
1
bienvenue sur codegolf!
rahnema1
@ rahnema1: Étonné de ne pas l'avoir visité plus tôt, car j'ai fait du golf sur SO avant la naissance de ce site.
gnovice