Skip to content

Latest commit

 

History

History
81 lines (59 loc) · 1.7 KB

File metadata and controls

81 lines (59 loc) · 1.7 KB

解説

長い文字列置換を扱う問題です。

"%%%s%%%%%%%%%%%%ss"%"d"%1%"%"%()%"2"

文字列のプレースホルダによるフォーマットは%演算子でも可です。 s"{1}""{}".format(1)と同じです。

>>> print("%s" % 1)
"1"

%プレースホルダを使う時に文字列としての%%%と表現します。

>>> print("%d%%" % 100)
"100%"

%演算子を複数使って繋げる事が可能です。 プレースホルダのフォーマットは前から処理されます。 以下は%%%s%sに置換され、その後に%s1に置換される例です。

>>> print("%%%s" % "s" % 1)
"1"

tupleやdictで複数のプレースホルダをまとめて扱えます。 空のtupleを渡した場合は何も変換されません。

>>> print("%s%d" % (1,2))
"12"

>>> print("1" % ())
"1"

上記の点を利用して問題を前から実行して見ていきます。 最初の%演算子でいくつかの%%%に、%sdに置換されます。

>>> print("%%%s%%%%%%%%%%%%ss" % "d")
"%d%%%%%%ss"

2つ目の%演算子で先頭に1が入ります。

>>> print("%d%%%%%%ss" % 1)
"1%%%ss"

3つ目の%演算子で%s%に置換されます。

>>> print("1%%%ss" % "%")
"1%%s"

4つ目の%演算子では空のtupleが渡されているので何も置換されません。 よって%%%になるだけです。

>>> print("1%%s" % ())
"1%s"

最後の%演算子では素直に2が入ります。

>>> print("1%s" % 2)
"12"

というわけで、"%%%s%%%%%%%%%%%%ss"%"d"%1%"%"%()%"2"12でした。