有没有可以定期让我做心算练习的软件?

ors*_*iro 10 scripts software-recommendation education

我意识到我的懒惰天性,需要时不时地推动自己做一些基本的心算。因此,我正在寻找一种软件,它会定期让我做一个简短的心算练习(加、减、乘、除)。

标准:

  • 它应该允许我自定义间隔时间
  • 它应该集成在 Ubuntu 桌面中,即隐藏在后台并且仅在锻炼时间显示(弹出)

Jac*_*ijm 9

1. 直白版

下面的脚本将随机产生分配,+-×÷。您可以(并且应该)设置脚本可以使用的最大数量,以及分配之间的时间间隔。

作业

分配显示在 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)

如何使用

  1. 将脚本复制到一个空文件中,另存为 mindpractice.py
  2. 使用最大允许数量和分配之间的间隔时间(以秒为单位)作为参数运行它:

    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 分钟的休息时间。

  3. 如果一切正常,您可以按照通常的方式将其添加到启动应用程序中,或者可以制作一个启动器来切换,我稍后可能会添加:)

笔记

  • 分割可能需要一些解释。你可能不喜欢浮点数计算。因此,如果分配是除法,则脚本会查找可被除以的数字,并选择一个(随机)。如果(主)数结果是质数,则分配将更改为另一种类型。

2. 更多选择

一旦你开始计算,你会发现除以(比方说)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。


3.让我们得意忘形

能够看到一些统计数据

下面的版本显示了每 10 次练习后的统计数据:

在此处输入图片说明

此外(在用于儿童时可能有用),您可以查看最近 100 个错误回答的练习中出了什么问题。在隐藏文件中,作业及其(错误的)答案都被写入:

在此处输入图片说明

此日志文件位于:

~/.calculog
Run Code Online (Sandbox Code Playgroud)

剧本

python3 /path/to/mindpractice.py 1000 300
Run Code Online (Sandbox Code Playgroud)

如何使用

用法与选项 2 非常相似,但您将获得可用的日志文件和每 10 次作业后的分数。


4.终极版

下面的版本类似于选项 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)

它会记住上次使用的参数


使用最能满足您需求的版本...