Skip to content

Instantly share code, notes, and snippets.

@pasberth
Created September 9, 2011 15:51
Show Gist options
  • Select an option

  • Save pasberth/1206574 to your computer and use it in GitHub Desktop.

Select an option

Save pasberth/1206574 to your computer and use it in GitHub Desktop.
とりあえずやってみた
#!/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