世界のナベアツ(古いな)ではない。
いつものようにtwitterで時間を潰していたらこんなtweetを見かけた。
課題: 1~100から3の付く値を求めよ!
— たぁしい@ご当地エンジニア (@tashy51446345) 2020年11月7日
偉いプログラマー: 3で割りきれる値を…😏
ペンギンのプログラマー: 文字列にして'3'が入ってる値を…😁💧
ひねくれ者なので、「文字列で処理しないコード」を書きたくなる。
考え方としてはこうだ。
・f(x)=0(0≦x≦9),1(10≦x≦19),2(20≦x≦29),,,9(90≦x≦99),10(x=100)とする。
・同様にg(x)=x(0≦x≦9),x-10(10≦x≦19),,,x-90(90≦x≦99),x-100(x=100)とする。
・これによって1~100までの整数はa(x)=10f(x)+g(x),(0≦x≦100)として表現できる。
・「3がつく数字」とは10の位が3で割って商が1余り0となる数字、または1の位が3で割って商が1余り0となる数字である。
というわけで、Pythonの勉強も兼ねて以下のようなコードを書いてみた。
#1~100の整数から3がつく数だけを出力する
def f(x):
if 0 <= x <= 9:
return 0
elif 10 <= x <= 19:
return 1
elif 20 <= x <= 29:
return 2
elif 30 <= x <= 39:
return 3
elif 40 <= x <= 49:
return 4
elif 50 <= x <= 59:
return 5
elif 60 <= x <= 69:
return 6
elif 70 <= x <= 79:
return 7
elif 80 <= x <= 89:
return 8
elif 90 <= x <= 99:
return 9
elif x == 100:
return 10
def g(x):
if 0 <= x <= 9:
return x
elif 10 <= x <= 19:
return x-10
elif 20 <= x <= 29:
return x-20
elif 30 <= x <= 39:
return x-30
elif 40 <= x <= 49:
return x-40
elif 50 <= x <= 59:
return x-50
elif 60 <= x <= 69:
return x-60
elif 70 <= x <= 79:
return x-70
elif 80 <= x <= 89:
return x-80
elif 90 <= x <= 99:
return x-90
elif x == 100:
return x-100
for x in range(101):
#第一判定;10の位を3で除した商が1、剰余0の場合のみ出力
if divmod(f(x),3) == (1,0):
print (10*f(x)+g(x))
#第二判定;1の位を3で除した商が1、剰余0の場合のみ出力
elif divmod(g(x),3) == (1,0):
print (10*f(x)+g(x))
はっきりいって無駄なことをしている、とわかってはいるけれど。