Stare formacje armii rzymskiej są bardzo znane na całym świecie. W tych formacjach rzymscy legioniści zgrupowani w geometryczny kształt (zwykle prostokąt) chronią boki i ich większą część za pomocą swoich tarcz. Legioniści w pozycjach wewnętrznych zakrywali górną część, umieszczając tarczę nad głowami, legioniści na bokach nosili 2 lub więcej tarcz: jedną do ochrony części nadrzędnej i jedną lub więcej tarcz do ochrony boków (jeśli ktoś był w kącie miał 3 tarcze, jeśli ktoś był sam w formacji, miał 5 tarcz Tak, wiem, że człowiek nie może nosić 5 tarcz, ale jakoś to zrobił ). Korzystając z tej formacji, wszyscy rzymscy legioniści bronili się i byli wówczas najtrudniejszym przeciwnikiem.
Historia mówi, że był rzymski generał, który stwierdził, że najlepszym kształtem formacji był kwadrat (ta sama liczba legionistów w rzędach i kolumnach). Problem polegał na ustaleniu, ile formacji (i ich rozmiar) powinien podzielić swoją armię, aby:
- Nie pozostawiaj żadnego legionisty poza formacją (chociaż przyznał się do jednej formacji legionowej)
- Zmniejsz liczbę wymaganych osłon
Generał, po wykonaniu pewnych obliczeń matematycznych i obliczeń, doszedł do wniosku, że najlepszym sposobem na spełnienie tych 2 warunków jest rozpoczęcie od największego możliwego kwadratu, a następnie powtarzanie, dopóki legioniści nie opuścili .
Przykład:
Jeśli 35 legionistów w jego armii składało się z formacji
- Kwadrat legionistów 5 x 5 (jest to największy możliwy kwadrat).
Z pozostałymi legionistami (10)
- Kwadrat 3 x 3
Z pozostałymi legionistami (1)
- Kwadrat 1x1.
Na koniec będzie wyglądać mniej więcej tak:
5x5
* * * * * 3x3
* * * * * * * * 1x1
* * * * * * * * *
* * * * * * * *
* * * * *
Legioniści w pozycjach wewnętrznych zakrywali górną część, umieszczając tarczę nad głowami . Potrzebowali tylko 1 tarczy.
* * * * *
* 1 1 1 * * * *
* 1 1 1 * * 1 * *
* 1 1 1 * * * *
* * * * *
Legioniści na flankach nosili 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 *
Jeśli ktoś był w kącie, miał 3 tarcze
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
Jeśli ktoś był sam w formacji, miał 5 tarcz
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
Ta formacja wymagała łącznie 71 tarcz.
Wyzwanie
- Oblicz liczbę tarcz potrzebnych dla X legionistów
Wkład
- Liczba legionistów w armii
Wydajność
- Potrzebna ilość osłon.
Przypadki testowe
35 => 71
20 => 44
10 => 26
32 => 72
- Obowiązują standardowe zasady gry w golfa
Amazon.com : Best-selling Nipple Shield Carrying Case, Perfect...
taki, więc chyba nigdy się nie dowiem. Czy faktycznie nosili 5 tarcz - czy to miało sprawić, że pytanie zadziała: P?Odpowiedzi:
Python 2 ,
605048 bajtówWypróbuj online!
Nowy w golfie kodowym, ale daje z siebie wszystko!
Metoda:
Suma,
n^2 + 4n
gdzien
jest każdą z największych liczb kwadratowych, które sumują się do danych wejściowych.Edytuj 1
Zmniejszony do 50 bajtów dzięki @Jonathan Frech!
Edytuj 2
Przełączono
int(s**.5)
na,s**.5//1
aby zapisać 2 bajty dzięki @ovsźródło
n*n
jest krótszy niżn**2
zaoszczędzić dwa bajty; co więcej, nie mogę powiedzieć, skoro nie piszę pytona ...int(s**.5)
można skrócić dos**.5//1
.//
jest podział podłogi w obu Python 2 i 3.3**.5//1
ewaluuje1.0
w obu wersjach.R ,
5150 bajtówWypróbuj online!
Kwadrat o długości boku musi mieć dokładnie tarczę . Zmniejszamy o największy kwadrat mniejszy lub równy aż wyniesie zero, kumulując liczbę tarcz wraz z upływem czasu.y y2+4y x x
Dowód:
Biorąc pod uwagę idealny kwadrat o długości boku , potrzebujemy dokładnie 1 tarczy dla każdego członka kwadratu. Następnie dla każdego członka na krawędzi potrzebujemy dodatkowej tarczy. Istnieje użytkowników nie na brzegach, tak, że są użytkowników na krawędziach. Wreszcie dla każdego rogu potrzebujemy dodatkowej tarczy. Oprócz przypadku, gdy , możemy w ten sposób dodać 4. Upraszcza to co na szczęście daje również prawidłową wartość gdy , co pozwala nam używać go przez cały .y (y−2)2 y2−(y−2)2 y=1 y2+4y 5 y=1 y
źródło
JavaScript (ES7), 34 bajty
Wypróbuj online!
W jaki sposób?
Na przykład dla :w=3
Formuła obowiązuje dla , ponieważ .s 1 = 5w=1 s1=5
źródło
Galaretka , 13 bajtów
Wypróbuj online!
-1 dzięki Jonathan Allan .
źródło
Julia 0.6 , 36 bajtów
Wypróbuj online!
Używa tej samej metody , co odpowiedź R @ Giuseppe, chociaż moja metoda dotarcia tam wymagała mniej znaczącego myślenia i bardziej tylko kontroli wzrokowej: wewnętrzny kwadrat 1s ma wymiary o , więc ma tarcze. Wokół tego znajdują się 4 ściany żołnierzy każda, każda z 2 tarczami - co dodaje tarcze. Wreszcie, są cztery 3 w czterech rogach, więc dodaje 12 tarcz.n2+4n (n−2) (n−2) (n−2)2 n−2 4∗(n−2)∗2
Nie golfowany:
(Można to również zrobić w 35 bajtach
n>0?(s=isqrt(n))*s+4s+f(n-s*s):0
, ale napisałem to dla Julii 0.7 chciałem uniknąć nowych ostrzeżeń o wycofaniu (wymagające spacji są?
i:
).)źródło
Stax , 15 bajtów
Uruchom i debuguj
źródło
Brachylog , 26 bajtów
Wypróbuj online!
źródło
Retina 0.8.2 , 28 bajtów
Wypróbuj online! Link zawiera przypadki testowe. Wyjaśnienie:
Konwertuj na dziesiętny.
Dopasuj liczby nieparzyste. Pierwsze przejście przez grupę
\1
jeszcze nie istnieje, więc\G1
można dopasować tylko , które pasują 1. Kolejne mecze nie mogą się zgadzać,\G1
ponieważ\G
tylko dopasowania na początku meczu, więc zamiast tego musimy dopasować,11\1
który jest o 2 większy niż poprzedni mecz. Dopasowujemy jak najwięcej liczb nieparzystych, jak to możliwe, a zatem całkowite dopasowanie jest liczbą kwadratową, podczas gdy ostatni chwyt jest o jeden mniej niż dwa razy większy od jego boku.Dodaj boczne osłony do każdego meczu.n2 2n−1 n2+4n=n2+2+2(2n−1)
$&
jest i wynosi podczas gdy potrzebujemy . 2 n - 1 n 2 + 4 n = n 2 + 2 + 2 ( 2 n - 1 )$1
Suma i przeliczenie na dziesiętne.
źródło
05AB1E , 17 bajtów
Wypróbuj online lub sprawdź wszystkie przypadki testowe .
Obejście, ponieważ
ΔDtïÐns4*+Šn-}O
( 15 bajtów ) wydaje się nie działać. Wypróbuj online w trybie debugowania, aby zobaczyć, co mam na myśli. Spodziewam się, że aby przejść od[45,'35',25]
do[45,10]
po-
i następnej iteracjiΔ
, ale najwyraźniej to czyści stos z wyjątkiem ostatniej wartości i staje się[10]
, w wyniku czego 0 na samym końcu .. Nie wiem, czy to ma zachowanie lub błąd .. (EDYCJA: Jest zamierzone, patrz na dole).Wyjaśnienie:
Używa również gdzie jest szerokością w pętli, jak większość innych odpowiedzi.ww2+4w w
EDYCJA: Najwyraźniej zachowanie, które opisałem powyżej,
Δ
jest zamierzone. Oto dwie 17-bajtowe alternatywy dostarczone przez @ Mr.Xcoder , które wykorzystująΔ
umieszczając wartości w tablicy global_array (with^
) i odzyskując je później (with¯
):Wypróbuj online lub sprawdź wszystkie przypadki testowe .
Wypróbuj online lub sprawdź wszystkie przypadki testowe .
źródło
dc , 25 bajtów
Wypróbuj online!
Oblicza tarcze jako
sum(n^2)
(oryginalny numer) plus4*sum(n)
, wciskając kopię każdej kwadratowej długości boku do rejestru stosua
, a następnie dodając wszystkie wartości z rejestru,a
gdy rekurencja „rozwija się”.źródło
Łuska , 17 bajtów
Wypróbuj online!
Alternatywny
Wypróbuj online!
źródło
APL (Dyalog Unicode) ,
3130 bajtówWypróbuj online!
-1 bajt dzięki @jslip
źródło
Rubinowy , 45 bajtów
Wypróbuj online!
źródło
PHP , 67 bajtów
Aby uruchomić:
Przykład:
Lub wypróbuj online!
Za pomocą
-R
opcji ta wersja ma 60 bajtów :Przykład:
(w systemie Linux, należy wymienić
"
z'
)Uwaga: Korzystam z doskonałej formuły odpowiedzi Arnaulda , nie byłem w stanie znaleźć niczego krótszego.
źródło
Pyth , 19 bajtów
Funkcja rekurencyjna, którą należy wywołać za pomocą
y
(patrz link).Wypróbuj tutaj!
Pyth , 21 bajtów
Historia zmian jest dość zabawna, ale koniecznie odwiedź ją, jeśli chcesz znacznie szybszej wersji :)
Wypróbuj tutaj!
Wyjaśnienie
źródło
Swift 4 ,
111 99 8478 bajtówWypróbuj online!
To uczucie przy ręcznym wdrażaniu pierwiastka kwadratowego z liczby całkowitej jest znacznie krótsze niż wbudowane ...
Nieoznakowany i wyjaśniony
źródło