名もなき未知

エンジニアリングとか、日常とかそういうのをまとめる場所。アクセス解析のためGAを利用、Googleに情報を送信しています。商品紹介のためAmazonアフィリエイトを利用、Amazonに情報を送信しています。記事に関しては私が書いていない引用文を除いて自由にご利用ください。

yukicoder no.207/208/209/210 に参加しました(解いたのは207, 208のみです)

書こうと思って忘れていました.48位でした.




No.207 世界のなんとか

問題

No.207 世界のなんとか - yukicoder

回答

#27069 No.207 世界のなんとか - yukicoder

(今の中高生は分かるんですかね…)
3の倍数 or 3がつく数の時は出力を行います.
「3で割った時のあまりが0」または「数値を文字列を変換した時に3が含まれている」という条件で簡単に出力可能です.(文字列に変換しなくても10で割り続けて,10の剰余が3であるかどうかチェックすることで確認可能だとは思います,私はループを増やすと疲れるので避けましたけど.)

A, B = map(int, input().split())
for i in range(A, B + 1):
    if i % 3 == 0 or str(i).find("3") != -1:
        print(i)

追記

"3" in str(i)

で良さそうですね…w

NO.208 王将

問題

No.208 王将 - yukicoder

回答

(実際通したコード)

#27259 No.208 王将 - yukicoder

(修正版)

#27633 No.208 王将 - yukicoder

(どうでもいいのですが,問題文を読んだ時にとっさに餃子? と思ってしまいました)


よく読むと,このようなことに気が付きます.

  • 斜めに移動して,その後ひたすら縦(横)で目標とする座標に到達できる(最短)
    • 普通は2通りあるので,もし片方のルート上に歩兵がいれば,もう片方のルートを選択する,このイメージで良い
    • 移動量はmax(x, y)
  • 例外として,x == yの際は斜め移動が1ルートしかない,このルート上に歩兵がいる場合,避けなければならない.
    • つまり,x == y and x2 == y2 and x2 < x のとき,移動量はmax(x, y) + 1

この,歩兵が邪魔なときの移動ですが,例えば,(x, y) = (2, 2), (x2, y2) = (1, 1) を考えた際に,このような動きになります.
□…移動可能マス
G…ゴール(今は(2, 2))
歩…歩兵(今は(1, 1))
王…王将(スタートは(0, 0))

# 0回目(初期状態)
□□G
□歩□
王□□

# 1回目
□□G
□歩□
□王□

# 2回目
□□G
□歩王
□□□

# 3回目
□□王(G)
□歩□
□□□

という形で動きますので,max(2, 2) + 1で,3回… となります.

以上を踏まえまして,修正版のコードはこんなかんじになりました.

x1, y1 = map(int, input().split())
x2, y2 = map(int, input().split())
res = max(x1, y1)

if x1 == y1 and x2 == y2 and x2 < x1:
    res += 1
print(int(res))

ちなみになぜ最初の提出版のコードから修正したかといいますと…
0 <= x,y,x2,y2 <= 10^9 を読み落としていて,負の領域のことまで考えていたからですorz
一応,どの象限であっても目標点が直線上,かつ歩兵が直線上にあり,目標点よりも手前に歩兵があるパターンで考えれば良いのですが^^;
一応貼っておきます,正の数以外のテストが通るかどうかは知りません(試すのめんどくさくなった)

import math

x1, y1 = map(int, input().split())
x2, y2 = map(int, input().split())
diff = math.fabs(x1 - y1)
clac = lambda x, y: min(math.fabs(x), math.fabs(y))
res = diff + clac(x1, y1)

if diff == 0:
    if math.fabs(x2) == math.fabs(y2):
        if 0 < x2 < x1 and 0 < y2 < y1:
            res += 1
        elif 0 < x2 < x1 and y1 < y2 < 0:
            res += 1
        elif x1 < x2 < 0 and 0 < y2 < y1:
            res += 1
        elif x1 < x2 < 0 and y1 < y2 < 0:
            res += 1

print(int(res))


三問目はなんとなーく…? わかったような…?
時間があれば試してみたいとは思いますが…

追記

今気がついたけど,過去に書いたブログ記事が解説としてリンクされてたのです…
もう少し立派に見えるように書きなおしておこう…ww