Старые формирования римской армии очень известны во всем мире. В этих формированиях римские легионеры группировались в геометрическую форму (обычно прямоугольник), защищая фланги и превосходящую его часть с помощью своих щитов. Легионеры во внутренних помещениях прикрывали верхнюю часть, размещая свой щит над головами, легионеры по бокам несли 2 или более щитов: один для защиты верхней части и один или несколько щитов для защиты флангов (если кто-то находился в углу у него было 3 щита, если кто-то был один в строю, у него было 5 щитов. Да, я знаю, что человек не может носить 5 щитов, но каким-то образом они это сделали ). Используя это формирование, все римские легионеры защитились и были самым сильным противником в то время.
История рассказывает, что был римский генерал, который утверждал, что лучшей формой формирования был квадрат (такое же количество легионеров в строках и столбцах). Проблема заключалась в том, чтобы выяснить, сколько формирований (и размер) он должен разделить свою армию, чтобы:
- Не оставляйте ни одного легионера за пределами формирования (хотя он допускал единственное легионерное формирование)
- Уменьшите количество необходимых щитов
Генерал, после некоторой математики и вычислений, он понял, что лучший способ выполнить эти 2 условия - начать с максимально возможного квадрата, а затем повторить, пока не останется легионеров .
Пример:
Если 35 легионеров в его армии, формирование состояло в
- Площадь легионеров 5х5 (это самая большая площадь из возможных).
С остальными легионерами (10)
- Квадрат 3х3
С остальными легионерами (1)
- Квадрат 1х1.
В конце это будет выглядеть примерно так:
5x5
* * * * * 3x3
* * * * * * * * 1x1
* * * * * * * * *
* * * * * * * *
* * * * *
Легионеры во внутренних помещениях покрывали верхнюю часть, размещая свой щит над головами . Им нужен был только 1 щит.
* * * * *
* 1 1 1 * * * *
* 1 1 1 * * 1 * *
* 1 1 1 * * * *
* * * * *
Легионеры на флангах несут 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 *
Если кто-то был в углу, у него было 3 щита
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
Если кто-то был один в строю, у него было 5 щитов
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
Для этого формирования потребовалось в общей сложности 71 щит.
Вызов
- Рассчитайте количество щитов, необходимых для X количества легионеров
вход
- Количество легионеров в армии
Выход
- Необходимое количество щитов.
Тестовые случаи
35 => 71
20 => 44
10 => 26
32 => 72
- Применяются стандартные правила игры в гольф
Amazon.com : Best-selling Nipple Shield Carrying Case, Perfect...
таков, я думаю, я никогда не узнаю по-настоящему. На самом ли деле они несли 5 щитов или это заставило вопрос сработать: P?Ответы:
Python 2 ,
605048 байтовПопробуйте онлайн!
Новичок в коде гольф, но я делаю это как можно лучше!
Метод:
Сумма
n^2 + 4n
гдеn
каждое из наибольших квадратных чисел, которые суммируют с вводом.Редактировать 1
Благодаря @Jonathan Frech уменьшено до 50 байт!
Редактировать 2
Переключился
int(s**.5)
наs**.5//1
сохранение 2 байта благодаря @ovsисточник
n*n
короче, чемn**2
сэкономить два байта; более того, я не могу сказать, так как не пишу на Python ...int(s**.5)
можно сократить доs**.5//1
.//
Это разделение пола в обоих Python 2 и 3.3**.5//1
оценивается1.0
в обеих версиях.R ,
5150 байтПопробуйте онлайн!
Доказательство:
источник
JavaScript (ES7), 34 байта
Попробуйте онлайн!
Как?
Формула верна для , так как .w=1 s1=5
источник
Желе , 13 байт
Попробуйте онлайн!
-1 спасибо Джонатану Аллану .
источник
Юлия 0,6 , 36 байт
Попробуйте онлайн!
Используется тот же метод что и в ответе @ Giuseppe's R, хотя мой метод для этого заключался в менее значительном мышлении и больше просто визуальном осмотре: внутренний квадрат 1s имеет размеры по , так что имеет щита. Вокруг этого есть 4 стены по солдата в каждой, каждая с 2 щитами - так что добавляется щита. Наконец, в четырех углах есть четыре тройки, так что добавляется 12 щитов.n2+4n (n−2) (n−2) (n−2)2 n−2 4∗(n−2)∗2
Ungolfed:
(Это также может быть сделано в 35 байтах с
n>0?(s=isqrt(n))*s+4s+f(n-s*s):0
, но я написал это для Julia 0.7, хотел избежать новых предупреждений об устаревании (требующие пробелы?
и:
).)источник
Stax , 15 байт
Запустите и отладьте его
источник
Брахилог , 26 байт
Попробуйте онлайн!
источник
Сетчатка 0.8.2 , 28 байт
Попробуйте онлайн! Ссылка включает в себя тестовые случаи. Объяснение:
Преобразовать в десятичную.
Совпадение нечетных чисел. Первый проход через группу
\1
еще не существует, поэтому\G1
может совпадать только тот , который соответствует 1. Последующие совпадения не могут совпадать,\G1
поскольку совпадают\G
только совпадения в начале матча, поэтому вместо этого мы должны сопоставить значение,11\1
которое на 2 больше, чем предыдущий матч. Мы сопоставляем столько нечетных чисел, сколько можем, и поэтому общее совпадение представляет собой квадратное число, в то время как последний снимок равен одному меньше, чем его сторона.$&
$1
Суммируйте и преобразуйте в десятичную.
источник
05AB1E , 17 байт
Попробуйте онлайн или проверьте все контрольные примеры .
Обходной путь, потому что
ΔDtïÐns4*+Šn-}O
( 15 байт ), похоже, не работает .. Попробуйте онлайн в режиме отладки, чтобы понять, что я имею в виду. Я ожидал бы , чтобы перейти от[45,'35',25]
к[45,10]
после-
и следующей итерацииΔ
, но , видимо , она очищает стек для последнего значения , за исключением , и становится[10]
, в результате 0 в самом конце .. Не уверен , если это предназначено поведение или ошибка .. (РЕДАКТИРОВАТЬ: Это предназначено, см. Внизу.)Объяснение:
РЕДАКТИРОВАТЬ: Очевидно, поведение, для которого я описал выше,
Δ
предназначено. Вот две 17- байтовые альтернативы, предоставленные @ Mr.Xcoder, которые используютΔ
, помещая значения в global_array (с^
) и получая их снова после (с¯
):Попробуйте онлайн или проверьте все контрольные примеры .
Попробуйте онлайн или проверьте все контрольные примеры .
источник
постоянный ток , 25 байтов
Попробуйте онлайн!
Вычисляет щиты как
sum(n^2)
(исходное число) плюс4*sum(n)
, помещая копию каждой длины стороны квадрата в регистр стека,a
а затем добавляя все значения из регистра,a
поскольку рекурсия «разворачивается».источник
Шелуха , 17 байт
Попробуйте онлайн!
альтернатива
Попробуйте онлайн!
источник
APL (Dyalog Unicode) ,
3130 байтПопробуйте онлайн!
-1 байт благодаря @jslip
источник
Рубин , 45 байт
Попробуйте онлайн!
источник
PHP , 67 байт
Чтобы запустить это:
Пример:
Или попробуйте онлайн!
Используя
-R
опцию, эта версия составляет 60 байт :Пример:
(в Linux заменить
"
на'
)Примечание: здесь используется замечательная формула ответа Арно , я не смог найти ничего короче этого.
источник
Pyth , 19 байт
Рекурсивная функция, которую следует вызывать с помощью
y
(см. Ссылку).Попробуй это здесь!
Pyth , 21 байт
История изменений довольно забавная, но обязательно посетите ее, если вы хотите намного более быструю версию :)
Попробуй это здесь!
объяснение
источник
Swift 4 ,
111 99 8478 байтПопробуйте онлайн!
Это чувство при реализации целочисленного квадратного корня вручную намного короче, чем встроенный ...
Неуправляемый и объясненный
источник