info

scheme(gauche)で世界のナベアツ問題

3がつく数と3の倍数の時だけアホになる(片仮名になる)それ以外は普通に数字を表示
peercastの大会で課題だったので、っていうか就活の課題やれ俺www

(use srfi-1)
(use srfi-13)

(define (unpack x y)
  (if (= x 0)
      y
      (unpack (quotient x 10) (append  (list (modulo x 10)) y))))

(define (3baisu? x) (= (modulo x 3) 0))

(define (3gatuku? x)
  (any (lambda (i) (= i 3)) (unpack x '())))

(define (senkurai x)
  "セン")

(define (hyakukurai x)
  (ref '( ""  "ヒャク"  "ニヒャク" "サンビャク" "ヨンヒャク" "ゴヒャク" "ロッピャク" "ナナヒャク" "ハッピャク" "キュウヒャク") x))

(define (jukurai x)
  (ref '( "" "ジュウ" "ニジュウ" "サンジュウ" "ヨンジュウ" "ゴジュウ" "ロクジュウ" "ナナジュウ" "ハチジュウ" "キュウジュウ") x))

(define (ichikurai x)
  (ref '( "" "イチ" "ニ" "サン" "ヨン" "ゴ" "ロク" "ナナ" "ハチ" "キュウ") x))

(define func  `(() ,ichikurai ,jukurai ,hyakukurai ,senkurai))

(define (tokatakana x)
  (let loop ((lis (unpack x '())) (kana ""))
    (if (= (length lis) 0)
	kana
	(loop (cdr lis) (string-append kana ((ref func (length lis)) (car lis)))))))
		    

(for-each print (map (lambda (x)
		       (if (or (3baisu? x) (3gatuku? x))
			   (string-append (tokatakana x) "!")
			   x))
		       (iota 1000 1 1)))


出力の最後のほう

950
キュウヒャクゴジュウイチ!
952
キュウヒャクゴジュウサン!
キュウヒャクゴジュウヨン!
955
956
キュウヒャクゴジュウナナ!
958
959
キュウヒャクロクジュウ!
961
962
キュウヒャクロクジュウサン!
964
965
キュウヒャクロクジュウロク!
967
968
キュウヒャクロクジュウキュウ!
970
971
キュウヒャクナナジュウニ!
キュウヒャクナナジュウサン!
974
キュウヒャクナナジュウゴ!
976
977
キュウヒャクナナジュウハチ!
979
980
キュウヒャクハチジュウイチ!
982
キュウヒャクハチジュウサン!
キュウヒャクハチジュウヨン!
985
986
キュウヒャクハチジュウナナ!
988
989
キュウヒャクキュウジュウ!
991
992
キュウヒャクキュウジュウサン!
994
995
キュウヒャクキュウジュウロク!
997
998
キュウヒャクキュウジュウキュウ!
1000