ors*_*iro 10 scripts software-recommendation education
我意识到我的懒惰天性,需要时不时地推动自己做一些基本的心算。因此,我正在寻找一种软件,它会定期让我做一个简短的心算练习(加、减、乘、除)。
标准:
下面的脚本将随机产生分配,+,-,×和÷。您可以(并且应该)设置脚本可以使用的最大数量,以及分配之间的时间间隔。
分配显示在 Zenity 输入窗口中:
如果答案是错误的:
如果答案正确:
#!/usr/bin/env python3
from random import randint
import sys
import subprocess
import time
# maximum number & interval
max_n = int(sys.argv[1]); pause = int(sys.argv[2])
def fix_float(n):
"""
if the assignment is a division, the script divides the random number by a
number (integer) it can be divided by. it looks up those numbers, and picks
one of them (at random). if the number is a prime number the assignment is
changed into another type
"""
try:
divs = [i for i in range(2, n) if n%i == 0]
pick = randint(1, len(divs))
div_by = divs[pick-1]
return [str(n)+" : "+str(div_by), int(n/div_by)]
except (ValueError, IndexError):
pass
def get_assignment():
"""
get a random number within the user defined range, make the assignment and
the textual presentation
"""
n1 = randint(2, max_n); n2 = randint(2, max_n)
assignments = [
[str(n1)+" + "+str(n2), n1+n2],
[str(n1)+" - "+str(n2), n1-n2],
[str(n1)+" x "+str(n2), n1*n2],
fix_float(n1),
]
# pick an assignment (type) at random
assignment = assignments[randint(0, 3)]
# if the random number is a prime number and the assignment a division...
assignment = assignment if assignment != None else assignments[1]
# run the interface job
try:
answer = int(subprocess.check_output(["/bin/bash", "-c",
'zenity --entry --title="Think hard:" --text='+'"'+assignment[0]+'"'
]).decode("utf-8"))
if answer == assignment[1]:
subprocess.Popen(["notify-send", "Coolcool"])
else:
subprocess.Popen([
"notify-send", "Oooops, "+assignment[0]+\
" = "+str(assignment[1])])
except (subprocess.CalledProcessError, ValueError):
pass
while True:
time.sleep(pause)
get_assignment()
Run Code Online (Sandbox Code Playgroud)
mindpractice.py
使用最大允许数量和分配之间的间隔时间(以秒为单位)作为参数运行它:
python3 /path/to/mindpractice.py <max_number> <interval>
Run Code Online (Sandbox Code Playgroud)
例如
python3 /path/to/mindpractice.py 1000 300
Run Code Online (Sandbox Code Playgroud)
计算多达 的数字1000
,作业之间有 5 分钟的休息时间。
如果一切正常,您可以按照通常的方式将其添加到启动应用程序中,或者可以制作一个启动器来切换,我稍后可能会添加:)
一旦你开始计算,你会发现除以(比方说)100 的数字比乘以100 的数字要容易得多。
使用下面的脚本,您可以(并且应该)设置每种锻炼类型的最大数量(请参阅脚本下方的说明)。
python3 /path/to/mindpractice.py <max_number> <interval>
Run Code Online (Sandbox Code Playgroud)
像第一个一样设置脚本,但使用参数运行它(以任何顺序,脚本会将正确的参数链接到正确的项目):
p:
暂停(任务之间的休息,以秒为单位))s:
减去(计算的最大数量)a:
添加(最大数量)m:
乘法(最大数)d:
除(最大数量)例如:
python3 '/home/jacob/Desktop/num.py' a:10 d:100 s:10 m:10 p:300
Run Code Online (Sandbox Code Playgroud)
显示锻炼每五分钟,数多达10个,除瓜分图100。
下面的版本显示了每 10 次练习后的统计数据:
此外(在用于儿童时可能有用),您可以查看最近 100 个错误回答的练习中出了什么问题。在隐藏文件中,作业及其(错误的)答案都被写入:
此日志文件位于:
~/.calculog
Run Code Online (Sandbox Code Playgroud)
python3 /path/to/mindpractice.py 1000 300
Run Code Online (Sandbox Code Playgroud)
用法与选项 2 非常相似,但您将获得可用的日志文件和每 10 次作业后的分数。
下面的版本类似于选项 3(包括日志文件和报告),但具有一些附加功能:
添加计算平方根
添加使用一系列数字,而不是简单地设置最大值
记住上次运行时的参数,当不带参数运行时(只有第一次,必须设置参数)。如果第一次运行时没有设置参数,脚本会发送一条消息:
#!/usr/bin/env python3
from random import randint
import sys
import subprocess
import time
levels = sys.argv[1:]
pause = [int(arg.replace("p:", "")) for arg in levels if "p:" in arg][0]
def fix_float(n):
"""
if the assignment is a division, the script divides the random number by a
number (integer) it can be divided by. it looks up those numbers, and picks
one of them (at random). if the number is a prime number the assignment is
changed into another type
"""
try:
divs = [i for i in range(2, n) if n%i == 0]
pick = randint(1, len(divs))
div_by = divs[pick-1]
return [str(n)+" : "+str(div_by), int(n/div_by)]
except (ValueError, IndexError):
pass
def get_assignment():
"""
get a random number within the user defined range, make the assignment and
the textual presentation
"""
# pick an assignment (type) at random
track = randint(0, 3)
arg = ["a:", "s:", "m:", "d:"][track]
max_n = [int(item.replace(arg, "")) for item in levels if arg in item][0]
n1 = randint(2, max_n); n2 = randint(2, max_n)
assignments = [
[str(n1)+" + "+str(n2), n1+n2],
[str(n1)+" - "+str(n2), n1-n2],
[str(n1)+" x "+str(n2), n1*n2],
fix_float(n1),
]
assignment = assignments[track]
# if the random number is a prime number and the assignment a division...
assignment = assignment if assignment != None else assignments[1]
# run the interface job
try:
answer = int(subprocess.check_output(["/bin/bash", "-c",
'zenity --entry --title="Think hard:" --text='+'"'+assignment[0]+'"'
]).decode("utf-8"))
if answer == assignment[1]:
subprocess.Popen(["notify-send", "Coolcool"])
else:
subprocess.Popen([
"notify-send", "Oooops, "+assignment[0]+\
" = "+str(assignment[1])])
except (subprocess.CalledProcessError, ValueError):
pass
while True:
time.sleep(pause)
get_assignment()
Run Code Online (Sandbox Code Playgroud)
将脚本复制到一个空文件中,(再次)将其保存为mindpractice.py
. 使用以下选项运行它(作为示例)
必须设置:
p:300 to set the interval between assignments to 5 minutes
Run Code Online (Sandbox Code Playgroud)
可选(进行选择):
a:30-100 to add in numbers from 30-100 (optional)
s:10-100 to subtract in numbers from 10-100
m:10-20 to multiply in numbers from 10-20
d:200-400 to divide in numbers from 200-400
r:1-1000 to find square root in numbers from 1-1000
Run Code Online (Sandbox Code Playgroud)示例命令:
python3 '/path/to/mindpractice.py' p:300 d:10-100 s:10-30 r:300-600
Run Code Online (Sandbox Code Playgroud)
设置:
p:300 to set the interval between assignments to 5 minutes
d:10-100 to divide in numbers from 10-100
s:10-30 to subtract in numbers from 10-30
r:300-600 to calculate square roots from 300-600
Run Code Online (Sandbox Code Playgroud)
同时添加和乘法不被使用。
然后下一次,如果脚本运行:
python3 '/path/to/mindpractice.py'
Run Code Online (Sandbox Code Playgroud)
它会记住上次使用的参数
使用最能满足您需求的版本...