Kawaii Lab

プログラミングとかサービス開発とか

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に成り代わる言語が採用される場合も予想されるので、そういった場合に特定の言語に依存した文法を使うとリプレイスの障害になる場合があります。
汎用的な文法を使っていれば、リプレイス先の言語でも容易に置き換え方法が見つかるでしょう。

正規表現の件もそうですが、ネックになりそうな点はあらかじめ代替え策を探し、できそうであればそちらを使うようにします。
技術的な負積ではなく、戦略的な負積を積むようにチームで意識することで取り組むべき目標も見やすいかなと。