朝日新聞2006年12月8日のパズル横丁問題

問題

▲は2つの整数の大きい方を選択し,▲は小さい方を選択する演算子。以下の計算式の答えは?

5▲(8▼(1▲(4▼□)))

但し□の部分の数字は不明。

解答への道(ヒント)

数字が確定していれば直ぐに計算できるので,取り敢えず□に何か数字を入れて計算してみます。

#include "puzutl.h"

int mi( int x, int y)
{
  return    min(x,y);
}

int ma( int x, int y)
{
  return    max(x,y);
}

int main( int argc, cstring argv[])
{
  for( int i=-100; i< 100; i++) { // □に-100〜100までの数字を割り当てる
    ps( "%d\n", ma(5,mi(8,(ma(1,mi(4,i))))));
  }
  return    0;
}

おー,同じ数字が出力されました。これが答えだって判ったけど,うーん,これで終わりにするのも何だなー。

おいらは一応プログラマーってことだから,演算対象が範囲を持った数字であるとした以下のようなプログラムを作る。

#include "puzutl.h"

class uval {                    // 数値(可能性のある値を最小値,最大値の範囲で持つ)
public:
  uval() {                      // 何も指定しないときは可能性のある最小値,最大値の組み合わせ
    m_min        = INT_MIN;
    m_max        = INT_MAX;
  }
  uval( int val) {              // 値が決まっているので最小値=最大値
    m_min       = val;
    m_max       = val;
  }
  uval( int min, int max) {     // 値が範囲で決まっている
    assert(min<=max);
    m_min       = min;
    m_max       = max;
  }
  int getmin() { return m_min;} // 範囲の最小値を取得する
  int getmax() { return m_max;} // 範囲の最大値を取得する
  int getval() {                // 値を取得する
    if( m_min == m_max) return m_min;
    pe( "Unknown value range %d, %d", m_min, m_max);
    return 0;
  }
private:
  int           m_min;          // 範囲の最小値
  int           m_max;          // 範囲の最大値
};

uval calmin( uval x, uval y)    // 2つの数の小さい方を取得する
{
  return    uval(min(x.getmin(),y.getmin()),
                 min(x.getmax(),y.getmax()));
}

uval calmax( uval x, uval y)    // 2つの数の大きい方を取得する
{
  return    uval(max(x.getmin(),y.getmin()),
                 max(x.getmax(),y.getmax()));
}

int main( int argc, cstring argv[])
{
  ps( "%d\n", calmax(5,calmin(8,(calmax(1,calmin(4,uval()))))).getval()); // uval()は値が不明の場合
  return    0;
}

答えは1件出力されました。

 

小惑星イトカワに続き月探査船でも名前とメッセージを募集しているので早速応募した。

こういうのは夢があっていいなー。

「月に願いを!」って響きも良い。しかし探査船の名前が「selene(セレーネ)」ってのは戴けない。もっと日本的な名前に出来ないのかね。

何年か前に中国の有人宇宙船が打ち上げられたとき「神舟」って名前で,それだけで夢があるなーって思ったものだ。

解速度