議事録(54) - hamamatsu-rb/hamamatsu-rb.github.com GitHub Wiki

議事録(54)

KPT振り返り

自己紹介

  • 新人:はたさん
  • @Langurさんの紹介。ルーターの開発をやっている
  • Kuroyanagiさんが久しぶりに出席。最近はPHPやってる
  • @chuiさんがポジションペーパーを初めて作成
  • あとはいつも通り

CodeKataKata

  • お題『小学生がひらめきで解く算数の問題を大人げなくコンピュータで解く!』
  • 5問目まで行った人もいるよ
  • みんなのコードは以下

1 . 連続する4個の整数を掛け合わせると積が9□□□4になりました。(それぞれの□に入る数字はわかりません) この連続する4個の整数のうち、最大の数はいくつですか?

class Math1
  def initialize(m, n)
    @man  = m
    @ichi = n
  end
  def calc(num)
    result = 1
    4.times { |i|
      result = result * (num + i)
    }
    return result
  end
  def judge(num)
    result = self.calc(num)
    man = result.to_i / 10000
    ichi = result.to_i % 10
    if (man == @man && ichi == @ichi)
      ret = TRUE
    else
      ret = FALSE
    end
  end
  def test(n)
    n.times { |i|
      if (self.judge(i + 1))
        return (i + 4)
      end
    }
    return -1
  end
end
ret = Math1.new(9, 4).test(20)
p ret if (ret > 0)
require 'minitest/autorun'

# 連続する4個の整数を掛け合わせると積が9□□□4になりました。
# (それぞれの□に入る数字はわかりません) 
# この連続する4個の整数のうち、最大の数はいくつですか?出典
# ※どっかまちがってます

def kansu n
	n * (n - 1) * (n - 2) * (n - 3)
end

def answer
	(1..10).each do |n|
		ret = kansu(n).to_s
		if ret[0] == "9" && ret[ret.length - 1] == "4"
			p ret
			return n
		end
	end
end

describe "answer spec" do
	it "" do
		answer = 19
		(answer * (answer - 1) * (answer - 2) * (answer - 3)).to_s.must_equal "93024"
	end
end
  • minitestおすすめ
n = 1
regexp = /^9...4$/

loop do
  range = n...n+4
  prod = range.reduce(&:*)
  if regexp =~ prod.to_s
    puts "#{range.to_a.join('*')} = #{prod}"
    break
  end
  n += 1
end
  • reduceしらん人多数
a = 1
ans = 0
times = 0
while times <= 99994
  times = a*(a+1)*(a+2)*(a+3)
  if times.to_s =~ /^9\d{3}4$/
    ans = a + 3
  end
  a += 1
end

puts ans
#連続する4個の整数を掛け合わせると積が9□□□4になりました。(それぞれの□に入る数字はわかりません)
#この連続する4個の整数のうち、最大の数はいくつですか?
def renzoku
m = [1,2,3,4]
loop{
	v = m[0] * m[1] * m[2] * m[3]
	s = v.to_s
  	if ((s.length > 4) and (s[0] == '9') and (s[4] == '4'))
  	then
  		return m[3]
  	end
  	m[0] = m[0] + 1
  	m[1] = m[1] + 1
  	m[2] = m[2] + 1
  	m[3] = m[3] + 1
}
end

print renzoku()
## 小学生問題 1   
(1..100).each { |x|
  y = (x)*(x+1)*(x+2)*(x+3) 
  if ( (y/10000).to_i == 9 && (y%10) == 4) then
    printf("Found!: %d == %d x %d x %d x %d .", y,x,x+1,x+2,x+3 )
  end
}
def nth(m,n)
  (m/10**(n-1))%10
end

(0..99999).each do |i|
  m = (i)*(i+1)*(i+2)*(i+3)

  if nth(m,5) == 9 && nth(m,1) == 4
    puts "ans: " + (i+3).to_s
    puts "num: " + m.to_s
    break
  end
end

2 . 1段目は1×1個、2段目は2×2個のレンガを使い、200段のピラミッドを作るとき、 使われているレンガの数は全部で何個?

class Math2
  def initialize(num)
    @max = num
  end

  def calc
    result = 0
    @max.times { |i|
      result = result + ((i + 1) * (i + 1))
    }
    return result
  end
end

p Math2.new(200).calc
require 'active_support/all'

puts (1..200).sum { |n| n * n }
ret = 0
(1..200).each do |i|
	ret += i * i
end
#1段目は1×1個、2段目は2×2個のレンガを使い、
#200段のピラミッドを作るとき、使われているレンガの数は全部で何個?
def pla(kai)
	v = 0
	(1..kai).each{|i|
		v = v + i * i
	}
	return v
