自己言及のパズルの答え

id:selvaggioが解けなかったらしいので、Rubyに解かせてみる。

こんな答えが出た。

$ ruby solve.rb
1回目の試行...失敗
2回目の試行...失敗
3回目の試行...失敗
4回目の試行...成功

この文章には
0が1個
1が11個
2が2個
3が1個
4が1個
5が1個
6が1個
7が1個
8が1個
9が1個
含まれています

一応、スクリプトもさらしておく。

Element = Struct.new("Element", :name, :value)

def count(elements)
  counter = Array.new(10,0)
  elements.each{|e|
    e.name.to_s.each_byte{|v|
      counter[v.chr.to_i]  += 1
    }
    if e.value
      e.value.to_s.each_byte{|v|
        counter[v.chr.to_i]  += 1
      }
    end
  }
  counter
end

def solve(elements)
  counter = count(elements)
  elements.each{|e|
    e.value = counter[e.name]
  }
end

def valid?(elements)
  counter = count(elements)
  elements.each{|e|
    if counter[e.name] != e.value
      return false
    end
  }
  return true
end

elements = []
0.upto(9){|i|
  elements.push Element.new(i,nil)
}
i = 0
loop{
  i += 1
  print "#i:回目の試行..."
  solve elements
  if valid?(elements) then
    puts '成功'
    break
  end
  puts "失敗"
}
puts ''
puts 'この文章には'
elements.each{|e|
  puts "#e.name:が#e.value:個"
}
puts '含まれています'