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 _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に渡した関数を返している。
参考
【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は===で比較するため。
参考
【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から取得している。
参考
AtomでXcodeのようにcmd-shift-jで、現在開いているファイルをTree View上で見つける
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のみを取得できる。