0.2.3-t7
Deploy to FTP / deploy (push) Successful in 4s
Build APK / build (push) Failing after 1m57s

This commit is contained in:
Sebastian Molenda
2026-05-29 22:20:33 +02:00
parent 66a028880c
commit 1385b3ace0
8 changed files with 152 additions and 42 deletions
+36 -1
View File
@@ -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.
+26 -13
View File
@@ -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[{
&quot;keyToString&quot;: { "keyToString": {
&quot;ModuleVcsDetector.initialDetectionPerformed&quot;: &quot;true&quot;, "ModuleVcsDetector.initialDetectionPerformed": "true",
&quot;RunOnceActivity.ShowReadmeOnStart&quot;: &quot;true&quot;, "RunOnceActivity.ShowReadmeOnStart": "true",
&quot;RunOnceActivity.cidr.known.project.marker&quot;: &quot;true&quot;, "RunOnceActivity.cidr.known.project.marker": "true",
&quot;RunOnceActivity.git.unshallow&quot;: &quot;true&quot;, "RunOnceActivity.git.unshallow": "true",
&quot;RunOnceActivity.readMode.enableVisualFormatting&quot;: &quot;true&quot;, "RunOnceActivity.readMode.enableVisualFormatting": "true",
&quot;cf.first.check.clang-format&quot;: &quot;false&quot;, "android.gradle.sync.needed": "true",
&quot;cidr.known.project.marker&quot;: &quot;true&quot;, "cf.first.check.clang-format": "false",
&quot;git-widget-placeholder&quot;: &quot;master&quot;, "cidr.known.project.marker": "true",
&quot;kotlin-language-version-configured&quot;: &quot;true&quot;, "git-widget-placeholder": "master",
&quot;last_opened_file_path&quot;: &quot;/Users/aln/Work/Matma&quot; "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="" />
+42 -19
View File
@@ -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){
+25 -5
View File
@@ -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 = ''
+23 -4
View File
@@ -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 = ''