Heatmaps
Rozważmy prostokątny pokój, na którego suficie mamy kamerę termiczną skierowaną w dół. W pomieszczeniu znajduje się pewna liczba źródeł ciepła o intensywności 1-9
, przy czym temperatura tła jest 0
. Ciepło rozprasza się z każdego źródła, spadając o jedną jednostkę na (nie przekątny) stopień. Na przykład 20x10
pokój
...........1........
....................
...8................
..5...............2.
....................
.1..................
................1...
.................65.
....................
............2.......
zawiera 9 źródeł ciepła, a gradient temperatury pokazywany przez kamerę termiczną wynosi
34565432100100000000
45676543210000000000
56787654321000000110
45676543210000001221
34565432100000012321
23454321000000123432
12343210000001234543
01232100000012345654
00121000000011234543
00010000000121123432
W formie graficznej może to wyglądać następująco:
Na podstawie gradientu możemy wywnioskować pozycje i natężenia niektórych źródeł ciepła, ale nie wszystkich. Na przykład, 9
zawsze można wywnioskować wszystkie s, ponieważ mają one maksymalną temperaturę, podobnie jak 8
w tym przypadku, ponieważ daje lokalne maksimum w gradiencie. 2
Blisko prawej krawędzi można również wywnioskować, mimo że nie jest na lokalnym maksimum, ponieważ nie ma innego 2
jak sąsiada. Z 5
drugiej strony nie są one wywnioskowane, ponieważ ich ciepło równie dobrze mogłoby być wytwarzane przez bardziej intensywne źródła w ich pobliżu. Do 0
s są znane zawierają żadnych źródeł ciepła, ale wszystkie inne płytki mogą potencjalnie zawierać jeden. Oznaczmy niepewne kafelki łącznikami-
, niektóre źródła ciepła według odpowiednich cyfr i pewne puste miejsce według okresów .
:
---------..1........
----------..........
---8-------......--.
----------......--2-
---------......-----
--------......------
-------......-------
.-----......-----6--
..---.......--------
...-.......-2-------
Twoim zadaniem będzie wytworzenie tego wywnioskowanego wzoru z gradientu temperatury.
Zasady
Dostajesz dane wejściowe jako ciąg rozdzielony znakami nowej linii lub pionowymi rurami |
, w zależności od tego, który jest wygodniejszy, a dane wyjściowe powinny mieć taką samą formę. Na wejściu i / lub wyjściu może znajdować się ogranicznik końcowy, ale żaden poprzedni. Rozmiar danych wejściowych może się różnić, ale jego szerokość i wysokość są zawsze co najmniej 4
. Zarówno funkcje, jak i pełne programy są dopuszczalne. Wygrywa najmniej bajtów, a standardowe luki są zabronione.
Dodatkowe przypadki testowe
Wkład:
898778765432100
787667654321100
677656543211210
678765432112321
567654321123210
który wygląda tak w formie graficznej:
Wydajność:
-9---8-------..
-------------..
--------------.
--8---------3--
-----------3--.
Wkład:
7898
8787
7676
6565
Wydajność:
--9-
8---
----
----
Wkład:
00001
00000
00000
10000
Wydajność:
....1
.....
.....
1....
Odpowiedzi:
CJam,
73 69 6255 bajtówAKTUALIZACJA : Nowy algorytm. Krótszy i większy zakres ulepszeń
Jak to działa
Logika jest podobna do poniższego algorytmu, ale tutaj nie sprawdzam wszystkich 4 sąsiadów w jednej iteracji. Zamiast tego używam mniejszego podejścia do iteracji po wszystkich wierszach i kolumnach w obu kierunkach. Oto kroki z tym związane:
.
lub-
.Oto przykład uruchamiany na małym wejściu:
Po pierwszym kroku:
Po drugim kroku:
Po ostatnim mapowaniu na pojedynczy znak końcowy wynik:
Kod Objaśnienie :
Wypróbuj tutaj
Starsze podejście
Jak to działa
Logika jest prosta, iteruj po siatce i sprawdź, czy bieżąca wartość jest większa lub równa pozostałym czterem sąsiadom - w górę, w dół, w lewo i w prawo. Następnie przekształć bieżącą wartość na podstawie powyższej reguły, a jeśli wartość jest równa 0, ustaw ją na „.” .
Objaśnienie kodu
Wypróbuj online tutaj
źródło
JavaScript (ES6) 99
Przetestuj w konsoli Firefox / FireBug
Wydajność
źródło
Python 2: 154 bajty
Dane wejściowe muszą mieć formę
"00001\n00000\n00000\n10000"
.Konwersja ciągu znaków na macierz 2D jest dość długa w Pythonie. Więc zachowuję oryginalny format ciągu. Wyliczam ponad dane wejściowe,
i
jest indeksem,v
jest char (w końcu wyliczam zapisane bajty w rozwiązaniu golfowym !!). Dla każdej pary(i,v)
obliczam poprawny znak wyjściowy i dołączam do nich. Jak wybrać prawidłowy znak wyjściowy? Jeśliv == '\n'
, wyjściowy char jest\n
, tov == '0'
niż wyjściowy char jest'.'
. W przeciwnym razie testuję 4 sąsiadówv
, którzy sąb[i-b.index('\n')-1]
(powyżej),b[i-1]
(po lewej,b[i+1]
(po prawej) ib[i+b.index('\n')+1]
(poniżej), jeśli są,<= v
i wybieram znak'-'
lubv
. Tutaj porównuję znaki nie liczb, ale działa całkiem dobrze, ponieważ wartości ascii są w prawidłowej kolejności. Również nie ma problemów, jeślib[i-1]
lubb[i+1]
równa'\n'
, ponieważord('\n') = 10
.Pyth:
6158Mniej więcej tłumaczenie skryptu Python. Dość brzydka ;-)
Wypróbuj online: Pyth Compiler / Executor Ten sam format wejściowy, co rozwiązanie Python.
źródło
Perl,
77, 75, 7270Standardowe sztuczki polegające na dopasowywaniu wyrażeń regularnych 2d.
Przykład:
Wypróbuj tutaj
źródło
Java,
307,304,303,299298Jest to z pewnością „idealne” wyzwanie dla niektórych kodegolfów Java :)
Dane wejściowe (metoda „|” rury):
Wydajność:
źródło
char[]r=a[0].replace("|", <--here"").toCharArray()
.APL, 92
Przykład:
źródło
Ruby 140
Nic specjalnego; po prostu iteruj po mapie i porównaj bieżącą wartość z wartością czterech sąsiadów.
Uruchom online z testami: http://ideone.com/AQkOSY
źródło
R 223
O najlepszych, jakie mogę teraz wymyślić. Radzenie sobie ze sznurkiem jest dość drogie. Myślę, że jest miejsce na poprawę, ale w tej chwili jej nie widzę
Wynik testu
źródło
J - 69 bajtów
Przykłady:
PS:
(0 : 0)
jest to standardowy sposób określania ciągów w języku J. Równie dobrze możesz użyć|
łańcuchów rozdzielanych (z końcowym|
).źródło
Excel VBA - 426
To będzie rzadka okazja, że VBA wygrywa dowolne gry w golfa kodowego, ale ponieważ to jest to, z czego najczęściej korzystam, fajnie się z nią bawić. Pierwsza linia jest obudową krawędzi, która wydłużyła to, niż wydaje się, że powinna być.
Liczba nie obejmuje początkowych białych wierszy.
Bawiłem się pomysłem wysłania danych wejściowych do arkusza i pracy stamtąd, ale myślę, że zapętlenie przekazywanego ciągu znak po znaku zapisuje kod.
Zadzwoń z natychmiastowego okna:
Dane wyjściowe (w oknie):
źródło
Perl - 226
Możesz spróbować na ideone . Jeśli ktoś jest zainteresowany wyjaśnieniem, daj mi znać.
źródło
Haskell - 193
f
jest funkcją, która przyjmuje ciąg znaków w formie0001\n0000\n0000\n1000
i zwraca wymagany ciąg.g
to funkcja, która pobiera listę list znaków i zwraca listę list ((w lewo, w górę), to, (w prawo, w dół)).źródło