
pythonããã°ã©ã ã®åæ©ïŒïŒïŒïŒæŒç¿ïŒãžã§ãŒã¯çŽåãèŠã€ããã
pythonããã°ã©ã ã®åæ©ïŒïŒ
ïŒæŒç¿ïŒãžã§ãŒã¯çŽåãèŠã€ããã
ããã«ã¡ã¯makokonã§ããåå¿è
åãpythonããã°ã©ã ã®æéã«ããããã
仿¥ã¯ãæŒç¿ãœããç°¡åãªããã°ã©ã ãããšã©ãŒããªãããããåäœãæ¹åããªãããããã°ã©ã ãã©ãå€åããŠããã®ããèŠãŠãããŸããããåç« ã®ã¿ã€ãã«ãæŒç¿ãœããªã£ãŠããŸãã
仿¥ã®ãé¡ã¯ããžã§ãŒã¯çŽåã§ãããªã«ããïŒããŸããæ¬åœã«ãããªååãªã®ãç¥ããŸãããã詊ããŠã¿ãŸãããã
ãžã§ãŒã¯çŽåãšã¯
äŸã«ãã£ãŠãnoteã®ãã¿ã«ãªããããªé¢çœãç»åããªãããªããšSNSãèŠãŠãããšãããŸãããã
ããããã®ç»åã§ãããŸãã«ãžã§ãŒã¯çŽåã忝ãšååã«åãæ°åããããšãã®æ°åã忝ãšååããåãé€ãåŠçã§ãããããŠãäžæè°ãªããšã«çµæã¯æ£ãããïŒæ³šæãçµæãæ£ããã®ã¯å¶ç¶ã§ããç®æ°ã®å匷äžã®äººããæè²é¢ä¿è
ã®äººã¯æ±ºããŠäœ¿ããªãã§ãã ããïŒ
ãšã«ããé¢çœãæ°åã§ãããã®ãžã§ãŒã¯çŽåãèŠã€ããããã°ã©ã ãæžããŠã¿ãããã¡ãã£ãšèããŠã¿ãŠããããããªåŠçãå¿
èŠããã§ãã

