1. Phiên bản đơn giản
Kịch bản dưới đây sẽ tạo ra bài tập một cách ngẫu nhiên, + , - , x và ÷ . Bạn có thể (và nên) đặt số lượng tối đa mà tập lệnh có thể sử dụng, cũng như khoảng thời gian giữa các bài tập.
Bài tập
Các bài tập được trình bày trong cửa sổ nhập Zenity:
nếu câu trả lời sai:
Nếu câu trả lời là đúng:
Kịch bản
#!/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()
Cách sử dụng
- Sao chép tập lệnh vào một tập tin trống, lưu nó dưới dạng
mindpractice.py
Chạy nó với số lượng tối đa được phép và khoảng thời gian (tính bằng giây) giữa các bài tập dưới dạng đối số:
python3 /path/to/mindpractice.py <max_number> <interval>
ví dụ
python3 /path/to/mindpractice.py 1000 300
để thực hiện các phép tính lên đến số liệu 1000
, với thời gian nghỉ 5 phút giữa các bài tập.
Nếu tất cả đều hoạt động tốt, bạn có thể thêm nó vào các ứng dụng khởi động theo cách thông thường hoặc trình khởi chạy để chuyển đổi có thể được thực hiện, mà tôi có thể thêm sau :)
Ghi chú
- Việc phân chia có thể cần một số lời giải thích. Bạn có thể không muốn tính toán trong phao. Do đó, nếu phép gán là một phép chia, tập lệnh sẽ tra cứu các số có thể được chia cho và chọn một số (ngẫu nhiên). Nếu số (chính) hóa ra là số nguyên tố, phép gán được thay đổi thành loại khác.
2. Nhiều lựa chọn hơn
Khi bạn bắt đầu tính toán, bạn sẽ thấy rằng việc chia tối đa cho các số liệu (giả sử) 100 dễ dàng hơn nhiều so với nhân số lên tới 100.
Với tập lệnh bên dưới, bạn có thể (và nên) đặt tối đa số cho mỗi loại bài tập (xem hướng dẫn bên dưới tập lệnh).
Kịch bản
#!/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()
Cách sử dụng
Thiết lập tập lệnh chính xác như tập lệnh đầu tiên, nhưng chạy tập lệnh với các đối số (theo bất kỳ thứ tự nào, tập lệnh sẽ liên kết đúng các đối số với mục bên phải):
p:
tạm dừng (nghỉ giữa các bài tập, tính bằng giây))
s:
trừ (số tối đa để tính với)
a:
thêm (số tối đa)
m:
nhân (số tối đa)
d:
chia (số tối đa)
Ví dụ:
python3 '/home/jacob/Desktop/num.py' a:10 d:100 s:10 m:10 p:300
để hiển thị một bài tập cứ sau năm phút, số lượng lên tới 10, ngoại trừ chia cho hình 100.
3. Hãy mang đi một chút
Có thể xem một số thống kê
Phiên bản dưới đây cho bạn thấy số liệu thống kê sau mỗi 10 bài tập:
Ngoài ra (có thể hữu ích khi sử dụng cho trẻ em), bạn có thể thấy những gì đã sai trong 100 bài tập được trả lời sai cuối cùng. Trong một tệp ẩn, cả bài tập và câu trả lời (không chính xác) của chúng đều được viết:
Logfile này được đặt:
~/.calculog
Kịch bản
#!/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 = []
Cách sử dụng
Cách sử dụng khá giống với tùy chọn 2, nhưng bạn sẽ có sẵn tệp logfile và điểm số sau mỗi 10 bài tập.
4. Phiên bản cuối cùng
Phiên bản bên dưới giống như tùy chọn 3 (bao gồm tệp nhật ký và báo cáo), nhưng có một số tính năng bổ sung:
thêm tính toán căn bậc hai
thêm bằng cách sử dụng một phạm vi số, thay vì chỉ đơn giản là đặt tối đa
- thêm tùy chọn để chỉ chạy các loại tính toán cụ thể (ví dụ: chỉ chia và nhân).
nhớ các đối số mà nó đã được chạy với lần trước, khi chạy mà không có đối số (chỉ lần đầu tiên, các đối số phải được đặt). Nếu không có đối số nào được đặt trong lần chạy đầu tiên, tập lệnh sẽ gửi một thông báo:
Kịch bản
#!/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 = []
Cách sử dụng
Sao chép tập lệnh vào một tập tin trống, lưu nó (một lần nữa) dưới dạng mindpractice.py
. Chạy nó với các tùy chọn sau (làm ví dụ)
Phải được thiết lập:
p:300 to set the interval between assignments to 5 minutes
Tùy chọn (thực hiện lựa chọn):
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
Lệnh ví dụ:
python3 '/path/to/mindpractice.py' p:300 d:10-100 s:10-30 r:300-600
để thiết lập:
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
trong khi thêm và nhân không được sử dụng.
Sau đó, lần sau, nếu tập lệnh được chạy với:
python3 '/path/to/mindpractice.py'
Nó sẽ ghi nhớ các đối số được sử dụng cuối cùng
Sử dụng phiên bản phục vụ tốt nhất nhu cầu của bạn ...