是否有可以定期让我进行心理算术练习的软件?

Orschiro

我意识到自己的懒惰本性,需要不时推动自己进行一些基本的心理算术。因此,我正在寻找一个软件,该软件会定期要求我进行简短的心理算术练习(加,减,乘,除)。

标准:

  • 它应该允许我自定义间隔时间
  • 它应该集成在Ubuntu桌面中,即隐藏在后台,仅在运动时显示(弹出)
雅各布·弗利姆(Jacob Vlijm)

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()

如何使用

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

    python3 /path/to/mindpractice.py <max_number> <interval>
    

    例如

    python3 /path/to/mindpractice.py 1000 300
    

    最多可计算到的数字1000,在两次分配之间有5分钟的间隔。

  3. 如果一切正常,则可以按常规方式将其添加到启动应用程序中,或者可以进行启动器的切换,稍后我可能会添加它:)

笔记

  • 这种划分可能需要一些解释。您可能不希望以浮点数进行计算。因此,如果分配是除法,脚本将查找可以除以的数字,并随机选择一个。如果(主)号码原来是质数,则该分配将更改为另一种类型。

2.更多选择

一旦开始计算,您会发现除以100(例如)的数字要比乘以100的数字容易得多

使用下面的脚本,您可以(并且应该)设置每种锻炼类型的最大数字(请参阅脚本下方的说明)。

剧本

#!/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()

如何使用

  • 完全像第一个脚本一样设置脚本,但是使用参数运行它(以任何顺序,脚本会将正确的参数链接到正确的项目):

    • p: 暂停(两次作业之间的间隔,以秒为单位)
    • s: 减去(要计算的最大数)
    • a: 加(最大数量)
    • m: 乘(最大数)
    • d: 除(最大数)

    例如:

    python3 '/home/jacob/Desktop/num.py' a:10 d:100 s:10 m:10 p:300
    

    显示锻炼每五分钟,数多达10个,瓜分图100。


3.让我们有点生气

能够看到一些统计数据

下面的版本向您显示每10次练习后的统计信息:

在此处输入图片说明

另外(当用于儿童时可能很有用),您可以查看最近100次错误回答的练习中出了什么问题。在一个隐藏的文件中,作业和它们的(不正确的)答案都被写成:

在此处输入图片说明

该日志文件位于:

~/.calculog

剧本

#!/usr/bin/env python3
from random import randint
import sys
import subprocess
import time
import os

log = os.environ["HOME"]+"/.calculog"

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"])
            return "ok"
        else:
            subprocess.Popen([
                "notify-send", "Oooops, "+assignment[0]+\
                " = "+str(assignment[1])])
            open(log, "+a").write(assignment[0]+"\t\t"+str(answer)+"\n")
            try:
                history = open(log).read().splitlines()
                open(log, "wt").write(("\n").join(history[-100:])+"\n")     
            except FileNotFoundError:
                pass 
            return "mistake"
    except (subprocess.CalledProcessError, ValueError):
        return None

results = []
while True:
    time.sleep(pause)
    results.append(get_assignment())
    if len(results) >= 10:
        score = results.count("ok")
        subprocess.call([
            "zenity", "--info",
            '--title=Latest scores',
            '--text='+str(score)+' out of 10',
            '--width=160',
            ])
        results = []

如何使用

使用方法几乎与选项2完全相同,但是您将拥有可用的日志文件和每10个作业后的得分。


4.终极版

下面的版本类似于选项3(包括日志文件和报告),但是具有一些附加功能:

  • 添加计算平方根

    在此处输入图片说明

  • 使用一定范围的数字进行相加,而不是简单地设置最大值

  • 添加仅运行特定计算类型的选项(例如,仅除法和乘法)。
  • 记住上次运行的参数,没有参数时运行(仅第一次,必须设置参数)。如果在第一次运行时未设置任何参数,则脚本会发送一条消息:

    在此处输入图片说明

剧本

#!/usr/bin/env python3
from random import randint
import sys
import subprocess
import time
import os

