病室番号問題

id:yorutrain:20080524:p7系由で知った問題。

『2001年 ソフトウェア開発 問1』
500の病室をもつA病院では,病室の番号として001から順に3けたの番号を割り当てている。ただし,どのけたにも4と9の数字を使用しないことになっている。
この病院の125番目の病室の番号はどれか。
ア 150  イ 166  ウ 175  エ 186

http://d.hatena.ne.jp/e_c_e_t/20080419

恐らく題意としては、4と9を除くということが実質的に8進数でカウントすることと同じであるということに気付くか否かを測るものだと思う。つまり、0から7のかわりに{0, 1, 2, 3, 5, 6, 7, 8}の8個を使った8進数にすれば答えとなる。
試験を受けようという人なら基数変換くらいは出来るはずだが、こういった問題に応用できるかどうかは別問題なわけで、試験問題作成者のセンスの良さを感じた。
プログラミングの練習課題としても面白い。試みにScheme(Gauche)で解いてみた。

(use srfi-1)

(define (room-number n)
  (fold
   (lambda(e r)(+ (* r 10) (vector-ref '#(0 1 2 3 5 6 7 8) e)))
   0
   (unfold-right zero? (cut modulo <> 8) (cut quotient <> 8) n)))

(display
 (room-number 125))

ついでにCでも。

#include <stdio.h>

int room_number(int number) {
  int answer=0;
  for(int column=1; number>0; number/=8, column*=10)
    answer+=(int[]){0,1,2,3,5,6,7,8}[number%8]*column;
  return answer;
}

int main(void) {
  printf("%d\n", room_number(125));
  return 0;
}

Document ID: 00d54365158a8993dee32181410af419