정기적으로 정신 산술 운동을 할 수있는 소프트웨어가 있습니까?


9

나는 게으른 성격을 알고 있으며 때때로 기본적인 정신 산술을하도록 나 자신을 밀어야합니다. 따라서 나는 주기적으로 짧은 정신 산술 운동 (플러스, 마이너스, 곱하기, 나누기)을 요구하는 소프트웨어를 찾고 있습니다.

기준 :

  • 간격 시간을 사용자 정의 할 수 있어야합니다.
  • Ubuntu Desktop에 통합되어야합니다. 즉, 배경에 숨겨져 있고 운동 시간 동안 만 팝업 (팝업)됩니다

2
그러한 소프트웨어가 존재하는지 의심하지만 쉘 또는 파이썬 스크립트로 매우 쉽게 만들 수 있습니다. 내일까지 뭔가를 요리거야, 생각 나게하십시오
세르지 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. 모든 것이 제대로 작동하면 일반적인 방법으로 시작 응용 프로그램에 추가 하거나 토글 런처를 만들 수 있습니다. 나중에 추가 할 수 있습니다 :)

노트

  • 분할은 약간의 설명이 필요할 수 있습니다. 수레로 계산하고 싶지 않을 것입니다. 따라서 과제가 나누기 인 경우 스크립트는 나눌 수있는 숫자를 찾아서 무작위로 하나를 선택합니다. (main) 번호가 소수로 판명되면 할당이 다른 유형으로 변경됩니다.

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

    그림 100까지 나누는 것을 제외하고 5 분마다 운동을 표시합니다 (최대 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

1
@orschiro는 어려움을 구별하기 위해 확장 버전을 추가했습니다.
Jacob Vlijm

로그 파일은 아주 좋은 생각입니다! 나는 현재 세 자리 곱셈과 나눗셈에 대해 머리를 쓰려고 노력하고 있습니다. 그들은 그렇게 간단하지 않습니다. :)
orschiro

단지 생각 : 때때로 나는 일에 너무 집중하여 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 버전에 대해 개인적으로 감사드립니다. 한가지 질문은 방금 운동을했다는 것 15/14 = 1입니다. 그런 운동이 얼마나 유용한 지 잘 모르겠습니다. 어떻게 생각해?
orschiro

@orschiro 이것은입니다 integer arithmetic. 즉, 결과는 전체가 아니라 나머지 부분임을 의미합니다. 원하는 경우 decimal산술 을 구현할 수도 있습니다. 또한 어떤 종류의 다른 옵션을 구현하고 추가하고 싶은지 알려주십시오. 현재, 나는 agile development방법 을 연습하려고 노력하고 있으며 클라이언트와의 통신이 그러한 방법의 핵심입니다. 알려주세요.
Sergiy Kolodyazhnyy

듣기 좋네요! 더 많은 피드백을 제공하고 싶습니다. 예를 들어 Ubuntu Desktop에 더 잘 통합됩니다 (스크립트를 백그라운드에서 더 많이 실행합니다 (예 : 사용자 입력 후 최소화)). 추가 피드백을 가장 잘 제공 할 수있는 방법은 무엇입니까?
orschiro
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.