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

pockestrap

Web Programmer's memo

paiza で pizza もぐもぐしてきた

Programming Ruby Golang

12月14日【IT系就活生向けプログラミング試験対策勉強会】開催決定! - paiza開発日誌 これいってきました。ピザおいしかった。

で、事前課題で 天才火消しエンジニア霧島「もしPMおじさんが丸投げを覚えたら」|paizaオンラインハッカソンLite を解くとのことなので、解き直してました。

前解いた時の記事 => paiza Online Hackathon 解いてみた - pockestrap

Ruby

pockeさんの採点結果[100点] 完璧ぃぃ!|paizaオンラインハッカソンLite

m = gets.to_i
n = gets.to_i

# for index
man = 0
cost = 1

companies = []

n.times do |i|
  a, b = gets.split.map(&:to_i)
  companies.push([a, b])
end


memo = {}


p (func = -> (i, x) { 
  if x >= m
    return 0
  end

  if i == n  # last
    return 2500000000000
  end


  return memo[i * 2500000000000 + x] ||=(
    a = companies[i][cost] + func.call(i + 1, x + companies[i][man])
    b = func.call(i + 1, x)

    a < b ? a : b
  ) 

}).call(0, 0)

defメソッド定義しないでlambdaにしたほうが変数が束縛されて便利なんだよね。

Golang

pockeさんの採点結果[100点] 完璧ぃぃ!|paizaオンラインハッカソンLite

package main

import (
    "bufio"
    "fmt"
    "os"
    "strconv"
)

type Company struct {
    man  int
    cost int
}

func main() {
    sc := bufio.NewScanner(os.Stdin)
    sc.Scan()
    m, _ := strconv.Atoi(sc.Text())
    sc.Scan()
    n, _ := strconv.Atoi(sc.Text())

    cs := make([]*Company, 0)

    sc.Split(bufio.ScanWords)
    for i := 0; i < n; i++ {
        sc.Scan()
        a, _ := strconv.Atoi(sc.Text())
        sc.Scan()
        b, _ := strconv.Atoi(sc.Text())

        c := &Company{man: a, cost: b}
        cs = append(cs, c)
    }

    memo := make(map[int]int)

    var f func(int, int) int
    f = func(i int, x int) int {
        if x >= m {
            return 0
        }
        if i == n {
            return 2500000000000
        }

        if v, ok := memo[i*2500000000000+x]; ok {
            return v
        }

        h := cs[i].cost + f(i+1, x+cs[i].man)
        g := f(i+1, x)

        var r int
        if h < g {
            r = h
        } else {
            r = g
        }
        memo[i*2500000000000+x] = r
        return r
    }

    fmt.Println(f(0, 0))
}

Rubyのほうは事前課題として、Goの方は解きたくなったので後から追加で書きました。行数多いなぁ、うーん。

当日 ハノイの塔Mod7 を解きました。コード公開していいかわかんないからとりあえず載せない。

というかmod7の方はテストケース多いとstack溢れて死ぬし解けてないんだけどね。つらい。 ハノイの塔もググったのをそのまま実装して、解いてから意味を考えようと思ってたら解いて時間が終わってしまった。


まー pizza おいしかったし、面白い話聞けたし、人と話せたし、おかし美味しかったし、エナドリおいしかったしよかったです。

もっとGolang書きたい