W duchu Patch the Image , oto podobne wyzwanie, ale z tekstem.
Wyzwanie
Trochę zgnilizna dotknęła twój cenny tekst! Biorąc pod uwagę akapit składający się ze znaków ASCII, z prostokątnym otworem gdzieś w nim, twój program powinien spróbować wypełnić ten otwór odpowiednim tekstem, aby akapit zlewał się jak najlepiej.
Dalsze definicje
- Otwór zawsze będzie prostokątny i może obejmować wiele linii.
- Zawsze będzie tylko jedna dziura.
- Zauważ, że dziura niekoniecznie spada na granice słów (w rzeczywistości zwykle nie).
- Otwór będzie wynosił najwyżej 25% akapitu wejściowego, ale może nakładać się lub rozciągać poza „koniec” „normalnego” tekstu (patrz przykłady Euclid lub Borsuk poniżej).
- Ponieważ znalezienie dziury nie jest głównym celem tego wyzwania, będzie ona składać się wyłącznie ze znaków skrótu,
#
aby umożliwić łatwą identyfikację. - Żadna inna lokalizacja w akapicie wejściowym nie będzie miała znaku skrótu.
- Twój kod nie może używać „normalnego” tekstu w poniższych przykładach - odbiera i przetwarza tylko tekst z dziurą.
- Dane wejściowe mogą być pojedynczym ciągiem wieloliniowym, tablicą ciągów (jeden element na linię), plikiem itp. - wybór najbardziej dogodnego dla twojego języka.
- W razie potrzeby można pobrać opcjonalne dodatkowe dane wejściowe wyszczególniające współrzędne otworu (np. Krotkę współrzędnych lub tym podobne).
- Opisz swój algorytm w swoim zgłoszeniu.
Głosowanie
Wyborcy proszeni są o ocenę wpisów na podstawie tego, jak dobrze algorytm wypełnia otwór tekstowy. Niektóre sugestie obejmują:
- Czy wypełniony obszar odpowiada przybliżonemu rozkładowi odstępów i interpunkcji jak reszta akapitu?
- Czy wypełniony obszar wprowadza błędną składnię? (np. dwie spacje z rzędu, kropka po znaku zapytania, błędna sekwencja
, ,
, itp.) - Jeśli zmrużysz oczy (więc tak naprawdę nie czytasz tekstu), czy widzisz, gdzie była dziura?
- Jeśli poza dziurą nie ma żadnych słów CamelCase, czy dziura zawiera jakieś? Jeśli poza dziurą nie ma żadnych wielkich liter, czy dziura zawiera jakieś? Jeśli poza otworem jest wiele wielkich liter, czy dziura zawiera proporcjonalną ilość?
Kryterium ważności
Aby zgłoszenie zostało uznane za ważne, nie może zmieniać żadnego tekstu akapitu poza otworem (w tym spacji końcowych). Pojedyncza nowa linia na samym końcu jest opcjonalna.
Przypadki testowe
Format to oryginalny akapit w bloku kodu, po którym następuje ten sam akapit z otworem. Do wprowadzania zostaną użyte akapity z otworem.
1 (Łata obrazu)
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 (adres 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 (dowód Euklidesa na twierdzenie Pitagorasa)
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 od 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!
źródło
Odpowiedzi:
Python 2
Wiem, że @atlasologist opublikował już rozwiązanie w Pythonie 2, ale sposób, w jaki moje prace są nieco inne. Działa to poprzez przejście przez wszystkie otwory, od góry do dołu, od lewej do prawej, patrząc 5 znaków do tyłu i na postać powyżej i znajdując postać, w której pasują one do siebie. W przypadku znalezienia wielu znaków wybierana jest najczęstsza. W przypadku braku znaków usuwa powyższe ograniczenie znaków. Jeśli nadal nie znaleziono żadnych znaków, zmniejsza liczbę znaków, które ogląda wstecz, i powtarza się.
Oto wynik Badger, Badger, Badger:
Oto wynik z dowodu:
A wynik Jabberwocky:
źródło
Python 2
To dość proste rozwiązanie. Tworzy przykładowy ciąg złożony ze słów o średniej długości słowa
A
- (A
/ 2) iA
+ (A
/ 2), a następnie stosuje fragmenty przycięte na początku i na końcu z próbki do obszaru łatki. Nie obsługuje wielkich liter i jestem pewien, że istnieje przypadek testowy krzywej, który by go złamał, ale w przykładach jest w porządku. Zobacz poniższy link, aby uruchomić wszystkie testy.Umieściłem również łatkę w kodzie, aby zachować dokładność.
Lorem Ipsum, oryginał następnie załatany:
Spróbuj
źródło
mushroger
...#
znaków w kodzie.@
, nic ciekawego.Java Shakespeare
Kto potrzebuje znajomości standardowych angielskich konwencji? Po prostu stwórz własny! Tak jak bard mógł wymyślić własne słowa. Ten bot nie przejmuje się zbytnio poprawianiem odciętych słów, po prostu wstawia losowe słowa. Rezultatem jest piękna Poezja. Jako bonus, bard ma wyższy kaliber i może obsłużyć wiele otworów, pod warunkiem, że mają ten sam rozmiar!
Przykładowe dane wejściowe
Piękna wydajność
Ostatnie kilka wierszy jest głęboko poetyckie, jeśli sam to powiem. Działa zaskakująco dobrze również pod adresem Gettysburg.
Pozwala zobaczyć, co sprawia, że Szekspir tyka. Oto kod. Zasadniczo stara się zbudować bazę słownictwa na podstawie danych wejściowych. Następnie używa tych słów i losowo umieszcza je w otworze (upewniając się, że dobrze się mieszczą). Jest deterministyczny, ponieważ wykorzystuje ustalone ziarno do losowości.
Większość poezji Szekspira jest własnością publiczną.
źródło
Python 2.7
Kolejne rozwiązanie Python z innym podejściem. Mój program postrzega tekst jako łańcuch Markowa , po którym po każdej literze pojawia się inna litera z pewnym prawdopodobieństwem. Pierwszym krokiem jest więc zbudowanie tabeli prawdopodobieństw. Następnym krokiem jest zastosowanie tych prawdopodobieństw do łatki.
Pełny kod, w tym jeden przykładowy tekst, znajduje się poniżej. Ponieważ w jednym przykładzie użyto znaków Unicode, dołączyłem jawną stronę kodową (utf-8) w celu zapewnienia zgodności z tym przykładem.
Przykładowe dane wyjściowe dla Lorem Ipsum:
Dodatkowa poetycka linia w Jabberwocky:
źródło
C # 5 masywny jak zawsze
Rzuciłem to razem, to trochę bałagan, ale czasami przynosi pewne dobre wyniki. Jest to algorytm głównie deterministyczny, ale z dodaną pewną losowością (o ustalonym ziarnie), aby uniknąć tworzenia tego samego ciągu dla podobnych przerw. Staramy się unikać kolumny kolumn po obu stronach szczelin.
Działa poprzez tokenizowanie danych wejściowych na słowa i interpunkcję (interpunkcja pochodzi z ręcznie wprowadzonej listy, ponieważ nie przeszkadza mi, aby się dowiedzieć, czy Unicode może to dla mnie zrobić), dzięki czemu może wstawiać spacje przed słowami, a nie przed interpunkcja, ponieważ jest to dość typowe. Dzieli się na typowe białe znaki. W myśl łańcuchów Markowa (tak myślę) liczy się, jak często każdy token podąża za sobą, a następnie nie oblicza prawdopodobieństwa tego ( wydaje mi się, że ponieważ dokumenty są tak małe, lepiej byłoby kierować się na rzeczy widzimy dużo, gdzie możemy). Następnie wykonujemy pierwsze wyszukiwanie szerokości, wypełniając przestrzeń pozostawioną przez hasze i słowa „częściowe” po obu stronach, przy czym koszt jest obliczany jako
-fabness(last, cur) * len(cur_with_space)
, gdziefabness
zwracana jest liczbacur
powtórzeńlast
dla każdego dołączonego tokena w generowanym ciągu. Oczywiście staramy się minimalizować koszty. Ponieważ nie zawsze możemy wypełnić lukę słowami i znakami interpunkcyjnymi znajdującymi się w dokumencie, rozważa się także wiele „specjalnych” tokenów z niektórych stanów, w tym częściowe ciągi znaków po obu stronach, przeciwko którym popełniamy arbitralnie zwiększone koszty.Jeśli BFS nie znajdzie rozwiązania, wówczas naiwnie staramy się wybrać losowy przysłówek lub po prostu wstawić spacje, aby wypełnić przestrzeń.
Wyniki
Wszystkie 6 można znaleźć tutaj: https://gist.github.com/anonymous/5277db726d3f9bdd950b173b19fec82a
Przypadek testowy Euclid nie poszedł zbyt dobrze ...
Łatka obrazu
Jabberwocky
Borsuk
_ Cieszę się z tego, jak to się potoczyło ... to na szczęście, że „borsuk, borsuk” pasuje, bo inaczej nie zrobiłby tego tak dobrze
Kod
Uruchom to z
Jest tego całkiem sporo. Jedynym zdalnie interesującym bitem jest
Fill
metoda. Dołączam implementację sterty, ponieważ .NET jej nie ma (DLACZEGO MS DLACZEGO ?!).źródło