LoginSignup
3
3

More than 3 years have passed since last update.

"「ループ・再帰・gotoを使わず1から100までの数値を印字する」Conner Davis 氏の回答の考察"のpython版をやってみた

Last updated at Posted at 2019-11-29

いつもの日課でQiitaのトレンドページを見ていたのですが、こんな記事を見かけました!

「ループ・再帰・gotoを使わず1から100までの数値を印字する」Conner Davis 氏の回答の考察
https://qiita.com/xtetsuji/items/19d07c629852876da401

いやいやいや

$$ 1000\div999^{2} $$

$$ = 0.001002003004005...099100 $$

これで1から100までの数値を出せるなんて面白すぎますし、凄過ぎません?

perlとrubyでの再現を記事中ではされているのですが、普段僕の使っているpythonでは再現はされていないようなのでやってみました。

make_num.py
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の数値を表示できるという発想が面白かったです。

参考文献

3
3
8

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3