朝日新聞2006年12月8日パズル横丁解答

プログラムの実行結果は以下の通り。

5

□に何を設定しても結果は5になる。

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

プログラムのソースは以下の通り。

#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;
}