Aujourd'hui, vous devez résoudre un problème très pratique: combien de boucles avez-vous besoin d'un certain nombre de feuilles sur votre rouleau de papier toilette? Regardons quelques faits:
- Le diamètre d'un cylindre de papier toilette nu est de 3,8 cm
- La longueur d'une feuille de papier toilette est de 10 cm.
- L'épaisseur d'une feuille de papier toilette est de 1 mm.
Avant d’enrouler le cylindre pour la première fois, sa circonférence en cm est de 3,8 * pi. Chaque fois que vous enroulez une feuille autour du cylindre, son rayon augmente de 0,1; sa circonférence augmente donc de 0,2 * PI. Utilisez ces informations pour déterminer le nombre de boucles nécessaires pour insérer n feuilles de papier toilette. (Remarque: utilisez une approximation de Pi au moins aussi précise que 3.14159).
Cas de test :
n = 1 :
- 10 / (3,8 * pi) = 0,838 boucle
n = 2 :
- (Combien de boucles complètes pouvons-nous créer?) 1 boucle complète = 3,8 * pi = 11,938.
- (Combien nous reste-t-il après la 1ère boucle?) 20 - 11,938 = 8,062
- (Combien d'une 2ème boucle la pièce restante fait-elle?) 8.062 / (4 * pi) = .642 boucles
- Réponse: 1.642 boucles
n = 3 :
- 1ère boucle complète = 3,8 * pi = 11,938, 2ème boucle complète = 4 * pi = 12,566
- 30 - 11,938 - 12,566 = 5,496
- 5,496 / (4,2 * pi) = 0,417
- Réponse: 2.417 boucles
n = 100 => 40,874
nloops = sqrt(n+11.34)*0.0564189 - 0.19
100
->40.874
Réponses:
Pyth,
2723 octetsEssayez-le en ligne. Suite de tests.
Explication
la source
Haskell,
594644 octetsUn facteur d'échelle de 5 / pi est appliqué, de sorte qu'un cylindre de papier ait une circonférence de 19,20,21 ... cm et une feuille de 50 / pi cm.
Sauvegardé 2 octets grâce à xnor, en utilisant une fonction sans nom.
la source
(19!).(50/pi*)
.Jelly ,
292726 bytesEssayez-le en ligne!
la source
Haskell, 97 octets
Peut-être serait-il en mesure de jouer plus loin en déplaçant le filtrage de l'
&
opérateur dans unetakeWhile
déclaration, mais étant donné que ce n'est pas une langue de golf, cela semble relativement compétitif.Explication
Le flux de longueurs de papier hygiénique comprenant des boucles complètes est d'abord calculé comme suit
scanl (+) 0 (map (* pi) [0.38, 0.4 ..]]
. Nous les compressons avec le nombre de révolutions complètes, ce qui ramèneraDouble
implicitement le type . Nous passons cela à&
avec le nombre actuel que nous voulons calculer, appelez-lep
.&
traite la liste des(Double, Double)
paires à sa droite en (a) sautant vers l’avant jusqu’à ce qu’ellesnd . head . tail
soit supérieure àp
, à quel pointsnd . head
est inférieur àp
.Pour obtenir la proportion de cette ligne qui est remplie, il calcule
(p - x)/(y - x),
et l'ajoute au nombre total de boucles effectuées jusqu'à présent.la source
C ++, 72 octets
J'ai utilisé C ++ ici car il supporte les arguments de fonction par défaut, nécessaires ici pour initialiser le rayon.
La récursivité semble produire un code plus court que l’utilisation d’une
for
boucle. En outre,auto
au lieu defloat
- 1 octet de moins!la source
d
pour l'r
adius ...Lua, 82 octets
Pas mal pour une langue d'usage général, mais pas très compétitif par rapport aux langues de golf dédiées bien sûr. Les constantes sont prémultipliées avec pi, à la précision indiquée.
la source
n
, mais le reste aurait fonctionné tel quel (tel quel). Dans tous les cas, cela prend maintenant àn
partir de la ligne de commande; par exemple, pour 3 feuilles, exécutez-le commelua tp.lua 3
.JavaScript, 77 octets
Afficher l'extrait de code
la source
w=(s,d=3.8,c=d*3.14159)=>c>s*10?s*10/c:1+w(s-c/10,d+.2)
C, 87 octets
Utilise une formule explicite pour le nombre de boucles entières:
J'ai remplacé
100 / pi
par31.831
, et remplacéfloor
parround
, en tournant le nombre ennuyeux-18.5
à un clean-19
.La longueur de ces boucles est
Après avoir soustrait cette longueur de toute la longueur, le code divise le reste par la circonférence appropriée.
Soyons clairs: cette solution est complexe
O(1)
, contrairement à beaucoup d’autres solutions. C'est donc un peu plus long qu'une boucle ou une récursivité.la source
C #, 113 octets
Ungolfed:
Résultats:
la source
PHP, 101 octets
Ungolfed
Je pense que cela pourrait être fait un peu plus court, mais je suis à court d’idées.
la source
Python 3,
11410999 octetsCette fonction suit la circonférence de chaque couche jusqu'à ce que la somme des circonférences soit supérieure à la longueur du nombre de feuilles. Une fois que cela se produit, la réponse est:
Mise à jour
la source
JavaScript, 44 octets
J'ai utilisé l'idée d'Anatolyg et traduit le code en JavaScript.
la source
> <>,
4644 octetsAttend que le nombre de feuilles soit présent sur la pile au début du programme.
Ceci utilise une approximation de pi de
355/113 = 3.14159292...
, stockantpi/5
dans le registre. La circonférence de l'itération actuelle réside sur la pile etpi/5
est ajoutée à chaque itération.Éditer: Refactorisé pour stocker directement la circonférence - la version précédente était stockée
pi/10
et le diamètre commençait tel38
quel, ce qui était plus long de 2 octets.la source
PHP, 79 octets
Exécuter le code dans le bac à sable
J'ai à peu près uniquement traduit la réponse de Ross Bradbury pour JavaScript dans une fonction PHP, qui est également récursive.
la source