Skip to content

Commit e42404b

Browse files
authored
Add prime factorization (#262)
1 parent b7dd44d commit e42404b

9 files changed

Lines changed: 174 additions & 0 deletions

File tree

app/src/main/java/com/github/muellerma/tabletoptools/ui/MainActivity.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ class MainActivity : AppCompatActivity() {
4141
R.id.nav_rot13,
4242
R.id.nav_alphabet,
4343
R.id.nav_number_converter,
44+
R.id.nav_prime_fac,
4445
R.id.nav_timer,
4546
R.id.nav_buzzers,
4647
R.id.nav_prefs
@@ -58,6 +59,7 @@ class MainActivity : AppCompatActivity() {
5859
getString(R.string.menu_rot13_value) -> R.id.nav_rot13
5960
getString(R.string.menu_alphabet_value) -> R.id.nav_alphabet
6061
getString(R.string.menu_number_converter_value) -> R.id.nav_number_converter
62+
getString(R.string.menu_prime_fac_value) -> R.id.nav_prime_fac
6163
getString(R.string.menu_timer_value) -> R.id.nav_timer
6264
getString(R.string.menu_buzzers_value) -> R.id.nav_buzzers
6365
else -> R.id.nav_dice
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
package com.github.muellerma.tabletoptools.ui.fragments
2+
3+
import android.os.Bundle
4+
import android.text.Editable
5+
import android.text.TextWatcher
6+
import android.util.Log
7+
import android.view.LayoutInflater
8+
import android.view.View
9+
import android.view.ViewGroup
10+
import android.widget.EditText
11+
import androidx.annotation.VisibleForTesting
12+
import com.github.muellerma.tabletoptools.databinding.FragmentPrimeFacBinding
13+
import kotlin.math.sqrt
14+
15+
16+
class PrimeFacFragment : AbstractBaseFragment(), TextWatcher {
17+
private lateinit var binding: FragmentPrimeFacBinding
18+
private lateinit var input: EditText
19+
20+
override fun onCreateView(
21+
inflater: LayoutInflater,
22+
container: ViewGroup?,
23+
savedInstanceState: Bundle?
24+
): View {
25+
Log.d(TAG, "onCreateView()")
26+
binding = FragmentPrimeFacBinding.inflate(inflater, container, false)
27+
28+
input = binding.input
29+
30+
input.addTextChangedListener(this)
31+
32+
val savedInput = savedInstanceState?.getCharSequence("input")?.toString().orEmpty()
33+
input.setText(savedInput)
34+
35+
return binding.root
36+
}
37+
38+
override fun onSaveInstanceState(outState: Bundle) {
39+
outState.putCharSequence("input", input.text)
40+
super.onSaveInstanceState(outState)
41+
}
42+
43+
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
44+
// no-op
45+
}
46+
47+
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
48+
// no-op
49+
}
50+
51+
override fun afterTextChanged(s: Editable?) {
52+
val input = input.text.toString().toIntOrNull()
53+
val output = if (input == null) {
54+
""
55+
} else {
56+
factor(input).joinToString(", ")
57+
}
58+
binding.result.text = output
59+
}
60+
61+
companion object {
62+
private var TAG = PrimeFacFragment::class.java.simpleName
63+
64+
@VisibleForTesting
65+
fun factor(num: Int): ArrayList<Int> {
66+
val array = ArrayList<Int>()
67+
var x = num
68+
var i = 2
69+
while (i <= sqrt(x.toDouble())) {
70+
while (x % i == 0) {
71+
array.add(i)
72+
x /= i
73+
}
74+
i++
75+
}
76+
if (x != 1 || num == 1) {
77+
array.add(x)
78+
}
79+
return array
80+
}
81+
}
82+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<vector xmlns:android="http://schemas.android.com/apk/res/android"
2+
android:width="24dp"
3+
android:height="24dp"
4+
android:viewportWidth="24"
5+
android:viewportHeight="24">
6+
<path
7+
android:fillColor="#FF000000"
8+
android:pathData="M19,13H5V11H19V13M12,5A2,2 0,0 1,14 7A2,2 0,0 1,12 9A2,2 0,0 1,10 7A2,2 0,0 1,12 5M12,15A2,2 0,0 1,14 17A2,2 0,0 1,12 19A2,2 0,0 1,10 17A2,2 0,0 1,12 15Z"/>
9+
</vector>
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<ScrollView
3+
xmlns:android="http://schemas.android.com/apk/res/android"
4+
xmlns:app="http://schemas.android.com/apk/res-auto"
5+
xmlns:tools="http://schemas.android.com/tools"
6+
android:layout_width="match_parent"
7+
android:layout_height="match_parent"
8+
android:fillViewport="true"
9+
tools:context=".ui.fragments.PrimeFacFragment">
10+
11+
<androidx.constraintlayout.widget.ConstraintLayout
12+
android:layout_width="match_parent"
13+
android:layout_height="wrap_content">
14+
15+
<EditText
16+
android:layout_width="0dp"
17+
android:layout_height="wrap_content"
18+
android:inputType="number"
19+
android:gravity="start|top"
20+
android:lines="1"
21+
android:id="@+id/input"
22+
app:layout_constraintEnd_toEndOf="parent"
23+
app:layout_constraintStart_toStartOf="parent"
24+
android:layout_marginStart="8dp"
25+
android:layout_marginEnd="8dp"
26+
android:importantForAutofill="no"
27+
app:layout_constraintTop_toTopOf="parent"
28+
android:layout_marginTop="16dp"
29+
android:hint="@string/prime_fac_input"
30+
tools:ignore="LabelFor" />
31+
32+
<TextView
33+
android:layout_width="0dp"
34+
android:layout_height="0dp"
35+
android:id="@+id/result"
36+
app:layout_constraintTop_toBottomOf="@id/input"
37+
android:layout_marginTop="16dp"
38+
android:textIsSelectable="true"
39+
app:layout_constraintEnd_toEndOf="parent"
40+
app:layout_constraintStart_toStartOf="parent"
41+
android:layout_marginStart="8dp"
42+
android:layout_marginEnd="8dp"
43+
app:layout_constraintBottom_toBottomOf="parent"
44+
android:layout_marginBottom="8dp" />
45+
46+
</androidx.constraintlayout.widget.ConstraintLayout>
47+
</ScrollView>

app/src/main/res/menu/activity_main_drawer.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,12 @@
2424
android:id="@+id/nav_number_converter"
2525
android:icon="@drawable/ic_menu_number_converter"
2626
android:title="@string/menu_number_converter" />
27+
28+
<item
29+
android:id="@+id/nav_prime_fac"
30+
android:icon="@drawable/ic_division"
31+
android:title="@string/menu_prime_fac" />
32+
2733
<item
2834
android:id="@+id/nav_timer"
2935
android:icon="@drawable/ic_baseline_timer_24"

app/src/main/res/navigation/mobile_navigation.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,12 @@
3434
android:label="@string/menu_number_converter"
3535
tools:layout="@layout/fragment_number_converter" />
3636

37+
<fragment
38+
android:id="@+id/nav_prime_fac"
39+
android:name="com.github.muellerma.tabletoptools.ui.fragments.PrimeFacFragment"
40+
android:label="@string/menu_prime_fac"
41+
tools:layout="@layout/fragment_prime_fac" />
42+
3743
<fragment
3844
android:id="@+id/nav_timer"
3945
android:name="com.github.muellerma.tabletoptools.ui.fragments.TimerFragment"

app/src/main/res/values/array.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
<item>@string/menu_rot13</item>
1414
<item>@string/menu_alphabet</item>
1515
<item>@string/menu_number_converter</item>
16+
<item>@string/menu_prime_fac</item>
1617
<item>@string/menu_timer</item>
1718
<item>@string/menu_buzzers</item>
1819
</string-array>
@@ -22,6 +23,7 @@
2223
<item>@string/menu_rot13_value</item>
2324
<item>@string/menu_alphabet_value</item>
2425
<item>@string/menu_number_converter_value</item>
26+
<item>@string/menu_prime_fac_value</item>
2527
<item>@string/menu_timer_value</item>
2628
<item>@string/menu_buzzers_value</item>
2729
</string-array>

app/src/main/res/values/strings.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,10 @@
2727
<string name="number_converter_binary">Binary</string>
2828
<string name="number_converter_hexadecimal">Hexadecimal</string>
2929

30+
<!-- Integer factorization -->
31+
<string name="menu_prime_fac">Prime factorization</string>
32+
<string name="prime_fac_input">Enter an integer to perform a prime factorization</string>
33+
3034
<!-- Titles for start page -->
3135
<string name="menu_dice_value" translatable="false">dice</string>
3236
<string name="menu_timer_value" translatable="false">timer</string>
@@ -35,6 +39,7 @@
3539
<string name="menu_rot13_value" translatable="false">rot13</string>
3640
<string name="menu_alphabet_value" translatable="false">alphabet</string>
3741
<string name="menu_number_converter_value" translatable="false">converter</string>
42+
<string name="menu_prime_fac_value" translatable="false">prime_fac</string>
3843

3944
<!-- Dice -->
4045
<string name="menu_dice">Dice</string>
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.github.muellerma.tabletoptools
2+
3+
import com.github.muellerma.tabletoptools.ui.fragments.PrimeFacFragment
4+
import org.junit.Assert.assertEquals
5+
import org.junit.Test
6+
7+
class PrimeFacUnitTest {
8+
@Test
9+
fun testFactor() {
10+
assertEquals(arrayListOf(1), PrimeFacFragment.factor(1))
11+
assertEquals(arrayListOf(2, 2), PrimeFacFragment.factor(4))
12+
assertEquals(arrayListOf(2, 5), PrimeFacFragment.factor(10))
13+
assertEquals(arrayListOf(2, 3, 5), PrimeFacFragment.factor(30))
14+
}
15+
}

0 commit comments

Comments
 (0)