Musisz napisać program lub funkcję.
Dane wejściowe to „mapa” liczb. Możesz wybrać mapę jako ciąg znaków z nowymi znakami linii ( \n
) lub tablicę ciągów 2D.
Wszystkie mapy mają od 5 znaków do 5 znaków, a znaki są zawsze cyframi większymi niż 0 lub spacjami.
Oto przykład mapy:
12 45
11233
233
1
2 899
Twoim zadaniem jest znalezienie połączonych komponentów na mapie. Poprawnym składnikiem jest seria co najmniej trzech identycznych cyfr w poziomie i / lub w pionie ( nie po przekątnej ) ( nie spacje ). Następnie należy zastąpić znaki prawidłowych połączonych komponentów literą x
s i wydrukować lub zwrócić ten wynik.
Zatem wynik dla powyższego przykładu byłby następujący:
x2 45
xx2xx
2xx
1
2 899
Oto kolejny przypadek testowy (dzięki Martinowi Enderowi):
Input:
2 3
4
1 5
111 6
11 7
Output:
2 3
4
x 5
xxx 6
xx 7
To jest kod golfowy, więc wygrywa najkrótszy kod w bajtach!
źródło
Odpowiedzi:
JavaScript (ES6),
171161139137136133132 132 bajtówTo jest tłumaczenie mojej odpowiedzi w języku Python. I / O jako tablice znaków.
Szkoda, że nie ma skutecznego sposobu na zrobienie
sum
...źródło
Python 3,
238237200199192181 bajtówDefiniuje funkcję,
f(a)
która pobiera dane wejściowe jako tablicę znaków i zwraca tę samą zmodyfikowaną tablicę. ( Tablice znaków są domyślnie akceptowane jako ciągi znaków ).Nie obeznany z wyjaśnieniem
Zmodyfikowany kod jest rekurencyjny, ale działa tak samo.
źródło
Rubinowy, 304 bajty
przykładowe użycie:
kod ponownie wykorzystuje metodę „blot” do obliczenia długości ścieżki.
zmienne / metody:
Spróbuj uzyskać bardziej szczegółowe wyjaśnienie:
zrób kopię ciągu wejściowego, którego używamy do znalezienia długości ścieżki z dowolnego punktu na mapie.
zdefiniuj funkcję anonimową „ps” (długość ścieżki) (lambda), która przyjmuje indeks mapy i jako argument. zwraca długość ścieżki od tego punktu. robi to poprzez wywołanie metody „b” (blot) w celu wstawienia x na kopii oryginalnej mapy, a następnie zliczając liczbę x w zwracanym ciągu.
następna część iteruje każdy znak na mapie (indeks i, znak s [i]). wywołuje funkcję „b” (blot) na pozycji mapy i, jeśli długość ścieżki od pozycji i jest większa niż 2 i jeśli nie jest to spacja lub znak nowej linii.
funkcja b (blot) przyjmuje jako argument ciąg mapy i indeks. inicjuje @v (odwiedzana tablica) i wywołuje funkcję pomocniczą b2.
funkcja b2 przyjmuje ciąg mapy, pozycję mapy (i) oraz znak w bieżącej ścieżce (c). wywołuje się rekurencyjnie, aby zastąpić połączone sekcje cyfr znakiem „x”. zwraca ciąg wejściowy (jest to po to, aby funkcja ps mogła wywołać scan () na zwracanej wartości).
ta instrukcja if sprawdza, czy podana pozycja mapy (i) mieści się w granicach ciągu (0 ... s.size) i czy znak w s [i] jest taki sam jak znak początkowy. sprawdzane jest również @v [i], aby uniknąć nieskończonej rekurencji.
jest to bit, który zastępuje znak w indeksie (i) znakiem „x”. oznacza również ten indeks jako odwiedzony.
w tym miejscu b2 nazywa się rekurencyjnie szukając ścieżki. i + 1 to jeden znak po prawej, i-1 to jeden znak po lewej, i + 6 to jeden wiersz w dół (5 cyfr + 1 nowa linia = 6 znaków), i-6 to jeden rząd w górę.
źródło
C (Ansi),
243233179188 bajtówGra w golfa:
Z adnotacjami:
}
Wejście:
Oczekuje nowej linii na początku i na końcu łańcucha.
Przykładowe dane wejściowe:
Przykładowe dane wyjściowe:
Aktualizacja
Naprawienie siatki pozwoliło mi zgolić prawie 60 bajtów.
źródło
Mathematica, 180 bajtów
Wyjaśnienie:
Czysta funkcja, która akceptuje
5x5
tablicę.
to 3-bajtowy prywatny znakU+F3C7
reprezentujący operator transpozycji Postfiksa\[Transpose]
.(f=Flatten@#;p=Partition)
: Spłaszcza listę wejściową i zapisuje jąf
. Ustawiap = Partition
i zwraca.g=p[r,5]
: Tablica{{1,2,3,4,5}, ..., {21,22,23,24,25}}
( dzieje się tak, ponieważr
zostaje ustawiona naRange@25
).Join[g=p[r,5],g]
: lista wierszy i kolumng
.p[#,2,1]&
: Czysta funkcja#
dzieląca listę na podlisty o długości2
z nakładaniem się1
; tj. lista sąsiednich par w#
.##&@@p[#,2,1]&
: Tak samo jak powyżej, z tym że zwraca aSequence
.##&@@p[#,2,1]&/@Join[g=p[r,5],g]
: Odwzorowuje poprzednią funkcję wierszy i kolumn wg
celu uzyskania listy wszystkich sąsiednich pozycji wg
. Mój żołądek mówi, że jest na to krótszy sposób.r~Graph~Cases[...]
: Wykres, którego wierzchołki są liczbami całkowitymi,1, ..., 25
a których krawędzie są krawędziami między sąsiednimi wpisami, wg
których te same odpowiadające wpisy w tablicy wejściowej (inne niż" "
){a_,b_}/;(A=f[[a]])==f[[b]]&&A!=" "
: Wzorzec, który pasuje do{a,b}
tegof[[a]] == f[[b]]
(ta sama wartość w tablicy wejściowej) i który nie jest równy" "
. Ustaw,A = f[[a]]
aby zapisać1
bajt....:>a<->b
: Zamień każde dopasowanie na nieukierunkowaną krawędź od a do b.VertexComponent
: Zwraca połączony składnik drugiego argumentu (wierzchołek) w pierwszym argumencie (wykres).Tr[1^VertexComponent[...]]
: Rozmiar podłączonego komponentu. Zapisuje1
bajt zLength@VertexComponent[...]
.If[Tr[...]<3,f[[#]],"x"]&
Pure funkcja, która zajmuje pozycję#
wg
. Jeśli rozmiar podłączonego komponentu jest mniejszy niż3
, zastąp go odpowiednim wpisem na wejściu. W przeciwnym razie zastąp go"x"
.(f=Flatten@#;p=Partition)[...,5]
: I w końcu przekształć wynik w5x5
tablicę.źródło
Clojure, 188 bajtów
To jest przytłaczające: D
Nazywany tak (wymaga 1D wektora znaków):
Zbyt leniwy, aby go odholfować, ale w zasadzie
for[m(range 30)]
odwiedza każdy indeks, a dla każdego indeksu wewnętrznalet[n(for[p[-1 -6 1 6]...(+ m p))]
tworzy listę od 0 do 4 elementów, która wymienia lokalizacje, które miały tę samą wartość (1 - 9) co lokalizacja środkowa. Jeśli więcej niż 1 sąsiad pasuje do środkowej części, oznacza to, że wszystkie one tworzą klaster, więc te lokalizacje są dodawane do zestawu używanego w(if((set(flatten(...)))i)
. Jeśli indeksi
zostanie znaleziony z zestawu, wówczas\x
zostanie wyemitowany, a wartość oryginalna inaczej. To:when( ... )
całkiem interesujące ...źródło