CodilityのLesson1をGoで解いてみた(解説付き)
概要
オンラインコーディングの試験であるCodilityのLesson1を自分なりに解いてみました。
BinaryGap coding task - Learn to Code - Codility
使用したのはGo
になります。
問題の要約
以下の範囲の整数値が与えられた時、バイナリ化し1
で囲まれた0
ブロックの最長の長さを求めよ
ただし、バイナリのなかで一つも1
で囲まれた0
ブロックがない場合は、0
を返すこと
[1..2,147,483,647]
コード
先にコードを載せておきます
package main import ( "fmt" "strings" ) func main() { // 問題文の仮定リスト int_list := []int{1, 2, 20, 147, 483, 647} // 仮定リストを回す for _, val := range int_list { fmt.Println(`integer is :`, val) fmt.Println(`max bynary gap is :`, Solution(val)) fmt.Println(``) } } func Solution(N int) int { // 10進数から2進数(バイナリ)に変換する // 終端が0で終わる場合は消し去る binary := strings.TrimRight(fmt.Sprintf("%b", N), "0") fmt.Println(`bynary is :`, binary) // バイナリの中の1が出てくる回数を数える delimiter_count := strings.Count(binary, `1`) // 1が一回しか出てこない場合、両端が1で囲まれるケースは存在しないので0を返す if 2 > delimiter_count { return 0 } // 1を区切りにして0のブロックを配列として取得する binary_gaps := strings.Split(binary, `1`) // 0の配列の中で一番長さが大きいものを取得する max_binary_gap_length := 0 for _, binary_gap := range binary_gaps { if max_binary_gap_length < len(binary_gap) { max_binary_gap_length = len(binary_gap) } } return max_binary_gap_length }
結果 integer is : 1 bynary is : 1 max bynary gap is : 0 integer is : 2 bynary is : 1 max bynary gap is : 0 integer is : 20 bynary is : 101 max bynary gap is : 1 integer is : 147 bynary is : 10010011 max bynary gap is : 2 integer is : 483 bynary is : 111100011 max bynary gap is : 3 integer is : 647 bynary is : 1010000111 max bynary gap is : 4
解説
コード自体の説明はコードに書いてあるのでそこは省略します。
主に上記の点以外で意識した点は以下の点になります。
- コードで使用されている記述方法が言語間で汎用的に使えること
- Goにおける正規表現は排他制御を行なっているためスケールする際にネックとなり得るため使わない
- 人間が読みやすく、かつ、問題文に対して(工数的な意味で)迅速に解決できるようにスコープを絞る
まとめると、リプレイスしやすくスケールしやすいコードを書いたわけです。
今後Goに成り代わる言語が採用される場合も予想されるので、そういった場合に特定の言語に依存した文法を使うとリプレイスの障害になる場合があります。
汎用的な文法を使っていれば、リプレイス先の言語でも容易に置き換え方法が見つかるでしょう。
正規表現の件もそうですが、ネックになりそうな点はあらかじめ代替え策を探し、できそうであればそちらを使うようにします。
技術的な負積ではなく、戦略的な負積を積むようにチームで意識することで取り組むべき目標も見やすいかなと。