fork download
  1. #!/usr/bin/env python3
  2.  
  3. ### 余再帰
  4. class unfoldr:
  5. def __init__(self, f, seed):
  6. self.f = f
  7. self.seed = seed
  8. def __iter__(self):
  9. return self
  10. def __next__(self):
  11. match self.f(self.seed):
  12. case a, b:
  13. self.seed = b
  14. return a
  15. case None:
  16. raise StopIteration
  17.  
  18. ## 練習問題 1:
  19. ## “SPAM”という単語を 10 回表示するプログラムを作成しなさい。
  20. def one(n = 10):
  21. print(''.join(unfoldr(lambda x: None if x == 0 else ('SPAM\n', x - 1), n)))
  22.  
  23. ## 練習問題 2
  24. ## 九九、三の段( 3 ~ 27 の 3 の倍数)を表示するプログラムを作成しなさい。
  25. def two(n = 3):
  26. print(''.join(unfoldr(lambda x: None if x > 9 else (f'{n * x}\n', x + 1), 1)))
  27.  
  28. ## 練習問題 3
  29. ## 2 の 1 乗から 8 乗までを計算し表示するプログラムを作成しなさい。
  30. def three(base = 2, power = 8):
  31. print(''.join(unfoldr(lambda x: None if x > power else (f'{base ** x}\n', x + 1), 1)))
  32.  
  33. ## 練習問題 4
  34. ## 7 の階乗を計算し、表示するプログラムを作成しなさい。
  35. ## ※ 階乗:1 から n までの積。1 × 2 × 3 × … ×( n - 1 )× n
  36. def four(n = 7):
  37. from functools import reduce
  38. print(reduce(lambda x, y: x * y, unfoldr(lambda x: None if x == 0 else (x, x - 1), n)))
  39.  
  40. ## 練習問題 5
  41. ## 整数を 10 回入力し、平均値を求めるプログラムを作成しなさい。
  42. ## ※ 計算は整数で行い、小数点以下は切り捨ててよい。
  43. def five(n = 10):
  44. from statistics import mean
  45. from math import floor
  46. return floor(mean(unfoldr(lambda x: None if x == 0 else (int(input()), x - 1), n)))
  47.  
  48. ## 練習問題 6
  49. ## 整数、0 か 1 を 10 回入力する。これを対戦成績と考え、0 を負け、1 を勝ちとして、勝ちの総数、負けの総数を表示するプログラムを作成しなさい。
  50. def six(n = 10):
  51. match_results = list(unfoldr(lambda x: None if x == 0 else(int(input()), x - 1), n))
  52. print(match_results.count(1), match_results.count(0))
  53.  
  54. ## 練習問題 7
  55. ## 次のプログラムを作成しなさい。
  56. ## 巨人、阪神戦で毎回の得点を入力する。(1 回 ~ 9 回)
  57. ## 入力が終わったら、それぞれの得点とどちらが勝ったか、引き分けかを表示する。
  58. ## ※ 試合は巨人の先行とする。
  59. ## 1回表、巨人の得点は? 0
  60. ## 1回裏、阪神の得点は? 0
  61. ## 2回表、巨人の得点は? 0
  62. ## 2回裏、阪神の得点は? 1
  63. ## :
  64. ## :
  65. ## :
  66. ## 9回表、巨人の得点は? 0
  67. ## 9回裏、阪神の得点は? 1
  68. ##
  69. ## 巨人:5点, 阪神:6点
  70. ##    阪神の勝ち
  71. def seven(n = 9):
  72. games = unfoldr(lambda x: None if x > n else
  73. ((int(input(f'{x}回表、巨人の得点は?')),
  74. int(input(f'{x}回裏、阪神の得点は?'))),
  75. x + 1), 1)
  76. giants, tigers = [sum(i) for i in zip(*games)]
  77. print(f'巨人: {giants}点, 阪神: {tigers}点\n\t{'阪神' if tigers > giants else '巨人'}の勝ち')
  78.  
  79. ## 練習問題 8
  80. ## 自然数(正の整数)を 10 回入力し、最大値を求めるプログラムを作成しなさい。
  81. def eight(n = 10):
  82. return max(unfoldr(lambda x: None if x == 0 else(int(input()), x - 1), n))
  83.  
  84. ## 練習問題 9
  85. ## 整数を 10 回入力し、最大値と最小値を求めるプログラムを作成しなさい。
  86. def nine(n = 10):
  87. lst = list(unfoldr(lambda x: None if x == 0 else (int(input()), x - 1), n))
  88. return max(lst), min(lst)
  89.  
  90. ## 練習問題 10
  91. ## 個数を示す数値を入力し、その個数分だけ‘*’を表示するプログラムを作成しなさい。
  92. def ten(n):
  93. print(''.join(unfoldr(lambda x: None if x == 0 else ('*', x - 1), n)))
  94.  
  95. ## 練習問題 11
  96. ## 個数を示す数値を入力し、その個数分だけ 0 ~ 9 の数字を表示するプログラムを作成しなさい。数字は 0 , 1 , 2 , 3 , , の順に表示し、9 の次は 0 に戻るものとします。
  97. def eleven(n):
  98. print(''.join(unfoldr(lambda x: None if x >= n else(str(x % 10), x + 1), 0)))
  99.  
  100. ## 練習問題 12
  101. ## 10000 より小さい 3 の累乗( 3, 9, 27, , , )をすべて表示するプログラムを作成しなさい。
  102. def twelve(n = 10000, d = 3):
  103. from math import floor, log
  104. y = floor(log(n) / log(d))
  105. print(''.join(unfoldr(lambda x: None if x > y else (f'{d ** x}\n', x + 1), 1)))
  106.  
  107. ## 練習問題 13
  108. ## 数値を繰り返し入力し、合計が 100 を超えたら入力を止めて合計を表示するプログラムを作成しなさい。
  109. def thirteen(n = 100):
  110. print(sum(unfoldr(lambda x: None if x > n else (x, x + int(input())), int(input()))))
  111.  
  112. ## 練習問題 14
  113. ## ストライク・カウントを数えるプログラムを作成しなさい。
  114. ## 1球ごとにストライクかボールかを入力する。
  115. ## 3ストライクまたは4ボールになったら入力を止め、ストライクとボールのカウントを表示する。
  116. ## ※ ストライクの場合は 1、ボールの場合は 2 を入力する。
  117. ## ストライク=1 or ボール=2 ?
  118. ## 1
  119. ## ストライク=1 or ボール=2 ?
  120. ## 2
  121. ## ストライク=1 or ボール=2 ?
  122. ## 1
  123. ## ストライク=1 or ボール=2 ?
  124. ## 1
  125. ## 1ボール,3ストライク
  126. def fourteen():
  127. strike_max, ball_max = 3, 4
  128. def foo(lst):
  129. lst[int(input('ストライク=1 or ボール=2 ?\n')) - 1] += 1
  130. return lst
  131. print('{1}ボール, {0}ストライク'.format(*list(unfoldr(lambda x: None if x[0] == strike_max or x[1] == ball_max else (x, foo(x)), foo([0, 0])))[-1]))
  132.  
  133. ## 練習問題 15
  134. ## 前の問題に次の修正を加えなさい。
  135. ## 1球ごとにストライク、ボール、ファウルの何れかを入力する。(残念ながらヒットにはなりません)
  136. ## ファウルの場合、2ストライクまではストライクにカウントするが、3ストライクにはならない。
  137. ## 3ストライクまたは4ボールになったら入力を止め、ストライクとボールのカウントを表示する。
  138. def fifteen():
  139. strike_max, ball_max = 3, 4
  140. def foo(lst):
  141. try:
  142. lst[int(input('ストライク=1 or ボール=2 ?\n')) - 1] += 1
  143. except IndexError:
  144. if lst[0] < 2:
  145. lst[0] += 1
  146. finally:
  147. return lst
  148. print('{1}ボール, {0}ストライク'.format(*list(unfoldr(lambda x: None if x[0] == strike_max or x[1] == ball_max else (x, foo(x)), foo([0, 0])))[-1]))
  149.  
  150. ## 練習問題 16
  151. ## 入力された数が素数かどうかを判定するプログラムを作成しなさい。
  152. ## ※ 判定する数は 4 以上としてよい。
  153. def sixteen(n):
  154. def foo(x):
  155. nonlocal n
  156. if x > n:
  157. return None
  158. else:
  159. while n % x != 0:
  160. x += 1
  161. return (n if x ** 2 > n else x, x + 1)
  162. return len(list(unfoldr(foo, 2))) == 1
  163.  
  164. ## 練習問題 17
  165. ## 2 以上の数値を入力し、素因数分解した結果を表示しなさい。
  166. ## 例:
  167. ## 20100
  168. ## 2 2 3 5 5 67
  169. def seventeen(n):
  170. from math import sqrt, ceil
  171. def foo(x):
  172. nonlocal n
  173. if x > ceil(sqrt(n)):
  174. return None
  175. else:
  176. while True:
  177. if sixteen(x) and n % x == 0:
  178. n /= x
  179. return (f'{x} ', x)
  180. x += 1
  181. return print(''.join(unfoldr(foo, 2)))
  182.  
  183. ## 練習問題 18
  184. ## 九九表(一の段~九の段)を表示するプログラムを作成しなさい。
  185. ## ※ printf(" %2d", x ); のように、%2d と記述すると表示が 2 桁に揃う。
  186. def eighteen():
  187. print(''.join(unfoldr(lambda x: None if x[1] > 9 else
  188. (f'{x[0]:2} × {x[1]:2} = {x[0] * x[1]:2}{"\n" if x[0] == 9 else " "}',
  189. (x[0] + 1, x[1]) if x[0] < 9 else (1, x[1] + 1)), (1, 1))))
  190.  
  191. ## 練習問題 19
  192. ## 数値を繰り返して入力し、0 が入力されたら入力を止め、それまでの合計を表示するプログラムを作成しなさい。
  193. def nineteen():
  194. print(sum(unfoldr(lambda x: None if x == 0 else (x, int(input())), int(input()))))
  195.  
  196. ## 練習問題 20
  197. ## 数値を繰り返して入力し、0 が入力されたら入力を止め、平均値を表示するプログラムを作成しなさい。
  198. ## ※ 計算は整数で行い、小数点以下は切り捨ててよい。
  199. ## ※ 最後に入力された 0 は平均に含めない。
  200. ## ※ 少なくとも 1 回は入力が行われるものとする。(最初に 0 を入力してはいけない)
  201. def twenty():
  202. from statistics import mean
  203. from math import floor
  204. print(floor(mean(list(unfoldr(
  205. lambda x: None if x == 0 else (x, int(input())), int(input()))))))
  206.  
  207. ## 練習問題 21
  208. ## サイズを示す数値を入力し、何等かの文字で例のような三角形を表示するプログラムを作成しなさい。
  209. ## サイズ 4 の例
  210. ## $
  211. ## $$
  212. ## $$$
  213. ## $$$$
  214. def twentyOne(n):
  215. print(''.join(unfoldr(lambda x: None if x > n else ('$' * x + '\n', x + 1), 1)))
  216.  
  217. ## 練習問題 22
  218. ## サイズを示す数値を入力し、何等かの文字で、そのサイズの×印を表示するプログラムを作成しなさい。
  219. ## サイズ 3 の例
  220. ## X X
  221. ##  X
  222. ## X X
  223. ## サイズ 4 の例
  224. ## X  X
  225. ##  XX
  226. ##  XX
  227. ## X  X
  228. ## サイズ 5 の例
  229. ## X   X
  230. ##  X X
  231. ##   X
  232. ##  X X
  233. ## X   X
  234. def twentyTwo(n):
  235. print(''.join(unfoldr(lambda x: None if x > n - 1 else
  236. (''.join(unfoldr(lambda i: None if i > n else
  237. ('X' if i == x or i == n - x - 1 else ' ', i + 1), 0)) + '\n', x + 1), 0)))
  238.  
  239. ## 練習問題 23
  240. ## フィボナッチ数列を表示するプログラムを作成しなさい。
  241. ## 最初の2つの項を 0、1 とし、1000 まで( 1000 以下の項)を表示するものとします。
  242. ## ※ フィボナッチ数列:
  243. ##  それぞれの項がその直前の2つの項の和になっている数列のこと。
  244. ## 例:0, 1, 1, 2, 3, 5, 8, 13, 21, ...
  245. def twentyThree(n = 1000):
  246. print(', '.join(unfoldr(lambda x: None if x[0] > n else (f'{x[0]}', (x[1], x[0] + x[1])), (0, 1))))
  247. if __name__ == '__main__':
  248. ## one()
  249. ## two()
  250. ## three()
  251. ## four()
  252. ## print(five())
  253. ## six()
  254. ## seven()
  255. ## print(eight())
  256. ## print('{} {}'.format(*nine()))
  257. ## ten(int(input()))
  258. ## eleven(int(input()))
  259. ## twelve()
  260. ## thirteen()
  261. ## fourteen()
  262. ## fifteen()
  263. ## print(sixteen(int(input())))
  264. ## seventeen(20100)
  265. ## eighteen()
  266. ## nineteen()
  267. ## twenty()
  268. ## twentyOne(4)
  269. ## [twentyTwo(i) for i in (3, 4, 5)]
  270. twentyThree()
  271.  
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
compilation info
Traceback (most recent call last):
  File "/usr/lib/python3.9/py_compile.py", line 144, in compile
    code = loader.source_to_code(source_bytes, dfile or file,
  File "<frozen importlib._bootstrap_external>", line 918, in source_to_code
  File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed
  File "./prog.py", line 11
    match self.f(self.seed):
          ^
SyntaxError: invalid syntax

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/usr/lib/python3.9/py_compile.py", line 150, in compile
    raise py_exc
py_compile.PyCompileError:   File "./prog.py", line 11
    match self.f(self.seed):
          ^
SyntaxError: invalid syntax

stdout
Standard output is empty