Puzzles for Hackers:スクリプトキディから大人のハッカーへ

頭の体操。なかなか面白いです。

Puzzles for Hackers:スクリプトキディから大人のハッカーへ (IT Architects' Archive 知の連環)

Puzzles for Hackers:スクリプトキディから大人のハッカーへ (IT Architects' Archive 知の連環)

下記の問題をいとも簡単に解ける人は本書は必要ありません。

とかって煽られたので、「ハッカーの覆面算」というのをやってみました。Rubyで。
構想30分、製作30分、あとは1時間くらいネチネチとリファクタリングしてました。これはいとも簡単に解けたことになるんやろうか?
まだやってなくてこれからやろうとしている人には、以下ネタバレありなので、ご注意ください。


効率は悪いですが、この本に載っている解答みたいにネストが深くなるのが嫌だったのでこうしてます。
C言語でやると各桁が異なる数字かどうかのチェックでifの条件が&&のオバケになるのですが、RubyはArray#uniq!を使えば楽ですね。

こんな感じ。

#!/usr/bin/env ruby

# HACKER + HACKER + HACKER = ENERGY

module Place
  def place n
    self / n % 10
  end

  def place2 nn
    self / nn % 100
  end
end

class Integer
  include Place
end

module Uniq
  def uniq?
    size = self.size
    self.uniq!
    self.size == size
  end
end

class Array
  include Uniq
end

(300000..999999).each do |energy|
  e = energy.place(100000)
  e2 = energy.place(1000)
  next unless e == e2
  n = energy.place(10000)
  r = energy.place(100)
  g = energy.place(10)
  y = energy.place(1)
  next unless [e, n, r, g, y].uniq?
  next unless energy % 3 == 0
  hacker = energy / 3
  next unless hacker.place2(1) == energy.place2(100)
  h = hacker.place(100000)
  a = hacker.place(10000)
  c = hacker.place(1000)
  k = hacker.place(100)
  next unless [e, n, r, g, y, h, a, c, k].uniq?
  puts "------"
  puts "HACKER", hacker
  puts "ENERGY", energy
  puts "------"
end