99の一覧

30分プログラム、その441。99の一覧を出力してみる。
どう書く.orgで、これと同じ出力をするプログラムを0-9の数字をソースコードに入力せずに作れ、という問題が出たといううわさを聞いた気がする。どうやるんだろう?チャーチ数的なことかな?
それを30分でやるのは無理なので、普通に0-9の数字を使って99の表を出力するプログラムを書いてみた。

使い方

$ gosh 9x9.scm
 1  2  3  4  5  6  7  8  9
 2  4  6  8 10 12 14 16 18
 3  6  9 12 15 18 21 24 27
 4  8 12 16 20 24 28 32 36
 5 10 15 20 25 30 35 40 45
 6 12 18 24 30 36 42 48 54
 7 14 21 28 35 42 49 56 63
 8 16 24 32 40 48 56 64 72
 9 18 27 36 45 54 63 72 81

ソースコード

#! /opt/local/bin/gosh
;; -*- mode:scheme; coding:utf-8 -*-
;;
;; 9x9.scm -
;;
(use srfi-1)

(define (map-map f xs ys)
  (map (lambda (x) (map (cut f x <>) ys))
       xs))

(define (products xs ys)
  (map-map * xs ys))

(let1 digits (iota 9 1)
  (map
   (lambda (row)
     (print (string-join (map (cut format "~2d" <>) row)
			 " ")))
   (products digits digits)))