Nun, obwohl sich diese Herausforderung als großer Erfolg herausstellte, erwies es sich auch als sehr trivial zu lösen. Daher habe ich für diejenigen, die nach einer größeren Herausforderung suchen, eine Fortsetzung dieser Herausforderung erstellt, in der Sie nun die Anzahl der eindeutigen Rechtecke zählen müssen. Hör zu!
Nun, für diejenigen unter Ihnen, die diese Herausforderung lösen möchten, ist es an der Zeit.
Nun, eine solche Herausforderung haben wir noch nicht wirklich, also machen wir uns auf den Weg.
Betrachten Sie dieses 3 x 3
Raster von Rechtecken:
Wie viele Rechtecke gibt es? Wenn wir visuell zählen, können wir sehen, dass es tatsächlich 36
Rechtecke gibt, einschließlich der gesamten Ebene selbst, die alle im folgenden animierten GIF gezeigt werden:
Die Aufgabe
Das Zählen von Rechtecken wie oben gezeigt ist die Aufgabe. Mit anderen Worten, wenn 2 ganze Zahlen größer oder gleich 0
sind m
und n
wobei m
die Breite und n
die Höhe dargestellt werden, wird die Gesamtzahl der Rechtecke in diesem m x n
Rechteckraster ausgegeben .
Regeln
Die Verwendung von eingebauten Funktionen, die dieses Problem direkt lösen, ist ausdrücklich untersagt.
Bei dieser Herausforderung geht es nicht darum, die kürzeste Antwort zu finden, sondern die kürzeste Antwort in jeder Sprache. Daher wird keine Antwort akzeptiert.
Standardlücken sind verboten.
Testfälle
Präsentiert im Format Array of Integers Input -> Integer Output
:
[0,0] -> 0
[1,1] -> 1
[3,3] -> 36 (Visualized above)
[4,4] -> 100
[6,7] -> 588
Verweise
Denken Sie daran, das ist Code-Golf , also gewinnt der kürzeste Code!
588
für den letzten Testfall gerechnet .Antworten:
Python, 22 Bytes
Die Formel
m*n*(m+1)*(n+1)/4
wird mit dem Bitkomplement gekürzt~m=-(m+1)
, ausgedrückt(m+1)*(n+1)
als~m*~n
.Warum ist die Anzahl der Rechtecke
m*n*(m+1)*(n+1)/4
? Jedes Rechteck wird durch die Auswahl von zwei horizontalen Linien (oben und unten) und zwei vertikalen Linien (links und rechts) festgelegt. Es gibtm+1
horizontale Linien, von denen wir eine Teilmenge von zwei verschiedenen auswählen. Also die Anzahl der Auswahlmöglichkeiten istchoose(m+1,2)
, was istm*(m+1)/2
. Multiplizieren mit denn*(n+1)/2
Auswahlmöglichkeiten für vertikale Linien ergibt das Ergebnis.quelle
Gelee , 4 Bytes
Probieren Sie es online!
Alternativ auch 4 Bytes
Probieren Sie es online!
quelle
בHP
und‘c2P
vielleicht andere 4-Byte-Alternativen.nth
undmth
Dreieckszahl handelt.R
wandelt jede Zahl in den 1 basierend Index:[1, 2, ..., n]
.S
ist Summen- und€
bedeutet ‚jeweils‘ so wird jede Liste summiert, um eine Liste zu geben wie:[nth triangle number, mth triangle number]
. NimmtP
dann das Produkt dieser Liste, das das gewünschte Ergebnis liefert.Javascript (ES6), 17 Byte
Eine Gabelung dieser Antwort .
quelle
Mathematica, 15 Bytes
Dies ist eine unbenannte Funktion, die zwei Ganzzahlargumente verwendet und die Anzahl der Rechtecke zurückgibt.
Erläuterung
Die Implementierung ist im Grunde eine sehr golfene Form des Produkts der beiden Dreieckszahlen. Es könnte sich lohnen, den Abschnitt "Folgen von Argumenten" in diesem Beitrag zu lesen, um Einzelheiten zu erfahren, aber ich werde versuchen, das Wesentliche hier zusammenzufassen.
##
wird zu einer Folge aller Argumente erweitert. Dies ähnelt dem Aufteilen in andere Sprachen. Zum Beispiel, wenn die Argumente3
und sind4
, dann{1, 2, ##, 5}
werden Sie geben{1, 2, 3, 4, 5}
. Dies funktioniert aber nicht nur in Listen, sondern in jedem beliebigen Ausdruck, zBf[1, 2, ##, 5]
auchf[1, 2, 3, 4, 5]
.Dies wird interessant, wenn Sie
##
mit Operatoren kombinieren . Alle Operatoren in Mathematica sind nur kurze Hände für einenf[...]
ähnlichen Ausdruck (möglicherweise verschachtelt). ZBa+b
istPlus[a, b]
unda-b
tatsächlich darstelltPlus[a, Times[-1, b]]
. Wenn Sie nun##
mit Operatoren kombinieren , besteht Mathematica darin, die Operatoren zuerst zu erweitern,##
wie einen einzelnen Operanden zu behandeln und sie erst am Ende zu erweitern. Durch Einfügen##
an der richtigen Stelle können wir sie daher sowohl zum Multiplizieren als auch zum Addieren der Operanden verwenden.Machen wir das für den obigen Code:
Wenn wir es zu seiner vollen Form erweitern, erhalten wir Folgendes:
Fügen wir die Funktionsargumente ein
a
undb
:Und jetzt konvertieren wir es zurück in die mathematische Standardnotation:
Eine kleine Umordnung zeigt, dass dies das Produkt der Dreieckszahlen ist:
Tolles Faktum: Diese Implementierung ist so golfen, dass sie die gleiche Länge wie die integrierte für die Berechnung einer einzelnen Dreieckszahl hat
PolygonalNumber
.quelle
C 25 Bytes
Puristische Version (27):
ISO-er-Version (35):
quelle
Qualle , 16 Bytes
Eingabeformat ist
[x y]
, Ausgabe ist nur das Ergebnis.Probieren Sie es online!
Alternative Lösung, gleiche Byteanzahl:
Erläuterung
Zeit, Jellyfish die Einführung zu geben, die es verdient! :)
Qualle ist Zgarbs Sprache basierend auf seiner 2D-Syntax-Herausforderung . Die Semantik ist weitgehend von J inspiriert, aber die Syntax ist ein Kunstwerk. Alle Funktionen sind Einzelzeichen und in einem Raster angeordnet. Funktionen nehmen ihre Argumente vom nächsten Token nach Süden und Osten und geben das Ergebnis nach Norden und Westen zurück. Auf diese Weise können Sie ein interessantes Netz von Funktionsaufrufen erstellen, in dem Sie Werte wiederverwenden, indem Sie sie aus mehreren Richtungen in mehrere Funktionen übertragen.
Wenn wir die Tatsache ignorieren, dass einige der Token im obigen Programm spezielle Operatoren (übergeordnete Funktionen) sind, würde das obige Programm in einer vernünftigen Sprache geschrieben:
Lassen Sie uns den Code von unten nach oben durchgehen. Die Eingabe wird von der eingespeist
i
, die daher zu auswertet[x y]
.Die
+
darüberliegende Seite empfängt diese Eingabe zusammen mit dem Literal1
und erhöht daher beide Elemente, um etwas zu ergeben[(x+1) (y+1)]
(die meisten Operationen werden automatisch über Listen geführt).Der andere Wert von
i
wird nach links gesendet, aber dieE
Teilung ist das östliche Argument nach Norden und Westen. Das heißt, die Eingaben rechts*
sind tatsächlich[x y]
und[(x+1) (y+1)]
dies wird berechnet[x*(x+1) y*(y+1)]
.Das nächste
*
wird durch das vorhergehende geändert,/
was es zu einer Faltoperation macht. Das Umklappen*
eines Paares multipliziert es einfach, so dass wir erhaltenx*(x+1)*y*(y+1)
.Jetzt
%
wird nur noch die Division berechnetx*(x+1)*y*(y+1)/4
. Leider führt dies zu einem Float, so dass wir es mit dem Unary abrunden müssen|
. Abschließend wird dieser Wert eingegeben, aufp
den das Endergebnis gedruckt wird.quelle
R,
4035 BytesNun, es ist Zeit, in die Tiefe zu springen! Hier ist mein R- Code, inspiriert von @xnor answer:
BEARBEITEN : In dieser Version wird R zweimal nach Eingaben fragen.
quelle
cat(prod(choose(scan()+1,2)))
ist 29 Bytes.CJam,
1210 Bytes2 Bytes gespart dank Martin.
Probieren Sie es online!
Dies ist ein Block, der eine Liste von 2 Elementen aus dem Stapel entnimmt und die Lösung auf dem Stapel belässt. Nutzbare vollständiges Programm für die Prüfung:
riari+{_:)+:*4/}~
.Basierend auf der herausragenden Python-Lösung von xnor.
Erläuterung:
quelle
{_:~+:*4/}
~
In CJam muss das überhaupt nicht verwendet werden. Verwenden Sie einfach)
.Matlab,
2319 BytesDie Umsetzung der Formel
m*n*(m+1)*(n+1)/4
Verbrauch:
ans([m,n])
quelle
MATL , 6 Bytes
Die Eingabe ist ein Array des Formulars
[m,n]
.Probieren Sie es online!
Erläuterung
Direkte Berechnung basierend auf der Formel
m*(m+1)*n*(n+1)/4
.quelle
J, 8 Bytes
Verwendung:
quelle
Java 7,
3938 BytesJava 8,
2625191817 BytesBasierend auf der ausgezeichneten Antwort von @xnor . Mehrere Bytes dank @DavidConrad gespeichert . Probieren Sie es hier aus.
Testcode (Java 7):
Probieren Sie es hier aus.
Ausgabe:
quelle
return
unda->b->
ist ein Byte kürzer als(a,b)->
.Function<Integer, Function<Integer, Integer>>
als Parameter verwendet, würde kein Semikolon folgen.;
für einzelne J8-Lambdas.return
. Außerdem programmiere ich fast nie in Java 8 (daher alle meine Java 7-Antworten), aber wie komme icha->b->
zur Arbeit? Hier ist die Idee für den aktuellen Fall.MathOperation.operation
, um nur einen zu nehmenint
, a zurückzugebenFunction<Integer, Integer>
, und wenn Sie es aufrufen, übergeben Sie zunächst nur den ersten Parametera
und rufen dann den.apply(b)
aufFunction
. Sie müssen auch importierenjava.util.function.Function
. Hier ist eine Idee mit den Änderungen.Ruby, 22 Bytes
@ Xnors Trick stehlen und ein Stabby-Lambda machen:
Beispielaufruf:
Oder als proc, auch 22 bytes:
Was wir dann nennen könnten:
quelle
Labyrinth ,
1311 BytesProbieren Sie es online!
Erläuterung
Dies berechnet auch das Produkt der Dreieckszahlen wie die meisten Antworten. Der führende 2x2 Block ist eine kleine Schleife:
Bei der ersten Iteration
*
wird nichts ausgeführt, sodass die tatsächliche Schleifenreihenfolge wie folgt lautet:Der verbleibende Code ist nur linear:
Labyrinth versucht dann
/
erneut auszuführen , was das Programm aufgrund einer Division durch Null beendet.quelle
Pyke, 6 Bytes
Probieren Sie es hier aus!
quelle
05AB1E, 4 Bytes
Erläuterung
Verwendet die in A096948 beschriebene Formel
Übernimmt die Eingabe als [n, m] .
Probieren Sie es online aus
quelle
Pyth,
86 BytesZwei Bytes gespart dank @DenkerAffe.
Die Eingabe wird als Liste wie erwartet
[m,n]
. Probieren Sie es hier aus .Erläuterung:
quelle
F
anstelle von verwenden.*
und entfernen,Q
da es implizit hinzugefügt wird.F
aber ich konnte nicht herausfinden, wie man es benutzt und dachte, ich müsste es.*
stattdessen benutzen ... Danke!C #, 19 Bytes
Eine anonyme Funktion basierend auf der Antwort von @ xnor.
quelle
Lua,
7463 BytesDie Funktion übernimmt die Eingabe als Zahlenparameter.
Aufgrund der Art und Weise, wie Lua implementiert ist, handelt es sich technisch gesehen um eine Funktion mit variablen Argumenten, die aufgerufen werden kann, indem sie in eine "function" -Anweisung eingeschlossen oder mit "loadstring" aus dem Quellcode geladen wird.
quelle
Cheddar , 23 Bytes
quelle
n*(n+1)
kann golfen werdenn^2+n
m->n->...
Brain-Flak ,
8480 BytesProbieren Sie es online!
Wahrscheinlich sehr suboptimal, vor allem wegen der Wiederverwendung des Codes in Bezug auf Dreieckszahlen, aber zumindest haben wir eine Brain-Flak-Lösung, die funktioniert.
Leider scheint es durch die Endlosschleife mit dem
0 0
Testfall zu scheitern, aber alle anderen funktionieren einwandfrei.quelle
Konvex, 7 Bytes
Ich weiß, dass dies kleiner sein kann, ich kann nur nicht herausfinden, wie noch ...
Probieren Sie es online! . Verwendet die CP-1252-Codierung.
quelle
APL (Dyalog) , 9 Bytes
Probieren Sie es online!
quelle
Pyt , 3 Bytes
Erläuterung:
Probieren Sie es online!
quelle