Skip to content

Commit

Permalink
add project euler.net TriplicateNumbers problem
Browse files Browse the repository at this point in the history
  • Loading branch information
giovannymassuia committed Dec 31, 2023
1 parent cf2ff38 commit af3fb79
Show file tree
Hide file tree
Showing 7 changed files with 299 additions and 4 deletions.
1 change: 1 addition & 0 deletions .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

124 changes: 124 additions & 0 deletions .idea/uiDesigner.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

14 changes: 10 additions & 4 deletions java-dsa/pom.xml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>io.giovannymassuia</groupId>
Expand All @@ -21,6 +21,12 @@
<version>5.10.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<version>5.10.0</version>
<scope>test</scope>
</dependency>
</dependencies>

<build>
Expand All @@ -41,10 +47,10 @@
<disable>true</disable>
</consoleOutputReporter>
<statelessTestsetInfoReporter
implementation="org.apache.maven.plugin.surefire.extensions.junit5.JUnit5StatelessTestsetInfoTreeReporterUnicode"/>
implementation="org.apache.maven.plugin.surefire.extensions.junit5.JUnit5StatelessTestsetInfoTreeReporterUnicode"/>
</configuration>
</plugin>
</plugins>
</build>

</project>
</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package io.giovannymassuia.eulernet.triplicatenumber;

/**
* A triplicate number is a positive integer such that, after repeatedly removing three consecutive
* identical digits from it, all its digits can be removed.</p>
*
* <p>
* For example, the integer 122555211 is a triplicate number:
* </p>
* <p>
* 122[555]211 -> 1[222]11 -> [111] -> .
* </p>
* On the other hand, neither 663633 nor 9990 are triplicate numbers.
*/
public interface TriplicateNumbers {

boolean isTriplicate(long number);

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package io.giovannymassuia.eulernet.triplicatenumber;

public class TriplicateNumbersNaive implements TriplicateNumbers {

@Override
public boolean isTriplicate(long number) {
String numberString = String.valueOf(number);
// char[] numbers = numberString.toCharArray();
// Map<Character, Integer> counter = new HashMap<>();
//
// for (char n : numbers) {
// counter.merge(n, 1, Integer::sum);
// }

int len = numberString.length() / 3;

for (int i = 0; i < len; i++) {
for (int j = 0; j <= 9; j++) {
String x = String.valueOf(j).repeat(3);
if (numberString.contains(x)) {
numberString = numberString.replace(x, "");
}

if (numberString.isEmpty()) {
return true;
}
}
}

return numberString.isEmpty();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
package io.giovannymassuia.eulernet.triplicatenumber;

import java.util.HashMap;
import java.util.Map;
import java.util.Stack;

public class TriplicateNumbersStack implements TriplicateNumbers {

@Override
public boolean isTriplicate(long number) {
// 122555244411L
// [1] <-> [2] <-> [5] <-> [2] <-> [4] <-> [1]
// 1 2 3 1 3 2
return solutionWithTuple(number) && solutionWithMap(number);
}

private boolean solutionWithMap(long number) {
Stack<Character> stack = new Stack<>();
Map<Character, Integer> counter = new HashMap<>();

char[] numbers = String.valueOf(number).toCharArray();

stack.push(numbers[0]);
counter.put(numbers[0], 1);

for (int i = 1; i < numbers.length; i++) {
char curr = numbers[i];

counter.merge(curr, 1, Integer::sum);

if (!stack.isEmpty() && stack.peek() == curr) {
if (counter.get(curr) == 3) {
stack.pop();
counter.put(curr, 0);
}
} else {
stack.push(curr);
}
}

return stack.isEmpty();
}

private boolean solutionWithTuple(long number) {
Stack<Tuple> stack = new Stack<>();
char[] numbers = String.valueOf(number).toCharArray();

for (char n : numbers) {
if (!stack.isEmpty() && stack.peek().c == n) {
if (++stack.peek().count == 3) {
stack.pop();
}
continue;
}
stack.push(Tuple.of(n));
}

return stack.isEmpty();
}

static class Tuple {

char c;
int count = 1;

Tuple(char c) {
this.c = c;
}

static Tuple of(char c) {
return new Tuple(c);
}
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package io.giovannymassuia.eulernet.triplicatenumber;

import static org.junit.jupiter.api.Assertions.assertEquals;

import java.util.stream.Stream;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource;

class TriplicateNumbersTest {

TriplicateNumbers triplicateNumbersNaive = new TriplicateNumbersNaive();
TriplicateNumbers triplicateNumbersStack = new TriplicateNumbersStack();

@ParameterizedTest
@MethodSource("buildInputs")
void isTriplicateNaive(long input, boolean expect) {
assertEquals(triplicateNumbersNaive.isTriplicate(input), expect);
}

@ParameterizedTest
@MethodSource("buildInputs")
void isTriplicateStack(long input, boolean expect) {
assertEquals(triplicateNumbersStack.isTriplicate(input), expect);
}

private static Stream<Arguments> buildInputs() {
return Stream.of(
Arguments.of(122555211L, true),
Arguments.of(663633L, false),
Arguments.of(9990L, false),
Arguments.of(122555244411L, true),
Arguments.of(122255522211L, true),
Arguments.of(122344433211L, true),
Arguments.of(411433314111444L, false)
);
}
}

0 comments on commit af3fb79

Please sign in to comment.