Created
September 9, 2011 15:51
-
-
Save pasberth/1206574 to your computer and use it in GitHub Desktop.
とりあえずやってみた
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/usr/local/bin/ruby | |
| # -*- coding: utf-8 -*- | |
| " | |
| 問題: | |
| ミミは5つあります。ウサミミは3つ、ネコミミは2つです | |
| テトラちゃんと、ミルカさんと、ユーリは、このうちいずれかのミミを頭に付けています。余りはふたつです。 | |
| 自分のミミは見えません。 | |
| 他のふたりのミミは見えます。 | |
| 余りのふたつのミミをなんだか知ることはできません。 | |
| さて、自分が付けているミミはなんなのかあてましょう | |
| " | |
| require "singleton" | |
| module NekousaTheorem | |
| extend self | |
| class Mimikko | |
| @@all_mimies = [ | |
| :usa, | |
| :usa, | |
| :usa, | |
| :neko, | |
| :neko | |
| ] | |
| @@rest_mimies = @@all_mimies.clone | |
| @@mimies = {} | |
| def initialize name | |
| @@mimies[self] = @@rest_mimies.delete_at(@@rest_mimies.index @@rest_mimies.sample) | |
| @name = name | |
| attr_reader :name | |
| def to_s | |
| @name | |
| def mimi | |
| @@mimies[self] | |
| def all_mimies | |
| @@all_mimies.clone | |
| def else_mimies | |
| @@mimies.reject { |k, v| self == k } | |
| TETORA = Mimikko.new 'テトラちゃん' | |
| MIRUKA = Mimikko.new 'ミルカさん' | |
| YURI = Mimikko.new 'ユーリ' | |
| def TETORA.which? | |
| " もしふたりともネコミミなら自分自身はウサミミである " | |
| rest = all_mimies.tap do |itself| | |
| else_mimies.each do |mimikko, mimi| | |
| itself.each_index { |i| break itself.delete_at(i) if itself[i] == mimi } | |
| return :usa if rest.all? { |v| v == :usa } | |
| nil | |
| def MIRUKA.which? | |
| " もしふたりともネコミミなら自分自身はウサミミである " | |
| rest = all_mimies.tap do |itself| | |
| else_mimies.each do |mimikko, mimi| | |
| itself.each_index { |i| break itself.delete_at(i) if itself[i] == mimi } | |
| return :usa if rest.all? { |v| v == :usa } | |
| if TETORA.which? | |
| " テトラちゃんが自分自身のミミを決定できるのは、ふたりともネコミミの場合のみなので、もしテトラちゃんが答えられればミルカさんはネコミミになる " | |
| return :neko | |
| else | |
| " もし答えられないのなら、ふたりのうちすくなくとも一方はウサミミになる。もしユーリがネコミミなら、その時点で自分自身がウサミミだと決定できる " | |
| return :usa if else_mimies[YURI] == :neko | |
| " もしユーリがウサミミなら、断定はできない " | |
| nil | |
| def YURI.which? | |
| " もしふたりともネコミミなら自分自身はウサミミである " | |
| rest = all_mimies.tap do |itself| | |
| else_mimies.each do |mimikko, mimi| | |
| itself.each_index { |i| break itself.delete_at(i) if itself[i] == mimi } | |
| return :usa if rest.all? { |v| v == :usa } | |
| if TETORA.which? | |
| " テトラちゃんが自分自身のミミを決定できるのは、ふたりともネコミミの場合のみなので、もしテトラちゃんが答えられればユーリはネコミミになる " | |
| return :neko | |
| elsif MIRUKA.which? == :neko | |
| " ミルカさんがネコミミだと断定できる場合はテトラちゃんがウサミミだと断定できた場合なので、ここは通情あり得ない " | |
| elsif MIRUKA.which? == :usa | |
| " ミルカさんがウサミミだと断定できるのは、ユーリがネコミミの場合のみなので、ユーリはネコミミになる " | |
| return :neko | |
| else | |
| " ユーリがウサミミの場合はミルカさんは断定で機内ので、ユーリはウサミミになる " | |
| return :usa | |
| include NekousaTheorem | |
| puts "#{TETORA.mimi}: #{TETORA.which?}" | |
| puts "#{MIRUKA.mimi}: #{MIRUKA.which?}" | |
| puts "#{YURI.mimi}: #{YURI.which?}" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment