Puzzles for Hackers:スクリプトキディから大人のハッカーへ
頭の体操。なかなか面白いです。
Puzzles for Hackers:スクリプトキディから大人のハッカーへ (IT Architects' Archive 知の連環)
- 作者: イワン・スクリャロフ,鷹跣搗汯
- 出版社/メーカー: 翔泳社
- 発売日: 2006/08/29
- メディア: 単行本(ソフトカバー)
- 購入: 1人 クリック: 81回
- この商品を含むブログ (28件) を見る
下記の問題をいとも簡単に解ける人は本書は必要ありません。
とかって煽られたので、「ハッカーの覆面算」というのをやってみました。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