|
|
||
d:id:shinichiro_hさんに式を改良出来ると云われて小二三時間、ずーっと考えて漸くできました……何でこんな簡単なことが分からなかったんだろうorz
main=readLn>>=(\a->case a of{0->return();_->print(1+mod(a-1)9)>>main})
で、短くするのはもういいや、と。そしたら答えを乗っけてくれました。
main=readLn>>=(\a->case a of{0->return();_->print(a+9*(div(9-a)9))>>main})
91から74まで一気に節約!でもd:id:shinichiro_hさんは63迄削ったそうです……むーん……。
所謂数字根の問題です。
数字根をとる、というのは、
12 -> 1 + 2 -> 3 35 -> 3 + 5 -> 8 92 -> 9 + 2 -> 11 -> 1 + 1 -> 2
という操作です。要は各位の和を、一桁になるまで計算するわけ。
一般に、数字根は9で割った剰余と同じです。
ただし、9 ≡ 0となってしまうので、9に限って云えばダメですが……。
で、問題は、0が入力されるまで数字根を表示する物です。
では、ソース。
main=getLine>>=(\a->case a of{"0"->return();_->(print$(\n->n+9*(div(9-n)9))$read a)>>main})
9≡0を回避するのに奮闘しました。
肝心のモナド則が抜けていました。なのでメモメモ。