Dans l'esprit de Patch the Image , voici un défi similaire mais avec du texte.
Défi
La pourriture des bits a affligé votre précieux texte! Étant donné un paragraphe composé de caractères ASCII, avec un trou rectangulaire quelque part, votre programme doit essayer de remplir le trou avec le texte approprié, afin que le paragraphe se mélange le mieux possible.
D'autres définitions
- Le trou sera toujours rectangulaire et peut s'étendre sur plusieurs lignes.
- Il n'y aura qu'un seul trou.
- Notez que le trou ne tombe pas nécessairement sur les limites des mots (en fait, ce n'est généralement pas le cas).
- Le trou représentera au plus 25% du paragraphe d'entrée, mais peut se chevaucher ou s'étendre au-delà de la "fin" du texte "normal" (voir les exemples Euclid ou Badger ci-dessous).
- Étant donné que la recherche du trou n'est pas le point principal de ce défi, il sera composé uniquement de marques de hachage
#
pour permettre une identification facile. - Aucun autre emplacement dans le paragraphe d'entrée n'aura de marque de hachage.
- Votre code ne peut pas utiliser le texte "normal" dans les exemples ci-dessous - il ne recevra et ne traitera que le texte avec le trou qu'il contient.
- L'entrée peut être une seule chaîne multi-lignes, un tableau de chaînes (un élément par ligne), un fichier, etc. - votre choix de ce qui convient le mieux à votre langue.
- Si vous le souhaitez, une entrée supplémentaire facultative détaillant les coordonnées du trou peut être prise (par exemple, un tuple de coordonnées ou similaire).
- Veuillez décrire votre algorithme dans votre soumission.
Vote
Les électeurs sont invités à juger les entrées en fonction de la façon dont l'algorithme remplit le trou de texte. Voici quelques suggestions:
- La zone remplie correspond-elle à la distribution approximative des espaces et de la ponctuation comme le reste du paragraphe?
- La zone remplie présente-t-elle une syntaxe erronée? (par exemple, deux espaces consécutifs, une période suivie d'un point d'interrogation, une séquence erronée comme
, ,
, etc.) - Si vous plissez les yeux (pour ne pas lire le texte), pouvez-vous voir où était le trou?
- S'il n'y a pas de mots CamelCase en dehors du trou, le trou en contient-il? S'il n'y a pas de lettres majuscules à l'extérieur du trou, le trou en contient-il? S'il y a beaucoup de lettres majuscules à l'extérieur du trou, le trou contient-il un montant proportionnel?
Critère de validité
Pour qu'une soumission soit considérée comme valide, elle ne doit modifier aucun texte du paragraphe à l'extérieur du trou (y compris les espaces de fin). Une seule nouvelle ligne à la fin est facultative.
Cas de test
Le format est le paragraphe d'origine dans un bloc de code, suivi du même paragraphe avec un trou. Les paragraphes avec le trou seront utilisés pour la saisie.
1 (Patch l'image)
In a popular image editing software there is a feature, that patches (The term
used in image processing is inpainting as @minxomat pointed out.) a selected
area of an image, based on the information outside of that patch. And it does a
quite good job, considering it is just a program. As a human, you can sometimes
see that something is wrong, but if you squeeze your eyes or just take a short
glance, the patch seems to fill in the gap quite well.
In a popular image editing software there is a feature, that patches (The term
used in image processing is inpainting as @minxomat pointed out.) a selected
area of an image, #############information outside of that patch. And it does a
quite good job, co#############is just a program. As a human, you can sometimes
see that something#############t if you squeeze your eyes or just take a short
glance, the patch seems to fill in the gap quite well.
2 (adresse de Gettysburg)
But, in a larger sense, we can not dedicate, we can not consecrate, we can not
hallow this ground. The brave men, living and dead, who struggled here, have
consecrated it, far above our poor power to add or detract. The world will
little note, nor long remember what we say here, but it can never forget what
they did here. It is for us the living, rather, to be dedicated here to the
unfinished work which they who fought here have thus far so nobly advanced. It
is rather for us to be here dedicated to the great task remaining before us-
that from these honored dead we take increased devotion to that cause for which
they gave the last full measure of devotion-that we here highly resolve that
these dead shall not have died in vain-that this nation, under God, shall have
a new birth of freedom-and that government of the people, by the people, for
the people, shall not perish from the earth.
But, in a larger sense, we can not dedicate, we can not consecrate, we can not
hallow this ground. The brave men, living and dead, who struggled here, have
consecrated it, far above our poor power to add or detract. The world will
little note, nor long remember what we say here, but it can never forget what
they did here. It is for us the living, rather, to be dedicated here to the
unfinished work which they who fought here h######################advanced. It
is rather for us to be here dedicated to the######################before us-
that from these honored dead we take increas######################use for which
they gave the last full measure of devotion-######################solve that
these dead shall not have died in vain-that ######################, shall have
a new birth of freedom-and that government of the people, by the people, for
the people, shall not perish from the earth.
3 (Lorem Ipsum)
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim
ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit
in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur
sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt
mollit anim id est laborum.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim
ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
aliquip ex ea commodo conse################irure dolor in reprehenderit
in voluptate velit esse cil################giat nulla pariatur. Excepteur
sint occaecat cupidatat non################in culpa qui officia deserunt
mollit anim id est laborum.
4 (Jabberwocky)
'Twas brillig, and the slithy toves
Did gyre and gimble in the wabe;
All mimsy were the borogoves,
And the mome raths outgrabe.
'Twas brillig, and the slithy toves
Did gyre a######### in the wabe;
All mimsy #########borogoves,
And the mome raths outgrabe.
5 (Preuve d'Euclide du théorème de Pythagore)
1.Let ACB be a right-angled triangle with right angle CAB.
2.On each of the sides BC, AB, and CA, squares are drawn,
CBDE, BAGF, and ACIH, in that order. The construction of
squares requires the immediately preceding theorems in Euclid,
and depends upon the parallel postulate. [footnote 14]
3.From A, draw a line parallel to BD and CE. It will
perpendicularly intersect BC and DE at K and L, respectively.
4.Join CF and AD, to form the triangles BCF and BDA.
5.Angles CAB and BAG are both right angles; therefore C, A,
and G are collinear. Similarly for B, A, and H.
6.Angles CBD and FBA are both right angles; therefore angle ABD
equals angle FBC, since both are the sum of a right angle and angle ABC.
7.Since AB is equal to FB and BD is equal to BC, triangle ABD
must be congruent to triangle FBC.
8.Since A-K-L is a straight line, parallel to BD, then rectangle
BDLK has twice the area of triangle ABD because they share the base
BD and have the same altitude BK, i.e., a line normal to their common
base, connecting the parallel lines BD and AL. (lemma 2)
9.Since C is collinear with A and G, square BAGF must be twice in area
to triangle FBC.
10.Therefore, rectangle BDLK must have the same area as square BAGF = AB^2.
11.Similarly, it can be shown that rectangle CKLE must have the same
area as square ACIH = AC^2.
12.Adding these two results, AB^2 + AC^2 = BD × BK + KL × KC
13.Since BD = KL, BD × BK + KL × KC = BD(BK + KC) = BD × BC
14.Therefore, AB^2 + AC^2 = BC^2, since CBDE is a square.
1.Let ACB be a right-angled triangle with right angle CAB.
2.On each of the sides BC, AB, and CA, squares are drawn,
CBDE, BAGF, and ACIH, in that order. The construction of
squares requires the immediately preceding theorems in Euclid,
and depends upon the parallel postulate. [footnote 14]
3.From A, draw a line parallel to BD and CE. It will
perpendicularly intersect BC and DE at K and L, respectively.
4.Join CF and AD, to form the triangles BCF and BDA.
5.Angles CAB and BAG are both right angles; therefore C, A,
and G are #############milarly for B, A, and H.
6.Angles C#############e both right angles; therefore angle ABD
equals ang############# both are the sum of a right angle and angle ABC.
7.Since AB#############FB and BD is equal to BC, triangle ABD
must be co#############iangle FBC.
8.Since A-#############ight line, parallel to BD, then rectangle
BDLK has t############# of triangle ABD because they share the base
BD and hav#############titude BK, i.e., a line normal to their common
base, conn#############rallel lines BD and AL. (lemma 2)
9.Since C #############with A and G, square BAGF must be twice in area
to triangl#############
10.Therefo############# BDLK must have the same area as square BAGF = AB^2.
11.Similar############# shown that rectangle CKLE must have the same
area as square ACIH = AC^2.
12.Adding these two results, AB^2 + AC^2 = BD × BK + KL × KC
13.Since BD = KL, BD × BK + KL × KC = BD(BK + KC) = BD × BC
14.Therefore, AB^2 + AC^2 = BC^2, since CBDE is a square.
6 (Badger, Badger, Badger par weebl)
Badger, badger, badger, badger, badger,
badger, badger, badger, badger, badger
Mushroom, mushroom, a-
Badger, badger, badger, badger, badger,
badger, badger, badger, badger, badger
Mushroom, mushroom, a-
Badger, badger, badger, badger, badger,
badger, badger, badger, badger, badger
Mush-mushroom, a
Badger, badger, badger, badger, badger,
badger, badger, badger, badger, badger
Argh! Snake, a snake!
Snaaake! A snaaaake, oooh its a snake!
Badger, badger, badger, badger, badger,
badger, badger, badger, badger, badger
Mushroom, mushroom, a-
Badger##################badger, badger,
badger##################badger, badger
Mushro##################
Badger##################badger, badger,
badger##################badger, badger
Mush-mushroom, a
Badger, badger, badger, badger, badger,
badger, badger, badger, badger, badger
Argh! Snake, a snake!
Snaaake! A snaaaake, oooh its a snake!
la source
Réponses:
Python 2
Je sais que @atlasologist a déjà posté une solution en Python 2, mais la façon dont mes travaux sont un peu différents. Cela fonctionne en parcourant tous les trous, de haut en bas, de gauche à droite, en regardant 5 caractères en arrière et au personnage ci-dessus, et en trouvant un personnage où cela correspond. Si plusieurs caractères sont trouvés, il choisit le plus commun. Si aucun caractère n'est trouvé, il supprime la restriction ci-dessus. S'il n'y a toujours pas de caractères trouvés, il diminue la quantité de caractères qu'il regarde en arrière et se répète.
Voici le résultat de Badger, Badger, Badger:
Voici le résultat de la preuve:
Et le résultat de Jabberwocky:
la source
Python 2
Il s'agit d'une solution assez simple. Il crée un exemple de chaîne composée de mots compris entre la longueur moyenne des mots
A
- (A
/ 2) etA
+ (A
/ 2), puis il applique des morceaux découpés dans les espaces de début et de fin de l'échantillon à la zone de patch. Il ne gère pas la capitalisation, et je suis sûr qu'il y a un cas de test de courbe qui le casserait, mais cela fonctionne bien dans les exemples. Voir le lien ci-dessous pour exécuter tous les tests.J'ai également mis un correctif dans le code pour faire bonne mesure.
Lorem Ipsum, original puis patché:
L'essayer
la source
mushroger
...#
caractères du code.@
, rien d'intéressant.Java Shakespeare
Qui a besoin de comprendre les conventions anglaises standard? Faites le vôtre! Tout comme le barde a été autorisé à inventer ses propres mots. Ce bot ne s'inquiète pas trop de la correction des mots coupés, il insère vraiment juste des mots aléatoires. Le résultat est une belle poésie. En bonus, la barde est d'un calibre supérieur et peut gérer plusieurs trous à condition qu'ils soient de la même taille!
Exemple d'entrée
Belle sortie
Les deux dernières lignes sont profondément poétiques si je le dis moi-même. Il fonctionne aussi étonnamment bien sur l'adresse de Gettysburg.
Voyons ce qui fait vibrer Shakespeare. Voici le code. Essentiellement, il s'efforce de construire une base de vocabulaire à partir de l'entrée. Il utilise ensuite ces mots et les place au hasard dans le trou (en s'assurant qu'ils correspondent bien). Il est déterministe car il utilise une graine fixe pour le hasard.
La plupart de la poésie de Shakespeare est du domaine public.
la source
Python 2.7
Une autre solution Python avec une approche différente. Mon programme voit le texte comme une chaîne de Markov , où chaque lettre est suivie d'une autre lettre avec une certaine probabilité. La première étape consiste donc à construire la table des probabilités. L'étape suivante consiste à appliquer ces probabilités au patch.
Le code complet, y compris un exemple de texte, est ci-dessous. Étant donné qu'un exemple utilise des caractères unicode, j'ai inclus une page de code explicite (utf-8) pour la compatibilité avec cet exemple.
Exemple de sortie pour le Lorem Ipsum:
Une ligne extra poétique dans le Jabberwocky:
la source
C # 5 massif comme jamais
J'ai jeté cela ensemble, c'est un peu le bordel, mais cela produit parfois des résultats OK. C'est un algorithme principalement déterministe, mais avec un peu d'aléatoire (fixe) pour éviter qu'il ne produise la même chaîne pour des lacunes similaires. Il faut faire des efforts pour éviter d'avoir simplement des colonnes d'espaces de chaque côté des espaces.
Il fonctionne en symbolisant l'entrée en mots et en ponctuation (la ponctuation provient d'une liste saisie manuellement, car je ne peux pas être dérangé de savoir si Unicode peut le faire pour moi), afin qu'il puisse mettre des espaces avant les mots, et pas avant ponctuation, car c'est assez typique. Il se divise en espaces blancs typiques. Dans la veine des chaînes de Markov (je pense), il compte la fréquence à laquelle chaque jeton se suit, puis ne calcule pas les probabilités pour cela (je pense que parce que les documents sont si petits, nous ferions mieux de privilégier les choses nous voyons beaucoup où nous pouvons). Ensuite, nous effectuons une recherche en largeur, en remplissant l'espace laissé par les hachages et les mots «partiels» de chaque côté, le coût étant calculé comme
-fabness(last, cur) * len(cur_with_space)
, oùfabness
retourne le nombre de foiscur
suivilast
pour chaque jeton ajouté dans la chaîne générée. Naturellement, nous essayons de minimiser le coût. Parce que nous ne pouvons pas toujours combler le vide avec des mots et des signes de ponctuation trouvés dans le document, il prend également en compte un certain nombre de jetons `` spéciaux '' de certains États, y compris les chaînes partielles de chaque côté, contre lesquelles nous privilégions les coûts arbitrairement augmentés.Si le BFS ne parvient pas à trouver une solution, alors nous essayons naïvement de choisir un adverbe aléatoire, ou simplement d'insérer des espaces pour remplir l'espace.
Résultats
Les 6 peuvent être trouvés ici: https://gist.github.com/anonymous/5277db726d3f9bdd950b173b19fec82a
Le cas-test d'Euclid ne s'est pas très bien passé ...
Patcher l'image
Jabberwocky
Blaireau
_Je suis content de la façon dont celui-ci s'est avéré ...
Code
Le courir avec
Il y en a beaucoup. Le seul élément intéressant à distance est la
Fill
méthode. J'inclus l'implémentation du tas, car .NET n'en a pas (POURQUOI MS POURQUOI?!).la source