Macierz piramidalna to macierz kwadratowa, w której wszystkie liczby rosną lub maleją od punktu środkowego, podobnie jak dwie poniższe macierze:
1 1 1 1 1
1 2 2 2 1
1 2 3 2 1
1 2 2 2 1
1 1 1 1 1
Lub:
3 3 3 3 3
3 2 2 2 3
3 2 1 2 3
3 2 2 2 3
3 3 3 3 3
Biorąc pod uwagę niezerową liczbę całkowitą n
, utwórz macierz piramidalną, w której liczby przechodzą od 1
do n
w porządku rosnącym (jeśli n <0) lub malejącym (jeśli n> 0) od środka. Jeśli n
jest parzysty, to będą 4 środkowe liczby (patrz przykłady).
Jak zawsze:
- Opcjonalny format wejściowy i wyjściowy
- Liczba spacji, separator itp. Jest opcjonalna
Przypadki testowe:
1
1
-1
1
5
1 1 1 1 1 1 1 1 1
1 2 2 2 2 2 2 2 1
1 2 3 3 3 3 3 2 1
1 2 3 4 4 4 3 2 1
1 2 3 4 5 4 3 2 1
1 2 3 4 4 4 3 2 1
1 2 3 3 3 3 3 2 1
1 2 2 2 2 2 2 2 1
1 1 1 1 1 1 1 1 1
-5
5 5 5 5 5 5 5 5 5
5 4 4 4 4 4 4 4 5
5 4 3 3 3 3 3 4 5
5 4 3 2 2 2 3 4 5
5 4 3 2 1 2 3 4 5
5 4 3 2 2 2 3 4 5
5 4 3 3 3 3 3 4 5
5 4 4 4 4 4 4 4 5
5 5 5 5 5 5 5 5 5
2
1 1 1 1
1 2 2 1
1 2 2 1
1 1 1 1
-2
2 2 2 2
2 1 1 2
2 1 1 2
2 2 2 2
-4
4 4 4 4 4 4 4 4
4 3 3 3 3 3 3 4
4 3 2 2 2 2 3 4
4 3 2 1 1 2 3 4
4 3 2 1 1 2 3 4
4 3 2 2 2 2 3 4
4 3 3 3 3 3 3 4
4 4 4 4 4 4 4 4
-10 < n < 10
?Odpowiedzi:
Galaretka ,
1817 bajtówWypróbuj online! lub zweryfikuj wszystkie przypadki testowe .
Jak to działa
źródło
EXCEL: 126 bajtów
=MAX(MIN(MIN(CELL("row",RC)-1,CELL("col",RC)-1),MIN(((ABS(R1C1)-1)*2+3)-CELL("row",RC),((ABS(R1C1)-1)*2+3)-CELL("col",RC))),0)
Wypróbuj online *
Uwaga: w tej odpowiedzi używana jest notacja R1C1. Jeśli masz zamiar tego spróbować sam. musisz to włączyć w opcjach programu Excel.
podany wzór musi znajdować się w każdej komórce znajdującej się poza (2,2). Umieść żądaną wielkość piramidy w (1,1).
szybki zrzut ekranu formuły w akcji:
Oto dodatkowe zdjęcie dobrej zabawy z formatowaniem warunkowym!
* Obecnie aktualizacja zajmuje bardzo dużo czasu.
źródło
=MAX(MIN(MIN(ROW()-1,COLUMN()-1),MIN(((ABS(A1)-1)*2+3)-ROW(),((ABS(A1)-1)*2+3)-COLUMN())),0)
92 bajtów. Nadal nie obsługuje przypadków i formuły nie można przeciągać, ponieważ odwołanie do komórki nie jest zablokowane.=MEDIAN(MIN(ROW()-1,COLUMN()-1),ABS(A1)*2+1-MAX(ROW(),COLUMN()),0)
Range
dużo więcej niż 126 bajtów.Python 2,
1099998Sporządzać listę
i bawcie się z tym trochę.
edycja: nowy sposób tworzenia listy + dzięki Lynn za dwa bajty
źródło
If n is even, then there will be 4 center numbers
MATL ,
2624 bajtówWypróbuj online!Lub zweryfikuj wszystkie przypadki testowe (nieco zmodyfikowany kod, który ma służyć jako pakiet testowy).
Wyjaśnienie
Kod najpierw buduje tablicę wyjściową, przyjmując pozytywne dane wejściowe
n
. Tablica jest inicjalizowana jak1
dla nieparzystych danych wejściowych lub jako pusta tablica dla parzystych danych wejściowych (jest ona tworzona jako macierz tożsamości o wielkości równej parzystości danych wejściowych). Następnie powtarzane sąn
czasy dla parzystego wprowadzania in-1
czasy dla nieparzystego wprowadzania: rozszerz tablicę o ramkę zawierającą0
i dodaj1
do wszystkich elementów.Na przykład kroki wprowadzania
n
są następujące:Tablica początkowa:
Przedłuż z ramą:
Dodaj
1
:Przedłuż z ramą:
Dodaj
1
:Daje to prawidłowe wyjście dla dodatniego sygnału wejściowego. Jeśli dane wejściowe są ujemne, tablicę należy zmodyfikować, dodając wartość wejściową minus
1
i przyjmując wartość bezwzględną:Możesz obserwować powiększanie się tablicy (zmodyfikowany kod, aby pokazać kroki pośrednie) na MATL Online! Tłumacz jest wciąż wersją beta. Jeśli to nie działa, naciśnij ponownie „Uruchom” lub ponownie załaduj stronę.
Skomentowany kod
źródło
.2
sekundyPython 2.7:
123122120 bajtówprobs wciąż mogą zapisać kilka bajtów ...
edit1:
N=abs(n)
aby zapisać 1 bajtedit2:
(i+1)*(n>0)or-n-i
aby zapisać 2 bajtyźródło
Haskell,
119113110104102101 bajtówZwraca macierz jako listę list liczb całkowitych, na przykład:
f 2
->[[1,1,1,1],[1,2,2,1],[1,2,2,1],[1,1,1,1]]
.Jak to działa:
źródło
Perl, 175 bajtów
Zawiera 1 bajt dla
-p
.(Jest ostatnia nowa linia, której nie wiem, jak pokazać z przeceną, ale jej potrzebujesz).
Potrzebuje,
-p
a także-M5.010
lub-E
uruchomić:Cholera, to za długo ... Spróbuję innych podejść, kiedy będę miał trochę czasu.
źródło
eval
?y///
nie interpolate, więc jest użyć cudzysłowia interpolować$w
i$k
, a następnieeval
wykonaćy///
.Python 2, 109 bajtów
źródło
J,
2926 bajtówStosowanie
Wyjaśnienie
Przydaje się
i.
czasownik zakresu[0, 1, ..., n-1]
dla wartości dodatniejn
i[n-1, n-2, ..., 0]
ujemnej,n
co jest przydatne tutaj.źródło
Mathematica, 78 bajtów
Wyjaśnienie
Wykonaj macierz początkową: 1x1, jeśli nieparzysta, 2x2, jeśli parzysta.
Wygeneruj listę od 1 do abs (wejście) - 1.
Wypełnij początkową tablicę za pomocą wyżej wymienionej listy.
Dodaj 1 lub - wejście, w zależności od tego, która wartość jest mniejsza.
Zastosuj wartość bezwzględną do całej macierzy.
źródło
PHP,
177157 bajtówBiegnij z
php -r '<code>
zapętla się przez rzędy i kolumny, drukuje wartości w zależności od ich odległości od środka.
$n=abs($z)+1
:+1
Zapisuje kilka+1
i-1
w późniejszych wyrażeniach-$n+1
(wstępny przyrost warunku!) do$n-1
(-abs($z)
doabs($z)
)$n
: 1) są pomijane(
$n&1
dotyczy to nawet parzystych kolumn! Pamiętasz+1
?)+1
.źródło
Haskell,
191183173169168 bajtówStosowanie:
Podziękowania dla nich za
2102024 bajtów!źródło
negate
jest(0-)
f
, aby[id!id,tail!init]!!mod n 2
i następnie go do inlineg
i używać1<2
strażnika związać pośredni wynik oddziału:g n| ... |q<-r<$>a n=([id!id,tail!init]!!mod n 2)q$a n
. Nie potrzebujesz nazwy dla głównej funkcji.a
też (i powrócić do1<2
strażnika)g n| ... |1<2=[id!id,tail!init]!!mod n 2=<<map r$r$(\x->(x<$[1..x])++[x+1..n])<$>[1..n]
.m=map
w!
:...(++).m y
ig
:g n|n<0=m(m(abs.((n-1)+)))$g$abs n|1<2=[id!id,tail!init]!!mod n 2=<<m r$r$m(\x->(x<$[1..x])++[x+1..n])[1..n]
.JavaScript (ES6), 107 bajtów
l
jest rozmiarem tablicy.n<0?-n-j:j+1
Wydaje się niezgrabny, ale nie mogę znaleźć nic lepszego.źródło
Wigor,
152143 bajtyJestem pewien, że można by to bardziej zagrać w golfa, szczególnie te dwie ostatnie linie, ale mój mózg jest smażony.
Wypróbuj online!
Oto format xxd ze znakami niedrukowalnymi:
Wyjaśnienie
Buduje piramidę od środka, otaczając numer centralny
x
es:Następnie zastępuje
x
es kolejnym numerem i ponownie otaczax
es:...i tak dalej. W przypadku liczb parzystych robi to samo, ale zaczyna się od podstawy 2x2.
Oto kod „nieprzygotowany”. Jest to nieco niekonwencjonalne, ponieważ „nagrywam” makro, wpisując je do bufora (stąd wszystkie litery
<C-v>
s), a następnie usuwając je z rejestru, co jest najlepszym sposobem, w jaki udało mi się skomponować makro bez faktycznego naciskania klawiszy.źródło
PHP, 215 bajtów
źródło
R, 112 bajtów
Potrzebuje liczby całkowitej
n
w obszarze roboczym, w przeciwnym razie uruchomn=scan()
o dodatkowe 8 bajtów.źródło