Hoy necesita resolver un problema muy práctico: ¿Cuántos bucles necesita para tener un cierto número de hojas en su rollo de papel higiénico? Veamos algunos hechos:
- El diámetro de un cilindro de papel higiénico desnudo es de 3,8 cm.
- La longitud de una hoja de papel higiénico es de 10 cm.
- El grosor de una hoja de papel higiénico es de 1 mm.
Antes de envolver el cilindro por primera vez, tiene una circunferencia en cm de 3.8 * pi. Cada vez que envuelve una hoja alrededor del cilindro, su radio aumenta en .1, por lo tanto, su circunferencia aumenta en .2 * PI. Use esta información para averiguar cuántos bucles se necesitan para caber n hojas de papel higiénico. (Nota: utilice una aproximación de Pi que sea al menos tan precisa como 3.14159).
Casos de prueba :
n = 1 :
- 10 / (3.8 * pi) = .838 bucles
n = 2 :
- (¿Cuántos bucles completos podemos hacer?) 1 bucle completo = 3.8 * pi = 11.938.
- (¿Cuánto nos queda después del 1er ciclo?) 20 - 11.938 = 8.062
- (¿Cuánto de un segundo bucle hace la pieza restante?) 8.062 / (4 * pi) = .642 bucles
- Respuesta: 1.642 bucles
n = 3 :
- 1.er ciclo completo = 3.8 * pi = 11.938, segundo ciclo completo = 4 * pi = 12.566
- 30 - 11.938 - 12.566 = 5.496
- 5.496 / (4.2 * pi) = .417
- Respuesta: 2.417 bucles
n = 100 => 40.874
nloops = sqrt(n+11.34)*0.0564189 - 0.19
100
->40.874
Respuestas:
Pyth,
2723 bytesPruébalo en línea. Banco de pruebas.
Explicación
fuente
Haskell,
594644 bytesSe aplica un factor de escala de 5 / pi, de modo que un cilindro de papel tiene una circunferencia de 19,20,21 ... cm y una hoja es de 50 / pi cm.
Ahorró 2 bytes gracias a xnor, mediante el uso de una función sin nombre.
fuente
(19!).(50/pi*)
.Jalea ,
292726 bytesPruébalo en línea!
fuente
Haskell, 97 bytes
Es posible que pueda jugar más al golf moviendo el filtro del
&
operador a unatakeWhile
declaración, pero dado que no es un lenguaje de golf, esto parece relativamente competitivo.Explicación
El flujo de longitudes de papel higiénico que comprende bucles completos se calcula primero como
scanl (+) 0 (map (* pi) [0.38, 0.4 ..]]
. Comprimimos estos con el número de revoluciones completas, que también recogerá el tipoDouble
implícitamente. Le pasamos esto al&
número actual que queremos calcular, llámelop
.&
procesa la lista de(Double, Double)
pares a su derecha (a) saltando hacia adelante hasta quesnd . head . tail
sea mayor quep
, en cuyo puntosnd . head
es menor quep
.Para obtener la proporción de esta fila que se llena, luego la calcula
(p - x)/(y - x),
y la agrega a la cantidad total de bucles que se han realizado hasta ahora.fuente
C ++, 72 bytes
Usé C ++ aquí porque admite argumentos de función predeterminados, necesarios aquí para inicializar el radio.
La recursión parece producir un código más corto que el uso de un
for
bucle. Además, enauto
lugar defloat
- ¡1 byte menos!fuente
d
para elr
adio ...Lua, 82 bytes
No está mal para un lenguaje de propósito general, pero no es muy competitivo contra los idiomas de golf dedicados, por supuesto. Las constantes se premultiplican con pi, con la precisión indicada.
fuente
n
, pero el resto se habría ejecutado tal cual (¿tal cual?). En cualquier caso, ahora toman
de la línea de comando; Por ejemplo, para 3 hojas ejecutarlo comolua tp.lua 3
.JavaScript, 77 bytes
Mostrar fragmento de código
fuente
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
Utiliza una fórmula explícita para la cantidad de bucles completos:
Reemplacé
100 / pi
por31.831
, y reemplacéfloor
porround
, convirtiendo el molesto número-18.5
en limpio-19
.La longitud de estos bucles es
Después de restar esta longitud de la longitud total, el código divide el resto por la circunferencia adecuada.
Solo para dejarlo claro: esta solución tiene complejidad
O(1)
, a diferencia de muchas (¿todas?) Otras soluciones. Entonces es un poco más largo que un bucle o una recursión.fuente
C #, 113 bytes
Sin golf:
Resultados:
fuente
PHP, 101 bytes
Sin golf
Siento que esto podría hacerse un poco más corto, pero se me acabaron las ideas.
fuente
Python 3,
11410999 bytesEsta función rastrea la circunferencia de cada capa hasta que la suma de las circunferencias sea mayor que la longitud del número de hojas. Una vez que esto sucede, la respuesta es:
Actualizar
fuente
JavaScript, 44 bytes
Usé la idea de anatolyg y traduje el código a JavaScript.
fuente
> <>,
4644 bytesEspera el número de hojas que estarán presentes en la pila al inicio del programa.
Esto usa una aproximación de pi de
355/113 = 3.14159292...
, almacenandopi/5
en el registro. La circunferencia de la iteración actual vive en la pila ypi/5
se agrega en cada iteración.Editar: refactorizado para almacenar la circunferencia directamente: la versión anterior se almacenó
pi/10
y comenzó el diámetro como38
, que era 2 bytes más largo.fuente
PHP, 79 bytes
Ejecutar código en Sandbox
Prácticamente solo traduje la respuesta de Ross Bradbury para JavaScript en una función PHP, que también es recursiva.
fuente