fork download
  1. #lang racket
  2.  
  3. (require (only-in srfi/1 unfold)
  4. (only-in math/statistics mean))
  5.  
  6. #| 練習問題 1:
  7. “SPAM”という単語を 10 回表示するプログラムを作成しなさい。 |#
  8. (define one
  9. (case-lambda
  10. ((n)
  11. (for-each display (unfold zero?
  12. (lambda (x) "SPAM\n")
  13. sub1
  14. n)))
  15. (()
  16. (one 10))))
  17.  
  18. #| 練習問題 2
  19. 九九、三の段( 3 ~ 273 の倍数)を表示するプログラムを作成しなさい。 |#
  20. (define two
  21. (case-lambda
  22. ((n)
  23. (for-each display (unfold (lambda (x) (> x 9))
  24. (lambda (x) (format "~a~%" (* n x)))
  25. add1
  26. 1)))
  27. (()
  28. (two 3))))
  29.  
  30. #| 練習問題 3
  31. 21 乗から 8 乗までを計算し表示するプログラムを作成しなさい。 |#
  32. (define three
  33. (case-lambda
  34. ((base power)
  35. (for-each display (unfold (lambda (x) (> x power))
  36. (lambda (x) (format "~a~%" (expt base x)))
  37. add1
  38. 1)))
  39. (()
  40. (three 2 8))))
  41.  
  42. #| 練習問題 4
  43. 7 の階乗を計算し、表示するプログラムを作成しなさい。
  44. ※ 階乗:1 から n までの積。1 × 2 × 3 × ... ×( n - 1 )× n
  45. |#
  46. (define four
  47. (case-lambda
  48. ((n)
  49. (printf "~a~%" (apply * (unfold zero? identity sub1 n))))
  50. (()
  51. (four 7))))
  52.  
  53. #| 練習問題 5
  54. 整数を 10 回入力し、平均値を求めるプログラムを作成しなさい。
  55. ※ 計算は整数で行い、小数点以下は切り捨ててよい。 |#
  56. (define five
  57. (case-lambda
  58. ((n)
  59. (floor (mean (unfold zero? (lambda (x) (read)) sub1 n))))
  60. (()
  61. (five 10))))
  62.  
  63. #| 練習問題 6
  64. 整数、0110 回入力する。これを対戦成績と考え、0 を負け、1 を勝ちとして、勝ちの総数、負けの総数を表示するプログラムを作成しなさい。
  65. |#
  66. (define six
  67. (case-lambda
  68. ((n)
  69. (let ((match-result (unfold zero? (lambda (x) (read)) sub1 n)))
  70. (printf "~a ~a~%" (count (lambda (x) (= x 1)) match-result)
  71. (count zero? match-result))))
  72. (()
  73. (six 10))))
  74.  
  75. #| 練習問題 7
  76. 次のプログラムを作成しなさい。
  77. 巨人、阪神戦で毎回の得点を入力する。(1 回 ~ 9)
  78. 入力が終わったら、それぞれの得点とどちらが勝ったか、引き分けかを表示する。
  79. ※ 試合は巨人の先行とする。
  80. 1回表、巨人の得点は? 0
  81. 1回裏、阪神の得点は? 0
  82. 2回表、巨人の得点は? 0
  83. 2回裏、阪神の得点は? 1
  84. :
  85. :
  86. :
  87. 9回表、巨人の得点は? 0
  88. 9回裏、阪神の得点は? 1
  89.  
  90. 巨人:5, 阪神:6
  91. 阪神の勝ち |#
  92. (define seven
  93. (case-lambda
  94. ((n)
  95. (let* ((games (unfold (lambda (x) (> x n))
  96. (lambda (x)
  97. `(,(begin (printf "~a回表、巨人の得点は?" x)
  98. (read))
  99. ,(begin (printf "~a回裏、阪神の得点は?" x)
  100. (read))))
  101. add1
  102. 1))
  103. (giants (apply + (map car games)))
  104. (tigers (apply + (map cadr games))))
  105. (printf "巨人 ~a点、阪神:~a点~%\t~aの勝ち~%" giants tigers (if (> tigers giants) "阪神" "巨人"))))
  106. (()
  107. (seven 9))))
  108.  
  109. #| 練習問題 8
  110. 自然数(正の整数)10 回入力し、最大値を求めるプログラムを作成しなさい。
  111. |#
  112. (define eight
  113. (case-lambda
  114. ((n)
  115. (apply max (unfold zero? (lambda (x) (read)) sub1 n)))
  116. (()
  117. (eight 10))))
  118.  
  119. #| 練習問題 9
  120. 整数を 10 回入力し、最大値と最小値を求めるプログラムを作成しなさい。 |#
  121. (define nine
  122. (case-lambda
  123. ((n)
  124. (let ((lst (unfold zero? (lambda (x) (read)) sub1 n)))
  125. (values (apply max lst) (apply min lst))))
  126. (()
  127. (nine 10))))
  128.  
  129. #| 練習問題 10
  130. 個数を示す数値を入力し、その個数分だけ‘*’を表示するプログラムを作成しなさい。 |#
  131. (define (ten n)
  132. (for-each display (unfold zero? (lambda (x) "*") sub1 n)))
  133.  
  134. #| 練習問題 11
  135. 個数を示す数値を入力し、その個数分だけ 0 ~ 9 の数字を表示するプログラムを作成しなさい。数字は 0 , 1 , 2 , 3 , , の順に表示し、9 の次は 0 に戻るものとします。
  136. : 14
  137. 01234567890123 |#
  138. (define (eleven n)
  139. (for-each display (unfold (lambda (x) (>= x n))
  140. (lambda (x) (modulo x 10))
  141. add1
  142. 0)))
  143.  
  144. #| 練習問題 12
  145. 10000 より小さい 3 の累乗( 3, 9, 27, , , )をすべて表示するプログラムを作成しなさい。 |#
  146. (define twelve
  147. (case-lambda
  148. ((n d)
  149. (let ((y (floor (/ (log n) (log d)))))
  150. (for-each display (unfold (lambda (x) (> x y))
  151. (lambda (x) (format "~a~%" (expt d x)))
  152. add1
  153. 1))))
  154. (()
  155. (twelve 10000 3))))
  156.  
  157. #| 練習問題 13
  158. 数値を繰り返し入力し、合計が 100 を超えたら入力を止めて合計を表示するプログラムを作成しなさい。 |#
  159. (define thirteen
  160. (case-lambda
  161. ((n)
  162. (let ((i 0))
  163. (printf "~a~%" (last (unfold (lambda (x) (> i n))
  164. (lambda (x) (set! i (+ i (read)))
  165. i)
  166. identity
  167. 0)))))
  168. (()
  169. (thirteen 100))))
  170.  
  171. #| 練習問題 14
  172. ストライク・カウントを数えるプログラムを作成しなさい。
  173. 1球ごとにストライクかボールかを入力する。
  174. 3ストライクまたは4ボールになったら入力を止め、ストライクとボールのカウントを表示する。
  175. ※ ストライクの場合は 1、ボールの場合は 2 を入力する。
  176. ストライク=1 or ボール=2 ?
  177. 1
  178. ストライク=1 or ボール=2 ?
  179. 2
  180. ストライク=1 or ボール=2 ?
  181. 1
  182. ストライク=1 or ボール=2 ?
  183. 1
  184. 1ボール,3ストライク |#
  185. (define (fourteen)
  186. (let ((strike-max 3) (ball-max 4))
  187. (define (foo v)
  188. (println "ストライク=1 or ボール=2 ?")
  189. (let ((i (read)))
  190. (match v
  191. ((vector strike ball)
  192. (vector-set! v (sub1 i) (add1 (vector-ref v (sub1 i))))
  193. v))))
  194. (apply printf "~aボール, ~aストライク~%"
  195. (reverse
  196. (vector->list
  197. (last
  198. (unfold (lambda (x)
  199. (match x
  200. ((vector strike ball)
  201. (or (= strike strike-max)
  202. (= ball ball-max)))))
  203. identity
  204. foo
  205. (foo (vector 0 0)))))))))
  206.  
  207. #| 練習問題 15
  208. 前の問題に次の修正を加えなさい。
  209. 1球ごとにストライク、ボール、ファウルの何れかを入力する。(残念ながらヒットにはなりません)
  210. ファウルの場合、2ストライクまではストライクにカウントするが、3ストライクにはならない。
  211. 3ストライクまたは4ボールになったら入力を止め、ストライクとボールのカウントを表示する。
  212. |#
  213. (define (fifteen)
  214. (let ((strike-max 3) (ball-max 4))
  215. (define (foo v)
  216. (println "ストライク=1 or ボール=2 ?")
  217. (let ((i (read)))
  218. (match v
  219. ((vector strike ball)
  220. (with-handlers ((exn:fail?
  221. (lambda (exn)
  222. (when (< strike 2)
  223. (vector-set! v 0 (add1 (vector-ref v 0))))
  224. v)))
  225. (vector-set! v (sub1 i) (add1 (vector-ref v (sub1 i))))
  226. v)))))
  227. (apply printf "~aボール, ~aストライク~%"
  228. (reverse
  229. (vector->list
  230. (last
  231. (unfold (lambda (x)
  232. (match x
  233. ((vector strike ball)
  234. (or (= strike strike-max)
  235. (= ball ball-max)))))
  236. identity
  237. foo
  238. (foo (vector 0 0)))))))))
  239.  
  240. #| 練習問題 16
  241. 入力された数が素数かどうかを判定するプログラムを作成しなさい。
  242. ※ 判定する数は 4 以上としてよい。 |#
  243. (define (sixteen n)
  244. (= (length (unfold (lambda (x)
  245. (> x n))
  246. (lambda (x)
  247. (if (> (expt x 2) n)
  248. n
  249. x))
  250. (lambda (x)
  251. (let loop ((x x))
  252. (if (zero? (modulo n x))
  253. (add1 x)
  254. (loop (add1 x)))))
  255. 2)) 1))
  256.  
  257. #| 練習問題 17
  258. 2 以上の数値を入力し、素因数分解した結果を表示しなさい。
  259. :
  260. 20100
  261. 2 2 3 5 5 67 |#
  262. (define (seventeen n)
  263. (define (foo x)
  264. (let loop ((x x))
  265. (cond ((and (sixteen x) (zero? (modulo n x)))
  266. (set! n (quotient n x))
  267. x)
  268. (else (loop (add1 x))))))
  269. (for-each (lambda (x)
  270. (printf "~a " x)) (unfold (lambda (x)
  271. (> x (ceiling (sqrt n))))
  272. foo
  273. identity
  274. 2))
  275. (newline))
  276.  
  277. #| 練習問題 18
  278. 九九表(一の段~九の段)を表示するプログラムを作成しなさい。
  279. printf(" %2d", x ); のように、%2d と記述すると表示が 2 桁に揃う。 |#
  280. (define (eighteen)
  281. (display
  282. (string-join
  283. (unfold (lambda (x)
  284. (> (cadr x) 9))
  285. (lambda (x)
  286. (let ((x (car x)) (y (cadr x)))
  287. (format "~a × ~a = ~a~a" x y (* x y) (if (= x 9) "\n" " "))))
  288. (lambda (x)
  289. (let ((x (car x)) (y (cadr x)))
  290. (if (< x 9)
  291. `(,(add1 x) ,y)
  292. `(1 ,(add1 y)))))
  293. '(1 1)) ""))
  294. (newline))
  295.  
  296. #| 練習問題 19
  297. 数値を繰り返して入力し、0 が入力されたら入力を止め、それまでの合計を表示するプログラムを作成しなさい。 |#
  298. (define (nineteen)
  299. (display (apply + (unfold zero?
  300. identity
  301. (lambda (x)
  302. (read))
  303. (read))))
  304. (newline))
  305.  
  306. #| 練習問題 20
  307. 数値を繰り返して入力し、0 が入力されたら入力を止め、平均値を表示するプログラムを作成しなさい。
  308. ※ 計算は整数で行い、小数点以下は切り捨ててよい。
  309. ※ 最後に入力された 0 は平均に含めない。
  310. ※ 少なくとも 1 回は入力が行われるものとする。(最初に 0 を入力してはいけない)
  311. |#
  312. (define (twenty)
  313. (display (floor (mean (unfold zero?
  314. identity
  315. (lambda (x)
  316. (read))
  317. (read)))))
  318. (newline))
  319.  
  320. #| 練習問題 21
  321. サイズを示す数値を入力し、何等かの文字で例のような三角形を表示するプログラムを作成しなさい。
  322. サイズ 4 の例
  323. $
  324. $$
  325. $$$
  326. $$$$ |#
  327. (define (twentyOne n)
  328. (display (string-join (unfold (lambda (x)
  329. (> x n))
  330. (lambda (x)
  331. (string-append (make-string x #\$) "\n"))
  332. add1
  333. 1) "")))
  334.  
  335. #| 練習問題 22
  336. サイズを示す数値を入力し、何等かの文字で、そのサイズの×印を表示するプログラムを作成しなさい。
  337. サイズ 3 の例
  338. X X
  339. X
  340. X X
  341. サイズ 4 の例
  342. X X
  343. XX
  344. XX
  345. X X
  346. サイズ 5 の例
  347. X X
  348. X X
  349. X
  350. X X
  351. X X |#
  352. (define (twentyTwo n)
  353. (display (string-join (unfold (lambda (x)
  354. (> x (sub1 n)))
  355. (lambda (x)
  356. (let ((s (make-string n #\space)))
  357. (string-set! s x #\X)
  358. (string-set! s (- n x 1) #\X)
  359. (string-append s "\n")))
  360. add1
  361. 0) "")))
  362.  
  363. #| 練習問題 23
  364. フィボナッチ数列を表示するプログラムを作成しなさい。
  365. 最初の2つの項を 0、1 とし、1000 まで( 1000 以下の項)を表示するものとします。
  366. ※ フィボナッチ数列:
  367. それぞれの項がその直前の2つの項の和になっている数列のこと。
  368. 例:0, 1, 1, 2, 3, 5, 8, 13, 21, ... |#
  369. (define twentyThree
  370. (case-lambda
  371. ((n) (display (string-join
  372. (unfold (lambda (x)
  373. (> (car x) n))
  374. (lambda (x)
  375. (number->string (car x)))
  376. (lambda (x)
  377. `(,(cadr x) ,(+ (car x) (cadr x))))
  378. '(0 1)) ", "))
  379. (newline))
  380. (()
  381. (twentyThree 1000))))
Success #stdin #stdout 1.13s 127344KB
stdin
Standard input is empty
stdout
Standard output is empty