Skip to content

Instantly share code, notes, and snippets.

@ZhangHanDong
Last active August 29, 2015 14:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ZhangHanDong/1d1899fd46e8704a76e2 to your computer and use it in GitHub Desktop.
Save ZhangHanDong/1d1899fd46e8704a76e2 to your computer and use it in GitHub Desktop.
thoughtworks fizzbuzz test: https://www.jinshuju.net/f/EGQL3D
# thoughtworks fizzbuzz test: https://www.jinshuju.net/f/EGQL3D
# just for fun
# by blackanger.z@gmail.com
class Student
attr_accessor :number, :seeds, :fizzs
def initialize(number, seeds=[])
@number = number
@seeds = seeds
@fizzs = ['Fizz', 'Buzz', 'Whizz']
end
def number_off
re = calculate
re.empty? ? number : re
end
private
def calculate
if special_rule(seeds[0])
fizzs[0]
else
seeds.each_with_index.inject('') do |re, (seed, index)|
re << fizzs[index] if common_rule(seed)
re
end
end
end
def common_rule(seed); (number % seed) == 0 end
def special_rule(seed); number.to_s.match(/#{seed}/) end
end
# example:
# number_off_by_seeds(100, 3,5,7)
def number_off_by_seeds(students_number, *seeds)
queue = Array[]
1.upto(students_number) {|i| queue << Student.new(i, seeds) }
queue.each_with_index {|student, index| puts "number #{index+1} student number off: #{student.number_off}" }
end
@ZhangHanDong
Copy link
Author

require './student'
require 'minitest'
require 'minitest/autorun'

class TestStudent < MiniTest::Test
  def setup
    @seeds = [3, 5, 7]
  end

  def test_fizz
    student = Student.new(3, @seeds)
    # assert_equal 'Fizz', student.calculate
    assert_equal 'Fizz', student.number_off
  end

  def test_buzz
    student = Student.new(5, @seeds)
    # assert_equal 'Buzz', student.calculate
    assert_equal 'Buzz', student.number_off
  end

  def test_whizz
    student = Student.new(7, @seeds)
    # assert_equal 'Whizz', student.calculate
    assert_equal 'Whizz', student.number_off
  end

  def test_mix
    student1 = Student.new(15, @seeds)
    # assert_equal 'FizzBuzz', student1.calculate
    assert_equal 'FizzBuzz', student1.number_off

    student2 = Student.new(21, @seeds)
    # assert_equal 'FizzWhizz', student2.calculate
    assert_equal 'FizzWhizz', student2.number_off

    student3 = Student.new(105, @seeds)
    # assert_equal 'FizzBuzzWhizz', student3.calculate
    assert_equal 'FizzBuzzWhizz', student3.number_off
  end

  def test_normal
    student1 = Student.new(2, @seeds)
    # assert_equal '', student1.calculate
    assert_equal 2, student1.number_off

    student2 = Student.new(8, @seeds)
    # assert_equal '', student2.calculate
    assert_equal 8, student2.number_off
  end

  def test_include_number
    student1 = Student.new(13, @seeds)
    # assert_equal 'Fizz', student1.calculate
    assert_equal 'Fizz', student1.number_off

    student2 = Student.new(35, @seeds)
    # assert_equal 'Fizz', student2.calculate
    assert_equal 'Fizz', student2.number_off
  end

end

@ZhangHanDong
Copy link
Author

题目:
FizzBuzzWhizz

你是一名体育老师,在某次课距离下课还有五分钟时,你决定搞一个游戏。此时有100名学生在上课。游戏的规则是:

  1. 你首先说出三个不同的特殊数,要求必须是个位数,比如3、5、7。
  2. 让所有学生拍成一队,然后按顺序报数。
  3. 学生报数时,如果所报数字是第一个特殊数(3)的倍数,那么不能说该数字,而要说Fizz;如果所报数字是第二个特殊数(5)的倍数,那么要说Buzz;如果所报数字是第三个特殊数(7)的倍数,那么要说Whizz。
  4. 学生报数时,如果所报数字同时是两个特殊数的倍数情况下,也要特殊处理,比如第一个特殊数和第二个特殊数的倍数,那么不能说该数字,而是要说FizzBuzz, 以此类推。如果同时是三个特殊数的倍数,那么要说FizzBuzzWhizz。
  5. 学生报数时,如果所报数字包含了第一个特殊数,那么也不能说该数字,而是要说相应的单词,比如本例中第一个特殊数是3,那么要报13的同学应该说Fizz。如果数字中包含了第一个特殊数,那么忽略规则3和规则4,比如要报35的同学只报Fizz,不报BuzzWhizz。

现在,我们需要你完成一个程序来模拟这个游戏,它首先接受3个特殊数,然后输出100名学生应该报数的数或单词。比如,

输入
3,5,7
输出(片段)

1
2
Fizz
4
Buzz
Fizz
Whizz
8
Fizz
Buzz
11
Fizz
Fizz
Whizz
FizzBuzz
16
17
Fizz
19
Buzz

一直到100

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment