読者です 読者をやめる 読者になる 読者になる

ikemonn's blog

技術ネタをちょこちょこと

SRM 642 Div2 250 ForgetfulAddition

問題文

https://apps.topcoder.com/wiki/display/tc/SRM+642

書いた

class ForgetfulAddition:
    def minNumber(self, expression):
        num = str(expression)
        res = 0
        for i in xrange(1, len(num)):
            sum_num = int(num[:i]) + int(num[i:])
            if res == 0:
                res = sum_num
            res = min(res, sum_num)
        return res

他の参加者のコードみた

class ForgetfulAddition:
    def minNumber(self, expression):
        ans = 99999999
        for i in xrange(1, len(expression)):
            ans = min(ans, int(expression[i:]) + int(expression[:i]))
        return ans

感想

問題文の設定上99999999以上にはならないので、最初に設定しておけばif分無くていける。 ムダなstr変換無くす。

SRM 639 Div2 250 ElectronicPetEasy

問題文

https://apps.topcoder.com/wiki/display/tc/SRM+639

書いた

class ElectronicPetEasy:
    def isDifficult(self, st1, p1, t1, st2, p2, t2):

        first = []
        for i in xrange(t1):
            first.append(st1+(p1*i))

        second = []
        for i in xrange(t2):
            second.append(st2+(p2*i))

        res = "Easy"
        for i in first:
            if i in second:
                res = "Difficult"
                break
        return res

他の参加者のコードみた

class ElectronicPetEasy:
    def isDifficult(self, st1, p1, t1, st2, p2, t2):
        feed1 = set(range(st1, st1+p1*t1,p1))
        feed2 = set(range(st2, st2+p2*t2,p2))
        if feed1 & feed2 == set([]):
            return "Easy"
        return "Difficult"

感想

rangeでstart, stop, stepを指定すると等差数列を作れる。 set形だと&で共通する要素があるか比較できるので便利。

SRM 638 Div2 250 NamingConvention

問題文

https://community.topcoder.com/stat?c=problem_statement&pm=13521

書いた

class NamingConvention:
    def toCamelCase(self, variableName):
        while variableName.count('_') > 0:
            replace_char_index = variableName.index('_')
            variableName = variableName[:replace_char_index] + variableName[replace_char_index+1].upper() + variableName[replace_char_index+2:]
        return variableName

他の参加者のコードみたあと

result = ""
        variableName = list(variableName)
        for i, c in enumerate(variableName):
            if c == '_':
                variableName[i+1] = variableName[i+1].upper()
            else:
                result += c
        return result

感想

_ のindexを取得して、_を削除し、その後の文字を大文字にするということを考えたが、愚直に文字列をforで回したほうがシンプルだった。 pythonのstrは、Immutableなので直接書き換えることができない。 一旦Mutableなlistにしてから書き換える。

SRM 636 Div2 250 GameOfStones

TopCoder

問題文

Limak has found a large field with some piles of stones.

Limak likes perfection. It would make him happy if every pile had the same number of stones. He is now going to move some stones between the piles to make them all equal.

However, there is a catch. Limak's perfectionism does not allow him to carry just one stone at a time. As he has two hands, he must always carry exactly two stones: one in each hand. Thus, he can only make one type of an action: pick up two stones from one of the piles and carry both of them to some other pile. He is not allowed to remove a pile completely. Therefore, he cannot pick up stones from a pile that currently contains fewer than 3 stones.

You are given a int[] stones. Each element of stones is the initial number of stones in one of the piles. Compute and return the smallest number of actions Limak has to perform in order to make all piles equal. If it is impossible to make all piles equal using the allowed type of actions, return -1 instead.

書いた

# -*- coding: utf-8 -*-
import math,string,itertools,fractions,heapq,collections,re,array,bisect

class GameOfStones:
    def count(self, stones):
        if len(stones) <= 1:
            return 0
        sum_stones = sum(stones)

        if sum_stones % len(stones) != 0:
            return -1
        avg = sum_stones / len(stones)

        sum_gt_avg = 0
        for i in stones:
            if i > avg:
                diff = i - avg
                if (i-avg) % 2 != 0:
                    return -1
                sum_gt_avg += diff

        if sum_gt_avg % 2 != 0:
            return -1
        return sum_gt_avg / 2

他の参加者のコードみたあと

class GameOfStones:
    def count(self, stones):
        if len(stones) <= 1:
            return 0
        sum_stones = sum(stones)
        if sum_stones % len(stones) != 0:
            return -1
        avg = sum_stones / len(stones)

        result = 0
        for i in stones:
            if (i-avg) % 2 != 0:
                return -1
            if i > avg:
                result += (i-avg)/2

        return result

SRM 635 div2 250 IdentifyingWood

TopCoder

Problem Statement

We call a pair of Strings (s, t) "wood" if t is contained in s as a subsequence. (See Notes for a formal definition.)

Given Strings s and t, return the String "Yep, it's wood." (quotes for clarity) if the pair (s, t) is wood and "Nope." otherwise.

書いた

class IdentifyingWood:
    def check(self, s, t):
        if len(t) > len(s):
            return "Nope."
        match_cnt = 0
        s_start = 0
        for t_i in xrange(len(t)):
            for s_i in xrange(s_start, len(s)):
                if t[t_i] == s[s_i]:
                    s_start = s_i + 1
                    match_cnt += 1
                    break
        if match_cnt == len(t):
            return "Yep, it's wood."
        return "Nope."

他の参加者のコード読んだあと

class IdentifyingWood:
    def check(self, s, t):
        is_match = True
        for t_w in t:
            if t_w in s:
                index = s.index(t_w)
                s = s[index+1:]
            else:
                is_match = False
                break
                
        if is_match:
            return "Yep, it's wood."
        return "Nope."

文字列を1つずつ舐めていくのは、 for in で出来るのか。 マッチしたら次からはマッチした文字以降の文字列と比較すれば良いので、indexでマッチした部分を見つけて切っていくのよい。

【vim】vim <tab>で ファイル名を補完しようとすると、エラーが出る時の解決方法

vim

症状

oh-my-zshを入れたあとに、vim でTabを使ってファイル名を保管しようとすると_vim_files: function definition file not foundというエラーがでる。

解決方法

# 下記のファイルのあとに自分のMacの名前が付いていることがあるので、ls -la等のコマンドで確認
$ rm ~/.zcompdump
$ exec zsh

参考

arguments:448: vim_files: function definition file not found · Issue #518 · robbyrussell/oh-my-zsh

【Underscore.js】_.matcherを読んだ

JavaScript

jashkenas/underscore_.matcherを読んだ。

概要

_.matcher(attrs)

引数の「key : val」と同じものがあるかを判別する部分適用した関数を返す。

var matcher = _.matcher({age: 20, sex: "male"});
console.log(matcher({age: 20, sex: "male", country: "JP", name: "HOGA"})); // true

ソースコード

_.matcher = _.matches = function(attrs) {
    attrs = _.extendOwn({}, attrs);
    return function(obj) {
      return _.isMatch(obj, attrs);
    };
  };

引数をshallow-copyして、それを_.isMatchに渡した関数を返している。

参考

jashkenas/underscore