stkblog

白血病と関係ないことを書きます なにかあったら教えて下さい

yukicoder No. 304-306 やった

#304 鍵(1)

No.304 鍵(1) - yukicoder
「この問題はリアクティブ問題です。」


……
………
f:id:steek79:20100528121201j:plain
*1


過去問のAC答案とGoogleに聞いた結果、

import sys

としておいて

print 'blahblahblah'
sys.stdout.flush()

とすればいいらしいということを学ぶ。プログラミングの基礎がないのでこういうとき困る。

提出(AC

import sys

for x in xrange(1000):
    print '{0:03}'.format(x)
    sys.stdout.flush()
    res = raw_input()
    if res == 'unlocked':
        break

4桁なので素直に1000通り総当り

ゼロ埋め

ゼロで埋めるのどうするのか忘れてたのでメモ、

print string.zfill(s, width) #数値を表現する文字列の左側に、指定の幅になるまでゼロを付加します。符号付きの数字も正しく処理します。
print '%03.d' %s # 0:ゼロ埋め 3:桁数
print '{:03}'.format(s) #

7.1. string — 一般的な文字列操作 — Python 2.7ja1 documentation
文字列フォーマット操作 (%形式) » Python Snippets
format関数による文字列フォーマット(新しい形式) » Python Snippets


#305 鍵(2)

No.305 鍵(2) - yukicoder
今度は番号が10桁になったかわりに、あってる桁の数(X)を教えてもらえる

(TLE

00...0 から 99...9 まで試すと使われてる数の個数はわかる
けどそのあとどう組み合わせればいいのかわからない!パーミュテイション??ってやったらTLE

import sys
import itertools

answerlike = ''
for i in xrange(10):
    print str(i) * 10
    sys.stdout.flush()
    res = raw_input().split()[0]
    if res == 10:
        exit()
    else:
        for _ in xrange(int(res)):
            answerlike += str(i)

for p in itertools.permutations(answerlike):
    print ''.join(p)
    sys.stdout.flush()
    res = raw_input().split()[1]
    if res == 'unlocked':
        break

(AC

1桁ずつ特定していけばいいのだということに気付いて

00..00, 00..01, ... 00..09, → Xが大きいとこの数が1の位の正解
00..10, 00..20, ... 00..90, → Xが大きいとこの数が10の位の正解

て感じでつぶしてくと100回聞けばわかるはず
その桁の数字わかった時点でループやめたほうがいいとは思ったけど無視

import sys

code = []
for i in xrange(10):
    digits = []
    for j in xrange(10):
        ans = j * 10**i
        print str(ans).zfill(10)
        sys.stdout.flush()
        X = raw_input().split()
        X = int(X[0])
        if X == 10:
            exit()
        else:
            digits.append(X)
    n = digits.index(max(digits))
    code.append(n)

code = code[::-1]
code = map(str, code)
print ''.join(code)


「ダイヤル式の南京錠は合ってる数字に合わせるときだけ音と感触が違う」って聞いたことあるけど本当なのかな。
そうだとするとこれと同じようにやるだけなので最大(10*桁数)回で開く?

#306 さいたま2008

No.306 さいたま2008 - yukicoder
対称移動した点から直線を引くと最短距離、っていう中学か高校でよくやるやつ。

xa, ya = map(int, raw_input().split())
xb, yb = map(int, raw_input().split())

p = ya + 1.0 * (yb - ya) * xa/(xb + xa)
print p


こんな感じでした。
もうリアクティブ問題でも大丈夫