塩見周子の徒然日記

自分のことを塩見周子と思い込んでいるオタクです

2/13 AtCoder(文字列の置換、スライス、and、or、無限大)/ss

AtCoder
解くに至ったもの(16問)
ABC:039C/041C/043C/045C/048C
ARC:030A/032A/033A/034A/035A/036A/039A/040A/041A/043A/048A

 

ARC039A

文字列(数字)の一部を置換したいとき、例えば

A = 233

で、233を933に変えたいと思ったとき、

A[0] = '9'

はだめらしい('str' object does not support item assignment とエラーが出る。文字列は後から変更不可能とのこと)

書き換えたいときは、関数なりなんなりを用いて新しい文字列としてもう一度得る必要がある

だから、

C = A.replace(A[0],'9')

とすれば、C = 933と得られる。

嘘です ごめんなさい

A = 222だった場合、百の位だけ変えて232にしたいと思っても、

D = A.replace(A[0],'3')とすると、

D = 333となってしまう(A[0]自体は2であり、意味的には文字列中の2を全部3に置き換えることと同じになってしまうため)

これを避けるために、スライス(:)を使って、

D = A[:1] + '3' + A[2:]

とすると、D = 232となってくれる(n文字目を置き換える→A[:n-1]+'n文字目'+A[:n])

 

☆スライス

文字列sのn~n+k-1文字目の文字(つまりk個の文字)を取り出すときは、

t = s[n-1:n+k]

とすればよい。例えば1文字目から10文字取り出したいときは、

t = s[0:10]

とする

 

文字列の特定の場所だけ置換する方法を探してもなかなか見つかんなくて、代わりにreplaceを使うやつがたくさん出てきた 世の中の人は222を232にする必要性がないんだろうね 

 

 

and or

A = 991 ,B = 123に対して、A[1] != 9 and B[1] != 0 は偽である(A[1] == 9であるため)

 

この問題の場合、A[0]==9かつB[0]==1の場合とそれ以外......という風に分けていくと条件分岐が非常にめんどくさくて、上の真偽値も間違えやすい

→結局、A,Bの各桁を変える組合せを6パターン作り、各々を比較していくのが最も楽

 

ABC043C

無限大が欲しいときはfloat('inf')とすればよい               \\チカラガホシイカ......?//

 

解けなかったもの

ABC:044C(3次元配列とか出てきてわけわからんくなった)

ARC:029A/042A