Zdefiniujmy macierz 9s jako:
Zdefiniujmy liczbę wybuchającą jako liczbę w pozycji którą można rozłożyć na równe liczby całkowite między wszystkimi sąsiadującymi z nią sąsiadami (w tym sobą), a wartość bezwzględna każdej części jest większa niż 0.
Z poprzedniej macierzy rozbijmy liczbę na pozycji (indeksowane 0)
N = \ begin { bmatrix} 9+ \ kolor {czerwony} 1 i 9 + \ kolor {czerwony} 1 i 9 + \ kolor {czerwony} 1 \\ 9+ \ kolor {czerwony} 1 i \ kolor {niebieski} 0+ \ kolor {czerwony} 1 i 9 + \ kolor {czerwony} 1 \\ 9+ \ color {red} 1 i 9 + \ color {red} 1 & 9 + \ color {red} 1 \ end {bmatrix}
Czasami rozkładanie wyniku na liczbę wymierną większą niż 1. Jest to coś, czego musimy unikać przy eksplodowaniu liczb. W takich przypadkach pozostała część zostanie przypisana do numeru rozstrzelonego.
Aby to zademonstrować, kontynuujmy pracę z naszą poprzednią matrycą. Tym razem wybuchniemy liczbą na pozycji
Tutaj mamy 3 sąsiadów i samą liczbę. Tutaj równanie jest czymś w rodzaju co daje nam 2 dla każdego i 2 jako resztę.
Również czasami liczba nie będzie wystarczająco duża, aby mogła zostać rozłożona na równe części (gdzie abs jest większa niż 0) między jego sąsiadami (| liczba wymierna | <1). W takich przypadkach musimy „pożyczyć” od numeru rozstrzelonego, aby utrzymać warunek „większy niż 0” . Kontynuujmy z naszym poprzednim przykładem i rozbijmy liczbę na pozycji .
Wyzwanie polega na tym, że biorąc pod uwagę listę pozycji i skończoną niepustą tablicę liczb naturalnych, zwraca postać rozstrzeloną po rozbiciu każdej liczby z listy pozycji.
Przypadki testowe
Wkład: initial matrix: [[3, 3, 3], [3, 3, 3], [3, 3, 3]], numbers: [[0,0],[0,1],[0,2]]
Wydajność: [[1, 0, 1], [5, 6, 5], [3, 3, 3]]
Wkład: Initial matrix: [[9, 8, 7], [8, 9, 7], [8, 7, 9]], numbers: [[0,0],[1,1],[2,2]]
Wydajność: [[4, 11, 8],[11, 5, 10],[9, 10, 4]]
Wkład: Initial matrix: [[0, 0], [0, 0]], numbers: [[0,0],[0,0],[0,0]]
Wydajność: [[-9, 3],[3, 3]]
Wkład: Initial Matrix: [[10, 20, 30],[30, 20, 10],[40, 50, 60]], numbers: [[0,2],[2,0],[1,1],[1,0]]
Wydajność: [[21, 38, 13], [9, 12, 21], [21, 71, 64]]
Wkład: Initial Matrix: [[1]], numbers: [[0,0]]
Wydajność: [[1]]
Wkład: Initial Matrix: [[1, 2, 3]], numbers: [[0,0], [0, 1]]
Wydajność: [[1, 1, 4]]
Notatki
Zasady wejścia / wyjścia zastosowanie
Możesz założyć, że matryca wejściowa nigdy nie będzie pusta
Możesz założyć, że współrzędne zawsze będą poprawne
Współrzędna wejściowa w przypadkach testowych jest podawana jako (wiersz, kolumna). Jeśli potrzebujesz, aby to było (x, y), możesz zamienić wartości. Jeśli tak, proszę to zaznaczyć w swojej odpowiedzi
Odpowiedzi:
C (GCC)
220216214212 bajtówkredyt na @ceilingcat za 2 bajty
Uruchom tutaj
nieco mniej golfowa wersja
Kod wywoławczy z przykładem
i wynik
źródło
JavaScript (ES7),
126 125 123121 bajtówZaoszczędzono 2 bajty dzięki @Shaggy
Pobiera dane wejściowe jako
(matrix)(list)
. Wyjścia poprzez modyfikację macierzy.Wypróbuj online!
W jaki sposób?
Zamiast tego używamy funkcji rekurencyjnej, która wykonuje prostszy przepływ operacji, powtarzany tyle razy, ile potrzeba:
Główną zaletą jest to, że potrzebujemy tylko jednej pętli nad matrycą. Drugą korzyścią jest to, że nie musimy obliczać żadnego ilorazu.
Przykład
Po kroku 1 w pierwszej iteracji , mamy:
A po kroku 2 w pierwszej iteracji :
Po kroku 1 w drugiej iteracji , mamy:
A po kroku 2 w drugiej iteracji :
Obecnie przyrost komórkę odniesienia, dwukrotnie ( w punkcie 4 na obu powtórzeń ), co prowadzi do wyniku końcowego:
Skomentował
źródło
(0)
2 backtickami.R ,
163162161159155146 bajtówWypróbuj online!
Wyjaśnienie
(Odpowiada poprzedniej wersji kodu)
źródło
Czysty ,
181167 bajtówWypróbuj online!
W postaci częściowo zastosowanego literału funkcji.
Rozszerzony (pierwsza wersja):
źródło
Rdza - 295 bajtów
Jest to dość długi czas, ponieważ Rust wymaga indeksowania wektorów w liczbach całkowitych bez znaku, ale wymaga odejmowanych liczb całkowitych do odejmowania, co skutkuje ujemnymi. Jednak uważam, że mój algorytm jest jak dotąd „najkrótszym algorytmem”. W rzeczywistości nie ma potrzeby zajmowania się wykrywaniem krawędzi, dna itp.
Zauważ trzy rzeczy: po pierwsze, suma wszystkich komórek jest zawsze stała. Po drugie, jest to sytuacja podziału / reszty, więc możemy zastosować myślenie algorytmem Bresenhama. Po trzecie, pytanie zawsze dodaje tę samą liczbę do wszystkich komórek w pewnej odległości od komórki specjalnej pozycji, zanim zajmie się „dodatkowymi” rzeczami w specjalnej pozycji.
Algorytm:
Przechowuj oryginalną wartość komórki w pozycji P w M.
Rozpocznij pętlę:
Iteruj po każdej komórce I w macierzy. Jeśli pozycja komórki I mieści się w granicach 3 kwadrantu (odległość kwadratowa) od pozycji P, odejmij 1 od komórki P i dodaj 1 do komórki I. Policz, ile razy jest to wykonywane w jednej iteracji przez macierz.
Jeśli wartość pozostała w komórce w pozycji P jest mniejsza lub równa M / Count + M modulo Count, to przerwij pętlę. W przeciwnym razie wykonaj pętlę ponownie.
Powstała macierz będzie wersją rozłożoną na części. Count to w zasadzie sposób liczenia sąsiadów bez zajmowania się krawędziami. Pętla jest sposobem na rozbicie podziału / dodawania na powtarzające się pojedyncze dodawanie / odejmowanie jednego. Kontrola modulo zapewnia, że pozostanie nam odpowiednia pozostała pozycja P, aby poradzić sobie z „eksplozjami”, które nie są równo podzielne między sąsiadami. Struktura pętli do / while umożliwia prawidłowe działanie P <0.
Wersja bez golfa na Rust Playground
źródło
f
by to zrobił. Ale prawdopodobnie możesz zaoszczędzić jeszcze więcej bajtów, korzystając z anonimowej funkcji:|p:(i8,i8),v:&mut Vec<Vec<i8>>|{...}
Java 10,
194193191190184182171 bajtówIteracyjny port odpowiedzi JavaScript @Arnauld .
-17 bajtów dzięki @Arnauld .
Zmienia macierz wejściową zamiast zwracać nową, aby zapisać bajty.
Wypróbuj online.
Wyjaśnienie:
źródło
m[y]
m[y][x]
undefined[x]
miałoby to zawieść. W każdym razie twój(x-X)**2+(y-Y)**2<3
czek jest całkiem sprytny. Muszę pamiętać, że kiedy chcę sprawdzić wartości w macierzy w bloku 3x3 (i w granicach) wokół niego. Myślę, że faktycznie mam kilka takich odpowiedzi, w których teraz używam try-catch, a w jednym przypadku próbuję w końcu ... Spójrz na te, kiedy będę miał trochę czasu.Common Lisp , 498 bajtów
Wypróbuj online!
Użyj tej funkcji jako
(print (c #2A((3 3 3) (3 3 3) (3 3 3)) '((0 0)(0 1)(0 2))))
Wersja lepiej czytelna:
Przykład wyjściowy:
źródło
Python 2 , 171 bajtów
Wypróbuj online!
źródło