いつもの日課でQiitaのトレンドページを見ていたのですが、こんな記事を見かけました!
「ループ・再帰・gotoを使わず1から100までの数値を印字する」Conner Davis 氏の回答の考察
https://qiita.com/xtetsuji/items/19d07c629852876da401
いやいやいや
$$ 1000\div999^{2} $$
$$ = 0.001002003004005...099100 $$
これで1から100までの数値を出せるなんて面白すぎますし、凄過ぎません?
perlとrubyでの再現を記事中ではされているのですが、普段僕の使っているpythonでは再現はされていないようなのでやってみました。
from decimal import *
import re
getcontext().prec = 298
data = Decimal(1000) / Decimal(999**2) #計算部分
data = (str(data).split(".")[1])
print(re.findall(r'...', data)) #分割+出力部分
@shiracamus様 @LouiS0616様 お二人のご指摘により計算部分と分割部分を変更しました。
↓変更前
data = Decimal("1000")/Decimal(str(999**2))
print(re.split('(...)',data)[1::2])
pythonの通常の割り算では結果がfloatになってしまい、300桁まで出力することができません。
そのため、decimalライブラリを使うことで指定桁数まで出力するようにしています。
また、計算結果は0.001002003....といったようにくっついているので、分けるために正規表現を使っています。
出力は次のようになりました。
$ python make_num.py
['001', '002', '003', '004', '005', '006', '007', '008', '009', '010',
'011', '012', '013', '014', '015', '016', '017', '018', '019', '020',
'021', '022', '023', '024', '025', '026', '027', '028', '029', '030',
'031', '032', '033', '034', '035', '036', '037', '038', '039', '040',
'041', '042', '043', '044', '045', '046', '047', '048', '049', '050',
'051', '052', '053', '054', '055', '056', '057', '058', '059', '060',
'061', '062', '063', '064', '065', '066', '067', '068', '069', '070',
'071', '072', '073', '074', '075', '076', '077', '078', '079', '080',
'081', '082', '083', '084', '085', '086', '087', '088', '089', '090',
'091', '092', '093', '094', '095', '096', '097', '098', '099', '100']
今後使うところは予測がつきませんが、for文を使わずに1~100の数値を表示できるという発想が面白かったです。
参考文献