結局1問もACできずに終わってしまった。無念。

AtCoder Regular Contest 142 - AtCoder
AtCoder is a programming contest site for anyone from beginners to experts. We hold weekly programming contests online.

A問題

A - Reverse and Minimize

try

コンテスト中に書いたコードが以下。

def Amain(N, K): K_inv = int(str(K)[::-1]) if ( K % 10 == 0 or K < 0 or K > K_inv ): return 0 i = 0 cnt = 0 while True: x = K * 10 ** i y = K_inv * 10 ** i if x <= N: cnt += 1 if y <= N: cnt += 1 if x > N and y > N: break i += 1 return cnt

テストデータ・テスト関数定義

# 縮小表示 test_data = [ { "in":[1420, 142], "out": 3 },{ "in":[1419, 142], "out": 2 },{ "in":[6, 19], "out": 0 } ] def test_all(f): for i, data in enumerate(test_data): exp = data["out"] ans = f(*data["in"]) result = "AC" if exp == ans else "WA" print(f"{i+1} {result}: expected: {exp}, output: {ans}") test_all(Amain)

サンプルは通るが…

結果

う~む、他にどんな条件が…?
と考えてたが諦めた。

提出 #32598290 - AtCoder Regular Contest 142

解説

解説 - AtCoder Regular Contest 142

K を反転した整数が K と一致する場合に重複して数えないように気を付けてください。

まんまこれや!!!

という訳で以下修正。

def Amain2(N, K): K_inv = int(str(K)[::-1]) if ( K % 10 == 0 or K < 0 or K > K_inv ): return 0 i = 0 cnt = 0 while True: x = K * 10 ** i y = K_inv * 10 ** i if x <= N: cnt += 1 if y <= N and x != y: cnt += 1 if x > N and y > N: break i += 1 return cnt

diff ↓

# 縮小表示 from difflib import HtmlDiff as diff s1 = ''' def Amain(N, K): K_inv = int(str(K)[::-1]) if ( K % 10 == 0 or K < 0 or K > K_inv ): return 0 i = 0 cnt = 0 while True: x = K * 10 ** i y = K_inv * 10 ** i if x <= N: cnt += 1 if y <= N: cnt += 1 if x > N and y > N: break i += 1 return cnt '''.splitlines() s2 = ''' def Amain2(N, K): K_inv = int(str(K)[::-1]) if ( K % 10 == 0 or K < 0 or K > K_inv ): return 0 i = 0 cnt = 0 while True: x = K * 10 ** i y = K_inv * 10 ** i if x <= N: cnt += 1 if y <= N and x != y: cnt += 1 if x > N and y > N: break i += 1 return cnt '''.splitlines() diff().make_file(s1, s2)

無事AC。
提出 #32612282 - AtCoder Regular Contest 142

B問題

B - Unbalanced Squares

try

B問題については、コンテスト終了の4分後に自力ACできたのだ。提出 #32609717 - AtCoder Regular Contest 142

以下はその提出を1行だけ減らしたコード(提出 #32612447 - AtCoder Regular Contest 142)

import numpy as np def Bmain(N): m = np.arange(1, N*N+1).reshape(N, N) n2 = N // 2 * 2 tmp = m[:, :n2][:, ::2].copy() m[:, :n2][:, ::2] = m[:, :n2][:, 1::2] m[:, :n2][:, 1::2] = tmp return m

$a = b$の個数チェック関数定義

# 縮小表示 from itertools import product def check(M): print(M) n = len(M) cnt = 0 for i in range(1, n-1): for j in range(1, n-1): pos, neg = (0, 0) for x, y in product((-1, 0, 1), repeat=2): d = M[i+x][j+y] - M[i][j] if d > 0: pos += 1 elif d < 0: neg += 1 if pos == neg: cnt += 1 print(i, j) return cnt check(Bmain(3)) check(Bmain(4)) check(Bmain(5))

まとめ

  • A問題で『反転して同じ数になる場合』、序盤では考えてたはずなのにいつのまにか頭から消えてた
    • メモ取る。大事。
  • B問題はまさか自力でAC出るとは思わずダラダラしてたらコンテスト終了しちゃった
    • 試行錯誤の末、できてしまうこともある。最後まで粘れ!

なんか、すごい基本的な反省点だな…
こういう競技というかテストというか試験みたいなのから長らく離れてたのですっかりたるんでるが、シャキっとしよう。シャキっと。

自由欄