Hari ini Anda perlu memecahkan masalah yang sangat praktis: Berapa banyak loop yang Anda butuhkan untuk memiliki sejumlah lembaran pada gulungan kertas toilet Anda? Mari kita lihat beberapa fakta:
- Diameter silinder kertas toilet kosong adalah 3,8 cm
- Panjang satu lembar kertas toilet adalah 10cm.
- Ketebalan satu lembar kertas toilet adalah 1mm.
Sebelum Anda membungkus silinder pertama kali, ia memiliki keliling dalam cm 3,8 * pi. Setiap kali Anda membungkus selembar silinder di sekitar jari-jarinya meningkat sebesar 0,1, oleh karena itu kelilingnya meningkat sebesar 0,2 * PI. Gunakan informasi ini untuk mencari tahu berapa banyak loop yang diperlukan agar sesuai dengan n lembar kertas toilet. (Catatan: Gunakan perkiraan Pi yang setidaknya seakurat 3.14159).
Kasus uji :
n = 1 :
- 10 / (3.8 * pi) = .838 loop
n = 2 :
- (Berapa banyak loop penuh yang bisa kita buat?) 1 loop penuh = 3,8 * pi = 11,938.
- (Berapa banyak yang tersisa setelah loop pertama?) 20 - 11.938 = 8.062
- (Berapa banyak loop ke-2 yang dihasilkan oleh potongan yang tersisa?) 8.062 / (4 * pi) = .642 loop
- Jawaban: 1,642 loop
n = 3 :
- Loop penuh pertama = 3,8 * pi = 11,938, loop penuh kedua = 4 * pi = 12,566
- 30 - 11.938 - 12.566 = 5.496
- 5.496 / (4.2 * pi) = .417
- Jawaban: 2.417 loop
n = 100 => 40.874
nloops = sqrt(n+11.34)*0.0564189 - 0.19
100
->40.874
Jawaban:
Pyth,
2723 byteCobalah online. Suite uji.
Penjelasan
sumber
Haskell,
594644 byteFaktor skala 5 / pi diterapkan, sehingga silinder kertas memiliki keliling 19,20,21 ... cm dan selembar 50 / pi cm.
Disimpan 2 byte berkat xnor, dengan menggunakan fungsi yang tidak disebutkan namanya.
sumber
(19!).(50/pi*)
.Jelly ,
292726 byteCobalah online!
sumber
Haskell, 97 byte
Mungkin bisa golf lebih jauh dengan memindahkan filter dari
&
operator ketakeWhile
pernyataan, tetapi mengingat bahwa itu bukan bahasa golf, ini tampaknya relatif kompetitif.Penjelasan
Aliran panjang kertas toilet yang terdiri dari loop penuh pertama kali dihitung sebagai
scanl (+) 0 (map (* pi) [0.38, 0.4 ..]]
. Kami menutup ini dengan jumlah putaran penuh, yang juga akan mengambil jenisDouble
secara implisit. Kami meneruskan ini&
dengan nomor saat ini yang ingin kami hitung, sebut sajap
.&
memproses daftar(Double, Double)
pasangan di sebelah kanannya dengan (a) melompati ke depan sampaisnd . head . tail
lebih besar darip
, pada titiksnd . head
yang kurang darip
.Untuk mendapatkan proporsi dari baris ini yang diisi, ia kemudian menghitung
(p - x)/(y - x),
dan menambahkannya ke jumlah keseluruhan loop yang telah dibuat sejauh ini.sumber
C ++, 72 byte
Saya menggunakan C ++ di sini karena mendukung argumen fungsi default, diperlukan di sini untuk menginisialisasi jari-jari.
Rekursi tampaknya menghasilkan kode yang lebih pendek daripada menggunakan
for
-loop. Juga,auto
bukannyafloat
- 1 byte lebih sedikit!sumber
d
untukr
adius ...Lua, 82 byte
Tidak buruk untuk bahasa tujuan umum, tetapi tidak terlalu kompetitif terhadap bahasa golf khusus. Konstanta ditakdirkan dengan pi, dengan presisi yang dinyatakan.
sumber
n
, tetapi sisanya akan berjalan apa adanya (seperti apa adanya?). Bagaimanapun, sekarang dibutuhkann
dari baris perintah; misalnya untuk 3 lembar jalankan sebagailua tp.lua 3
.JavaScript, 77 byte
Tampilkan cuplikan kode
sumber
w=(s,d=3.8,c=d*3.14159)=>c>s*10?s*10/c:1+w(s-c/10,d+.2)
C, 87 byte
Menggunakan rumus eksplisit untuk jumlah keseluruhan loop:
Saya digantikan
100 / pi
oleh31.831
, dan digantifloor
denganround
, mengubah nomor yang mengganggu-18.5
menjadi bersih-19
.Panjang loop ini adalah
Setelah mengurangi panjang ini dari panjang keseluruhan, kode membagi sisanya dengan keliling yang tepat.
Hanya untuk memperjelas - solusi ini memiliki kompleksitas
O(1)
, tidak seperti banyak (semua?) Solusi lain. Jadi ini sedikit lebih lama dari satu loop atau rekursi.sumber
C #, 113 byte
Tidak Disatukan:
Hasil:
sumber
PHP, 101 byte
Tidak disatukan
Saya merasa ini bisa dilakukan sedikit lebih pendek, tetapi saya kehabisan ide.
sumber
Python 3,
11410999 byteFungsi ini melacak keliling setiap lapisan sampai jumlah keliling lebih besar dari panjang jumlah lembar. Setelah ini terjadi jawabannya adalah:
Memperbarui
sumber
JavaScript, 44 byte
Saya menggunakan ide anatolyg dan menerjemahkan kodenya ke dalam JavaScript.
sumber
> <>,
4644 byteMengharapkan jumlah lembar yang ada pada tumpukan saat program dimulai.
Ini menggunakan perkiraan pi
355/113 = 3.14159292...
, menyimpanpi/5
dalam register. Lingkaran iterasi saat ini tinggal di stack, danpi/5
ditambahkan pada setiap iterasi.Sunting: Refactored untuk menyimpan keliling secara langsung - versi sebelumnya disimpan
pi/10
dan memulai diameter as38
, yang lebih panjang 2 byte.sumber
PHP, 79 byte
Jalankan kode di Sandbox
Saya cukup banyak hanya menerjemahkan jawaban Ross Bradbury untuk JavaScript ke dalam fungsi PHP, yang juga bersifat rekursif.
sumber