end
print pla(200)
p (1..200).inject(0) {|t, i| t + i*i }
p (1..200)
p (1..200).map { |i| i * i }
p (1..200).map { |i| i * i }.reduce(:+)
# 問題
# 1段目は1×1個、2段目は2×2個のレンガを使い、200段のピラミッドを作るとき、
# 使われているレンガの数は全部で何個?
p (200*(200+1)*(2*200+1))/6

3 . 1×2×3×4×5×・・・ と順に1ずつ大きな整数をかけていきます。 この積について、次の問に答えなさい。出典 3 .1 積を2で7回割った商が初めて整数になるのは、いくつまでかけたときですか。 3 .2 積を6で14回割った商が初めて整数になるのは、いくつまでかけたときですか。

class Math3
  def initialize(m, n)
    @ans = m ** n
  end

  def fact(n)
    return 1 if (n == 0)
    n * fact(n - 1)
  end
  
  def calc
    i = 1
    loop {
      result = self.fact(i) % @ans
      if (result == 0)
        return i
      end
      i = i + 1
    }
  end
end

p Math3.new(2, 7).calc
p Math3.new(6, 14).calc
def fact
  n = 1
  prod = 1

  loop do
    yield n, prod
    n += 1
    prod *= n
  end
end

factor = enum_for(:fact)

p factor.find { |_, prod| (prod % 2 ** 7) == 0 }
p factor.find { |_, prod| (prod % 6 ** 14) == 0 }
fact = -> n { (1..n).reduce(:*) }

(1..999).each do |i|
  n = fact[i]
  if n % (2 ** 7) == 0
    puts "3.1 ans: " + i.to_s
    puts "3.1 num: " + n.to_s
    break
  end
end

(1..999).each do |i|
  n = fact[i]
  if n % (6 ** 14) == 0
    puts "3.2 ans: " + i.to_s
    puts "3.2 num: " + n.to_s
    break
  end
end

4 .1,2,3,4 のいずれかの数字を使って4ケタの整数を作ります。 同じ数字を何度使ってもかまいません。次の問に答えなさい。出典 4 .1 整数は全部で何個できますか。 4 .2 できたすべての整数の一の位の数の和を求めなさい。 4 .3 できたすべての整数の和を求めなさい。

5 .ある直方体の高さはたてより1cm長く、横より1cm短いです。 その体積は3□□□□□26c㎡です。(5個の□の数はわかりません) この直方体の高さは何cmですか。

LT

KPT

https://hmrb.doorkeeper.jp/events/26815

Keep

  • 再帰久しぶりに書いた
  • 発表やった!
  • 次回会場予約を帰り時ではなく、途中でやった。
  • 終了前に次回場所予約
  • ついにねんがんのテザリング機能をてにいれたぞ!
  • いろんなひとのコードがみれて勉強になった。またやりたい。
  • お題良かった!
  • ちゃんと答えをSlackに貼った
  • 敢えて突っ込みどころの多いコードを晒す勇気
  • 机の広さ
  • 久しぶりの参加でも、すぐに馴染む
  • ネタが適度なレベルだった
  • ネタが良かった
  • まず環境を整えます。あと基本構文憶えてきます。
  • Hamamatsu.rbに参加すること。
  • お菓子持ってきた

Problem

  • 正規表現勉強しよう...
  • Cygwin+Ruby環境、久々に触ると動かなかった。
  • 正規表現ザコ勢
  • ちょっと寒い
  • Yutoさんに仕切り役とかお任せが多くてごめんなさい
  • レーザーポインターがあるといいかも。 どこの説明しているかわかりやすくなるので。
  • ネタをやりきれなかった...
  • エアコン効き過ぎ
  • ちょっとコード突っ込みどころ多かった、
  • マシン重い(物理的にも)
  • 漸化式思い出せねぇぇぇ....

Try

  • コードの解説をするときはマウスカーソルの位置に気をつけよう
  • 2〜3または、4〜5人のチームに分けてみる?
  • minitestいいね!
  • kata2の適切なネタを補充
  • rubyの基本を最低限勉強する
  • コード共有ツールを作る?
  • slackを使っていない人でもコード共有できるツールはないものか
  • また参加する
  • Ruby環境用意 手順の説明?
  • Ruby環境作成チャート作る
  • みんなでやるお題
  • もっと周りと話して解いても良かったか?
  • LTする
  • お菓子持ってくる

雑談

  • 新人にSlackとKPTについて説明
  • 9月にAWSの勉強会(リモートで各支部繋げて作業?)があるらしい。パブリックビューイング的な?・・・
  • cloud 9 はいきなりrailsのアプリケーションができてしまうので今回の目的では微妙だった。
  • Ruby環境作成チュートリアル整えなければ。
  • 浜松自作OS友の会やるよー(8月)