Die alten römischen Heeresformationen sind auf der ganzen Welt sehr berühmt. In diesen Formationen gruppieren sich römische Legionäre in einer geometrischen Form (normalerweise ein Rechteck), die die Flanken und den oberen Teil mit ihren Schilden schützen. Die Legionäre in den inneren Stellungen bedeckten den oberen Teil mit ihrem Schild über dem Kopf, die Legionäre an den Flanken trugen 2 oder mehr Schilde: einen zum Schutz des oberen Teils und einen oder mehrere Schilde zum Schutz der Flanken (falls sich jemand in der Ecke befand) er hatte 3 Schilde, wenn jemand alleine in einer Formation war, hatte er 5 Schilde Ja, ich weiß, es ist für einen Menschen unmöglich, 5 Schilde zu tragen, aber irgendwie haben sie es geschafft . Mit dieser Formation schützten sich alle römischen Legionäre und waren zu dieser Zeit der härteste Gegner.
Aus der Geschichte geht hervor, dass es einen römischen General gab, der erklärte, die beste Form der Formation sei das Quadrat (die gleiche Anzahl von Legionären in Reihen und Spalten). Das Problem bestand darin, herauszufinden, wie viele Formationen (und wie groß) er sein Heer aufteilen sollte, um:
- Lasse keinen Legionär aus einer Formation (obwohl er eine einzelne Legionärsformation zugelassen hat)
- Reduzieren Sie die Anzahl der erforderlichen Schilde
Nach einigen Berechnungen stellte der General fest, dass der beste Weg, um diese beiden Bedingungen zu erfüllen, darin besteht, mit dem größtmöglichen Quadrat zu beginnen und es dann zu wiederholen, bis keine Legionäre mehr übrig sind .
Beispiel:
Befanden sich 35 Legionäre in seiner Armee, bestand die Formation aus
- Ein 5x5 Legionärsquadrat (Dies ist das größte mögliche Quadrat).
Mit den restlichen Legionären (10)
- Ein 3x3 Quadrat
Mit den restlichen Legionären (1)
- Ein 1x1 Quadrat.
Am Ende wird es ungefähr so aussehen:
5x5
* * * * * 3x3
* * * * * * * * 1x1
* * * * * * * * *
* * * * * * * *
* * * * *
Die Legionäre in den inneren Stellungen deckten den überlegenen Teil ab und legten ihren Schild über die Köpfe . Sie brauchten nur 1 Schild.
* * * * *
* 1 1 1 * * * *
* 1 1 1 * * 1 * *
* 1 1 1 * * * *
* * * * *
Die Legionäre an den Flanken trugen 2
* 2 2 2 *
2 1 1 1 2 * 2 *
2 1 1 1 2 2 1 2 *
2 1 1 1 2 * 2 *
* 2 2 2 *
Wenn jemand in der Ecke war, hatte er 3 Schilde
3 2 2 2 3
2 1 1 1 2 3 2 3
2 1 1 1 2 2 1 2 *
2 1 1 1 2 3 2 3
3 2 2 2 3
Wenn jemand alleine in einer Formation war, hatte er 5 Schilde
3 2 2 2 3
2 1 1 1 2 3 2 3
2 1 1 1 2 2 1 2 5
2 1 1 1 2 3 2 3
3 2 2 2 3
Diese Formation erforderte insgesamt 71 Schilde.
Herausforderung
- Berechnen Sie die Anzahl der Schilde, die für eine X-Anzahl von Legionären benötigt werden
Eingang
- Anzahl der Legionäre in der Armee
Ausgabe
- Anzahl der benötigten Schilde.
Testfälle
35 => 71
20 => 44
10 => 26
32 => 72
- Standard Code-Golfregeln gelten
Amazon.com : Best-selling Nipple Shield Carrying Case, Perfect...
so, dass ich es wahrscheinlich nie wirklich erfahren werde. Hatten sie tatsächlich 5 Schilde bei sich - oder sollte das die Frage klappen lassen: P?Antworten:
Python 2 ,
605048 BytesProbieren Sie es online!
Neu im Code-Golf, aber mein bester Schlag!
Methode:
Summe,
n^2 + 4n
wobein
jedes der größten Quadrate die Summe für die Eingabe ist.Bearbeiten 1
Reduziert auf 50 Bytes dank @Jonathan Frech!
Bearbeiten 2
Switched
int(s**.5)
zus**.5//1
2 Byte dank @ovs zu speichernquelle
n*n
ist kürzer alsn**2
zwei Bytes zu sparen; mehr als das kann ich nicht sagen, da ich keine Python schreibe ...int(s**.5)
kann auf gekürzt werdens**.5//1
.//
ist in Python 2 und 33**.5//1
die Unterteilung in Ebenen. Wird1.0
in beiden Versionen als ausgewertet .R ,
5150 BytesProbieren Sie es online!
Ein Quadrat mit der Seitenlänge muss genau Schilde haben. Wir reduzieren um das größte Quadrat, das kleiner oder gleich bis Null ist, und akkumulieren dabei die Anzahl der Schilde.y y2+4y x x
Beweis:
Bei einem perfekten Quadrat mit der Seitenlänge benötigen wir genau 1 Schild für jedes Mitglied des Quadrats. Als nächstes benötigen wir für jedes Mitglied am Rand einen zusätzlichen Schild. Es gibt Glieder, die nicht an den Rändern sind, also gibt es Glieder an den Rändern. Schließlich benötigen wir für jede Ecke einen zusätzlichen Schild. Abgesehen von dem Fall, in dem , können wir also 4 addieren. Dies vereinfacht sich zu was zum Glück auch den korrekten Wert ergibt, wenn , so dass wir ihn für alle .y (y−2)2 y2−(y−2)2 y=1 y2+4y 5 y=1 y
quelle
JavaScript (ES7), 34 Byte
Probieren Sie es online!
Wie?
Die Formel gilt für als .w=1 s1=5
quelle
Gelee , 13 Bytes
Probieren Sie es online!
-1 Danke an Jonathan Allan .
quelle
Julia 0,6 , 36 Bytes
Probieren Sie es online!
Verwendet die gleiche Methode wie @ Giuseppes R-Antwort, obwohl meine Methode, dorthin zu gelangen, weniger aussagekräftiges Denken und eine gerechtere visuelle Betrachtung beinhaltete: Das innere Quadrat von 1s hat Dimensionen mal . das hat also Schilde. Um das herum gibt es 4 Mauern mit jeweils Soldaten mit jeweils 2 Schilden - so dass Schilden hinzukommen. Schließlich gibt es vier 3s in den vier Ecken, so dass 12 Schilde hinzugefügt werden.n2+4n (n−2) (n−2) (n−2)2 n−2 4∗(n−2)∗2
Ungolfed:
(Das kann man auch in 35 Bytes mit machen
n>0?(s=isqrt(n))*s+4s+f(n-s*s):0
, aber ich habe das für Julia 0.7 geschrieben, um die neuen Verwerfungswarnungen zu vermeiden (Leerzeichen sind erforderlich?
und:
).)quelle
Stax , 15 Bytes
Führen Sie es aus und debuggen Sie es
quelle
Brachylog , 26 Bytes
Probieren Sie es online!
quelle
Retina 0.8.2 , 28 Bytes
Probieren Sie es online! Link enthält Testfälle. Erläuterung:
In Dezimalzahl konvertieren.
Ordne ungeraden Zahlen zu. Der erste Durchlauf durch die Gruppe,
\1
gibt es noch nicht, so dass nur\G1
mithalten kann, die 1. Nachträgliche Spiele Spiele nicht mithalten können ,\G1
da\G
nur Matches zu Beginn des Spiels, so stattdessen müssen wir das Spiel ,11\1
das 2 ist mehr als das vorherige Spiel. Wir passen so viele ungerade Zahlen an, wie wir können, und die Gesamtübereinstimmung ist daher eine quadratische Zahl, während die letzte Erfassung eins weniger als das Doppelte ihrer Seite ist.Fügen Sie die Seitenschilde zu jedem Match hinzu.n2 2n−1 n2+4n=n2+2+2(2n−1)
$&
ist und ist während wir brauchen .$1
Summieren und in Dezimalzahl umwandeln.
quelle
05AB1E , 17 Bytes
Probieren Sie es online aus oder überprüfen Sie alle Testfälle .
Problemumgehung, da
ΔDtïÐns4*+Šn-}O
( 15 Byte ) nicht zu funktionieren scheint. Versuchen Sie es online im Debug-Modus, um zu sehen, was ich meine. Ich würde erwarten , dass es von gehen ,[45,'35',25]
um[45,10]
nach der-
und im nächsten IterationΔ
, aber anscheinend löscht er den Stapel mit Ausnahme des letzten Wert und wird[10]
in 0 am Ende resultierenden .. Nicht sicher , ob dieses Verhalten oder einen Bug soll .. (EDIT: Es ist vorgesehen, siehe unten.)Erläuterung:
Verwendet auch wobei wie die meisten anderen Antworten die Breite in einer Schleife ist.ww2+4w w
EDIT: Anscheinend ist das oben beschriebene Verhalten
Δ
beabsichtigt. Hier zwei 17-Byte-Alternativen von @ Mr.Xcoder , die verwendetΔ
werden, indem Werte in das global_array eingegeben (mit^
) und anschließend erneut abgerufen werden (mit¯
):Probieren Sie es online aus oder überprüfen Sie alle Testfälle .
Probieren Sie es online aus oder überprüfen Sie alle Testfälle .
quelle
Gleichstrom , 25 Bytes
Probieren Sie es online!
Berechnet die Schilde als
sum(n^2)
(die ursprüngliche Zahl) plus,4*sum(n)
indem Sie eine Kopie jeder quadratischen Seitenlänge nacheinander in das Stapelregister schiebena
und dann alle Werte aus dem Register addieren,a
während die Rekursion "abrollt".quelle
Schale , 17 Bytes
Probieren Sie es online!
Alternative
Probieren Sie es online!
quelle
APL (Dyalog Unicode) ,
3130 BytesProbieren Sie es online!
-1 Byte dank @jslip
quelle
Ruby , 45 Bytes
Probieren Sie es online!
quelle
PHP , 67 Bytes
Um es auszuführen:
Beispiel:
Oder versuchen Sie es online!
Mit der
-R
Option ist diese Version 60 Bytes :Beispiel:
(unter Linux ersetzen
"
durch'
)Hinweis: Dies ist die Antwortformel von Arnauld. Ich konnte nichts Kürzeres finden.
quelle
Pyth , 19 Bytes
Eine rekursive Funktion, die mit aufgerufen werden soll
y
(siehe Link).Probieren Sie es hier aus!
Pyth , 21 Bytes
Das Revisionsprotokoll ist ziemlich lustig, aber besuchen Sie es unbedingt, wenn Sie eine viel schnellere Version wünschen :)
Probieren Sie es hier aus!
Erläuterung
quelle
Swift 4 ,
111 99 8478 BytesProbieren Sie es online!
Dieses Gefühl bei der manuellen Implementierung von Integer-Quadratwurzeln ist weitaus kürzer als die ...
Ungolfed und erklärt
quelle