Hoje, você precisa resolver um problema muito prático: quantas voltas você precisa para ter um certo número de folhas no rolo de papel higiênico? Vejamos alguns fatos:
- O diâmetro de um cilindro de papel higiênico é de 3,8 cm
- O comprimento de uma folha de papel higiênico é de 10 cm.
- A espessura de uma folha de papel higiênico é de 1 mm.
Antes de envolver o cilindro pela primeira vez, ele possui uma circunferência em cm de 3,8 * pi. Toda vez que você enrola uma folha ao redor do cilindro, seu raio aumenta em .1, portanto, sua circunferência aumenta em .2 * PI. Use essas informações para descobrir quantos loops são necessários para encaixar n folhas de papel higiênico. (Nota: use uma aproximação de Pi que seja pelo menos tão precisa quanto 3,14159).
Casos de teste :
n = 1 :
- 10 / (3,8 * pi) = 0,838 loops
n = 2 :
- (Quantos loops completos podemos fazer?) 1 loop completo = 3,8 * pi = 11,938.
- (Quanto nos resta após o 1º loop?) 20 - 11,938 = 8,062
- (Quanto de um segundo loop faz a peça restante?) 8.062 / (4 * pi) = 0,664 loops
- Resposta: 1.642 loops
n = 3 :
- 1º ciclo completo = 3,8 * pi = 11,938, 2º ciclo completo = 4 * pi = 12,566
- 30 - 11,938 - 12,566 = 5,496
- 5,496 / (4,2 * pi) = 0,417
- Resposta: 2.417 loops
n = 100 => 40.874
nloops = sqrt(n+11.34)*0.0564189 - 0.19
100
->40.874
Respostas:
Pitão,
2723 bytesExperimente online. Suíte de teste.
Explicação
fonte
Haskell,
594644 bytesUm fator de escala de 5 / pi é aplicado, de modo que um cilindro de papel tenha uma circunferência de 19,20,21 ... cm e uma folha seja 50 / pi cm.
Economizou 2 bytes graças ao xnor, usando uma função sem nome.
fonte
(19!).(50/pi*)
.Geléia ,
292726 bytesExperimente online!
fonte
Haskell, 97 bytes
Pode ser capaz de avançar ainda mais, movendo a filtragem do
&
operador para umatakeWhile
declaração, mas, como não é uma linguagem de golfe, isso parece relativamente competitivo.Explicação
O fluxo de pedaços de papel higiênico que compreende loops completos é primeiro calculado como
scanl (+) 0 (map (* pi) [0.38, 0.4 ..]]
. Nós as compactamos com o número de rotações completas, que também escolherão o tipoDouble
implicitamente. Passamos isso para&
o número atual que queremos calcular, chame-op
.&
processa a lista de(Double, Double)
pares à sua direita (a) avançando até quesnd . head . tail
seja maior quep
, nesse pontosnd . head
menor quep
.Para obter a proporção dessa linha que é preenchida, ela calcula
(p - x)/(y - x),
e a adiciona à quantidade geral de loops que foram feitos até agora.fonte
C ++, 72 bytes
Eu usei C ++ aqui porque ele suporta argumentos de função padrão, necessários aqui para inicializar o raio.
A recursão parece produzir um código mais curto do que o uso de um
for
loop. Além disso, emauto
vez defloat
- 1 byte a menos!fonte
d
para or
adius ...Lua, 82 bytes
Nada mal para um idioma de uso geral, mas não muito competitivo em relação aos idiomas dedicados ao golfe, é claro. As constantes são pré-multiplicadas com pi, com a precisão declarada.
fonte
n
, mas o resto teria funcionado como está (como estava?). De qualquer forma, agora é precison
da linha de comando; por exemplo, para 3 folhas, execute-o comolua tp.lua 3
.JavaScript, 77 bytes
Mostrar snippet de código
fonte
w=(s,d=3.8,c=d*3.14159)=>c>s*10?s*10/c:1+w(s-c/10,d+.2)
C, 87 bytes
Usa uma fórmula explícita para o número de loops inteiros:
I substituído
100 / pi
por31.831
, e substituídosfloor
comround
, virando o número irritante-18.5
para um ambiente limpo-19
.O comprimento desses loops é
Depois de subtrair esse comprimento de todo o comprimento, o código divide o restante pela circunferência adequada.
Apenas para deixar claro - esta solução tem complexidade
O(1)
, diferente de muitas (todas?) Outras soluções. Portanto, é um pouco mais longo que um loop ou recursão.fonte
C #, 113 bytes
Ungolfed:
Resultados:
fonte
PHP, 101 bytes
Ungolfed
Sinto que isso poderia ser feito um pouco mais curto, mas fiquei sem ideias.
fonte
Python 3,
11410999 bytesEsta função rastreia a circunferência de cada camada até que a soma das circunferências seja maior que o comprimento do número de folhas. Quando isso acontece, a resposta é:
Atualizar
fonte
JavaScript, 44 bytes
Usei a ideia de anatolyg e traduzi o código para JavaScript.
fonte
> <>,
4644 bytesEspera o número de folhas que estão presentes na pilha no início do programa.
Isso usa uma aproximação de pi de
355/113 = 3.14159292...
, armazenandopi/5
no registro. A circunferência da iteração atual fica na pilha epi/5
é adicionada a cada iteração.Editar: Refatorado para armazenar a circunferência diretamente - a versão anterior armazenava
pi/10
e iniciava o diâmetro como38
, que era 2 bytes mais longo.fonte
PHP, 79 bytes
Executar código no Sandbox
Traduzi apenas a resposta de Ross Bradbury para JavaScript em uma função PHP, que também é recursiva.
fonte