Postagem na caixa de areia (excluída)
As antigas formações do exército romano são muito famosas em todo o mundo. Nessas formações, os legionários romanos agrupados em uma forma geométrica (geralmente um retângulo) protegiam os flancos e a parte superior usando seus escudos. Os legionários em posições interiores cobriam a parte superior colocando seu escudo acima de suas cabeças, os legionários nos flancos carregavam 2 ou mais escudos: um para proteger a parte superior e um ou mais escudos para proteger os flancos (se alguém estivesse no canto ele tinha 3 escudos; se alguém estava sozinho em uma formação, ele tinha 5 escudos. Sim, eu sei que é impossível para um humano carregar 5 escudos, mas de alguma forma eles conseguiram ). Usando essa formação, todos os legionários romanos se protegeram e eram o adversário mais difícil da época.
A história conta que havia um general romano que afirmou que a melhor forma de formação era o quadrado (o mesmo número de legionários em linhas e colunas). O problema era descobrir quantas formações (e o tamanho) ele deveria dividir seu exército para:
- Não deixe nenhum legionário fora de uma formação (embora ele tenha admitido uma formação legionária única)
- Reduza a quantidade de escudos necessários
O general, depois de fazer algumas contas e cálculos, descobriu que a melhor maneira de cumprir essas 2 condições é começar com o maior quadrado possível e depois repetir até que não sobrem legionários .
Exemplo:
Se 35 legionários em seu exército, a formação consistia em
- Um quadrado de legionários 5x5 (este é o maior quadrado possível).
Com os legionários restantes (10)
- Um quadrado 3x3
Com os legionários restantes (1)
- Um quadrado 1x1.
No final, será algo parecido com isto:
5x5
* * * * * 3x3
* * * * * * * * 1x1
* * * * * * * * *
* * * * * * * *
* * * * *
Os legionários em posições interiores cobriam a parte superior, colocando o escudo acima da cabeça . Eles só precisavam de 1 escudo.
* * * * *
* 1 1 1 * * * *
* 1 1 1 * * 1 * *
* 1 1 1 * * * *
* * * * *
Os legionários nos flancos levavam 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 *
Se alguém estava no canto, ele tinha 3 escudos
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
Se alguém estava sozinho em uma formação, ele tinha 5 escudos
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
Essa formação exigiu um total de 71 escudos.
Desafio
- Calcular a quantidade de escudos necessários para uma quantidade X de legionários
Entrada
- Quantidade de legionários no exército
Saída
- Quantidade de escudos necessários.
Casos de teste
35 => 71
20 => 44
10 => 26
32 => 72
- Aplicam-se regras de código-golfe padrão
Amazon.com : Best-selling Nipple Shield Carrying Case, Perfect...
então acho que nunca vou realmente saber. Eles realmente carregavam 5 escudos-- ou era para fazer a pergunta funcionar: P?Respostas:
Python 2 ,
605048 bytesExperimente online!
Novo no código de golfe, mas dando o meu melhor balanço!
Método:
Soma
n^2 + 4n
onden
está cada um dos maiores números quadrados que somam à entrada.Editar 1
Reduzido para 50 bytes graças a @Jonathan Frech!
Editar 2
Comutado
int(s**.5)
paras**.5//1
salvar 2 bytes graças a @ovsfonte
n*n
é mais curto don**2
que economizar dois bytes; mais do que isso não posso dizer desde que eu fazer python não escrevo ...int(s**.5)
pode ser reduzido paras**.5//1
.//
é a divisão de piso no Python 2 e 3. é3**.5//1
avaliada1.0
nas duas versões.R ,
5150 bytesExperimente online!
Prova:
fonte
JavaScript (ES7), 34 bytes
Experimente online!
Quão?
fonte
Gelatina , 13 bytes
Experimente online!
-1 graças a Jonathan Allan .
fonte
Julia 0.6 , 36 bytes
Experimente online!
Ungolfed:
(Isso também pode ser feito em 35 bytes
n>0?(s=isqrt(n))*s+4s+f(n-s*s):0
, mas eu escrevi isso para Julia 0.7 queria evitar os novos avisos de descontinuação (os espaços exigidos são?
e:
).)fonte
Stax , 15 bytes
Execute e depure
fonte
Braquilog , 26 bytes
Experimente online!
fonte
Retina 0.8.2 , 28 bytes
Experimente online! O link inclui casos de teste. Explicação:
Converta para decimal.
Combine números ímpares. A primeira passagem pelo grupo
\1
ainda não existe, portanto, somente\G1
pode corresponder, que corresponde a 1. Correspondências subsequentes não podem corresponder,\G1
pois\G
apenas correspondências no início da partida, portanto, temos que corresponder a11\1
2 mais do que a partida anterior. Combinamos o maior número possível de números ímpares e, portanto, a correspondência total é um número quadrado, enquanto a última captura é uma menos que o dobro do seu lado.$&
$1
Soma e converta para decimal.
fonte
05AB1E , 17 bytes
Experimente online ou verifique todos os casos de teste .
Solução alternativa porque
ΔDtïÐns4*+Šn-}O
( 15 bytes ) parece não funcionar .. Experimente online no modo de depuração para entender o que quero dizer. Eu esperaria que ele vá partir[45,'35',25]
para[45,10]
depois do-
e próxima iteraçãoΔ
, mas aparentemente ele limpa a pilha, exceto para o último valor e torna-se[10]
, resultando em 0 no final .. Não tenho certeza se este é o comportamento desejado ou um bug .. (EDIT: Pretende-se, veja abaixo.)Explicação:
Edição: Aparentemente, o comportamento que eu descrevi acima
Δ
é destinado. Aqui estão duas alternativas de 17 bytes fornecidas pelo @ Mr.Xcoder que são usadasΔ
colocando valores no global_array (with^
) e recuperando-os novamente depois (com¯
):Experimente online ou verifique todos os casos de teste .
Experimente online ou verifique todos os casos de teste .
fonte
dc , 25 bytes
Experimente online!
Calcula os escudos como
sum(n^2)
(o número original) mais4*sum(n)
empurrando uma cópia do comprimento de cada lado quadrado para o registrador da pilhaa
, e adicionando todos os valores do registrador àa
medida que a recursão "desenrola".fonte
Casca , 17 bytes
Experimente online!
Alternativo
Experimente online!
fonte
APL (Dyalog Unicode) ,
3130 bytesExperimente online!
-1 byte graças a @jslip
fonte
Ruby , 45 bytes
Experimente online!
fonte
PHP , 67 bytes
Para executá-lo:
Exemplo:
Ou Experimente online!
Usando a
-R
opção, esta versão tem 60 bytes :Exemplo:
(no Linux, substitua
"
por'
)Nota: Isso está usando a ótima fórmula da resposta de Arnauld , não consegui encontrar nada mais curto que isso.
fonte
Pyth , 19 bytes
Uma função recursiva, que deve ser chamada usando
y
(consulte o link).Experimente aqui!
Pyth , 21 bytes
O histórico de revisões é bastante engraçado, mas não deixe de visitá-lo se quiser uma versão muito mais rápida :)
Experimente aqui!
Explicação
fonte
Swift 4 ,
111 99 8478 bytesExperimente online!
Essa sensação ao implementar a raiz quadrada inteira manualmente é muito mais curta que a embutida ...
Ungolfed e Explained
fonte