ikemonn's blog

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

SRM 635 div2 250 IdentifyingWood

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>で ファイル名を補完しようとすると、エラーが出る時の解決方法

症状

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を読んだ

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

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

jashkenas/underscore_.omitを読んだ。

概要

_.omit(object, *keys) 

第1引数から第2引数以降で指定したkey値以外のkey値とその値で構成されたObjectを返す。

var x = _.omit( {age: 20, sex: "male", country: "JP", name: "HOGA"}, ['age', 'sex']);
console.log(x); // {country: "JP", name: "HOGA"}

ソースコード

_.omit = function(obj, iteratee, context) {
    if (_.isFunction(iteratee)) {
      iteratee = _.negate(iteratee);
    } else {
      var keys = _.map(flatten(arguments, false, false, 1), String);
      iteratee = function(value, key) {
        return !_.contains(keys, key);
      };
    }
    return _.pick(obj, iteratee, context);
  };
var keys = _.map(flatten(arguments, false, false, 1), String);

をしているのは、JSのobjectのkeyはString型であり、_.containsは===で比較するため。

参考

jashkenas/underscore

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

jashkenas/underscore_.pickを読んだ。

概要

_.pick(object, *keys)

第一引数から第2引数以降で指定したkey値とその値で構成されたObjectを返す。

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

var y = _.pick(list, function(val, key, obj){
    return _.isNumber(val);
});

console.log(y); // {age: 20}

ソースコード

_.pick = function(object, oiteratee, context) {
    var result = {}, obj = object, iteratee, keys;
    if (obj == null) return result;
    if (_.isFunction(oiteratee)) {
      keys = _.allKeys(obj);
      iteratee = optimizeCb(oiteratee, context);
    } else {
      keys = flatten(arguments, false, false, 1);
      iteratee = function(value, key, obj) { return key in obj; };
      obj = Object(obj);
    }
    for (var i = 0, length = keys.length; i < length; i++) {
      var key = keys[i];
      var value = obj[key];
      if (iteratee(value, key, obj)) result[key] = value;
    }
    return result;
  };

第二引数が関数の場合、各プロパティに対して渡した関数実行される。 関数でない場合は、指定したkeyのプロパティを第一引数のobjectから取得している。

参考

jashkenas/underscore

AtomでXcodeのようにcmd-shift-jで、現在開いているファイルをTree View上で見つける

f:id:ikemonn:20151022181649g:plain

Atom -> 個人設定 -> Keybindings -> “your keycap file”  で下記を追記すればOK。

# 現在開いているファイルをTreeViewで指定する
'.platform-darwin':
  'cmd-shift-j': 'tree-view:reveal-active-file'

【Underscore.js】_.extendと_.extendOwnを読んだ

jashkenas/underscore_.extend_.extendOwnを読んだ。

概要

_.extend(destination, *sources) 
_.extendOwn(destination, *sources)
  • extend: sourcesに含まれている全てのプロパティ(プロトタイプを含む。)をdestinationにコピーしたものを返す
  • extendOwn: sourcesに含まれている全てのプロパティ(プロトタイプは除く)をdestinationにコピーしたものを返す
var Hoge = function(){};
Hoge.prototype.own = false;

var a = _.extend({}, {own: true}, new Hoge());
console.log(a); // {own: false}

var b = _.extendOwn({}, {own: true}, new Hoge());
console.log(b); // {own: true}

ソースコード

_.extend = createAssigner(_.allKeys);
_.extendOwn = _.assign = createAssigner(_.keys);


var createAssigner = function(keysFunc, undefinedOnly) {
    return function(obj) {
      var length = arguments.length;
      if (length < 2 || obj == null) return obj;
      for (var index = 1; index < length; index++) {
        var source = arguments[index],
            keys = keysFunc(source),
            l = keys.length;
        for (var i = 0; i < l; i++) {
          var key = keys[i];
          if (!undefinedOnly || obj[key] === void 0) obj[key] = source[key];
        }
      }
      return obj;
    };
  };

.allKeysでは、自身のプロトタイプのプロパティのkeyまで取得でき、.keysでは自身が持っているプロパティのkeyのみを取得できる。

参考

jashkenas/underscore