紙を42回折ると月に届くのか Swift + Xcode Playground で調べる

## 紙を42回折ると月に到達するという話がある

オチとしては、「42回も紙を折ることはできない」という話だった気がする。

## 地球から月への距離は

[月 \- Wikipedia](https://ja.wikipedia.org/wiki/%E6%9C%88)

> 地球中心から月の中心までの平均距離は38万4,403km（約1.3光秒）であり、地球の赤道半径の約60.27倍である。

## iOS には Units and Measurement という仕組みがある

単位変換が簡単にできそう。

[Units and Measurement \| Apple Developer Documentation](https://developer.apple.com/documentation/foundation/units_and_measurement)

> Label numeric quantities with physical dimensions to allow locale-aware formatting and conversion between related units.

## 紙を何回折ると月に届くのか調べるプログラムを Swift で書く

紙の厚さを 0.08mm と仮定。

```swift
import UIKit

// 地球と月との距離 38万4403キロメートル
let dist = Measurement(value: 384403, unit: UnitLength.kilometers)

// 紙の厚さは0.08ミリメートル
let paperThickness = Measurement(value: 0.08, unit: UnitLength.millimeters)

// 厚さを基準であるメートルに変換
var thickness = paperThickness.converted(to: UnitLength.meters)

// とりあえず100回ぐらい折ってみようか
for i in 0..<100 {
    
    if thickness.value >= 1000.0 {
        // キロメートルに変換して出力
        print("\(i)回目: \(thickness.converted(to: UnitLength.kilometers))")
    } else if thickness.value >= 1.0 {
        // メートルのまま出力
        print("\(i)回目: \(thickness)")
    } else if thickness.value >= 0.01 {
        // センチメートルに変換して出力
        print("\(i)回目: \(thickness.converted(to: UnitLength.centimeters))")
    } else {
        // ミリメートルに変換して出力
        print("\(i)回目: \(thickness.converted(to: UnitLength.millimeters))")
    }
    
    // 地球と月との距離を超えたら終了
    if thickness >= dist {
        print("\(paperThickness)の厚さの紙を\(i)回折ると月に到達することがわかった。")
        break
    }

    // 厚さを2倍にする
    thickness = thickness * 2
}
```

## 実行結果

0.08 mmの厚さの紙を43回折ると月に到達することがわかった。

<img width="960" alt="xcode-swift-playground.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139365/ffddcecf-a1a9-fc53-eda5-484d4485fea1.png">

```
0回目: 0.08 mm
1回目: 0.16 mm
2回目: 0.32 mm
3回目: 0.64 mm
4回目: 1.28 mm
5回目: 2.56 mm
6回目: 5.12 mm
7回目: 1.024 cm
8回目: 2.048 cm
9回目: 4.096 cm
10回目: 8.192 cm
11回目: 16.384 cm
12回目: 32.768 cm
13回目: 65.536 cm
14回目: 1.31072 m
15回目: 2.62144 m
16回目: 5.24288 m
17回目: 10.48576 m
18回目: 20.97152 m
19回目: 41.94304 m
20回目: 83.88608 m
21回目: 167.77216 m
22回目: 335.54432 m
23回目: 671.08864 m
24回目: 1.34217728 km
25回目: 2.68435456 km
26回目: 5.36870912 km
27回目: 10.73741824 km
28回目: 21.47483648 km
29回目: 42.94967296 km
30回目: 85.89934592 km
31回目: 171.79869184 km
32回目: 343.59738368 km
33回目: 687.19476736 km
34回目: 1374.38953472 km
35回目: 2748.77906944 km
36回目: 5497.55813888 km
37回目: 10995.11627776 km
38回目: 21990.23255552 km
39回目: 43980.46511104 km
40回目: 87960.93022208 km
41回目: 175921.86044416 km
42回目: 351843.72088832 km
43回目: 703687.44177664 km
0.08 mmの厚さの紙を43回折ると月に到達することがわかった。
```

## 今回の動作確認環境

- Xcode 10.3

## 参考資料

- [Units and Measurement \| Apple Developer Documentation](https://developer.apple.com/documentation/foundation/units_and_measurement)
- [Measurement \- Foundation \| Apple Developer Documentation](https://developer.apple.com/documentation/foundation/measurement)
- [UnitLength \- Foundation \| Apple Developer Documentation](https://developer.apple.com/documentation/foundation/unitlength)
- [【Apple発の新ローカライズ方法】iOS10から導入されたMeasurements &amp; Unitsのすべて \#単位 \- Qiita](https://qiita.com/ken0nek/items/0ce6cc31c2e03119dcbe)
- [Measurements and Unitsまとめ \- Qiita](https://qiita.com/nerd0geek1/items/aab9f67bb65c2d2861bc)