fizzbuzz 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. data/lib/fizzbuzz.rb +40 -1
  2. data/lib/fizzbuzz/version.rb +1 -1
  3. metadata +2 -2
@@ -1,3 +1,10 @@
1
+ # A note on originality: FizzBuzz has been solved in hundreds of ways by
2
+ # thousands of people. Most of the solutions found here have been rediscovered
3
+ # time and again by various authors. I will endeavor to give credit for
4
+ # original solutions and new combinations of existing solutions. If you feel
5
+ # you deserve shared credit for one of these solutions, by all means please
6
+ # let me know.
7
+
1
8
  $:.unshift File.dirname(__FILE__)
2
9
 
3
10
  # Prints numbers from 1 to 100. If the number is divisible by 3, it prints
@@ -7,6 +14,20 @@ def fizzbuzz
7
14
  fizzbuzz_map_with_ternary_modulo_15_3_5
8
15
  end
9
16
 
17
+ # The gold standard. Executes in constant time, also has a constant amount of
18
+ # elegance (where k is quite small)
19
+ def fizzbuzz_hardcode
20
+ [1, 2, "Fizz", 4, "Buzz", "Fizz", 7, 8, "Fizz", "Buzz", 11, "Fizz", 13, 14,
21
+ "FizzBuzz", 16, 17, "Fizz", 19, "Buzz", "Fizz", 22, 23, "Fizz", "Buzz", 26,
22
+ "Fizz", 28, 29, "FizzBuzz", 31, 32, "Fizz", 34, "Buzz", "Fizz", 37, 38,
23
+ "Fizz", "Buzz", 41, "Fizz", 43, 44, "FizzBuzz", 46, 47, "Fizz", 49, "Buzz",
24
+ "Fizz", 52, 53, "Fizz", "Buzz", 56, "Fizz", 58, 59, "FizzBuzz", 61, 62,
25
+ "Fizz", 64, "Buzz", "Fizz", 67, 68, "Fizz", "Buzz", 71, "Fizz", 73, 74,
26
+ "FizzBuzz", 76, 77, "Fizz", 79, "Buzz", "Fizz", 82, 83, "Fizz", "Buzz", 86,
27
+ "Fizz", 88, 89, "FizzBuzz", 91, 92, "Fizz", 94, "Buzz", "Fizz", 97, 98,
28
+ "Fizz", "Buzz"]
29
+ end
30
+
10
31
  # Uses ternary evaluation to choose element; uses modulo 15 to represent the
11
32
  # combination of moduli 3 and 5.
12
33
  def fizzbuzz_map_with_ternary_modulo_15_3_5
@@ -18,6 +39,21 @@ def fizzbuzz_map_with_ternary_modulo_15_3_5
18
39
  }
19
40
  end
20
41
 
42
+ # From: Dan Uznanski
43
+ def fizzbuzz_mod15_index
44
+ (1..100).map {|i| ['fizzbuzz', nil, nil, 'fizz', nil, 'buzz', 'fizz', nil, nil, 'fizz', 'buzz', nil, 'fizz', nil, nil][i % 15] || i }
45
+ end
46
+
47
+ # From: Arnar Birgisson
48
+ def fizzbuzz_indirect_index
49
+ (1..100).map {|i| ['fizzbuzz', 'fizz', 'buzz', i][[i%15,i%3,i%5,0].index(0)] }
50
+ end
51
+
52
+ # From: Paulo Bonzini
53
+ def fizzbuzz_25bit_encoding
54
+ (1..100).map {|a| [a, "Fizz", "Buzz", "FizzBuzz"][(0x1241843 >> ((a % 15) * 2)) & 3] }
55
+ end
56
+
21
57
  # Uses the fact that seed 1781773465 in Ruby's rand will generate the 15-digit
22
58
  # sequence that repeats in the FizzBuzz progression. The premise here is that
23
59
  # we want to cleverly trick rand into delivering a predictable sequence. (It
@@ -26,8 +62,9 @@ end
26
62
  # stored in a 30-bit number. Since 1781773465 requires 31 bits of storage, our
27
63
  # cleverness has actually cost us a bit of storage efficiency. BUT THAT'S NOT
28
64
  # THE POINT!)
65
+ #
66
+ # From: David Brady
29
67
  #--
30
-
31
68
  # This sequence adheres to the specific ordering of 0=int, 1=Fizz, 2=Buzz,
32
69
  # 3=FizzBuzz. It may be possible to find a smaller key if the ordering is
33
70
  # changed. There are 24 possible permutations. If we assume that the
@@ -46,6 +83,7 @@ end
46
83
 
47
84
 
48
85
  # Here's a 26-bit seed
86
+ # From: David Brady
49
87
  def fizzbuzz_rand_sequence15_3201
50
88
  (0..99).map {|i| srand(46308667) if (i%15).zero?; ["FizzBuzz", "Buzz", i+1, "Fizz"][rand(4)]}
51
89
  end
@@ -57,6 +95,7 @@ end
57
95
  # Uses the fact that the FizzBuzz sequence is a repeating 15-digit sequence,
58
96
  # and that the 15-digit can further be broken down into a, a', b, where b is
59
97
  # "FizzBuzz" and a' is the reverse of a.
98
+ # From: David Brady
60
99
  def fizzbuzz_sequence7_reverse
61
100
  i=0;
62
101
  stack = [0, 0, "Fizz", 0, "Buzz", "Fizz", 0]
@@ -2,7 +2,7 @@ module Fizzbuzz #:nodoc:
2
2
  module VERSION #:nodoc:
3
3
  MAJOR = 0
4
4
  MINOR = 0
5
- TINY = 1
5
+ TINY = 2
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
8
8
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fizzbuzz
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - FIXME full name
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-02-25 00:00:00 -07:00
12
+ date: 2008-02-26 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies: []
15
15