Supposons que l'on vous donne des lettres majuscules distinctes dispersées dans un tableau rectangulaire de cellules autrement vides. Chaque cellule du tableau appartient à la lettre la plus proche , définie comme la lettre accessible dans le plus petit nombre d'étapes horizontales et / ou verticales - pas d'étapes diagonales. (Si une cellule est équidistante de deux ou plusieurs lettres les plus proches, elle appartient à la première de ces lettres dans l'ordre alphabétique. Une cellule avec une lettre majuscule appartient à cette lettre.) Les cellules limites sont celles qui sont horizontales ou verticales adjacent à une ou plusieurs cellules n'appartenant pas à la lettre à laquelle elles appartiennent.
Écrivez un sous-programme de procédure avec le comportement suivant, produisant une sorte de diagramme de Voronoï ...
Entrée : toute chaîne ASCII composée uniquement de points, de lettres majuscules et de sauts de ligne, de telle sorte qu’une fois imprimée, elle affiche un tableau rectangulaire du type décrit ci-dessus, les points faisant office de blancs.
Sortie : une impression de la chaîne d'entrée avec chaque cellule frontière vide remplacée par la version en minuscule de la lettre à laquelle elle appartient. (Le sous-programme fait l'impression.)
Exemple 1
Contribution:
......B..
.........
...A.....
.........
.......D.
.........
.C.......
.....E...
.........
Sortie:
...ab.B..
....ab.bb
...A.abdd
aa...ad..
cca.ad.D.
..caeed..
.C.ce.edd
..ce.E.ee
..ce.....
Un croquis soulignant les limites:
Exemple 2
Contribution:
............................U...........
......T.................................
........................................
.....................G..................
..R.......S..........F.D.E............I.
.........................H..............
.....YW.Z...............................
......X.................................
........................................
........................................
......MN...........V....................
......PQ................................
........................................
.............L...............J..........
........................................
........................................
....C...........K.......................
........................................
..................................A.....
...........B............................
Sortie:
..rt.....ts...sg......gduu..U.....ui....
..rt..T..ts...sg......gddeu......ui.....
...rt...ts....sg......gddeeu....ui......
....rttts.....sggggggGgdde.euuuui.......
..R.rywss.S....sfffffFdDdEeeeeeei.....I.
...ryywwzs.....sf....fddhHhhhhhhhi......
..ryyYWwZzs..sssffff.fddh.......hi......
..rxxxXxzzs.sllvvvvvffddh....hhhhi......
rrrxxxxnzzssl.lv....vfddh...hjjjjii.....
mmmmmmmnnnnnl.lv.....vvdh..hj....jai....
mmmmmmMNnnnnl.lv...V...vvhhj.....jaai...
ppppppPQqqql...lv.......vhj......ja.ai..
ppppp.pq.ql....lkv.....vjj.......ja..aii
cccccppqql...L.lkkv...vj.....J...ja...aa
.....cpqqlll..lk..kvvvvj........ja......
......cccbbbllk....kkkkj.......ja.......
....C...cb..bk..K......kj.....ja........
.......cb....bk........kjjjjjja.........
......cb......bk.......kaaaaaa....A.....
.....cb....B...bk......ka...............
Amélioration des couleurs:
Réponses:
GolfScript,
138144137 caractèresL'entrée est donnée au sous-programme sous la forme d'une chaîne unique sur la pile. Malheureusement, j'ai dû utiliser un en
puts
raison de l'exigence selon laquelle la routine doit imprimer le résultat.Explication du code
Le bloc externe boucle essentiellement sur toutes les positions (x, y) en fonction de la taille des rectangles d'entrée. Dans la boucle, les coordonnées x et y sont laissées à chaque fois sur la pile. Une fois chaque ligne terminée, le résultat est imprimé sur la console.
Le code exécuté dans la boucle prend d'abord le caractère correspondant de l'entrée.
Ensuite, fondamentalement, nous vérifions si nous avons un
.
, c'est-à-dire si nous devons (éventuellement) remplacer le caractère.Encore une fois, le code interne commence par une boucle, maintenant sur toutes les coordonnées (x, y) (x, y + 1) (x + 1, y) (x, y-1) (x-1, y)
L'extrait de code interne récent renvoie simplement la lettre (en minuscule) du point le plus proche, compte tenu des deux coordonnées.
Donc, à partir des cinq lettres les plus proches pour les coordonnées (x, y) (x, y + 1) (x + 1, y) (x, y-1) (x-1, y), prenez la première, sinon toutes sont égal, sinon prendre a
.
.la source
Python 3 -
424422417332295 caractères:Il y a trois parties, chacune devant être sur sa propre ligne en raison de la syntaxe de Python:
w
est la largeur d'une rangée de la planche (y compris la nouvelle ligne à la fin, qui sera recyclée comme colonne de rembourrage).r
est unrange
objet qui indexe tous les caractères des
.n
est un tuple de décalages d'index pour atteindre les voisins d'un caractère (donc si vous vouliez permettre aux lettres de s'étaler en diagonale, vous auriez juste besoin d'ajouter-w-1,-w+1,w-1,w+1
au tuple).x
est un nom court pour lastr.replace
méthode, qui est utilisée plusieurs fois dans le code ultérieur (les appels seront étranges cependant, puisque j'utilisex(s,*"xy")
pour enregistrer des caractères, plutôt que le conventionnels.replace("x", "y")
). Les caractères (car ils trient après toutes les lettres). Une ligne de caractères de remplissage est également ajoutée à la fin.s
chaîne de paramètres est également légèrement modifiée à ce stade, avec son.
caractères et sauts de ligne étant remplacés par~
~
t
sera utilisé plus tard comme référence à l '"ancienne" version des
, mais il doit être initialisé à quelque chose de différents
au début, et zéro ne prend qu'un seul caractère (une valeur plus Pythonique seraitNone
, mais ce sont trois caractères supplémentaires) .s
à jour à plusieurs reprises en utilisant une compréhension de liste. Au fur et à mesure que la compréhension parcourt les index des
, les~
caractères sont remplacés par ceuxmin
de leurs voisins. Si un~
personnage était complètement entouré d'autres~
s, cela ne fera rien. Si elle était à côté d'une ou plusieurs lettres, il deviendra le plus petit d'entre eux ( en favorisant"a"
plus"b"
, etc.). Les sauts de ligne qui ont été convertis en~
caractères sont conservés en détectant leurs index avec l'opérateur de module. La ligne de remplissage à la fin n'est pas mise à jour dans la liste de compréhension (car la plage d'index,, ar
été calculée avant d'être ajoutée auxs
). Au lieu de cela, une nouvelle rangée de~
des caractères sont ajoutés une fois la compréhension terminée. Notez que celas
devient une liste de caractères plutôt qu'une chaîne après le premier passage de la boucle (mais parce que Python est flexible sur les types, nous pouvons toujours indexer pour obtenir les caractères de la même manière).~
caractères du remplissage) est remplacée par.
. Ensuite, les caractères sont tous concaténés ensemble dans une seule chaîne. Enfin, les~
caractères de remplissage sont reconvertis en nouvelles lignes et la chaîne est imprimée.la source
r=range
devrait probablement être à l'intérieur du corps de la fonction pour être considéré comme faisant partie d'une procédure appelable, mais vous pouvez enregistrer des caractères en écrivantr=range;s=[l.replace
. Vous pouvez également extraire plus de caractères en écrivantif"~"==s[y][x]else
etif"~"==s[y][x]else
, pour un total de 422. (Btw, cela a fonctionné pour moi avec Python 2.7)r=range
à la fin de la première ligne de la fonction (où j'ai configuré d'autres variables) et rasé quelques espaces que j'avais manqués auparavant. Je ne sais pas si j'ai obtenu les deux dont vous parliez, car vous semblez avoir mentionné deux fois la même chose. Et, dans Python 2.7, il peut être deux autres caractères plus court, car vous n'avez pas besoin des parenthèses aprèsprint
(généralement, cela n'enregistre qu'un seul caractère, maisprint"\n".join(...)
fonctionne).s[y][x]for
(supprimer un espace), mais vous semblez l'avoir trouvé de toute façon.Python,
229226 caractèresEst-ce qu'une inondation se remplit pour calculer le résultat. Le trailing
for
/zip
combo génère un tableaux
pour chaque cellule contenant la valeur dans cette cellule et ses quatre voisins. Ensuite, nous utilisons l'astuce de Blckknght etmin
un tas de possibilités pour chaque cellule. Il s'agit de la valeur de cellule d'origine, de tous les voisins si la cellule n'a pas encore été visitée, ou a.
si elle a été visitée et que tous les voisins sont.
ou sont égaux à la cellule elle-même.la source
return s
àprint s
. De plus, ne peut pasy!=b
être changé eny>b
? Cela ferait 226 caractères, je pense.C'est ici. Ceci est mon premier programme F #. Si j'ai raté une caractéristique de la langue, veuillez m'alerter car j'apprends encore.
Voici mon exemple d'entrée
Voici la sortie
Voici le code. Prendre plaisir.
Nous devons maintenant convertir ces données en un tableau à double dimension afin de pouvoir y accéder via des indexeurs.
Créons une matrice représentant la propriété de chaque cellule
Ayons une méthode utilitaire pour voir ce qui s'est passé.
Créons un enregistrement pour représenter où réside une majuscule particulière.
Maintenant, nous voulons trouver toutes les lettres majuscules.
Alors que nous nous déplaçons, nous avons besoin d'un concept de direction.
Alors que nous nous déplaçons, nous allons avoir besoin de connaître la taille. Cela nous aidera à contrôler si nous sortons des limites.
Modèle actif: correspond aux critères d'une cellule donnée.
Nous passons maintenant à la taxe sur le laiton. Cela réclame la cellule!
En utilisant le modèle actif, revendiquez cette cellule si elle n'est pas réclamée et renvoyez les coordonnées des cellules adjacentes.
Nous commençons à créer des listes de ce sac de données, créons un type pour rendre les choses plus claires.
Étant donné une liste de critères pour réclamer des cellules, nous allons parcourir la liste en retournant les cellules suivantes à réclamer et à rentrer dans cette liste.
Pour chaque capital, créez un critère de revendication dans chaque direction, puis revendiquez récursivement ces cellules.
Chaque programme a besoin d'un principal.
la source