Załóżmy, że masz kilka wyraźnych wielkich liter rozproszonych w prostokątnym układzie niepozornych komórek. Każda komórka w tablicy należy do najbliższej litery , zdefiniowanej jako litera osiągalna w najmniejszej liczbie poziomych i / lub pionowych kroków - bez kroków po przekątnej. (Jeśli komórka jest w równej odległości od dwóch lub więcej najbliższych liter, należy do którejkolwiek z tych liter, która jest pierwsza w kolejności alfabetycznej. Komórka z wielką literą należy do tej litery.) Komórki graniczne to komórki, które są poziomo lub pionowo przylegające do jednej lub więcej komórek, które nie należą do litery, do której one należą.
Napisz podprogram procedury o następującym działaniu, tworząc rodzaj diagramu Voronoi ...
Dane wejściowe : dowolny ciąg ASCII złożony tylko z kropek, wielkich liter i znaków nowej linii, tak że po wydrukowaniu wyświetla prostokątną tablicę opisanego powyżej rodzaju, z kropkami działającymi jak puste miejsca.
Dane wyjściowe : wydruk ciągu wejściowego z każdą pustą komórką graniczną zastąpioną małą wersją litery, do której należy. (Podprogram wykonuje wydruk).
Przykład 1
Wkład:
......B..
.........
...A.....
.........
.......D.
.........
.C.......
.....E...
.........
Wydajność:
...ab.B..
....ab.bb
...A.abdd
aa...ad..
cca.ad.D.
..caeed..
.C.ce.edd
..ce.E.ee
..ce.....
Szkic podkreślający granice:
Przykład 2
Wkład:
............................U...........
......T.................................
........................................
.....................G..................
..R.......S..........F.D.E............I.
.........................H..............
.....YW.Z...............................
......X.................................
........................................
........................................
......MN...........V....................
......PQ................................
........................................
.............L...............J..........
........................................
........................................
....C...........K.......................
........................................
..................................A.....
...........B............................
Wydajność:
..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...............
Wzmocnienie kolorów:
Odpowiedzi:
GolfScript,
138144137 znakówDane wejściowe są przekazywane do podprogramu jako pojedynczy ciąg znaków na stosie. Niestety musiałem skorzystać z
puts
powodu, że procedura musi wydrukować wynik.Objaśnienie kodu
Blok zewnętrzny zasadniczo zapętla się we wszystkich pozycjach (x, y) zgodnie z rozmiarem prostokątów wejściowych. W pętli współrzędne xiy pozostają za każdym razem na stosie. Po zakończeniu każdego wiersza wynik jest drukowany na konsoli.
Kod wykonywany w pętli najpierw pobiera odpowiedni znak danych wejściowych.
Następnie w zasadzie sprawdzamy, czy mamy
.
, tzn. Czy (ewentualnie) musimy zastąpić znak.Ponownie wewnętrzny kod zaczyna się od pętli, teraz ponad wszystkimi współrzędnymi (x, y) (x, y + 1) (x + 1, y) (x, y-1) (x-1, y)
Ostatni fragment kodu wewnętrznego zwraca po prostu (małą literę) literę najbliższego punktu, biorąc pod uwagę dwie współrzędne.
Tak więc z pięciu najbliższych liter dla współrzędnych (x, y) (x, y + 1) (x + 1, y) (x, y-1) (x-1, y) weź pierwszą, jeśli nie wszystkie są równe, w przeciwnym razie weź
.
.źródło
Python 3 -
424422417332295 znaków:Istnieją trzy części, z których każda musi znajdować się w osobnej linii ze względu na składnię Pythona:
w
to szerokość rzędu deski (w tym nowego wiersza na końcu, który zostanie przetworzony jako kolumna wypełnienia).r
torange
obiekt, który indeksuje wszystkie znakis
.n
jest krotką przesunięć indeksu, aby dostać się do sąsiadów postaci (więc jeśli chcesz, aby litery rozłożyły się po przekątnej, wystarczy dodać-w-1,-w+1,w-1,w+1
do krotki).x
to krótka nazwastr.replace
metody, która jest używana kilkakrotnie w późniejszym kodzie (wywołania będą jednak wyglądać dziwnie, ponieważ używamx(s,*"xy")
do zapisywania znaków, a nie konwencjonalnychs.replace("x", "y")
). Ws
tym momencie łańcuch parametru jest również nieco modyfikowany, a jego.
znaki i znaki nowej linii są zastępowane przez~
znaki (ponieważ sortują po wszystkich literach). Na~
końcu dodawane są również wartości dopełniania wiersza .t
zostanie później użyty jako odniesienie do „starej” wersjis
, ale musi zostać zainicjowany na coś, co nie jest równes
na początku, a zero przyjmuje tylko jeden znak (byłaby to bardziej pythoniczna wartośćNone
, ale to trzy dodatkowe znaki) .s
przy użyciu listy. Jak zrozumienie iteracje nad indeksys
,~
znaki są zastępowane przezmin
swoich sąsiadów. Jeśli~
postać została całkowicie otoczona przez inne osoby~
, nic to nie da. Gdyby to było obok jednej lub więcej liter, staje się najmniejsza z nich (faworyzowanie"a"
ponad"b"
itp). Nowe linie, które zostały zamienione na~
znaki, są zachowywane poprzez wykrycie ich indeksów za pomocą operatora modułu. Wiersz dopełniania na końcu nie jest aktualizowany w rozumieniu listy (ponieważ zakres indeksówr
został obliczony przed ich dodaniems
). Zamiast tego nowy rząd~
znaki są dodawane po zakończeniu zrozumienia. Zauważ, żes
po pierwszym przejściu pętli staje się listą znaków, a nie ciągiem znaków (ale ponieważ Python jest elastyczny w kwestii typów, nadal możemy indeksować, aby uzyskać znaki w ten sam sposób).~
znakami z wypełnienia), zostaje zastąpiona przez.
. Następnie wszystkie znaki są łączone w jeden ciąg. Na koniec~
znaki dopełniające są konwertowane z powrotem na znaki nowej linii i drukowany jest ciąg.źródło
r=range
powinien on znajdować się w ciele funkcji, aby można go było uznać za część wywoływanej procedury, ale można zapisywać znaki, piszącr=range;s=[l.replace
. Możesz także wycisnąć więcej znaków, piszącif"~"==s[y][x]else
iif"~"==s[y][x]else
, w sumie 422. (Btw, to działało dla mnie z Python 2.7)r=range
na końcu pierwszego wiersza funkcji (gdzie ustawiłem inne zmienne) i wygoliłem kilka spacji, które wcześniej mi umknęły. Nie jestem pewien, czy mam oba te, o których mówiłeś, ponieważ zdaje się, że dwukrotnie wspominałeś o tym samym. A w Pythonie 2.7 może być o kolejne dwa znaki krótszy, ponieważ nie potrzebujesz później nawiasówprint
(zwykle zapisuje tylko 1 znak, aleprint"\n".join(...)
działa).s[y][x]for
(usuwanie spacji), ale i tak wydaje się, że ją znalazłeś.Python,
229226 znakówWypełnia powódź, aby obliczyć wynik. Trailing
for
/zip
combo generuje tablicęx
dla każdej komórki zawierającą wartość w tej komórce i jej czterech sąsiadach. Następnie wykorzystujemy sztuczkę Blckknght imin
kilka możliwości dla każdej komórki. Są to oryginalne wartości komórki, sąsiedzi, jeśli komórka nie była jeszcze odwiedzana, lub a,.
jeśli została odwiedzona, a wszyscy sąsiedzi są.
równi samej komórce.źródło
return s
naprint s
. Ponadto niey!=b
można zmienić nay>b
? To chyba 226 znaków.Oto jest To mój pierwszy program w języku F #. Jeśli przegapiłem jakąś funkcję tego języka, powiadom mnie, gdy się uczę.
Oto moje przykładowe dane wejściowe
Oto wynik
Oto kod. Cieszyć się.
Teraz musimy przekonwertować te dane na tablicę dwuwymiarową, abyśmy mogli uzyskać do nich dostęp za pośrednictwem indeksatorów.
Stwórzmy macierz reprezentującą własność każdej komórki
Pozwól nam skorzystać z metody użyteczności, aby zobaczyć, co się stało.
Stwórzmy zapis, który reprezentuje miejsce, w którym znajduje się konkretna litera.
Teraz chcemy znaleźć wszystkie wielkie litery.
Kiedy się poruszamy, potrzebujemy koncepcji kierunku.
W miarę przemieszczania się będziemy musieli wiedzieć o rozmiarze. Pomoże nam to monitorować, czy wychodzimy poza granice.
Aktywny wzorzec: pasuje do kryteriów danej komórki.
Teraz dochodzimy do podatku od mosiądzu. To twierdzi komórkę!
Korzystając z aktywnego wzorca, przejmij tę komórkę, jeśli nie została odebrana, i zwróć współrzędne sąsiednich komórek.
Zaczynamy tworzyć listy tej torby danych, pozwól nam stworzyć typ, aby wszystko było bardziej zrozumiałe.
Biorąc pod uwagę listę kryteriów zgłaszania roszczeń do komórek, przejdziemy do następnej listy, zwracając kolejne komórki, aby zgłosić roszczenia i powrócić do tej listy.
Dla każdego kapitału utwórz kryteria roszczenia w każdym kierunku, a następnie rekurencyjnie przeszukaj te komórki.
Każdy program wymaga głównego.
źródło