Tbpgr Blog

Ruby プログラマ tbpgr(てぃーびー) のブログ

ฅ(・ω・ฅ)/{ マシュー問題の他の解答者さんの奇抜な解答を見たいので、まずは自分が解答を晒す }

概要

マシュー問題の他の解答者さんの奇抜な解答を見たいので、まずは自分が解答を晒す

経緯

マシューは CodeIQ の出題者。

主に、易しめの数学・アルゴリズムの定番問題にエロをまぶしてちょっと粗めに出題する傾向にある。
問題の制約や記述に穴があることが多いが、真摯に対応してくれることが多い憎みきれない男。

さて、マシューの問題だが、問題自体は簡単なものが多く、 問題の設定がかなり奇抜であるため、珍解答・ウケ狙いの解答が多そうなものが多い。

しかし、出題後に CodeIQ MAGAZINE での解答公開などがないため、
皆さんが行ったネタ解答は陽の目を見ないまま。

宝の山を掘り起こす

そこで、優秀な挑戦者さんたちの珠玉のネタ宝庫を掘り起こすべく
まずは私がコードを公開して流れをつくろうと思った次第です。
大したコードではないのですが、ダムを決壊させる蟻の一穴みたいなものです。

ちなみに、コードの公開についてはマシューに許可をとりました。
問題文を全文転載などしなければ、怒られないと思いますので
皆さん気兼ねなくブログなり、 ideone なり、 gist なりご利用ください。

問題

q1263 FizzBuzzっぽく愛の告白をして

ざっくり説明すると FizzBuzz
ただし、 Fizz / Buzz / FizzBuzz ではなく
マシュー / 大好き / 抱いて と出力する必要があります。

イラッとした方。 その感情は正しいものだと思います。

私の解答

マシュー / 大好き / 抱いて が癪にさわったので、これらを建前とし、本音は
マシュー / 大嫌い / 近寄らないで にしました。

# マシュー社交辞令モジュール
module ForMatthewPoliteness
  # 本音
  module RealIntention
    HATE = '大嫌い'
    STAY_AWAY = '近寄らないで'
  end

  # 建前
  module Tatemae
    # 建前マッピングに本音を与えると建前を得られる
    TATEMAE_MAPPING = {
      RealIntention::HATE => '大好き',
      RealIntention::STAY_AWAY => '抱いて!',
    }
  end
end

FMP = ForMatthewPoliteness
matthew_fizzbuzz = Enumerator.new { |y|
  a = 1
  loop {
    ret = case
    when a % 15 == 0 then FMP::Tatemae::TATEMAE_MAPPING[FMP::RealIntention::STAY_AWAY]
    when a % 5 == 0 then FMP::Tatemae::TATEMAE_MAPPING[FMP::RealIntention::HATE]
    when a % 3 == 0 then 'マシュー'
    else a
    end
    y << ret
    a += 1
  }
}

print matthew_fizzbuzz.take(100).join(',')
  • 出力
1,2,マシュー,4,大好き,マシュー,7,8,マシュー,大好き,11,マシュー,13,14,抱いて!,16,17,マシュー,19,大好き,マシュー,22,23,マシュー,大好き,26,マシュー,28,29,抱いて!,31,32,マシュー,34,大好き,マシュー,37,38,マシュー,大好き,41,マシュー,43,44,抱いて!,46,47,マシュー,49,大好き,マシュー,52,53,マシュー,大好き,56,マシュー,58,59,抱いて!,61,62,マシュー,64,大好き,マシュー,67,68,マシュー,大好き,71,マシュー,73,74,抱いて!,76,77,マシュー,79,大好き,マシュー,82,83,マシュー,大好き,86,マシュー,88,89,抱いて!,91,92,マシュー,94,大好き,マシュー,97,98,マシュー,大好き