"""
Use this script to practice head count. Some explanation might be needed:
The script can be used for the following types of calculating:

Type          argument example      explanation
-------------------------------------------------------------------------------
add           a:30-100              to add in numbers from 30-100
subtract      s:10-100              to subtract in numbers from 10-100
multiply      m:10-20               to multiply in numbers from 10-20
divide        d:200-400             to divide in numbers from 200-400
square root   r:1-1000              to find square root in numbers from 1-1000

N.B.
-------------------------------------------------------------------------------
- The argument p: (pause in seconds; break between the assignments) *must* be
  set, for example: p:300 to launch an assignment every 5 minutes
- A calculation type will only run *if* the argument is set for the
  corresponding type. An example: python3 /path/to/script p:60 s:30-60
  will run a subtract- assignment every minute.

Miscellaneous information:
-------------------------------------------------------------------------------
- On first run, arguments *must* be set. After first run, when no arguments
  are used the last set arguments will run, until the script is run with a new
  set of arguments.
- A log file of the last 100 incorrectly answered questions is kept in
  ~/.calculog
- After 10 assignments, the score of the last 10 pops up.
"""

log = os.environ["HOME"]+"/.calculog"
prefs = os.environ["HOME"]+"/.calcuprefs"
levels = sys.argv[1:]

if levels:
    open(prefs, "wt").write(str(levels))
else:
    try:
        levels = eval(open(prefs).read())
    except FileNotFoundError:
        subprocess.call([
            "zenity", "--info",
            '--title=Missing arguments',
            '--text=On first run, the script needs to be run with arguments\n'
            ])

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 fix_sqr(f1, f2):
    """
    If the assignment is calculating a square root, this function finds the sets
    of numbers (integers) that make a couple, within the given range.
    """
    q = f1; r = q**(.5); sets = []
    while q < f2:
        r = q**(.5)
        if r == int(r):
            sets.append([int(r), int(q)])
        q = q+1
    if sets:
        pick = sets[randint(0, len(sets)-1)]
        return ["√"+str(pick[1]), pick[0]]

def get_assignment():
    """
    get a random number within the user defined range, make the assignment and
    the textual presentation
    """ 
    args = ["a:", "s:", "m:", "d:", "r:"]
    indc = []
    for i, item in enumerate(args):
        if item in str(levels):
            indc.append(i)

    index = indc[randint(0, len(indc)-1)]
    name = args[index]

    minmax = [
        [int(n) for n in item.replace(name, "").split("-")] \
        for item in levels if name in item][0]

    assignment = None
    # if the random number is a prime number *and* the assignment a division 
    # or a square root...
    while assignment == None:
        n1 = randint(minmax[0], minmax[1]); n2 = randint(minmax[0], minmax[1])
        assignment = [
            [str(n1)+" + "+str(n2), n1+n2],
            [str(n1)+" - "+str(n2), n1-n2],
            [str(n1)+" x "+str(n2), n1*n2],
            fix_float(n1),
            fix_sqr(minmax[0], minmax[1]),
            ][index]
    # 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"])
            return "ok"
        else:
            subprocess.Popen([
                "notify-send", "Oooops, "+assignment[0]+\
                " = "+str(assignment[1])])
            open(log, "+a").write(assignment[0]+"\t\t"+str(answer)+"\n")
            try:
                history = open(log).read().splitlines()
                open(log, "wt").write(("\n").join(history[-100:])+"\n")     
            except FileNotFoundError:
                pass 
            return "mistake"
    except (subprocess.CalledProcessError, ValueError):
        return None

if levels:
    pause = [int(arg.replace("p:", "")) for arg in levels if "p:" in arg][0]
    [levels.remove(item) for item in levels if "p:" in item]
    results = []
    while True:
        time.sleep(pause)
        results.append(get_assignment())
        if len(results) >= 10:
            score = results.count("ok")
            subprocess.call([
                "zenity", "--info",
                '--title=Latest scores',
                '--text='+str(score)+' out of 10',
                '--width=160',
                ])
            results = []

如何使用

  • 将脚本复制到一个空文件中,再次将其保存为mindpractice.py使用以下选项运行它(作为示例)

    必须设置:

    p:300                to set the interval between assignments to 5 minutes
    

    可选(进行选择):

    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
    
  • 示例命令:

    python3 '/path/to/mindpractice.py' p:300 d:10-100 s:10-30  r:300-600
    

    设置:

    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
    

    同时添加乘法不被使用。

然后在下一次,如果脚本运行时使用:

python3 '/path/to/mindpractice.py'

它将记住上次使用的参数


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


本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在Julia中进行有理算术?

来自分类Dev

如何在Julia中进行有理算术?

来自分类Dev

是否可以定义参数集并对其进行引用?

来自分类Dev

是否有任何Ubuntu软件可以进行数学计算?

来自分类Dev

gnu-screen是否可以定期在两个虚拟终端之间切换?