https://x.com/Pajoca_/status/1863163347396694264
å çæ¿ããã«ãªãçŽå(ãã ãæç«)
課é¡ããžã§ãŒã¯çŽåãèŠã€ããããã°ã©ã ãæžããªããã
ã§ã¯ãé çªã«é²ããŠã¿ãŸãããã
ãžã§ãŒã¯çŽåã®ç¹åŸŽ
ãŸããç®çãšãããžã§ãŒã¯çŽåã®ç¹åŸŽãæ£ããèªèããŸãããã
ç¹åŸŽãšããŠã¯ã
ååãšåæ¯ã®æ°åãèŠãŠãåãæ°åãæ¶ããŠïŒåé€ããŠïŒæ®ã£ãæ°åã§æ°ããåæ°ãäœã£ãŠããŸã
å¶ç¶ã«ãããã®çµæãæ£ããçŽåçµæãšäžèŽããŠããŸã
忝ãšååã¯ïŒïŒä»¥äžã®æŽæ°
忝ã¯ååãã倧ããã
äŸãã°ã742/424 ã®å Žåãèãããš
42(4ãš2)ãæ¶ããš 742/424 -> 7/4 ãšãªãããããå®éã®çŽåçµæãšäžèŽããŸãã
ããšãããã°ã©ã ã®éœåäžã§ãããïŒãšïŒã®æ¡ä»¶ãä»ãå ããŠãããŸãã
課é¡ïŒïŒã忝ãïŒïŒããïŒïŒïŒïŒãŸã§å€åãããšãã®ãžã§ãŒã¯çŽåãèŠã€ããªããã
æ¢çŽ¢ã¢ã«ãŽãªãºã ã¯ã©ãããŸããããïŒãšããããããããªæãã§
æå®ãããç¯å²å ã®åæ°ãçæ
ååãšåæ¯ã®å ±éã®æ°åãèŠã€ãã
ãã®æ°åãåé€ããæ°ããåæ°ãäœæ
å ã®åæ°ã®å€ãšæ°ããåæ°ã®å€ãäžèŽãããã®ãæœåº
ãã¯ããã¯ãšããŠã¯ã忝ãšååãïŒéã«ãŒãã§å€åãããŠå
ã®åæ°ãäœãã
忝ãšååãæååã«å€ããŠãå
±éã®æåããã£ããåãé€ãã
åã³æ°åã«æ»ããŠå²ãç®ããã
å
ã®åæ°ãšãã®çµæãäžèŽåžãã°ãå
ã®åæ¯ååã®çµã¿åããããžã§ãŒã¯åæ°ãšããŠç»é²ãã
ãšããæé ã§ã§ãããã§ããã
課é¡ïŒïŒâããïŒåç®ã®çããlesson16-0.py
ãã£ãã®æ¹éã«åŸã£ãŠãäœã£ãŠã¿ãŸããã
def find_joke_fractions(max_num=10000):
results = []
for numerator in range(10, max_num):
for denominator in range(10, max_num):
if numerator >= denominator:
continue
# æ¬æ¥ã®åæ°ã®å€
true_value = numerator / denominator
# æ°åãæååãšããŠåŠç
num_str = str(numerator)
den_str = str(denominator)
# å
±éã®æ°åãèŠã€ãã
common_digits = set(num_str) & set(den_str)
for digit in common_digits:
# æ°åãåé€ããæ°ããæååãäœæ
new_num = int(''.join(c for c in num_str if c != digit))
new_den = int(''.join(c for c in den_str if c != digit))
# 0ã«ããé€ç®ãé²ã
if new_den == 0:
continue
# æ°ããåæ°ã®å€ãèšç®
joke_value = new_num / new_den
# å
ã®å€ãšäžèŽããå Žå
if abs(true_value - joke_value) < 1e-10:
results.append((numerator, denominator, new_num, new_den))
return results
# å®è¡äŸ
results = find_joke_fractions(1000)
for n, d, new_n, new_d in results:
print(f"{n}/{d} = {new_n}/{new_d}")課é¡ïŒïŒâããïŒåç®ã®çãã®çµæ
$ python lesson16-0.py
Traceback (most recent call last):
File "lesson16-0.py", line 38, in <module>
results = find_joke_fractions(1000)
^^^^^^^^^^^^^^^^^^^^^^^^^
File "lesson16-0.py", line 22, in find_joke_fractions
new_den = int(''.join(c for c in den_str if c != digit))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
ValueError: invalid literal for int() with base 10: ''ãã£ãšããããªããšã©ãŒã§ããã
ValueError: invalid literal for int() with base 10: ''
å
±éã®æåãåãé€ããããæååã空ã«ãªã£ãŠãæ°åã«æ»ããªããªã£ãããã§ãã
察çããŸãããã
課é¡ïŒïŒâãïŒåç®ãç©ºã®æåå察çãããªãããlesson16-1.py
空æååãã§ãã¯ã远å ïŒ`if not new_num_str or not new_den_str`ïŒ
äŸå€åŠçã远å ïŒtry-exceptïŒ
ç®çã®æååã空ãã©ããã¯ãæååã®é·ãããã§ãã¯ããŠãããã§ãããIFã®ããšåã«å€æ°ãæžããŠããã§ãã¯ã§ããŸãã
ã€ãã§ã«ãä»åŸãè²ã
远å ããããªã®ã§ïŒtry-exceptïŒã䜿ã£ãŠãäž»èŠãªåŠçã§ããšã©ãŒã®äŸå€åŠçãã§ããããã«ããŠãããŸãããã
0ã§ã®é€ç®ãªã©ã®ãã§ãã¯ãšäžŠã¹ãŠãããŠããããããã§ããã
def find_joke_fractions(max_num=10000):
results = []
for numerator in range(10, max_num):
for denominator in range(10, max_num):
if numerator >= denominator:
continue
# æ¬æ¥ã®åæ°ã®å€
true_value = numerator / denominator
# æ°åãæååãšããŠåŠç
num_str = str(numerator)
den_str = str(denominator)
# å
±éã®æ°åãèŠã€ãã
common_digits = set(num_str) & set(den_str)
for digit in common_digits:
try:
# æ°åãåé€ããæ°ããæååãäœæ
new_num_str = ''.join(c for c in num_str if c != digit)
new_den_str = ''.join(c for c in den_str if c != digit)
# 空æååãã§ãã¯
if not new_num_str or not new_den_str:
continue
new_num = int(new_num_str)
new_den = int(new_den_str)
# 0ã«ããé€ç®ãé²ã
if new_den == 0:
continue
# æ°ããåæ°ã®å€ãèšç®
joke_value = new_num / new_den
# å
ã®å€ãšäžèŽããå Žå
if abs(true_value - joke_value) < 1e-10:
results.append((numerator, denominator, new_num, new_den))
except:
continue
return results
# å®è¡äŸ
results = find_joke_fractions(1000) # ç¯å²ãå°ããããŠè©Šã
for n, d, new_n, new_d in results:
print(f"{n}/{d} = {new_n}/{new_d}")課é¡ïŒïŒâãïŒåç®ãlesson16-1.pyã®çµæ
$ python lesson16-1.py
10/20 = 1/2
10/30 = 1/3
10/40 = 1/4
10/50 = 1/5
10/60 = 1/6
10/70 = 1/7
10/80 = 1/8
10/90 = 1/9
10/110 = 1/11
10/120 = 1/12
10/130 = 1/13
10/140 = 1/14
以äžç¥ããšã©ãŒãæ¶ããŠåããŸããã
ãããã
10/90 = 1/9
10/110 = 1/11
10/120 = 1/1
ãããªãã¿ãŒã³ãã£ããã§ãã忝ååããæ«å°Ÿã®ïŒãåãé€ããããã©ã¡ããïŒïŒã§å²ã£ãçµæãšåãã§ãããã
å®ã«ã€ãŸãããããã¯ãžã§ãŒã¯ã«ãªã£ãŠããªãã
ãããªãã¿ãŒã³ã¯å¿
èŠãããŸããã
課é¡ïŒïŒâãïŒåç®ãæ«å°ŸãïŒã®ã±ãŒã¹ãåãé€ããªãããlesson16-2.py
ããã¯ç°¡åã§ããã 忝ãšååã®æååã®æ«å°ŸãïŒã®å Žåããã§ãã¯ãããã§ãã
if digit == '0' and (num_str.endswith('0') or den_str.endswith('0')):
continue
å
šéšã®ã³ãŒããæç€ºãããŸã§ããªãã®ã§ããããããŸãããã
def find_joke_fractions(max_num=10000):
results = []
for numerator in range(10, max_num):
for denominator in range(10, max_num):
if numerator >= denominator:
continue
# æ¬æ¥ã®åæ°ã®å€
true_value = numerator / denominator
# æ°åãæååãšããŠåŠç
num_str = str(numerator)
den_str = str(denominator)
# å
±éã®æ°åãèŠã€ãã
common_digits = set(num_str) & set(den_str)
for digit in common_digits:
# æ«å°Ÿã®0ã®å Žåã¯ã¹ããã
if digit == '0' and (num_str.endswith('0') or den_str.endswith('0')):
continue
try:
# æ°åãåé€ããæ°ããæååãäœæ
new_num_str = ''.join(c for c in num_str if c != digit)
new_den_str = ''.join(c for c in den_str if c != digit)
# 空æååãã§ãã¯
if not new_num_str or not new_den_str:
continue
new_num = int(new_num_str)
new_den = int(new_den_str)
# 0ã«ããé€ç®ãé²ã
if new_den == 0:
continue
# æ°ããåæ°ã®å€ãèšç®
joke_value = new_num / new_den
# å
ã®å€ãšäžèŽããå Žå
if abs(true_value - joke_value) < 1e-10:
results.append((numerator, denominator, new_num, new_den))
except:
continue
return results
# å®è¡äŸ
results = find_joke_fractions(1000)
for n, d, new_n, new_d in results:
print(f"{n}/{d} = {new_n}/{new_d}")課é¡ïŒïŒâãïŒåç®ãlesson16-2.pyã®å®è¡çµæ
å®è¡çµæã§ãã
$ python lesson16-2.py
åç¥
149/298 = 14/28
149/596 = 14/56
149/894 = 14/84
154/253 = 14/23
154/352 = 14/32
154/451 = 14/41
156/858 = 16/88
159/795 = 15/75
åŸç¥ïŒïŒã§ããã±ãŒã¹ã¯ãé€å€ã§ããŠããŸãã
åãæåãåãé€ããŠããã¯ã¢ããããæåã®åé¡ã¯ã¯ãªã¢ã§ãããããããŸãããããã§èª²é¡ïŒïŒã¯ã¯ãªã¢ããããšã«ããŸãããã
課é¡ïŒïŒãïŒæ¡ä»¥äžã®æ°åã®åãé€ãã«å¯Ÿå¿ããªããã
ãã£ãã®çµæãããèŠããšããŸã ãŸã äžååã ãšæããŸãã
æãéèŠãªã®ã¯ãäŸç€ºãããããªïŒïŒïŒïŒïŒïŒïŒïŒïŒïŒïŒïŒïŒïŒïŒãªã©ã®äºäŸãå«ãŸããŸãããé©åœãªå Žæã®ïŒæ¡ä»¥äžã®ç°ãªã£ãæ°åãåãé€ããŠãæç«ãããããããé©ããšç¬ããåŸããããšæããŸãã
ããããã°ãã£ããŸã§ã¯å
±éã®æåãæ¢ããŠæ¶ããŠããã ãã§ãããã
課é¡ïŒïŒâãé£ç¶ããïŒã€ä»¥äžã®æ°åãåæã«æ¶ããªãããlesson16-3.py
ä¿ç¶é£æåºŠãäžãããŸããããããããåŠçã«ã¯ãããªãã®ãã¯ããã¯ãããã®ã§ãããä»åã®åŠçã¯åããã§ãã
ã€ãŸããå
ã®æååãã2æå以äžã®éšåæååãåãåºããŠãçžæ¹ã®åãé·ãã®éšåæååãšçã£ç«¯ããæ¯èŒããããšã«ããŸãã
def find_joke_fractions(max_num=10000):
results = []
for numerator in range(10, max_num):
for denominator in range(10, max_num):
if numerator >= denominator:
continue
# æ¬æ¥ã®åæ°ã®å€
true_value = numerator / denominator
# æ°åãæååãšããŠåŠç
num_str = str(numerator)
den_str = str(denominator)
# å
±éã®é£ç¶ããéšåæååãæ¢ã
for length in range(2, min(len(num_str), len(den_str)) + 1):
for i in range(len(num_str) - length + 1):
num_part = num_str[i:i+length]
# æ«å°Ÿã®0ãå«ããã¿ãŒã³ã¯é€å€
if num_part.endswith('0'):
continue
for j in range(len(den_str) - length + 1):
den_part = den_str[j:j+length]
# åãé£ç¶æ°ååãèŠã€ãã£ãå Žå
if num_part == den_part:
try:
# ãã®éšåãé€ããæ°ããæ°ãäœæ
new_num_str = num_str[:i] + num_str[i+length:]
new_den_str = den_str[:j] + den_str[j+length:]
# 空æååãã§ãã¯
if not new_num_str or not new_den_str:
continue
new_num = int(new_num_str)
new_den = int(new_den_str)
# 0ã«ããé€ç®ãé²ã
if new_den == 0:
continue
# æ°ããåæ°ã®å€ãèšç®
joke_value = new_num / new_den
# å
ã®å€ãšäžèŽããå Žå
if abs(true_value - joke_value) < 1e-10:
results.append((numerator, denominator, new_num, new_den, num_part))
except:
continue
return results
# å®è¡äŸ
results = find_joke_fractions(1000)
for n, d, new_n, new_d, removed in results:
print(f"{n}/{d} = {new_n}/{new_d} (removed: {removed})")äž»ãªå€æŽç¹ïŒ
é£ç¶ããæ°ååïŒ2æ¡ä»¥äžïŒãæ¢ãããã«å€æŽ
ååãšåæ¯ããåãé£ç¶æ°ååãèŠã€ããŠåé€
æ«å°Ÿã®0ãå«ããã¿ãŒã³ã¯é€å€
åé€ããæ°ååã衚瀺ããããã«å€æŽ
ïŒã¯ãã©ããããžã§ãŒã¯çŽåã ã£ãã®ãããããã«ããã®ã§å¯Ÿå¿ããŸããã
ããã°ã©ã ã®æ©èœãå¢ããã»ã©ããããããã¢ãŠãããããéèŠã§ããã
課é¡ïŒïŒâãlesson16-3.pyãã®çµæ
æ©éå®è¡ããŠã¿ãŸãããã
$ python lesson16-3.py
166/664 = 1/4 (removed: 66)
199/995 = 1/5 (removed: 99)
266/665 = 2/5 (removed: 66)
424/742 = 4/7 (removed: 42)
484/847 = 4/7 (removed: 84)
499/998 = 4/8 (removed: 99)
545/654 = 5/6 (removed: 54)ããããªããªãããæãã§ããïŒïŒïŒïŒïŒïŒïŒïŒïŒã®çµã¿åããããããŸããããã宿ã§ããããããããŸãããïŒãããããªããšãªãïŒ
ããããåäœç¢ºèªãå
šãäžååã§ããã
ããã§å
šéšããããã«ããããªãã§ãããå°ãªããšãæ¢çŽ¢ç¯å²ãåºããŠã¿ãŸãããã
課é¡ïŒïŒâïŒ¢ãæ¢çŽ¢ç¯å²ãïŒïŒïŒïŒïŒãŸã§æ¡å€§ããŠåäœã確èªããããlesson16-4.py
æµç³ã«ãç¯å²ã倿Žããã ããªã®ã§å
šéšã¯èŒããŸããã
詊ããŠã¿ãŸãããïŒ
泚æããã®ããã°ã©ã ã¯2éã«ãŒãã®ãã°ããªã®ã§æ¢çŽ¢ç¯å²nãå¢ãããšO(n²)ã®ãªãŒããŒã§ èšç®éãå¢ããŸãã®ã§çµæ§æéãããããŸããã€ãŸãæ¢çŽ¢ç¯å²ã10åã«ãªã£ãã®ã§100åæéãããããŸããç¡çã«å®è¡ããå¿
èŠã¯ãªãã§ãããã
def find_joke_fractions(max_num=10000):
# ïŒåã®ã³ãŒããšåãïŒ
# ãã倧ããªç¯å²ã§å®è¡ããŠãçµæãçŽååã®æ¡æ°ã§ãœãŒã
results = find_joke_fractions(10000)
sorted_results = sorted(results, key=lambda x: len(str(x[0])))
# èŠããã衚瀺
for n, d, new_n, new_d, removed in sorted_results:
print(f"{n}/{d} = {new_n}/{new_d} (removed: {removed}, {len(removed)}æ¡)")課é¡ïŒïŒâããlesson16-4.pyãã®çµæ
å®è¡çµæã§ãããã¡ããéåãšæéãããããŸããã
çµè«ããèšããšçµæã¯æ£ããã£ããã©ãã€ãŸããªããã¿ãŒã³ããŸã æããŸããã
ã²ã©ãã®ã¯åæ¯ãååã®ïŒïŒåã«ãªã£ãŠãããã¿ãŒã³ãå
šãæåããããŸããããžã§ãŒã¯ã«ãªã£ãŠããŸãããæ¬¡ã¯ãã®ãžããã±ã¢ããªããäœè£ãæŽããŠãããŸããã
$ python lesson16-4.py
åç¥
981/9810 = 1/10 (removed: 98)
981/9810 = 9/90 (removed: 81)
982/9820 = 2/20 (removed: 98)
982/9820 = 9/90 (removed: 82)
983/9830 = 3/30 (removed: 98)
983/9830 = 9/90 (removed: 83)
984/9840 = 4/40 (removed: 98)
984/9840 = 9/90 (removed: 84)
985/9850 = 5/50 (removed: 98)
985/9850 = 9/90 (removed: 85)
åŸç¥
æéããããåé¡ãã©ããããã§ããïŒ
ãã®èšäºã¯åå¿è
åãã®ããã°ã©ãã³ã°ãªã®ã§ãå¥éã¢ã«ãŽãªãºã ã®éçºèšäºãèªãã§ãã ããã
äŸãã°ãæåãã®åŸ¹åºãã䞊ååŠçãç¡é§ãšããã£ãŠãããã®ãçæããªãããžãã¯ãªã©ã®å¯ŸçããããŸãã
課é¡ïŒïŒãæçµåœ¢ã«åããŠãæ°ã«ãªã£ãŠããéšåã«æãå ¥ããã
å
çšã®ãé¢çœããªãïŒïŒåãã¿ãŒã³ãæé€ãããšãšãã«ãå°ã䜿ãåæãæ¹åããŸãããã
課é¡ïŒïŒïŒïŒ¡ãïŒïŒåãã¿ãŒã³ãæé€ããæ¢çŽ¢ç¯å²ãæå®ã§ããããã«ããªããããlesson16-5.py
å ·äœçã«ã¯ã
åæ¯ã®æ¢çŽ¢ç¯å²ãã³ãã³ãã©ã€ã³ããæå®ã§ããããã«ããã>python sampley.py min max
ååã®æ¢çŽ¢ç¯å²ã¯ãmin/10-maxããã ããmin/10ãïŒïŒæªæºãªãïŒïŒã«åºå®ããã
忝ïŒååïŒïŒïŒã®ãã¿ãŒã³ã¯ãæ¢çŽ¢çµæã«å«ããªãã
ãããªæ¹éã§è¡ããŸãããã³ãã³ãã©ã€ã³ã®åŒæ°ã«ã€ããŠã¯ä»¥å玹ä»ããŸããããæ¢çŽ¢ç¯å²ã¯ãã«ãŒãç¯å²ã倿Žããã°ïŒ¯ïŒ«ããŸãããã¿ãŒã³æé€ã¯ããã€ãã®å Žæã«æŸã蟌ãã°ããã§ãããã
import sys
def find_joke_fractions(min_den, max_den):
results = []
# ååã®ç¯å²ãèšå®
min_num = max(10, min_den // 10)
max_num = max_den
for numerator in range(min_num, max_num + 1):
for denominator in range(min_den, max_den + 1):
# ååã忝以äžããŸãã¯åæ¯ãååã®10åã®å Žåã¯ã¹ããã
if numerator >= denominator or denominator == numerator * 10:
continue
# æ¬æ¥ã®åæ°ã®å€
true_value = numerator / denominator
# æ°åãæååãšããŠåŠç
num_str = str(numerator)
den_str = str(denominator)
# å
±éã®é£ç¶ããéšåæååãæ¢ã
for length in range(2, min(len(num_str), len(den_str)) + 1):
for i in range(len(num_str) - length + 1):
num_part = num_str[i:i+length]
# æ«å°Ÿã®0ãå«ããã¿ãŒã³ã¯é€å€
if num_part.endswith('0'):
continue
for j in range(len(den_str) - length + 1):
den_part = den_str[j:j+length]
# åãé£ç¶æ°ååãèŠã€ãã£ãå Žå
if num_part == den_part:
try:
# ãã®éšåãé€ããæ°ããæ°ãäœæ
new_num_str = num_str[:i] + num_str[i+length:]
new_den_str = den_str[:j] + den_str[j+length:]
# 空æååãã§ãã¯
if not new_num_str or not new_den_str:
continue
new_num = int(new_num_str)
new_den = int(new_den_str)
# 0ã«ããé€ç®ãé²ã
if new_den == 0:
continue
# æ°ããåæ°ã®å€ãèšç®
joke_value = new_num / new_den
# å
ã®å€ãšäžèŽããå Žå
if abs(true_value - joke_value) < 1e-10:
results.append((numerator, denominator, new_num, new_den, num_part))
except:
continue
return results
def main():
# ã³ãã³ãã©ã€ã³åŒæ°ã®ãã§ãã¯
if len(sys.argv) != 3:
print("Usage: python script.py min_denominator max_denominator")
print("Example: python script.py 100 1000")
sys.exit(1)
try:
min_den = int(sys.argv[1])
max_den = int(sys.argv[2])
if min_den < 10 or max_den <= min_den:
print("Error: min_denominator must be >= 10 and max_denominator must be > min_denominator")
sys.exit(1)
except ValueError:
print("Error: Arguments must be integers")
sys.exit(1)
print(f"Searching for joke fractions with denominators between {min_den} and {max_den}")
results = find_joke_fractions(min_den, max_den)
if not results:
print("No joke fractions found")
else:
for n, d, new_n, new_d, removed in sorted(results, key=lambda x: (len(str(x[0])), x[0])):
print(f"{n}/{d} = {new_n}/{new_d} (removed: {removed}, {len(removed)}æ¡)")
print(f"\nTotal {len(results)} patterns found")
if __name__ == "__main__":
main()ãã®ä»ã现ã
ãã倿Žãå å³ããŠãåºæ¥äžãã£ãã³ãŒãã®ç¹åŸŽã¯ã
äž»ãªå€æŽç¹ïŒ
ã³ãã³ãã©ã€ã³åŒæ°ã§åæ¯ã®ç¯å²ãæå®å¯èœã«
ååã®ç¯å²ãé©åã«èšå®ïŒmin_den/10以äžãmax_den以äžïŒ
忝ïŒååÃ10ã®ãã¿ãŒã³ãé€å€
ãšã©ãŒãã§ãã¯ãšãŠãŒã¶ãŒãã¬ã³ããªãŒãªã¡ãã»ãŒãžã远å
çµæã®ç·æ°ã衚瀺
䜿çšäŸïŒ
python lesson16-5.py 100 1000ããã§ããã䜿ããããããã€äžé©åãªãã¿ãŒã³ãé€å€ããããã°ã©ã ã«ãªã£ãããªã
課é¡ïŒïŒïŒïŒ¡ããlesson16-5.pyãã®çµæ
æ©éçµæã確èªããŠã¿ãŸãããã
$python lesson16-5.py 2000 2500
Searching for joke fractions with denominators between 2000 and 2500
273/2275 = 3/25 (removed: 27, 2æ¡)
333/2331 = 3/21 (removed: 33, 2æ¡)
333/2331 = 3/21 (removed: 33, 2æ¡)
334/2338 = 4/28 (removed: 33, 2æ¡)
364/2366 = 4/26 (removed: 36, 2æ¡)
444/2442 = 4/22 (removed: 44, 2æ¡)
444/2442 = 4/22 (removed: 44, 2æ¡)
455/2457 = 5/27 (removed: 45, 2æ¡)
1092/2093 = 12/23 (removed: 09, 2æ¡)
1183/2184 = 13/24 (removed: 18, 2æ¡)
1212/2121 = 12/21 (removed: 12, 2æ¡)
1212/2121 = 12/21 (removed: 21, 2æ¡)
1212/2121 = 12/21 (removed: 21, 2æ¡)
1212/2121 = 12/21 (removed: 12, 2æ¡)
1216/2128 = 16/28 (removed: 12, 2æ¡)
1216/2128 = 16/28 (removed: 21, 2æ¡)
1221/2220 = 11/20 (removed: 22, 2æ¡)
1221/2220 = 11/20 (removed: 22, 2æ¡)
1274/2275 = 14/25 (removed: 27, 2æ¡)
1332/2331 = 12/21 (removed: 33, 2æ¡)
1336/2338 = 16/28 (removed: 33, 2æ¡)
1365/2366 = 15/26 (removed: 36, 2æ¡)
1443/2442 = 13/22 (removed: 44, 2æ¡)
1456/2457 = 16/27 (removed: 45, 2æ¡)
1820/2184 = 20/24 (removed: 18, 2æ¡)
2045/2454 = 20/24 (removed: 45, 2æ¡)
Total 26 patterns foundãããããæãã§ããããããããæå€ãªåæ°ã䞊ãã§ããŸãã
æ¢çŽ¢ç¯å²ããçºèŠããåæ°ãªã©ã®è¡šç€ºã芪åãœããªããŸããã
ãªããä»åã¯ãéã³ããã°ã©ã ãã€èª²é¡ãæäŸããããã®ããã°ã©ã ãªã®ã§å²æããŠããŸãããç¯å²æå®ã倿Žãããšãã¯ãå¢çæ¡ä»¶ãå«ãããããªãã¿ãŒã³ã確èªããŠãã ãããã
çµæã®äžã§æ°ã«ãªããšãããæ¢ããŠã¿ãŸãããã
1212/2121 = 12/21 (removed: 12, 2æ¡)
1212/2121 = 12/21 (removed: 21, 2æ¡)
1212/2121 = 12/21 (removed: 21, 2æ¡)
1212/2121 = 12/21 (removed: 12, 2æ¡)
ãã®ããããåãå
åæ°ã䞊ãã§ããã®ãæ°ã«ãªããŸãããããã¯ãééãã§ã¯ãªãåãæ°åã§ãæ¶ãå Žæãéã£ãããæç«ãããã¿ãŒã³ãè€æ°ããããã§ãã
å
šæ¢çŽ¢ãããŒããªãããããæ£ããã§ããã©ãããŒãããžã§ãŒã¯ãªã®ã§ãåãåæ°ã¯1åã§ãããããªæ°ãããŸãã
課é¡ïŒïŒïŒïŒ¢ãæçµçµæããéè€ããåæ°ãåé€ããªããããlesson16-6.py
å
·äœçã«ã¯ãæåŸã®ãªã¹ãããœãŒãããŠãéè€ããŠããèŠçŽ ãã°ã«ãŒãåããŠäžã€ã«ãŸãšããŸããçŽåååŸã®æ°åã®çµã¿åããã§ãŸãšããã®ãè¯ãããã§ãã
ãŸãããã¹ãŠãæ¢çŽ¢ããããšãéèŠãªããšãããã®ã§ãéè€ãåé€ããã®ã§ã¯ãªãããªãã·ã§ã³ã§éžã¹ãããã«ããã»ããããã§ãããã
ãªãã·ã§ã³ãå¢ããã®ã§åŸã§åããããã«ç°¡åãªãã«ããã€ããŸãããã
æ¢çŽ¢éšã®æ¬äœã¯å€æŽããå¿
èŠããªãã§ãããã
import sys
import argparse
from itertools import groupby
def find_joke_fractions(min_den, max_den):
# ïŒåã®ã³ãŒããšåãïŒ
def remove_duplicates(results):
# çŽåååŸã®åæ°ã®çµã¿åããã§ãœãŒãããŠã°ã«ãŒãå
sorted_results = sorted(results, key=lambda x: (x[2], x[3], x[0], x[1]))
unique_results = []
# çŽååŸã®çµæãåããã®ã®äžããæåã®1ã€ã ããæ®ã
for key, group in groupby(sorted_results, key=lambda x: (x[2], x[3])):
unique_results.append(next(group))
return unique_results
def main():
# ã³ãã³ãã©ã€ã³åŒæ°ã®è§£æ
parser = argparse.ArgumentParser(description='Find joke fractions')
parser.add_argument('min_den', type=int, help='Minimum denominator')
parser.add_argument('max_den', type=int, help='Maximum denominator')
parser.add_argument('--allow-duplicates', '-d', action='store_true',
help='Allow duplicate results (same reduced fraction)')
args = parser.parse_args()
# åŒæ°ã®åŠ¥åœæ§ãã§ãã¯
if args.min_den < 10 or args.max_den <= args.min_den:
print("Error: min_denominator must be >= 10 and max_denominator must be > min_denominator")
sys.exit(1)
print(f"Searching for joke fractions with denominators between {args.min_den} and {args.max_den}")
results = find_joke_fractions(args.min_den, args.max_den)
if not results:
print("No joke fractions found")
return
# éè€åé€ã®ãªãã·ã§ã³åŠç
if not args.allow_duplicates:
original_count = len(results)
results = remove_duplicates(results)
if original_count != len(results):
print(f"\nRemoved {original_count - len(results)} duplicate patterns")
# çµæã®è¡šç€º
for n, d, new_n, new_d, removed in sorted(results, key=lambda x: (len(str(x[0])), x[0])):
print(f"{n}/{d} = {new_n}/{new_d} (removed: {removed}, {len(removed)}æ¡)")
print(f"\nTotal {len(results)} patterns found")
if __name__ == "__main__":
main()䜿çšäŸïŒ
# éè€ãåé€ããŠå®è¡
python lesson16-6.py 100 1000
# éè€ãèš±å¯ããŠå®è¡
python lesson16-6.py 100 1000 --allow-duplicates
# ãŸãã¯
python lesson16-6.py 100 1000 -däž»ãªå€æŽç¹ïŒ
argparseã䜿çšããŠã³ãã³ãã©ã€ã³åŒæ°ãåŠç
--allow-duplicatesãªãã·ã§ã³ã远å
remove_duplicates颿°ã远å ããŠéè€ãåé€
æ¢çŽ¢çµæã®æ°ã¯æçµçã«è¡šç€ºããæ°
--helpãªãã·ã§ã³ã®è¿œå
éè€ã®åé€ã¯ãçŽååŸã®åæ°ïŒnew_n/new_dïŒãåããã®ã1ã€ã«ãŸãšãã圢ã§è¡ãããŸããããã«ãããåãçµæã«è³ãç°ãªããã¿ãŒã³ãæŽçãããããç°¡æœãªåºåãåŸãããŸãã
ãªãã·ã§ã³ã®èª¬æã¯ä»¥äžã®ããã«ããŠç¢ºèªã§ããŸãïŒ
python script.py --helpparser.add_argumentã®helpãã©ã¡ãŒã¿ã¯ãååŒæ°ã®èª¬æãæå®ããŸãããã®èª¬æã¯ããŠãŒã¶ãŒã--helpãªãã·ã§ã³ã䜿ã£ãŠããã°ã©ã ã®äœ¿ãæ¹ãå°ãããšãã«è¡šç€ºããããã«ãã¡ãã»ãŒãžã«å«ãŸããŸããããã«ããããŠãŒã¶ãŒã¯ååŒæ°ãäœãæå³ããã®ããçè§£ãããããªããŸãã
課é¡ïŒïŒïŒïŒ¢ãlesson16-6.pyã®çµæ
ã§ã¯ãçµæã®ç¢ºèªã§ãã
$python lesson16-6.py 2000 2500
Searching for joke fractions with denominators between 2000 and 2500
Removed 10 duplicate patterns
273/2275 = 3/25 (removed: 27, 2æ¡)
333/2331 = 3/21 (removed: 33, 2æ¡)
334/2338 = 4/28 (removed: 33, 2æ¡)
364/2366 = 4/26 (removed: 36, 2æ¡)
444/2442 = 4/22 (removed: 44, 2æ¡)
455/2457 = 5/27 (removed: 45, 2æ¡)
1092/2093 = 12/23 (removed: 09, 2æ¡)
1183/2184 = 13/24 (removed: 18, 2æ¡)
1212/2121 = 12/21 (removed: 12, 2æ¡)
1216/2128 = 16/28 (removed: 12, 2æ¡)
1221/2220 = 11/20 (removed: 22, 2æ¡)
1274/2275 = 14/25 (removed: 27, 2æ¡)
1365/2366 = 15/26 (removed: 36, 2æ¡)
1443/2442 = 13/22 (removed: 44, 2æ¡)
1456/2457 = 16/27 (removed: 45, 2æ¡)
1820/2184 = 20/24 (removed: 18, 2æ¡)
Total 16 patterns foundã¡ãããšéè€ããªããªã£ãŠããŸãããããã«ã¯ãæžããŸãããä»ã®ãã©ã¡ãŒã¿ã確èªããŠã¿ãŠãã ããã
è²ã
ãäžæºã¯ãŸã ãããŸãããåŠç¿çšãšããããšã§ããã§äžæŠã®å®æãšããŸãã
æçµèª²é¡
ä»åã®ããã°ã©ã äœæãéããŠåŠãã ããšãæŽçããªããã
倧局ãªããšããããŸããããäžèšã®ãããªããã°ã©ãã³ã°èŠçŽ ãè©°ã蟌ã¿ãŸãããä»ãŸã§ã®ããã°ã©ã ã§é ã远ã£ãŠã¿ãã°ãã®å¹æãšäœ¿ãæ¹ãããããšæããŸãã
åºæ¬çãªããŒã¿åã®æ±ã
int ãš str ã®çžäºå€æ
æååæäœïŒã¹ã©ã€ã¹ãçµåãéšåæååã®æ€çŽ¢ïŒ
æ°å€æŒç®ïŒé€ç®ãæ¯èŒïŒ
ã¢ã«ãŽãªãºã çæè
æ¢çŽ¢ç¯å²ã®èšå®
é£ç¶éšåæååã®æœåº
éè€ã®é€å»
ããã°ã©ã ã®æ§é å
颿°ã®å®çŸ©ãšäœ¿çš
ã¡ã€ã³åŠçã®åé¢
ãšã©ãŒåŠç
try-except ã«ããäŸå€åŠç
å ¥åå€ã®åŠ¥åœæ§ãã§ãã¯
ã³ãã³ãã©ã€ã³åŒæ°ã®åŠç
argparse ã®äœ¿çš
ãªãã·ã§ã³åŠç
ããã°ã©ã ã®åºå
ãã©ãŒãããæååã®äœ¿çš
çµæã®æŽåœ¢è¡šç€º
ãã®ããã°ã©ã ã®åé¡ã«ã€ããŠèããçºå±çãªããã°ã©ã ãäœæããªããã
ããã倧局ãªããšè¡ã£ãŠããŸãããäŸãã°ä»¥äžã®ãããªæ¹åããããšæããŸããïŒé£æåºŠã¯ãã©ãã©ã§ãïŒ
ããã©ãŒãã³ã¹ã®æé©å
æ¢çŽ¢ç¯å²ã®æåã
ã¢ã«ãŽãªãºã ã®æ¹å
䞊ååŠçã®å°å ¥
æ©èœã®æ¡åŒµ
ç°ãªãããžã§ãŒã¯çŽåããã¿ãŒã³ã®è¿œå
çµæã®ãã¡ã€ã«åºå
ãã詳现ãªçµ±èšæ å ±ã®è¡šç€º
ã³ãŒãå質ã®åäž
ãŠããããã¹ãã®è¿œå
ã³ãŒãã®ããã¥ã¡ã³ãå
ãªãã¡ã¯ã¿ãªã³ã°
ãã®ä»
æ¢çŽ¢ããã®ã§ã¯ãªãäœæããããšã¯ã§ããªãã
å·šå€§ãªæ°ãæ¢ãæ¹æ³ã¯ãªãã ããã
å®å šãªçŽåãã¿ãŒã³ãæ¢ããïŒçµæãæ¢çŽåæ°ïŒ
ãããã®ãæ¹åãéããŠããããã°ã©ãã³ã°ãžã®çè§£ãæ·±ãŸããšæããŸãããã®ãããã«å¿ èŠãªããã°ã©ãã³ã°æè¡ã¯ããŸãå¥ã®é¡æã§ç޹ä»ããããšãããã§ãããã
ãŸãšã
ããŸããŸèŠã€ãããžã§ãŒã¯çŽåãèŠãŠããã®ãã¿ãŒã³æ¢ãããã®ããã°ã©ã ãäœæããŸããã
æåã¯ãæŽæ°ãšæåãçžäºã«å€æããã ãã®ããã°ã©ã ã玹ä»ããã€ããã§ããããé©åœã«æãããããã¡ã«ãå€ãã®ããã°ã©ãã³ã°èŠçŽ ãå«ãããææããã°ã©ã ã«ãªããŸããã
ã¿ãªããããé¢çœãæ
å ±ãèŠããããã䌌ããããªãã®ãæ¢ããŠã¿ãããã°ã©ã ããããŠãã ãããã
ããã·ã¥ã¿ã°
#python #ããã°ã©ãã³ã° #åå¿è
#int #str #æåå #ã¹ã©ã€ã¹ #ã¢ã«ãŽãªãºã #æ¢çŽ¢ #éè€ #æ§é å #颿° #ãšã©ãŒåŠç #try #except #å
¥åãã§ã㯠#ã³ãã³ãã©ã€ã³ãªãã·ã§ã³ #argparse
#çŽå #ãžã§ãŒã¯