Ten jest inspirowany najnowszym wyzwaniem przy tabliczce mnożenia Calvina .
Napisz funkcję lub program, który pobiera liczbę całkowitą N
jako dane wejściowe i wypisuje lub zwraca unikalną spiralę mnożenia N-na-N. Kod musi (teoretycznie) działać dla N od 0 do 1000 (jednak generowanie tego może być trudne). Dane wyjściowe powinny być równoważne tabeli utworzonej zgodnie z następującą procedurą:
Wypełnij tabelę mnożenia N-na-N. Np. Dla N = 3:
1 2 3 2 4 6 3 6 9
Postępuj zgodnie z ruchem wskazówek zegara od lewego górnego rogu, odnotowując odwiedzane liczby. Gdy odwiedzisz numer, który już odwiedziłeś, zamień go na 0.
Kilka przykładów może to wyjaśnić:
n = 0:
0
n = 1:
1
n = 2: // Spiral order:
1 2 // 1 2
0 4 // 4 3
n = 3:
1 2 3 // 1 2 3
0 4 6 // 8 9 4
0 0 9 // 7 6 5
n = 4:
1 2 3 4 // 1 2 3 4
0 0 6 8 // 12 13 14 5
0 0 9 12 // 11 16 15 6
0 0 0 16 // 10 9 8 7
n = 5:
1 2 3 4 5
0 0 6 8 10
0 0 9 12 15
0 0 0 16 20
0 0 0 0 25
n = 10:
1 2 3 4 5 6 7 8 9 10
0 0 0 0 0 12 14 16 18 20
0 0 0 0 15 0 21 24 27 30
0 0 0 0 0 0 28 32 36 40
0 0 0 0 25 0 35 0 45 50
0 0 0 0 0 0 42 48 54 60
0 0 0 0 0 0 49 56 63 70
0 0 0 0 0 0 0 64 72 80
0 0 0 0 0 0 0 0 81 90
0 0 0 0 0 0 0 0 0 100
Liczby znajdują się w następujący sposób:
Każdy rozsądny format wyjściowy jest akceptowany, ale musi to być macierz N-na-N, nie może to być tylko lista. Formaty takie jak te poniżej są akceptowane, ponieważ istnieje N łatwo rozróżnialnych kolumn 1 na N lub wierszy N na 1:
[[1 2 3][0 4 6][0 0 9]] <-- OK
[[1 0 0][2 4 0][3 6 9]] <-- OK
ans = <-- OK
1 2 3
0 4 6
0 0 9
Najkrótszy kod w bajtach wygrywa.
źródło
n=0
którego nie ma zera w tablicach mnożenia. Rozumiem,n=1
że wyjdzie 1, ale po co uwzględniać zero?n=0
powinno być macierzą 0 na 0, inaczej pytanie byłoby niespójne.Odpowiedzi:
J, 22 bajty
Wyprowadza macierz 0 na 0 dla
n=0
.źródło
Mathematica
123 122 117 98 9273 bajtyZ 24 bajtami zapisanymi dzięki LegionMammal978 i kolejnymi 19 bajkami alephalpha!
Zaskakujące jest to, że w tej tabeli wiele wystąpień dowolnej liczby całkowitej
n
będzie miało tę samą względną kolejność w spirali, co w samej tabeli! Pierwsze pojawienie się liczbyn
znajduje się w samej komórce, w której ta liczba pojawia się jako pierwsza w tabeli (kiedy jeden wiersz wypełnia się w tabeli). Oznacza to, że podejście może całkowicie pominąć ograniczenie spiralne, ponieważ nie ma wpływu na wynik. (Zobacz wyjaśnienie poniżej.)Przykład
Wyjaśnienie
Wykorzystujemy fakt, że porządek spiralny pozycji dowolnej cyfry n jest taki sam, jak porządek pozycji wierszy-kolumn zwracanych przez funkcję
Positions
!Lokalizacja pierwszego wystąpienia każdej liczby (niezależnie od tego, czy uporządkuje się według spirali, czy pozycji stołu) będzie pierwszym zwracanym elementem
Position
. Ta komórka pierwszego wystąpienia pozostanie bez zmian. Pozostałe wystąpienia liczby są zastępowane przez 0.Spójrzmy, jak to działa, badając przypadek
n==18
. Chodzi o to, aby zacząć od tabliczki mnożenia:i zlokalizuj pozycje wiersza-kolumny dla każdej liczby. Na przykład 18 znajduje się w wierszu 2, kolumnie 9 (pierwsza instancja); Wiersz 3, kol. 6; Wiersz 6, kolumna 3; i wiersz 9, kolumna 2. Mają one odpowiednie pozycje rzędu spirali {44, 58, 68, 82}.
jak pokazuje poniższa tabela.
Ostatnie 3 wystąpienia 18 muszą zostać zastąpione przez 0. (Użyjemy dużych, pogrubionych niebieskich zer, aby można je było łatwo dostrzec).
źródło
Function
?ReplacePart[t=1##&~Array~{#,#},Join@@(Rest[t~Position~#]&/@Union@@t)->0]&
Python,
99 95 90 89 8781 bajtówKod do gry w golfa:
Nie golfowany:
Wynik:
źródło
MATLAB,
96 88 87 8679 bajtówJest to 79-bajtowy kod, który następuje po przykładowych danych wyjściowych (konkretnie dla n = 0)
Ten ma 75 bajtów, zachowuje się tak samo, z wyjątkiem n = 0, które utworzy pustą tablicę zgodnie z implikacją pytania (N przez N tablica = 0 x 0 = pusta tablica).
Działa to również z Octave . Możesz spróbować online tutaj . Kod został już dodany jako plik o nazwie „multspiral.m”. W wierszu oktawy wpisz
multspiral
i naciśnij klawisz Enter. Następnie należy wprowadzić rozmiar tabeli (np. 4). Wydruk zostanie wydrukowany.Jak to działa?
Najpierw pobiera wymagany numer wejściowy (np. 6, 4 itd.)
Następnie zajmujemy się przypadkami
n=0
in=1
- są one traktowane w specjalny sposób, ponieważ są one dwa, które nie są zgodne z zasadą, której używam do generowania tablic - w rzeczywistości może to być 5 bajtów krótszych, jeśli nie wn=0
przypadku niejasnych przypadków.Następnie dla wszystkich wartości
n>2
wykonujemy pętlę, aż matryca osiągnie odpowiedni rozmiar.W rzeczywistości istnieją tylko trzy proste różnice między
n
in+1
dla wszystkichn>=2
. To są:Nowa kolumna jest dodawana z prawej strony w tablicy zawierającej liczby
n(1:n)
. Można to łatwo obliczyć za pomocą:Wszelkie elementy, które zostaną dodane w tej nowej kolumnie, muszą zostać usunięte z istniejącej macierzy (ustawione na zero), ponieważ zawsze pojawią się później w spirali niż w nowej kolumnie. Jest to usuwane za pomocą zagnieżdżonej pętli for, aby ustawić wszystkie elementy w bieżącej macierzy, które są w nowej kolumnie na zero.
Najbardziej dolny wiersz ma nowy wiersz, dla którego każdy element oprócz tego, który znajduje się w nowej kolumnie, będzie wynosił zero. Po dodaniu nowej kolumny, ze względu na poza zakresem, indeksy, które zostały celowo utworzone, są automatycznie uzupełniane przez 0. Jedną z mocnych cech MATLAB-a jest to, że może on powiększać tablice bez specjalnej obsługi, dzięki czemu możemy po prostu dodać nowy wiersz i kolumnę z:
Wreszcie mamy koniec pętli for - która po osiągnięciu macierz
m
zawiera nasze dane wyjściowe. Ponieważ jesteś elastyczny ze swoim formatem wyjściowym, macierz jest pokazana po prostum
jako nowa linia bez średnikaNa przykład, jeśli uruchomimy program, wpisz liczbę 10, otrzymamy następujące dane wyjściowe:
źródło
Haskell,
10399 bajtówPrzykład użycia:
f 4
->[[1,2,3,4],[0,0,6,8],[0,0,9,12],[0,0,0,16]]
.Właśnie odkryłem
Data.Lists
moduł, który ma ładne funkcje na listach (takich jakreplace
) i reeksportData.List
,Data.List.Split
iData.List.Extras
.źródło
Rubin,
676361 bajtów63 bajty
67 bajtów
Stosowanie:
źródło