Dziś musisz rozwiązać bardzo praktyczny problem: ile pętli potrzebujesz, aby mieć określoną liczbę arkuszy na rolce papieru toaletowego? Spójrzmy na kilka faktów:
- Średnica gołego cylindra z papieru toaletowego wynosi 3,8 cm
- Długość jednego arkusza papieru toaletowego wynosi 10 cm.
- Grubość jednego arkusza papieru toaletowego wynosi 1 mm.
Przed pierwszym owinięciem cylindra ma on obwód w cm 3,8 * pi. Za każdym razem, gdy owijasz arkusz wokół cylindra, jego promień zwiększa się o .1, a zatem jego obwód wzrasta o .2 * PI. Skorzystaj z tych informacji, aby dowiedzieć się, ile pętli pasuje do n arkuszy papieru toaletowego. (Uwaga: należy użyć przybliżenia Pi, które jest co najmniej tak dokładne jak 3.14159).
Przypadki testowe :
n = 1 :
- 10 / (3,8 * pi) = .838 pętli
n = 2 :
- (Ile pełnych pętli możemy wykonać?) 1 pełna pętla = 3,8 * pi = 11,938.
- (Ile pozostało po pierwszej pętli?) 20 - 11,938 = 8,062
- (Ile drugiej pętli tworzy pozostały element?) 8.062 / (4 * pi) = .642 pętli
- Odpowiedź: 1.642 pętle
n = 3 :
- 1. pełna pętla = 3,8 * pi = 11,938, druga pełna pętla = 4 * pi = 12.566
- 30 - 11,938 - 12,566 = 5,496
- 5,496 / (4,2 * pi) = .417
- Odpowiedź: 2.417 pętli
n = 100 => 40,874
nloops = sqrt(n+11.34)*0.0564189 - 0.19
100
->40.874
Odpowiedzi:
Pyth,
2723 bajtówWypróbuj online. Zestaw testowy.
Wyjaśnienie
źródło
Haskell,
594644 bajtówZastosowano współczynnik skali 5 / pi, tak że walec papierowy ma obwód 19,20,21 ... cm, a arkusz ma 50 / pi cm.
Zaoszczędzono 2 bajty dzięki xnor, używając funkcji bez nazwy.
źródło
(19!).(50/pi*)
.Galaretka ,
292726 bajtówWypróbuj online!
źródło
Haskell, 97 bajtów
Może być w stanie zagrać w golfa dalej, przenosząc filtrowanie od
&
operatora dotakeWhile
się pograć w golfa, oświadczenie, ale biorąc pod uwagę, że nie jest to język golfa, wydaje się to stosunkowo konkurencyjne.Wyjaśnienie
Strumień długości papieru toaletowego zawierającego pełne pętle oblicza się najpierw jako
scanl (+) 0 (map (* pi) [0.38, 0.4 ..]]
. Spakowujemy je liczbą pełnych obrotów, które pośrednio podniosą ten typDouble
. Przekazujemy to&
bieżącemu numerowi, który chcemy obliczyć, nazywamy gop
.&
przetwarza listę(Double, Double)
par po prawej stronie przez (a) przeskakiwanie do przodu, ażsnd . head . tail
będzie większa niżp
, w którym momenciesnd . head
jest mniejsza niżp
.Aby uzyskać część tego wiersza, która jest wypełniona, następnie oblicza
(p - x)/(y - x),
i dodaje ją do ogólnej liczby wykonanych do tej pory pętli.źródło
C ++, 72 bajty
Użyłem tutaj C ++, ponieważ obsługuje domyślne argumenty funkcji, potrzebne tutaj do zainicjowania promienia.
Wydaje się, że rekurencja generuje krótszy kod niż przy użyciu
for
pętli. Ponadtoauto
zamiastfloat
- 1 bajt mniej!źródło
d
dor
adius ...Lua, 82 bajty
Nieźle jak na język ogólnego przeznaczenia, ale oczywiście niezbyt konkurencyjny w stosunku do dedykowanych języków golfowych. Stałe są wstępnie mnożone przez pi z określoną dokładnością.
źródło
n
, ale reszta działałaby w stanie, w jakim się znajduje (jak było?). W każdym razie teraz pobieran
z wiersza poleceń; np. dla 3 arkuszy uruchom jakolua tp.lua 3
.JavaScript, 77 bajtów
Pokaż fragment kodu
źródło
w=(s,d=3.8,c=d*3.14159)=>c>s*10?s*10/c:1+w(s-c/10,d+.2)
C, 87 bajtów
Używa jawnej formuły dla liczby całych pętli:
Wymieniłem
100 / pi
przez31.831
i zastąpionefloor
zround
zwracając liczbę irytujących-18.5
do czysta-19
.Długość tych pętli wynosi
Po odjęciu tej długości od całej długości kod dzieli resztę przez odpowiedni obwód.
Żeby było jasne - to rozwiązanie ma złożoność
O(1)
, w przeciwieństwie do wielu (wszystkich?) Innych rozwiązań. Jest to więc nieco dłużej niż pętla lub rekurencja.źródło
C #, 113 bajtów
Nie golfowany:
Wyniki:
źródło
PHP, 101 bajtów
Bez golfa
Wydaje mi się, że można to zrobić trochę krócej, ale zabrakło mi pomysłów.
źródło
Python 3,
11410999 bajtówTa funkcja śledzi obwód każdej warstwy, dopóki suma obwodów nie będzie większa niż długość liczby arkuszy. Gdy tak się stanie, odpowiedź brzmi:
Aktualizacja
źródło
JavaScript, 44 bajty
Wykorzystałem pomysł anatolyga i przetłumaczyłem kod na JavaScript.
źródło
> <>,
4644 bajtówOczekuje, że liczba arkuszy będzie obecna na stosie podczas uruchamiania programu.
Wykorzystuje to przybliżenie liczby pi
355/113 = 3.14159292...
, zapisywaniepi/5
w rejestrze. Obwód bieżącej iteracji trwa na stosie ipi/5
jest dodawany przy każdej iteracji.Edycja: Przeprojektowano w celu bezpośredniego przechowywania obwodu - poprzednia wersja zapisała
pi/10
i rozpoczęła średnicę jako38
, która była o 2 bajty dłuższa.źródło
PHP, 79 bajtów
Uruchom kod w piaskownicy
Prawie przetłumaczyłem tylko odpowiedź Ross'a Bradbury'a na JavaScript na funkcję PHP, która również jest rekurencyjna.
źródło