Heute müssen Sie ein sehr praktisches Problem lösen: Wie viele Schleifen benötigen Sie, um eine bestimmte Anzahl von Blättern auf Ihrer Toilettenpapierrolle zu haben? Schauen wir uns einige Fakten an:
- Der Durchmesser eines bloßen Toilettenpapierzylinders beträgt 3,8 cm
- Die Länge eines Blattes Toilettenpapier beträgt 10 cm.
- Die Dicke eines Blattes Toilettenpapier beträgt 1 mm.
Bevor Sie den Zylinder zum ersten Mal umwickeln, hat er einen Umfang in cm von 3,8 * pi. Jedes Mal, wenn Sie ein Blatt um den Zylinder wickeln, vergrößert sich sein Radius um 0,1, daher vergrößert sich sein Umfang um 0,2 * PI. Verwenden Sie diese Informationen, um herauszufinden, wie viele Schlaufen für n Blatt Toilettenpapier erforderlich sind. (Hinweis: Verwenden Sie eine Näherung von Pi, die mindestens so genau wie 3.14159 ist.)
Testfälle :
n = 1 :
- 10 / (3,8 * pi) = 0,838 Schleifen
n = 2 :
- (Wie viele Vollschleifen können wir machen?) 1 Vollschleife = 3,8 * pi = 11,938.
- (Wie viel haben wir nach der 1. Runde übrig?) 20 - 11.938 = 8.062
- (Wie viel von einer zweiten Schleife macht das verbleibende Stück?) 8.062 / (4 * pi) = .642 Schleifen
- Antwort: 1.642 Schleifen
n = 3 :
- 1. volle Schleife = 3,8 * pi = 11,938, 2. volle Schleife = 4 * pi = 12,566
- 30 - 11,938 - 12,566 = 5,496
- 5,496 / (4,2 * pi) = 0,417
- Antwort: 2.417 Schleifen
n = 100 => 40,874
nloops = sqrt(n+11.34)*0.0564189 - 0.19
100
->40.874
Antworten:
Pyth,
2723 BytesProbieren Sie es online aus. Testsuite.
Erläuterung
quelle
Haskell,
594644 BytesEin Skalierungsfaktor von 5 / pi wird angewendet, so dass ein Papierzylinder einen Umfang von 19,20,21 ... cm hat und ein Bogen 50 / pi cm ist.
2 Bytes dank xnor mit einer unbenannten Funktion eingespart.
quelle
(19!).(50/pi*)
.Jelly ,
292726 BytesProbieren Sie es online!
quelle
Haskell, 97 Bytes
Könnte es weiter verbessern, indem die Filterung vom
&
Bediener in einetakeWhile
Aussage verschoben wird. Da es sich jedoch nicht um eine Golfsprache handelt, scheint dies relativ wettbewerbsfähig zu sein.Erläuterung
Der Strom von Toilettenpapierlängen, die volle Schleifen umfassen, wird zuerst mit berechnet
scanl (+) 0 (map (* pi) [0.38, 0.4 ..]]
. Wir zippen diese mit der Anzahl der vollen Umdrehungen, wodurch auch der TypDouble
implizit erfasst wird. Wir übergeben dies&
mit der aktuellen Nummer, die wir berechnen möchten, nennen esp
.&
verarbeitet die Liste der(Double, Double)
Paare auf der rechten Seite, indem (a) vorwärts gesprungen wird, bissnd . head . tail
größer ist alsp
, und an diesem Punktsnd . head
kleiner ist alsp
.Um den Anteil dieser Zeile zu ermitteln, der gefüllt ist, wird er berechnet
(p - x)/(y - x),
und zur Gesamtanzahl der bisher durchgeführten Schleifen addiert.quelle
C ++, 72 Bytes
Ich habe hier C ++ verwendet, weil es Standardfunktionsargumente unterstützt, die hier zum Initialisieren des Radius benötigt werden.
Rekursion scheint kürzeren Code zu erzeugen als die Verwendung einer
for
-Loop. Auchauto
anstelle vonfloat
- 1 Byte weniger!quelle
d
für denr
Adius benutzt ...Lua, 82 Bytes
Nicht schlecht für eine Allzwecksprache, aber natürlich nicht sehr konkurrenzfähig gegen engagierte Golfsprachen. Die Konstanten werden mit pi mit der angegebenen Genauigkeit vormultipliziert.
quelle
n
, aber der Rest wäre so gelaufen, wie er ist (wie er war?). In jedem Fall dauert es jetztn
von der Kommandozeile; zB für 3 Blatt laufen sie alslua tp.lua 3
.JavaScript, 77 Byte
Code-Snippet anzeigen
quelle
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
Verwendet eine explizite Formel für die Anzahl der ganzen Schleifen:
Ich habe ersetzt
100 / pi
durch31.831
und ersetztfloor
durchround
, indem ich die nervige Nummer-18.5
in eine saubere verwandelt habe-19
.Die Länge dieser Schleifen beträgt
Nach dem Subtrahieren dieser Länge von der gesamten Länge dividiert der Code den Rest durch den richtigen Umfang.
Nur um es klar zu machen - diese Lösung ist
O(1)
im Gegensatz zu vielen (allen?) Anderen Lösungen komplex. Es ist also etwas länger als eine Schleife oder Rekursion.quelle
C #, 113 Bytes
Ungolfed:
Ergebnisse:
quelle
PHP, 101 Bytes
Ungolfed
Ich glaube, das könnte etwas kürzer sein, aber mir gingen die Ideen aus.
quelle
Python 3,
11410999 BytesDiese Funktion verfolgt den Umfang jeder Schicht, bis die Summe der Umfänge größer ist als die Länge der Anzahl der Blätter. Sobald dies geschieht, lautet die Antwort:
Aktualisieren
quelle
JavaScript, 44 Bytes
Ich habe Anatolygs Idee verwendet und den Code in JavaScript übersetzt.
quelle
> <>,
4644 BytesErwartet, dass die Anzahl der Blätter beim Programmstart auf dem Stapel vorhanden ist.
Dies verwendet eine Näherung von pi von
355/113 = 3.14159292...
, diepi/5
in dem Register gespeichert ist. Der Umfang der aktuellen Iteration befindet sich auf dem Stapel undpi/5
wird bei jeder Iteration hinzugefügt.Bearbeiten: Umgestaltet, um den Umfang direkt zu speichern - Vorgängerversion gespeichert
pi/10
und Durchmesser als gestartet38
, der 2 Bytes länger war.quelle
PHP, 79 Bytes
Führen Sie Code in Sandbox aus
Ich habe so ziemlich nur Ross Bradburys Antwort für JavaScript in eine PHP-Funktion übersetzt, die auch rekursiv ist.
quelle