0.2.3-t7
This commit is contained in:
+36
-1
@@ -1,3 +1,38 @@
|
|||||||
.DS_Store
|
.DS_Store
|
||||||
./QuizzyTemplate
|
./QuizzyTemplate
|
||||||
./QuizzyTemplate/*
|
/.QuizzyTemplate
|
||||||
|
|
||||||
|
# Android/Gradle
|
||||||
|
/.gradle/
|
||||||
|
/build/
|
||||||
|
/app/build/
|
||||||
|
/**/build/
|
||||||
|
|
||||||
|
# Gradle wrapper
|
||||||
|
/gradle/wrapper/gradle-wrapper.jar
|
||||||
|
|
||||||
|
# Local configuration
|
||||||
|
/local.properties
|
||||||
|
|
||||||
|
# Keystore
|
||||||
|
*.jks
|
||||||
|
|
||||||
|
# Generated APKs/outputs
|
||||||
|
**/outputs/
|
||||||
|
**/apk/**
|
||||||
|
*.apk
|
||||||
|
*.ap_
|
||||||
|
|
||||||
|
# IntelliJ / Android Studio
|
||||||
|
.idea/
|
||||||
|
*.iml
|
||||||
|
|
||||||
|
# macOS
|
||||||
|
.DS_Store
|
||||||
|
|
||||||
|
# NPM / Node
|
||||||
|
node_modules/
|
||||||
|
|
||||||
|
# Misc
|
||||||
|
*.log
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Generated
+26
-13
@@ -13,6 +13,18 @@
|
|||||||
<component name="ClangdSettings">
|
<component name="ClangdSettings">
|
||||||
<option name="formatViaClangd" value="false" />
|
<option name="formatViaClangd" value="false" />
|
||||||
</component>
|
</component>
|
||||||
|
<component name="ExternalProjectsManager">
|
||||||
|
<system id="GRADLE">
|
||||||
|
<state>
|
||||||
|
<projects_view>
|
||||||
|
<tree_state>
|
||||||
|
<expand />
|
||||||
|
<select />
|
||||||
|
</tree_state>
|
||||||
|
</projects_view>
|
||||||
|
</state>
|
||||||
|
</system>
|
||||||
|
</component>
|
||||||
<component name="Git.Settings">
|
<component name="Git.Settings">
|
||||||
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
|
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
|
||||||
</component>
|
</component>
|
||||||
@@ -25,20 +37,21 @@
|
|||||||
<option name="hideEmptyMiddlePackages" value="true" />
|
<option name="hideEmptyMiddlePackages" value="true" />
|
||||||
<option name="showLibraryContents" value="true" />
|
<option name="showLibraryContents" value="true" />
|
||||||
</component>
|
</component>
|
||||||
<component name="PropertiesComponent">{
|
<component name="PropertiesComponent"><![CDATA[{
|
||||||
"keyToString": {
|
"keyToString": {
|
||||||
"ModuleVcsDetector.initialDetectionPerformed": "true",
|
"ModuleVcsDetector.initialDetectionPerformed": "true",
|
||||||
"RunOnceActivity.ShowReadmeOnStart": "true",
|
"RunOnceActivity.ShowReadmeOnStart": "true",
|
||||||
"RunOnceActivity.cidr.known.project.marker": "true",
|
"RunOnceActivity.cidr.known.project.marker": "true",
|
||||||
"RunOnceActivity.git.unshallow": "true",
|
"RunOnceActivity.git.unshallow": "true",
|
||||||
"RunOnceActivity.readMode.enableVisualFormatting": "true",
|
"RunOnceActivity.readMode.enableVisualFormatting": "true",
|
||||||
"cf.first.check.clang-format": "false",
|
"android.gradle.sync.needed": "true",
|
||||||
"cidr.known.project.marker": "true",
|
"cf.first.check.clang-format": "false",
|
||||||
"git-widget-placeholder": "master",
|
"cidr.known.project.marker": "true",
|
||||||
"kotlin-language-version-configured": "true",
|
"git-widget-placeholder": "master",
|
||||||
"last_opened_file_path": "/Users/aln/Work/Matma"
|
"kotlin-language-version-configured": "true",
|
||||||
|
"last_opened_file_path": "/Users/aln/Work/Matma"
|
||||||
}
|
}
|
||||||
}</component>
|
}]]></component>
|
||||||
<component name="TaskManager">
|
<component name="TaskManager">
|
||||||
<task active="true" id="Default" summary="Default task">
|
<task active="true" id="Default" summary="Default task">
|
||||||
<changelist id="51538617-7e5b-4e71-9f47-7bda274cf4cc" name="Changes" comment="" />
|
<changelist id="51538617-7e5b-4e71-9f47-7bda274cf4cc" name="Changes" comment="" />
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ const state = {
|
|||||||
timeLeft: 60,
|
timeLeft: 60,
|
||||||
sessionSolved: 0,
|
sessionSolved: 0,
|
||||||
sessionTarget: 20,
|
sessionTarget: 20,
|
||||||
|
history: [],
|
||||||
settings: {
|
settings: {
|
||||||
timedSeconds: 60,
|
timedSeconds: 60,
|
||||||
maxResult: 40,
|
maxResult: 40,
|
||||||
@@ -137,6 +138,7 @@ function startPlay(){
|
|||||||
menuScreen.classList.add('hidden')
|
menuScreen.classList.add('hidden')
|
||||||
playScreen.classList.remove('hidden')
|
playScreen.classList.remove('hidden')
|
||||||
state.score = 0
|
state.score = 0
|
||||||
|
state.history = []
|
||||||
scoreEl.textContent = state.score
|
scoreEl.textContent = state.score
|
||||||
state.answerBuffer = ''
|
state.answerBuffer = ''
|
||||||
answerEl.textContent = ''
|
answerEl.textContent = ''
|
||||||
@@ -160,53 +162,74 @@ function startPlay(){
|
|||||||
|
|
||||||
function generateProblem(){
|
function generateProblem(){
|
||||||
const ops = Array.from(state.ops)
|
const ops = Array.from(state.ops)
|
||||||
const op = ops[Math.floor(Math.random()*ops.length)]
|
|
||||||
const maxOp = Math.max(1, state.settings.maxOperand)
|
const maxOp = Math.max(1, state.settings.maxOperand)
|
||||||
const maxRes = Math.max(1, state.settings.maxResult)
|
const maxRes = Math.max(1, state.settings.maxResult)
|
||||||
let a = 0, b = 0
|
let a = 0, b = 0, op = '';
|
||||||
for (let i=0;i<200;i++){
|
|
||||||
|
const maxAttempts = 200;
|
||||||
|
for (let i = 0; i < maxAttempts; i++) {
|
||||||
|
op = ops[Math.floor(Math.random()*ops.length)]
|
||||||
|
let candidate = null;
|
||||||
|
|
||||||
if (op === 'div'){
|
if (op === 'div'){
|
||||||
b = randInt(1, maxOp)
|
b = randInt(1, maxOp)
|
||||||
if (!state.settings.allowFraction){
|
if (!state.settings.allowFraction){
|
||||||
const maxQByOp = Math.floor(maxOp / b)
|
const maxQByOp = Math.floor(maxOp / b)
|
||||||
const maxQ = Math.min(maxRes, maxQByOp)
|
const maxQ = Math.min(maxRes, maxQByOp)
|
||||||
if (maxQ < 0) continue
|
if (maxQ >= 0) {
|
||||||
const q = randInt(0, maxQ)
|
const q = randInt(0, maxQ)
|
||||||
a = q * b
|
a = q * b
|
||||||
if (state.settings.allowNegative && Math.random() < 0.2) a = -a
|
if (state.settings.allowNegative && Math.random() < 0.2) a = -a
|
||||||
return {a,b,op}
|
candidate = {a,b,op}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
const maxResultNByOp = Math.floor((10 * maxOp) / b)
|
const maxResultNByOp = Math.floor((10 * maxOp) / b)
|
||||||
const maxResultN = Math.min(maxRes * 10, maxResultNByOp)
|
const maxResultN = Math.min(maxRes * 10, maxResultNByOp)
|
||||||
if (maxResultN < 0) continue
|
if (maxResultN >= 0) {
|
||||||
const result_n = randInt(0, maxResultN)
|
const result_n = randInt(0, maxResultN)
|
||||||
if ((result_n * b) % 10 !== 0) continue
|
if ((result_n * b) % 10 === 0) {
|
||||||
a = (result_n * b) / 10
|
a = (result_n * b) / 10
|
||||||
if (state.settings.allowNegative && Math.random() < 0.2) a = -a
|
if (state.settings.allowNegative && Math.random() < 0.2) a = -a
|
||||||
return {a,b,op}
|
candidate = {a,b,op}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else if (op === 'mul'){
|
} else if (op === 'mul'){
|
||||||
a = randInt(0, maxOp)
|
a = randInt(0, maxOp)
|
||||||
b = randInt(0, maxOp)
|
b = randInt(0, maxOp)
|
||||||
if (a * b <= maxRes) return {a,b,op}
|
if (a * b <= maxRes) candidate = {a,b,op}
|
||||||
} else if (op === 'add'){
|
} else if (op === 'add'){
|
||||||
a = randInt(0, maxOp)
|
a = randInt(0, maxOp)
|
||||||
b = randInt(0, maxOp)
|
b = randInt(0, maxOp)
|
||||||
if (a + b <= maxRes) return {a,b,op}
|
if (a + b <= maxRes) candidate = {a,b,op}
|
||||||
} else if (op === 'sub'){
|
} else if (op === 'sub'){
|
||||||
a = randInt(0, maxOp)
|
a = randInt(0, maxOp)
|
||||||
b = randInt(0, maxOp)
|
b = randInt(0, maxOp)
|
||||||
if (!state.settings.allowNegative){
|
if (!state.settings.allowNegative){
|
||||||
if (a < b) [a,b] = [b,a]
|
if (a < b) [a,b] = [b,a]
|
||||||
if (a - b <= maxRes) return {a,b,op}
|
if (a - b <= maxRes) candidate = {a,b,op}
|
||||||
} else {
|
} else {
|
||||||
if (Math.abs(a - b) <= maxRes) return {a,b,op}
|
if (Math.abs(a - b) <= maxRes) candidate = {a,b,op}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (candidate) {
|
||||||
|
// Generujemy klucz dla historii. Dla dodawania i mnożenia 2+3 to to samo co 3+2.
|
||||||
|
const key = (op === 'add' || op === 'mul')
|
||||||
|
? `${op}:${[candidate.a, candidate.b].sort().join(',')}`
|
||||||
|
: `${op}:${candidate.a},${candidate.b}`;
|
||||||
|
|
||||||
|
if (!state.history.includes(key) || i === maxAttempts - 1) {
|
||||||
|
state.history.push(key);
|
||||||
|
if (state.history.length > 20) state.history.shift();
|
||||||
|
return candidate;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
a = Math.min(maxOp, Math.floor(maxRes/2))
|
a = Math.min(maxOp, Math.floor(maxRes/2))
|
||||||
b = Math.min(maxOp, 1)
|
b = Math.min(maxOp, 1)
|
||||||
return {a,b,op}
|
return {a,b,op: ops[0] || 'add'}
|
||||||
}
|
}
|
||||||
|
|
||||||
function randInt(min,max){
|
function randInt(min,max){
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
// Nauka Dzielenia
|
// Nauka Dzielenia
|
||||||
;(function () {
|
;(function () {
|
||||||
const st = { divisor: null, total: 20, solved: 0, score: 0, current: null, buf: '' }
|
const st = { divisor: null, total: 20, solved: 0, score: 0, current: null, buf: '', history: [] }
|
||||||
|
|
||||||
const selectScreen = document.getElementById('select-screen')
|
const selectScreen = document.getElementById('select-screen')
|
||||||
const playScreen = document.getElementById('play-screen')
|
const playScreen = document.getElementById('play-screen')
|
||||||
@@ -26,13 +26,14 @@
|
|||||||
st.total = Math.max(5, Math.min(100, parseInt(totalInput.value, 10) || 20))
|
st.total = Math.max(5, Math.min(100, parseInt(totalInput.value, 10) || 20))
|
||||||
st.solved = 0
|
st.solved = 0
|
||||||
st.score = 0
|
st.score = 0
|
||||||
|
st.history = []
|
||||||
show(playScreen)
|
show(playScreen)
|
||||||
nextProblem()
|
nextProblem()
|
||||||
})
|
})
|
||||||
|
|
||||||
document.getElementById('back-btn').addEventListener('click', () => show(selectScreen))
|
document.getElementById('back-btn').addEventListener('click', () => show(selectScreen))
|
||||||
document.getElementById('again-btn').addEventListener('click', () => {
|
document.getElementById('again-btn').addEventListener('click', () => {
|
||||||
st.solved = 0; st.score = 0; show(playScreen); nextProblem()
|
st.solved = 0; st.score = 0; st.history = []; show(playScreen); nextProblem()
|
||||||
})
|
})
|
||||||
document.getElementById('change-btn').addEventListener('click', () => show(selectScreen))
|
document.getElementById('change-btn').addEventListener('click', () => show(selectScreen))
|
||||||
|
|
||||||
@@ -60,9 +61,28 @@
|
|||||||
function randInt(min, max) { return Math.floor(Math.random() * (max - min + 1)) + min }
|
function randInt(min, max) { return Math.floor(Math.random() * (max - min + 1)) + min }
|
||||||
|
|
||||||
function nextProblem() {
|
function nextProblem() {
|
||||||
const b = st.divisor || randInt(1, 10) // divisor
|
let a, b, answer, key;
|
||||||
const answer = randInt(1, 10) // quotient (always integer)
|
const maxAttempts = 50;
|
||||||
const a = b * answer // dividend
|
|
||||||
|
for (let i = 0; i < maxAttempts; i++) {
|
||||||
|
b = st.divisor || randInt(1, 10) // divisor
|
||||||
|
answer = randInt(1, 10) // quotient
|
||||||
|
a = b * answer // dividend
|
||||||
|
|
||||||
|
// Jeśli wybrano konkretny dzielnik, kluczem jest iloraz (wynik).
|
||||||
|
// W przeciwnym razie kluczem jest całe działanie.
|
||||||
|
key = st.divisor ? answer : `${a}:${b}`;
|
||||||
|
|
||||||
|
if (!st.history.includes(key) || i === maxAttempts - 1) {
|
||||||
|
st.history.push(key);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (st.history.length > (st.divisor ? 6 : 15)) {
|
||||||
|
st.history.shift();
|
||||||
|
}
|
||||||
|
|
||||||
st.current = { a, b, answer }
|
st.current = { a, b, answer }
|
||||||
problemEl.textContent = `${a} ÷ ${b}`
|
problemEl.textContent = `${a} ÷ ${b}`
|
||||||
feedbackEl.textContent = ''
|
feedbackEl.textContent = ''
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
// Nauka Mnożenia
|
// Nauka Mnożenia
|
||||||
;(function () {
|
;(function () {
|
||||||
const st = { table: null, total: 20, solved: 0, score: 0, current: null, buf: '' }
|
const st = { table: null, total: 20, solved: 0, score: 0, current: null, buf: '', history: [] }
|
||||||
|
|
||||||
const selectScreen = document.getElementById('select-screen')
|
const selectScreen = document.getElementById('select-screen')
|
||||||
const playScreen = document.getElementById('play-screen')
|
const playScreen = document.getElementById('play-screen')
|
||||||
@@ -27,13 +27,14 @@
|
|||||||
st.total = Math.max(5, Math.min(100, parseInt(totalInput.value, 10) || 20))
|
st.total = Math.max(5, Math.min(100, parseInt(totalInput.value, 10) || 20))
|
||||||
st.solved = 0
|
st.solved = 0
|
||||||
st.score = 0
|
st.score = 0
|
||||||
|
st.history = []
|
||||||
show(playScreen)
|
show(playScreen)
|
||||||
nextProblem()
|
nextProblem()
|
||||||
})
|
})
|
||||||
|
|
||||||
document.getElementById('back-btn').addEventListener('click', () => show(selectScreen))
|
document.getElementById('back-btn').addEventListener('click', () => show(selectScreen))
|
||||||
document.getElementById('again-btn').addEventListener('click', () => {
|
document.getElementById('again-btn').addEventListener('click', () => {
|
||||||
st.solved = 0; st.score = 0; show(playScreen); nextProblem()
|
st.solved = 0; st.score = 0; st.history = []; show(playScreen); nextProblem()
|
||||||
})
|
})
|
||||||
document.getElementById('change-btn').addEventListener('click', () => show(selectScreen))
|
document.getElementById('change-btn').addEventListener('click', () => show(selectScreen))
|
||||||
|
|
||||||
@@ -61,8 +62,26 @@
|
|||||||
function randInt(min, max) { return Math.floor(Math.random() * (max - min + 1)) + min }
|
function randInt(min, max) { return Math.floor(Math.random() * (max - min + 1)) + min }
|
||||||
|
|
||||||
function nextProblem() {
|
function nextProblem() {
|
||||||
const a = st.table || randInt(1, 10)
|
let a, b, key;
|
||||||
const b = randInt(1, 10)
|
const maxAttempts = 50;
|
||||||
|
|
||||||
|
for (let i = 0; i < maxAttempts; i++) {
|
||||||
|
a = st.table || randInt(1, 10)
|
||||||
|
b = randInt(1, 10)
|
||||||
|
// Jeśli wybrano konkretną tabelkę, kluczem jest tylko drugi składnik.
|
||||||
|
// Jeśli "wszystkie", kluczem jest posortowana para (żeby 2x3 i 3x2 były traktowane tak samo).
|
||||||
|
key = st.table ? b : [a, b].sort().join('x');
|
||||||
|
|
||||||
|
if (!st.history.includes(key) || i === maxAttempts - 1) {
|
||||||
|
st.history.push(key);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (st.history.length > (st.table ? 6 : 15)) {
|
||||||
|
st.history.shift();
|
||||||
|
}
|
||||||
|
|
||||||
st.current = { a, b, answer: a * b }
|
st.current = { a, b, answer: a * b }
|
||||||
problemEl.textContent = `${a} × ${b}`
|
problemEl.textContent = `${a} × ${b}`
|
||||||
feedbackEl.textContent = ''
|
feedbackEl.textContent = ''
|
||||||
|
|||||||
Reference in New Issue
Block a user