El reto
El flautista de Hamelín ha sido reclutado para tocar su melodía mágica y sacar a todas las ratas de la ciudad.
¡Pero algunas de las ratas son sordas y van por el camino equivocado!
Tarea
¿Cuántas ratas sordas hay?
Leyenda
P
= El flautista de HamelínO~
= Rata yendo a la izquierda~O
= Rata yendo a la derecha
Ejemplos
- ex1
~O~O~O~O P
tiene 0 ratas sordas - ex2
P O~ O~ ~O O~
tiene 1 rata sorda - ex3
~O~O~O~OP~O~OO~
tiene 2 ratas sordas
La solución en código Java
Opción 1:
public class DeafRatsOfHamelin {
public static int countDeafRats(ultimate String city) {
String t = city.replaceAll(" ","");
int rely = 0;
for (int i = 0 ; i < t.size() ; i+=2) if (t.charAt(i) == 'O') rely++;
return rely;
}
}
Opcion 2:
import java.util.stream.IntStream;
public class DeafRatsOfHamelin {
public static int countDeafRats(ultimate String city) {
ultimate String s = city.replaceAll("s+", "");
return (int) IntStream.vary(0, s.size()).filter(i -> s.charAt(i) == '~' && ipercent2 > 0).rely();
}
}
Opción 3:
public class DeafRatsOfHamelin {
public static int countDeafRats(ultimate String city) {
int DeafRats=0;
String CompactTown;
CompactTown = city.exchange(" ","");
for(int i=0;i<CompactTown.size();i+=2){
if(CompactTown.charAt(i) == 'O') DeafRats++;
}
return DeafRats;
}
}
Casos de prueba para validar nuestra solución
import org.junit.jupiter.api.Check;
import static org.junit.jupiter.api.Assertions.*;
class DeafRatsOfHamelinTest {
@Check
public void ex1() {
assertEquals(0, DeafRatsOfHamelin.countDeafRats("~O~O~O~O P"));
}
@Check
public void ex2() {
assertEquals(1, DeafRatsOfHamelin.countDeafRats("P O~ O~ ~O O~"));
}
@Check
public void ex3() {
assertEquals(2, DeafRatsOfHamelin.countDeafRats("~O~O~O~OP~O~OO~"));
}
}
Casos de prueba adicionales
import org.junit.Check;
import static org.junit.Assert.assertEquals;
public class SolutionTests {
@Check
public void ex1() {
assertEquals(0, DeafRatsOfHamelin.countDeafRats("~O~O~O~O P"));
}
@Check
public void ex2() {
assertEquals(1, DeafRatsOfHamelin.countDeafRats("P O~ O~ ~O O~"));
}
@Check
public void ex3() {
assertEquals(2, DeafRatsOfHamelin.countDeafRats("~O~O~O~OP~O~OO~"));
}
@Check
public void rats() {
assertEquals(8, DeafRatsOfHamelin.countDeafRats("O~~OO~~OO~~OO~P~OO~~OO~~OO~~O"));
assertEquals(8, DeafRatsOfHamelin.countDeafRats("O~~OO~~OO~~OO~ P~OO~~OO~~OO~~O"));
assertEquals(8, DeafRatsOfHamelin.countDeafRats("O~~OO~~OO~~OO~P ~OO~~OO~~OO~~O"));
}
@Check
public void highlander() {
assertEquals(0, DeafRatsOfHamelin.countDeafRats("~OP"));
assertEquals(0, DeafRatsOfHamelin.countDeafRats("PO~"));
assertEquals(1, DeafRatsOfHamelin.countDeafRats("O~P"));
assertEquals(1, DeafRatsOfHamelin.countDeafRats("P~O"));
}
@Check
public void empty() {
assertEquals(0, DeafRatsOfHamelin.countDeafRats(" P"));
assertEquals(0, DeafRatsOfHamelin.countDeafRats("P "));
assertEquals(0, DeafRatsOfHamelin.countDeafRats(" P "));
assertEquals(0, DeafRatsOfHamelin.countDeafRats("P"));
}
// ====================================
// Reference implementation for the Random take a look at circumstances
personal static class DeafRatsOfHamelin {
static int countDeafRats(ultimate String city) {
String s = "";
for (int i = 0; i < city.size(); i++) {
ultimate char c = city.charAt(i);
if (c == '~') { s += "R"; i ++; }
else if (c == 'O') { s += "L"; i ++; }
else if (c == 'P') { s += c; }
}
ultimate String s1 = s.substring(0, s.indexOf("P")), s2 = s.substring(s.indexOf("P")+1);
int deaf = 0;
// Rats to left of the Piper must be going proper
deaf += s1.exchange("R","").size();
// Rats to proper of the Piper must be going left
deaf += s2.exchange("L","").size();
return deaf;
}
}
personal static String makeRatFacing(ultimate char largely) {
ultimate double d = Math.random() * 3;
if (largely == 'L') {
// Largely dealing with left
if (d < 2.5) return "O~";
if (d < 2.8) return "~O";
} else {
// Largely dealing with proper
if (d < 2.5) return "~O";
if (d < 2.8) return "O~";
}
return " ";
}
personal static String makeTown(char piperPos) {
ultimate int ratsLeft = (int)(Math.random() * 20) + 5;
ultimate int ratsRight = (int)(Math.random() * 20) + 5;
String city = "";
boolean piper = false;
if (piperPos == 'L') { city += "P"; piper = true; }
for (int r = 0; r < ratsLeft; r++) {
city += makeRatFacing(piper ? 'L' : 'R');
}
if (piperPos == 'M') { city += "P"; piper = true; }
for (int r = 0; r < ratsRight; r++) {
city += makeRatFacing(piper ? 'L' : 'R');
}
if (piperPos == 'R') city += "P";
return city;
}
@Check
public void random() {
for (int r = 1; r <= 200; r++) {
ultimate int p = (int)(Math.random() * 3);
ultimate char piper = p == 0 ? 'L' : p == 1 ? 'M' : 'R';
ultimate String city = makeTown(piper);
ultimate int anticipated = DeafRatsOfHamelin.countDeafRats(city);
System.out.println(String.format("Random take a look at %d : <span type='colour:inexperienced'>%s</span> has %d deaf rats", r, city, anticipated));
assertEquals(anticipated, DeafRatsOfHamelin.countDeafRats(city));
}
}
}