Skip to content

Instantly share code, notes, and snippets.

@Kerrick
Last active December 9, 2024 20:58
Show Gist options
  • Save Kerrick/37b6740ad1e36102c691fe185304ef75 to your computer and use it in GitHub Desktop.
Save Kerrick/37b6740ad1e36102c691fe185304ef75 to your computer and use it in GitHub Desktop.
FizzBuzz in Ruby and JavaScript with no conditionals and no modulo operator
class Replacement
class << self
def for(n) = @@registered.find { it.valid? n }.new(n)
def register(klass) = (@@registered ||= []).prepend klass
def inherited(klass) = register(klass)
end
def initialize(n) = @n = n
end
class TheNumber < Replacement
def self.valid?(n) = true
def to_s = @n.to_s
end
class Fizz < Replacement
def self.valid?(n) = n / 3.0 == n / 3
def to_s = "Fizz"
end
class Buzz < Replacement
def self.valid?(n) = n / 5.0 == n / 5
def to_s = "Buzz"
end
class FizzBuzz < Replacement
def self.valid?(n) = Fizz.valid?(n) && Buzz.valid?(n)
def to_s = "FizzBuzz"
end
1.upto(20) { puts Replacement.for(it) }
class Replacement {
static for = n => new (this.#registered.find(k => k.isValid(n)))(n)
static register = klass => this.#registered.unshift(klass)
static #registered = []
constructor(n) { this.n = n }
}
class TheNumber extends Replacement {
static isValid = () => true
toString = () => this.n.toString()
}
Replacement.register(TheNumber)
class Fizz extends Replacement {
static isValid = n => Math.floor(n / 3) === n / 3
toString = () => "Fizz"
}
Replacement.register(Fizz)
class Buzz extends Replacement {
static isValid = n => Math.floor(n / 5 ) === n / 5
toString = () => "Buzz"
}
Replacement.register(Buzz)
class FizzBuzz extends Replacement {
static isValid = n => Fizz.isValid(n) && Buzz.isValid(n)
toString = () => "FizzBuzz"
}
Replacement.register(FizzBuzz)
for (let i = 0; i <= 20; i += 1) {
console.log(`${Replacement.for(i)}`)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment