名もなき未知

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

yukicoder open 2015 small に参加しました

3問目は撃墜されました.弱いコードでした.66位でした.

1問目 No.191 供託金

問題

No.191 供託金 - yukicoder

回答

#22427 No.191 供託金 - yukicoder

ぼく「平均より小さければ30万」
ち が い ま す

読み間違えていました.1 / 10 以下ならでしたね.
こんなんで何度も出し直してたら時間がもったいないです.ダメダメ.
そこ直したらAC.

読み込んだものをリストにして,for文で回してチェック,これだけでOKではないでしょうか.

N = int(input())
moneys = list(map(int, input().split()))
th = sum(moneys) / 10
res = 0
for i in range(N):
    res += 30 if th >= moneys[i] else 0
print(res)
2問目 No.192 合成数

問題

No.192 合成数 - yukicoder

回答

#22455 No.192 合成数 - yukicoder

解説聞いてましたけど,これ偶数だったらそのまま出力,そうでなければ1足して出力でいいみたいですね.
ぼくはアホなので,てきとうに5の倍数に揃えました.(5の倍数が揃えやすいと思ったからですね.2の倍数でよかったわけですが)
それと問題文の理解に非常に時間がかかりました.はい.

print(int(input()) // 5 * 5)
3問目

問題

No.193 筒の数式 - yukicoder

元の回答コード

#22521 No.193 筒の数式 - yukicoder


訂正版

#22728 No.193 筒の数式 - yukicoder

> この時、数式の最初や最後が演算子になってはいけない。
これはわかった

> leading zeroは認める。
これはよくわからない.

まあいいや → 大会後,チャレンジで見事に落とされる.
はい.ちなみに修正前のコードはこれ.

S = input()
maxnum = -9999999999999999999999999
length = len(S)
ckecknum = lambda x: not (x == "+" or x == "-")
for i in range(length):
    line = S[i:length] + S[0:i]

    # frist and end check
    first = line[0]
    end = line[length - 1]
    if not ckecknum(first) or not ckecknum(end):
        line = ""
        continue
    
    try:
        maxnum = max(maxnum, eval(line))
    except:
        pass
print(maxnum)

具体的に言うと,こういうパターンがダメ.

01+011+011

元のコードだと多分一つも計算出来ないかららだめ.

leading zeroっていうのはあれです,例えば

011

は次のように解釈する.

11

ということです.

どうやらpython3のevalではleading zeroを認めていない模様.
evalの言語仕様よく知らなかったので,勉強になりました.
そして参加者すごすぎて怖いです.もっと強いコード描かなきゃ(白目)

一応,訂正後のコードならば通るのですが,かなり冗長になってしまったので,だめですね…
(エラーチェックとか多すぎると思う)

改善点として,leading zeroは正規表現でひっかけるのが良いと思う.

S = input()
maxnum = -9999999999999999999999999
length = len(S)
checknum = lambda x, line: not (line[x] == "+" or line[x] == "-")
for i in range(length):
    line = S[i:length] + S[0:i]
    tline = line

    if not checknum(0, line) or not checknum(len(line) - 1, line):
        continue
    
    j = 0
    while tline[j] == "0":
        j += 1
    if not checknum(j, tline):
        tline = tline[j - 1:len(tline)]
        
    j = 1
    while j < len(tline):
        if not checknum(j - 1, tline) and tline[j] == "0":
            if j == len(tline) - 1:
                break
            else:
                if checknum(j + 1, tline):
                    tline = tline[0:j] + tline[j+1:len(tline)]
        else:
            j += 1

    for i in range(len(tline) - 1):
        if not checknum(i, tline) and not checknum(i + 1, tline):
            line = ""
            break
    else:
        line = tline

    try:
        maxnum = max(maxnum, eval(line))
    except:
        pass
print(maxnum)


残りの問題はわかりませんでした.
フィボナッチの1問目は前半半分のテストケースは通したけど,後半はさっぱり.
他の人のコード見る限りでは,DPっぽいけどさっぱりわからん.


本当はこの後CodeForceの問題も見てみようかと思いましたが,どうやら登録が間に合わなかったようで,また今度になりそうです.
あと情報の登録なんですが,大学名とか都市名とか存在しなくて真顔.誰も参加してないのかな….
不安ですねえ.

あと言語モード切り替えてなかったので,最初ロシア語で困惑しました,英語にすぐ切り替えたけどw


yukicoderに関しては,★3~★4解けるようにならなきゃなと思います.
もっともっと問題を解いて,解法について調べて,みたいな作業を繰り返していかなきゃだめですね.


というわけで,今日はこれにておしまい.

追記

解説としてリンクされていたので,少し修正してみました.