来自分类Dev

Debian是否有任何软件可以修复我的GRUB

来自分类Dev

验证程序/ standard / all我们可以定期使用它吗?

来自分类Dev

在Keras中,在我自己的模型上使用include_top = False是否会删除所有最后的密集层,我是否可以定义模型的“顶部”?

来自分类Dev

是否可以在对象键中进行算术运算?

来自分类Dev

AWS是否可以定期自动终止并为自动伸缩组重新创建新实例?

来自分类Dev

AWS是否可以定期自动终止并为自动伸缩组重新创建新实例?

来自分类Dev

是否有一种简单的方法可以对R中的向量中的元素进行算术运算?

来自分类Dev

有没有一种方法可以定期运行非void python函数?

来自分类Dev

有不可变(通常为ConcurrentHashMap)数据结构的正式模式,该模式可以定期替换吗?

来自分类Dev

在C ++容器上进行迭代时是否可以定义“步长”大小?

来自分类Dev

是否有任何方法可以对openwrt ipk进行软件包签名

来自分类Dev

是否有开源软件可以对计算机BIOS进行仿真和虚拟编程?

来自分类Dev

默认情况下,哪个版本的Python使用有理算术?

来自分类Dev

是否有可以查看.dwg文件的软件?

来自分类Dev

是否有可以查看.dwg文件的软件?

来自分类Dev

是否有GUI软件可以显示我的家庭网络上的用户正在使用多少带宽?

来自分类Dev

是否可以用我自己的软件包替换特定名称的现有pip软件包?

来自分类Dev

全新安装后是否有任何软件可以帮助我重新安装软件

来自分类Dev

是否可以定位nProgress加载栏?

来自分类Dev

是否可以定义包含对象的对象?

来自分类Dev

是否可以定位nProgress加载栏?

来自分类Dev

TDD。我的编码练习非常复杂,如果私有方法非常复杂,我是否要对其进行测试?

来自分类Dev

配置MySQL以定期转储所有数据

来自分类Dev

是否可以定义将重试的图层,例如具有指数补偿的图层?

Related 相关文章

  1. 1

    如何在Julia中进行有理算术?

  2. 2

    如何在Julia中进行有理算术?

  3. 3

    是否可以定义参数集并对其进行引用?

  4. 4

    是否有任何Ubuntu软件可以进行数学计算?

  5. 5

    gnu-screen是否可以定期在两个虚拟终端之间切换?

  6. 6

    Debian是否有任何软件可以修复我的GRUB

  7. 7

    验证程序/ standard / all我们可以定期使用它吗?

  8. 8

    在Keras中,在我自己的模型上使用include_top = False是否会删除所有最后的密集层,我是否可以定义模型的“顶部”?

  9. 9

    是否可以在对象键中进行算术运算?

  10. 10

    AWS是否可以定期自动终止并为自动伸缩组重新创建新实例?

  11. 11

    AWS是否可以定期自动终止并为自动伸缩组重新创建新实例?

  12. 12

    是否有一种简单的方法可以对R中的向量中的元素进行算术运算?

  13. 13

    有没有一种方法可以定期运行非void python函数?

  14. 14

    有不可变(通常为ConcurrentHashMap)数据结构的正式模式,该模式可以定期替换吗?

  15. 15

    在C ++容器上进行迭代时是否可以定义“步长”大小?

  16. 16

    是否有任何方法可以对openwrt ipk进行软件包签名

  17. 17

    是否有开源软件可以对计算机BIOS进行仿真和虚拟编程?

  18. 18

    默认情况下,哪个版本的Python使用有理算术?

  19. 19

    是否有可以查看.dwg文件的软件?

  20. 20

    是否有可以查看.dwg文件的软件?

  21. 21

    是否有GUI软件可以显示我的家庭网络上的用户正在使用多少带宽?

  22. 22

    是否可以用我自己的软件包替换特定名称的现有pip软件包?

  23. 23

    全新安装后是否有任何软件可以帮助我重新安装软件

  24. 24

    是否可以定位nProgress加载栏?

  25. 25

    是否可以定义包含对象的对象?

  26. 26

    是否可以定位nProgress加载栏?

  27. 27

    TDD。我的编码练习非常复杂,如果私有方法非常复杂,我是否要对其进行测试?

  28. 28

    配置MySQL以定期转储所有数据

  29. 29

    是否可以定义将重试的图层,例如具有指数补偿的图层?

热门标签

归档