Zeigen Sie bei einer positiven Ganzzahl unter 1000 alle möglichen Rechtecke mit diesem Bereich an.
Aufgabe
Angenommen, die Eingabe ist 20. Wir können ein Rechteck mit 20 × 1, 10 × 2 oder 5 × 4 erstellen. Dies ist also eine gültige Ausgabe:
********************
**********
**********
*****
*****
*****
*****
Beachten Sie, dass jedes mögliche Rechteck genau einmal angezeigt wird.
Die Rechtecke können in beliebiger Reihenfolge, Ausrichtung oder Position angezeigt werden, aber auch an den Ecken dürfen sich keine zwei Rechtecke überlappen oder berühren. Folgendes gilt ebenfalls:
********************
****
********** ****
********** ****
****
****
Wertung
Der Bounding-Box-Bereich (BBA) einer Ausgabe ist der Bereich des minimalen Rechtecks, der alle Rechtecke einschließt. In der ersten Beispielausgabe beträgt die Größe 20 × 9, sodass der BBA 180 beträgt. In der zweiten Beispielausgabe beträgt die Größe 20 × 7, sodass der BBA nur 140 beträgt.
Suchen Sie den BBA des Ausgangs, wenn der Eingang 60, 111, 230, 400 und 480 ist, und addieren Sie sie. Multiplizieren Sie diese Summe mit der Größe Ihres Codes in Bytes. Das Ergebnis ist Ihre Punktzahl; niedrigste Punktzahl gewinnt.
Regeln
- Das Programm (oder die Funktion) muss eine gültige Ausgabe für jede positive ganze Zahl unter 1000 erzeugen.
- Die Ausgabe darf nur Sternchen (
*
), Leerzeichen () und Zeilenumbrüche enthalten.
- Zwischen den Rechtecken kann beliebig viel Platz sein, dies gilt jedoch für die BBA.
- Führende oder nachfolgende Zeilen oder Spalten zählen nicht zum BBA, wenn sie nur Leerzeichen enthalten.
quelle
Antworten:
Ruby, 228 Byte * 21895 = 4992060
Mehrere Änderungen gegenüber ungolfed Code.
m
Am größten ist die Änderung der Bedeutung der Variablen von der Höhe des quadratischsten Rechtecks zur Höhe des quadratischsten Rechtecks plusn
.Trivial
*40
wurde geändert,*n
was eine Menge unnötiger Leerzeichen rechts für große bedeutetn
; und-2
wird geändert,0
was bedeutet, dass Rechtecke, die über den Boden gezeichnet sind, immer die ersten beiden Spalten verfehlen (dies führt zu einer schlechteren Packung für Zahlen, deren einzige Faktorisierung darin besteht(n/2)*2
).Erläuterung
Ich fand endlich Zeit, darauf zurückzukommen.
Für ein bestimmtes
n
Feld muss genügend Platz für das längste1*n
und das quadratischste Rechteck vorhanden seinx*y
. Es sollte offensichtlich sein, dass das beste Layout erzielt werden kann, wenn beide Rechtecke ihre langen Seiten in die gleiche Richtung ausrichten.Wenn wir die Anforderung von Leerzeichen zwischen den Rechtecken ignorieren, stellen wir fest, dass die Gesamtfläche entweder
(n+y)*x = (n+n/x)*x
oder istn*(x+1)
. In jedem Fall wird dies ausgewertetn*x + n
. Einschließlich des Leerzeichens müssen wir ein zusätzliches einfügen,x
wenn wir die Rechtecke Ende an Ende platzieren odern
wenn wir die Rechtecke nebeneinander platzieren. Ersteres ist daher vorzuziehen.Dies ergibt die folgenden Untergrenzen
(n+y+1)*x
für den Feldbereich:Dies legt den folgenden Algorithmus nahe:
Es ist tatsächlich möglich, alle Rechtecke für die erforderlichen Testfälle innerhalb der oben genannten unteren Grenzen zu erhalten, mit Ausnahme von 60, was die folgende Ausgabe von 71 * 8 = 568 ergibt. Dies kann leicht auf 60 * 9 = 540 verbessert werden, indem die beiden dünnsten Rechtecke um ein Quadrat nach rechts und dann nach oben verschoben werden. Die Einsparung ist jedoch minimal, sodass es wahrscheinlich keinen zusätzlichen Code wert ist.
Dies ergibt eine Gesamtfläche von 21895.
Ungolfed Code
quelle
CJam, 90385 * 31 Bytes = 2801935
Testen Sie es hier. Verwenden Sie dieses Skript , um die BBAs zu berechnen.
Dies ist nur die naive Lösung, um die Dinge in Gang zu bringen.
quelle
Ruby, 56 Bytes
90385 * 56 = 5061560 unter der Annahme, dass die Ausgabe der von Martin entspricht (ich glaube, das ist es.)
Hier ist eine weitere nützliche Funktion in einem nützlichen Testprogramm
Welches gibt die folgende Ausgabe als Referenz:
quelle