暗算の練習を定期的に行うソフトウェアはありますか?


9

私は自分の怠惰な性質を認識しており、時々いくつかの基本的な暗算を行うように自分をプッシュする必要があります。したがって、私は定期的に短い暗算演習(プラス、マイナス、乗算、除算)を行うように要求するソフトウェアを探しています。

基準:

  • インターバル時間をカスタマイズできるようにする必要があります
  • Ubuntuデスクトップに統合する必要があります。つまり、バックグラウンドで非表示にし、エクササイズ時にのみ表示(ポップアップ)します。

2
そのようなソフトウェアは存在しないと思いますが、シェルまたはpythonスクリプトで非常に簡単に作成できます。明日は料理を作ります。思い出してください
Sergiy Kolodyazhnyy

ええ、bsdgamesには算術などがありますが、定期的なポップアップを自分で自動化する必要があります。
mchid

@Serg様、あなたの料理の実験についてお伝えします。:)
orschiro

1
そこで、進行中の回答を投稿しました。進行中は編集します。見て、あなたの考え、追加または削除する機能を教えてください。これまでのところ、これはコンソールアプリですが、最終的には小さなポップアップウィンドウに変わります。
Sergiy Kolodyazhnyy

2
取り組むべき素晴らしい質問であることが判明しました!
Jacob Vlijm

回答:


8

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. すべて正常に動作する場合は、通常の方法で起動アプリケーションに追加する、トグルするランチャーを作成できます。後で追加する場合があります。

注意

  • 分割は、いくつかの説明が必要になる場合があります。あなたはおそらく浮動小数点数で計算したくないでしょう。したがって、割り当てが除算である場合、スクリプトは除算可能な数値を検索し、(ランダムに)1つを選択します。(メイン)番号が素数であることが判明した場合、割り当ては別のタイプに変更されます。

2.その他のオプション

計算を開始すると、100までの数値を掛けるよりも、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

    5分ごとにエクササイズを表示するには、最大100までの除算を除いて、最大10までの数字を入力します。


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'

最後に使用された引数を記憶します


ニーズに最適なバージョンを使用してください...



このバージョンはこれまでのところうまく機能しています。どうもありがとうございます!
orschiro 2016年

1
@orschiroは拡張版を追加して、問題を区別しました。
Jacob Vlijm

ログファイルはとてもいいアイデアです!私は現在、3桁の乗算と除算のいくつかに頭を悩ませています。それらはそれほど単純ではありません。:)
orschiro 2016年

単なるアイデア:仕事に集中しすぎて、Think Hard前に仕事を完了するためのウィンドウを無視することがあります(たとえば、文章を書き終えるなど)。その後、ウィンドウのことを忘れます。5分後にThink Hardウィンドウが自動的にフォーカスを回復する可能性はありますか?
orschiro

1
@orschiro絶対に!私はまだ完全にGUIバージョン(最初の実行でさえもコマンドラインから何も設定する必要はありません)を噛んでいましたが、それらが答えにメーターを追加できるかどうかはわかりません:)
Jacob Vlijm

3

前書き:

次のアプリケーションは、ユーザーが評価するランダムな整数式を生成します。ランダムに生成される式の範囲は、メインポップアップウィンドウでのユーザーの設定によって異なります。Lets Beginボタンをクリックすると、ユーザーが[キャンセル]ボタンを押すまで、セッションが無期限に開始されます。

ここに画像の説明を入力してください

ここに画像の説明を入力してください

ソースコード:

#!/usr/bin/env python

# Author: Serg Kolo
# Date: Jan 30,2016
# Purpose: A graphical utility for practicing
#          random arithmetic operations
# Written for: http://askubuntu.com/q/725287/295286

#    Copyright: Serg Kolo , 2016
#    This program is free software: you can redistribute it and/or modify
#    it under the terms of the GNU General Public License as published by
#    the Free Software Foundation, either version 3 of the License, or
#    (at your option) any later version.
#
#    This program is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU General Public License for more details.
#
#    You should have received a copy of the GNU General Public License
#    along with this program.  If not, see <http://www.gnu.org/licenses/>.

import sys
import time
import random
from PyQt4 import QtGui


class mathApp(QtGui.QWidget):
   def __init__(self):
       super(mathApp,self).__init__()
       self.mainMenu()

   def mainMenu(self):
      self.setGeometry(300, 300, 400, 200)

      self.btn = QtGui.QPushButton("Let's begin",self)
      self.btn.move(20,150)
      self.btn.clicked.connect(self.askQuestions)

      self.lbl1 = QtGui.QLabel(self)
      self.lbl1.move(20,25)
      self.lbl1.setText("Numbers From")


      self.lbl2 = QtGui.QLabel(self)
      self.lbl2.move(20,55)
      self.lbl2.setText("Numbers To")

      self.lbl2 = QtGui.QLabel(self)
      self.lbl2.move(20,85)
      self.lbl2.setText("Repeat (seconds)")

      self.le1 = QtGui.QLineEdit(self)
      self.le1.move(150,20)

      self.le2 = QtGui.QLineEdit(self)
      self.le2.move(150,50)

      self.le3 = QtGui.QLineEdit(self)
      self.le3.move(150,80)

      self.lbl3 = QtGui.QLabel(self)
      self.lbl3.move(20,105)

      self.setWindowTitle('Random Integer Arithmetic')

      self.show()

   def askQuestions(self):
       rangeStart = int(self.le1.text())
       rangeEnd = int(self.le2.text())
       sleepTime = int(self.le3.text())
       done=False
       while not done:
          self.show()
          expression = self.generateOperation(rangeStart,rangeEnd)
          correctAnswer = eval(expression)

          prompt = QtGui.QInputDialog() 
          text,ok = prompt.getText(self,"Don't think too hard",expression) 
          if ok:
             if int(text) == correctAnswer:                
                self.showAnswer("CORRECT,YOU ROCK !")
             else :
                self.showAnswer("Nope");
          else:
              done=True

          if done==True:
              self.close()
          time.sleep(sleepTime)


   def generateOperation(self,start,end):
      a = random.randint(start,end)
      b = random.randint(start,end)
      oplist = ['+','-','/','*']
      op = oplist[random.randint(0,3)]
      expr = str(a) + op + str(b) + ''
      return expr

   def showAnswer(self,result):
       popup = QtGui.QMessageBox()
       popup.setText(result)
       popup.exec_()


def main():
   root = QtGui.QApplication(sys.argv)
   app = mathApp()
   sys.exit(root.exec_())

if __name__ == '__main__':
   main()

@Serg様、拡張GUIバージョンを個人的に感謝したいと思います。1つの質問、私はちょうど運動をしました15/14 = 1。このような演習がどれほど役立つかはわかりません。どう思いますか?
orschiro 2016年

@orschiroこれですinteger arithmetic。つまり、結果は全体であり、残りではありません。よろしければ、decimal算術演算も実装してみてください。また、他にどのようなオプションを実装して追加してほしいか教えてください。現在、私はagile development方法を練習しようとしています、そして、クライアントとのコミュニケーションはそのような方法の鍵です。私にお知らせください。
Sergiy Kolodyazhnyy 2016年

それは聞くのは素晴らしいことです!Ubuntuのデスクトップへのより良い統合など、より多くのフィードバックを提供したいと思います(スクリプトをよりバックグラウンドで実行します。つまり、ユーザー入力後に最小化します)。どうすればさらにフィードバックを提供できますか?
orschiro 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.