Eine Pyramidenmatrix ist eine quadratische Matrix, bei der alle Zahlen vom Mittelpunkt aus zunehmen oder abnehmen, wie die beiden folgenden Matrizen:
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
Oder:
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
Bei einer ganzen Zahl ungleich Null n
, schafft eine pyramidale Matrix , wobei die Zahlen aus gehen 1
zu n
entweder in ansteigender Reihenfolge (wenn n <0) oder absteigende Reihenfolge (wenn n> 0) von der Mitte. Wenn gerade n
ist, gibt es 4 Zentrumsnummern (siehe Beispiele).
Wie immer:
- Optionales Eingabe- und Ausgabeformat
- Anzahl der Leerzeichen, Trennzeichen usw. ist optional
Testfälle:
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
?Antworten:
Jelly ,
1817 BytesProbieren Sie es online! oder überprüfen Sie alle Testfälle .
Wie es funktioniert
quelle
EXCEL: 126 Bytes
=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)
Online ausprobieren *
Hinweis: Diese Antwort verwendet die R1C1-Notation. Wenn du das selbst probierst. Sie müssen dies in den Excel-Optionen aktivieren.
Die angegebene Formel muss in jeder Zelle jenseits von (2,2) vorhanden sein. Geben Sie Ihre gewünschte Pyramidengröße in (1,1) ein.
Schnelles Screen-Cap der Formel in Aktion:
Hier ist ein zusätzliches Bild von etwas Spaß beim bedingten Formatieren!
* Die Aktualisierung dauert derzeit sehr lange.
quelle
=MAX(MIN(MIN(ROW()-1,COLUMN()-1),MIN(((ABS(A1)-1)*2+3)-ROW(),((ABS(A1)-1)*2+3)-COLUMN())),0)
92 Byte verkürzen . Die Fälle werden jedoch immer noch nicht behandelt, und die Formel kann nicht verschoben werden, da der Zellverweis nicht gesperrt ist.=MEDIAN(MIN(ROW()-1,COLUMN()-1),ABS(A1)*2+1-MAX(ROW(),COLUMN()),0)
Range
einfügen , benötigen Sie entweder eine oder eine Menge mehr als 126 Bytes.Python 2,
1099998Erstelle Liste
und ein wenig damit spielen.
edit: neue art liste zu erstellen + danke lynn für zwei bytes
quelle
If n is even, then there will be 4 center numbers
MATL ,
2624 BytesProbieren Sie es online! Oder überprüfen Sie alle Testfälle (leicht modifizierter Code als Testsuite).
Erläuterung
Der Code erstellt zuerst das Ausgabearray unter der Annahme einer positiven Eingabe
n
. Das Array wird1
für ungerade Eingaben oder für gerade Eingaben als leeres Array initialisiert (dies wird als Identitätsmatrix mit einer Größe erstellt, die der Parität der Eingabe entspricht). Das Folgende wird dannn
für gerade Eingaben undn-1
für ungerade Eingaben wiederholt : Erweitern Sie das Array mit einem Rahmen0
,1
der alle Elemente enthält , und fügen Sie ihn hinzu .Die Eingabeschritte
n
lauten beispielsweise:Anfangsarray:
Mit Rahmen verlängern:
Hinzufügen
1
:Mit Rahmen verlängern:
Hinzufügen
1
:Dies gibt den korrekten Ausgang für den positiven Eingang. Wenn die Eingabe negativ ist, muss das Array geändert werden, indem das Minus der Eingabe hinzugefügt
1
und der absolute Wert verwendet wird:Sie können das Anwachsen des Arrays (modifizierter Code, um Zwischenschritte anzuzeigen ) bei MATL Online beobachten! Der Dolmetscher ist noch eine Beta. Wenn es nicht funktioniert, klicken Sie erneut auf "Ausführen" oder laden Sie die Seite neu.
Kommentierter Code
quelle
.2
Sekunden zuPython 2.7:
123122120 BytesProbs können noch ein paar Bytes sparen ...
edit1:
N=abs(n)
um 1 Byte zu speichernedit2:
(i+1)*(n>0)or-n-i
um 2 Bytes zu speichernquelle
Haskell,
119113110104102101 BytesGibt die Matrix als Liste von Listen mit ganzen Zahlen zurück, zum Beispiel:
f 2
->[[1,1,1,1],[1,2,2,1],[1,2,2,1],[1,1,1,1]]
.Wie es funktioniert:
quelle
Perl, 175 Bytes
Beinhaltet 1 Byte für
-p
.(Es gibt eine nachgestellte Zeile, die ich nicht mit dem Markdown anzeigen kann, aber Sie brauchen sie).
Bedürfnisse
-p
sowie-M5.010
oder-E
zu laufen:Verdammt, das ist zu lang ... Ich werde einige andere Ansätze ausprobieren, wenn ich etwas Zeit habe.
quelle
eval
?y///
nicht interpoliert, verwenden Sie die doppelten Anführungszeichen, um zu interpolieren$w
und$k
danneval
auszuführeny///
.Python 2, 109 Bytes
quelle
J,
2926 BytesVerwendung
Erläuterung
Der Bereich
i.
verb gibt[0, 1, ..., n-1]
für positivn
und[n-1, n-2, ..., 0]
für negativ aus,n
was hier nützlich ist.quelle
Mathematica, 78 Bytes
Erläuterung
Erstelle eine Anfangsmatrix: 1x1 wenn ungerade, 2x2 wenn gerade.
Erzeugen Sie eine Liste von 1 bis abs (Eingabe) - 1.
Füllen Sie das ursprüngliche Array mit der oben genannten Liste auf.
Addiere 1 oder -input, je nachdem, welcher Wert kleiner ist.
Wenden Sie den absoluten Wert auf die gesamte Matrix an.
quelle
PHP,
177157 Bytesrenn mit
php -r '<code>
Durchläuft Zeilen und Spalten und druckt die Werte in Abhängigkeit vom Abstand zur Mitte.
$n=abs($z)+1
: Das+1
spart ein paar+1
und-1
in späteren Ausdrücken-$n+1
(Vorinkrement in der Bedingung!) bis$n-1
(-abs($z)
bisabs($z)
)$n
: 1) werden übersprungen(
$n&1
gilt hier für gerade Spalten!+1
?)+1
.quelle
Haskell,
191183173169168 BytesVerwendung:
Danke an nimi für
2102024 Bytes!quelle
negate
ist(0-)
f
zu[id!id,tail!init]!!mod n 2
und dann inline es ing
und die Verwendung1<2
Wache ein Zwischenergebnis der Branche zu binden:g n| ... |q<-r<$>a n=([id!id,tail!init]!!mod n 2)q$a n
. Sie brauchen keinen Namen für die Hauptfunktion.a
, auch (und wechseln Sie wieder auf die1<2
Wache):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
in!
:...(++).m y
undg
: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 Byte
l
ist die Größe des Arrays. Dasn<0?-n-j:j+1
scheint umständlich, aber ich kann nichts besseres finden.quelle
Vim,
152143 BytesIch bin mir sicher, dass man mehr Golf spielen könnte, vor allem in den letzten beiden Zeilen, aber mein Gehirn ist verrückt.
Probieren Sie es online!
Hier ist es im xxd-Format mit nicht druckbaren Zeichen:
Erläuterung
Es baut die Pyramide von der Mitte aus und umgibt die Zentrumsnummer mit
x
es:Dann ersetzt es die
x
es durch die nächste Zahl und umgibt sie erneut mitx
es:...und so weiter. Bei geraden Zahlen geschieht das Gleiche, jedoch mit einer 2x2-Basis.
Hier ist der Code "ungolfed". Es ist insofern etwas unkonventionell, als ich ein Makro "aufzeichne", indem ich es in einen Puffer (daher alle
<C-v>
s) schreibe und dann in ein Register lösche. Dies ist der beste Weg, ein Makro zu erstellen, ohne die Tastenanschläge tatsächlich auszuführen.quelle
PHP, 215 Bytes
quelle
R 112 Bytes
Benötigt eine Ganzzahl
n
im Arbeitsbereich, andernfalls werdenn=scan()
zusätzliche 8 Byte benötigt.quelle