fkino blog このページをアンテナに追加 RSSフィード

***引っ越しました。引っ越し先はこちら。***

2006-10-22

[]Puzzles for Hackers:スクリプトキディから大人のハッカー16:28 Puzzles for Hackers:スクリプトキディから大人のハッカーへ - fkino blog を含むブックマーク Puzzles for Hackers:スクリプトキディから大人のハッカーへ - fkino blog のブックマークコメント

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

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

[]HINANO TAHITI 16:48 HINANO TAHITI - fkino blog を含むブックマーク HINANO TAHITI - fkino blog のブックマークコメント

日本でこれが飲めるところを発見。嬉しい。\(^_^)/

f:id:fkino:20061015170324j:image

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/fkino/20061022