Der Satz von Nichomachus bezieht das Quadrat einer Summe auf die Summe der Würfel:
und hat eine schöne geometrische Visualisierung:
Herausforderung: Erstellen Sie den zweiten Teil dieser Visualisierung in ASCII.
Sie müssen sicherstellen, dass alle visuellen Abgrenzungen von Ihrem Diagramm eingehalten werden. Dies ist am einfachsten mit vier "Farben" zu tun, obwohl es mit nur drei möglich ist (siehe letztes Beispiel unten für wie). Bei vier Farben werden zwei zur Unterscheidung zwischen Bereichen innerhalb eines "Streifens" (dh den verschiedenen Teilen, aus denen ein einzelner Würfel besteht) und zwei zur Unterscheidung zwischen benachbarten Streifen verwendet. Sie können auch mehr als vier Farben verwenden, wenn Sie möchten. Wenn dies verwirrend ist, sollte das folgende Beispiel klarstellen.
Input-Output
Die Eingabe ist eine einzelne Ganzzahl größer als 0. Die Ausgabe ist ein ASCII-Raster, das den folgenden Beispielen ähnelt und dem abgeflachten Raster für diese Eingabenummer im obigen Bild entspricht. Führende und nachfolgende Leerzeichen sind in Ordnung.
Dies ist Codegolf mit Standardregeln.
Beispielausgaben
N = 1
#
N = 2
#oo
o@@
o@@
N = 3
#oo+++
o@@+++
o@@+++
+++###
+++###
+++###
N = 4
#oo+++oooo
o@@+++oooo
o@@+++@@@@
+++###@@@@
+++###@@@@
+++###@@@@
oo@@@@oooo
oo@@@@oooo
oo@@@@oooo
oo@@@@oooo
N = 5
#oo+++oooo+++++
o@@+++oooo+++++
o@@+++@@@@+++++
+++###@@@@+++++
+++###@@@@+++++
+++###@@@@#####
oo@@@@oooo#####
oo@@@@oooo#####
oo@@@@oooo#####
oo@@@@oooo#####
+++++#####+++++
+++++#####+++++
+++++#####+++++
+++++#####+++++
+++++#####+++++
Dreifarbige Version für N = 4 dank @BruceForte:
#oo+++oooo
o##+++oooo
o##+++####
+++ooo####
+++ooo####
+++ooo####
oo####++++
oo####++++
oo####++++
oo####++++
Antworten:
MATL ,
302827 BytesProbieren Sie es online!
Bonusmaterial:
Für 26 Bytes erzeugt die folgende modifizierte Version eine grafische Ausgabe :
Probieren Sie es bei MATL Online!
Das Bild verlangt nach etwas Farbe und kostet nur 7 Bytes:
Probieren Sie es bei MATL Online!
Oder verwenden Sie eine längere Version (37 Byte), um zu sehen, wie die Zeichenmatrix schrittweise aufgebaut wird :
Probieren Sie es bei MATL Online!
Beispielausgaben
Für die Eingabe wird
8
im Folgenden die Grundversion, die grafische Ausgabe und die grafische Farbausgabe angezeigt.Erläuterung
Allgemeines Verfahren
Eine numerische Matrix wird in
N
Schritten von der äußeren zur inneren Ebene erstellt, wobeiN
die Eingabe erfolgt. Jeder Schritt überschreibt einen inneren (oben links) Teil der vorherigen Matrix. Am Ende werden die Zahlen in der erhaltenen Matrix in Zeichen geändert.Beispiel
Für die Eingabe ist
4
die erste MatrixIn einem zweiten Schritt wird die Matrix
wird in die obere Hälfte des letzteren überschrieben. Dann ist das selbe erledigt mit
und schließlich mit
Die resultierende Matrix ist
Zuletzt
30
wird zu jedem Eintrag hinzugefügt und die resultierenden Zahlen werden als Codepunkte interpretiert und in Zeichen umgewandelt (also beginnend bei33
, entsprechend!
).Konstruktion der Zwischenmatrizen
N
Berücksichtigen Sie bei der Eingabe abnehmende Wertek
vonN
bis1
. Für jedesk
wird ein Vektor von ganzen Zahlen von1
bisk*(k+1)
erzeugt, und dann wird jeder Eintrag durch dividiertk
und aufgerundet. Als Beispielk=4
gibt dies an (alle Blöcke haben eine Größe mitk
Ausnahme des letzten):während für
k=3
das Ergebnis wäre (alle Blöcke haben Größek
):Dieser Vektor wird elementweise mit Broadcast zu einer transponierten Kopie von sich selbst hinzugefügt; und wird dann
k
zu jedem Eintrag hinzugefügt. Dafürk=4
gibt esDies ist eine der oben gezeigten Zwischenmatrizen, mit der Ausnahme, dass sie horizontal und vertikal gespiegelt wird. Alles was übrig bleibt ist, diese Matrix umzudrehen und in die obere linke Ecke der "akkumulierten" Matrix zu schreiben, die für den ersten (
k=N
) Schritt zu einer leeren Matrix initialisiert wurde.Code
quelle
Python 2 ,
187178164162152 Bytes-8 Bytes dank Mr.Xcoder
-1 Bytes dank Stephen
-10 Bytes dank Jonathan Frech
Probieren Sie es online!
quelle
sum(range(y))%y
->y*~-y/2%y
Kohle ,
5046 BytesProbieren Sie es online! Link ist eine ausführliche Version des Codes. Zurück 50-Bit - Version mit Erklärung: Versuchen Sie es online!
Hinweis: Ich durchlaufe das Zeichen, anstatt zu versuchen, das Zeichen direkt zuzuweisen,
l
da Sie das Ergebnis der Indizierung einer Zeichenfolge nicht direkt einer Variablen zuordnen können, da es sich um ein mehrdeutiges Konstrukt in Charcoal handelt. Zum Glück ist die Anzahl der Bytes gleich.quelle
C (GCC) ,
135128120 BytesProbieren Sie es online!
Verwendet nur drei Farben.
Arbeitet konzeptionell an einem um 180 Grad gedrehten Raster:
Und berechnet Farben nach der Formel:
quelle
gcc -O2
.g(i%m,i/m,n)%3
) nur für drei farben funktioniert ?x/k&&y/k
anstelle vonx>=k&y>=k
R ,
131126123 Bytes3 Bytes gespart dank @Giuseppe
Probieren Sie es online!
Dies verwendet den gleichen Algorithmus wie die MATL- Antwort von @LuisMendo . Der einzige Unterschied besteht darin, dass die Matrix nicht in Zeichen konvertiert, sondern mit allen Werten mod4 ausgegeben wird, um sicherzustellen, dass jedes Element ein einzelnes ASCII-Zeichen ist.
quelle
for
Schleife für -1 Byte zurückgebracht :)Python 2 ,
176 -175 BytesProbieren Sie es online!
quelle
J="".join;
(+10 Byte) definieren und beide"".join
s (-2 * 7 = -14 Byte) durchJ
(+2 Byte) ersetzen , können Sie ein Byte speichern (da nach demprint
; +1 Byte ein zusätzlicher Speicherplatz erforderlich ist) .