Skip to content

Instantly share code, notes, and snippets.

@Reflej0
Created October 28, 2018 23:07
Show Gist options
  • Save Reflej0/ee925982c9079f4cffa8bc6f65b5787b to your computer and use it in GitHub Desktop.
Save Reflej0/ee925982c9079f4cffa8bc6f65b5787b to your computer and use it in GitHub Desktop.
Ejercicio Duración legible por humanos, dado x cantidad de segundos descomponen en anos, días, horas, minutos y segundos.
public class FormatoAmigable
{
/** Limites https://cs.fit.edu/~ryan/java/language/java-data.html
* Calculadora https://www.dcode.fr/big-numbers-division
* MAX_INT = 2147483647
* MAX_LONG = 9223372036854775807
* Segundos en un ano = 31536000
* Cantidad max anos (int) 68
* Cantidad max anos (long) 292471208677
*/
public static String duracion(long numero)
{
if(numero < 0)
return "Entrada invalida";
else if(numero == 0)
return "Ahora";
String retorno = "";
long anos = numero / 31536000;
if(anos>0)
numero -= (anos * 31536000);
long dias = numero / 86400;
if(dias>0)
numero -= (dias * 86400);
long horas = numero / 3600;
if(horas>0)
numero -= (horas * 3600);
long minutos = numero / 60;
if(minutos>0)
numero -= (minutos * 60);
long segundos = numero;
if(anos==1)
retorno+="1 ano,";
else if(anos>1)
retorno+=anos+" anos, ";
if(dias==1)
retorno+=" 1 dia, ";
else if(dias>1)
retorno+=dias+" dias, ";
if(horas==1)
retorno+=" 1 hora, ";
else if(horas>1)
retorno+=horas+" horas, ";
if(minutos==1)
retorno+=" 1 minuto,";
else if(minutos>1)
retorno+=minutos+" minutos,";
if(segundos==1)
retorno+=" 1 segundo";
else if(segundos>1)
retorno+=segundos+" segundos";
//Tratamiento de la cadena antes de ser retornada.
//1) Elimino los espacios de adelante y atras, si es que hubiese.
retorno = retorno.trim();
//2) Elimino la ultima coma si es que hubiese.
int longitud = retorno.length()-1;
if(retorno.charAt(longitud)==',')
retorno = retorno.substring(0, longitud);
//3)Detecto la ultima , y la reemplazo por y.
int ultimaComa = retorno.lastIndexOf(',');
if(ultimaComa!=-1)
{
String primero = retorno.substring(0, ultimaComa);
String segundo = "";
//5)Detectado a base de pruebas tambien. No parece ser una solucion muy elegante jaja.
try
{
segundo = retorno.substring(ultimaComa+1, longitud+1);
}
catch(StringIndexOutOfBoundsException e)
{
segundo = retorno.substring(ultimaComa+1, longitud);
}
retorno=primero+" y "+segundo;
}
//4)Detectado a base de pruebas. En algunos casos cuando se realiza el punto 3.
//Remueve mas de dos espacios seguidos.
retorno = retorno.replaceAll("\\s{2,}", " ");
return retorno;
}
}
import org.junit.Assert;
import org.junit.jupiter.api.Test;
public class Tests
{
@Test
public void numeroNegativo()
{
String retorno = FormatoAmigable.duracion(-1);
Assert.assertEquals(retorno, "Entrada invalida");
}
@Test
public void ahora()
{
String retorno = FormatoAmigable.duracion(0);
Assert.assertEquals(retorno, "Ahora");
}
@Test
public void unSegundo()
{
String retorno = FormatoAmigable.duracion(1);
Assert.assertEquals(retorno, "1 segundo");
}
@Test
public void unMinuto()
{
String retorno = FormatoAmigable.duracion(60);
Assert.assertEquals(retorno, "1 minuto");
}
@Test
public void unMinutounSegundo()
{
String retorno = FormatoAmigable.duracion(61);
Assert.assertEquals(retorno, "1 minuto y 1 segundo");
}
@Test
public void unMinutodosSegundos()
{
String retorno = FormatoAmigable.duracion(62);
Assert.assertEquals(retorno, "1 minuto y 2 segundos");
}
@Test
public void dosMinutos()
{
String retorno = FormatoAmigable.duracion(120);
Assert.assertEquals(retorno, "2 minutos");
}
@Test
public void dosMinutosunSegundo()
{
String retorno = FormatoAmigable.duracion(121);
Assert.assertEquals(retorno, "2 minutos y 1 segundo");
}
@Test
public void dosMinutostresSegundos()
{
String retorno = FormatoAmigable.duracion(123);
Assert.assertEquals(retorno, "2 minutos y 3 segundos");
}
@Test
public void unaHora()
{
String retorno = FormatoAmigable.duracion(3600);
Assert.assertEquals(retorno, "1 hora");
}
@Test
public void unaHoraunSegundo()
{
String retorno = FormatoAmigable.duracion(3601);
Assert.assertEquals(retorno, "1 hora y 1 segundo");
}
@Test
public void unaHoraunMinuto()
{
String retorno = FormatoAmigable.duracion(3660);
Assert.assertEquals(retorno, "1 hora y 1 minuto");
}
@Test
public void unaHoraunMinutounSegundo()
{
String retorno = FormatoAmigable.duracion(3661);
Assert.assertEquals(retorno, "1 hora, 1 minuto y 1 segundo");
}
@Test
public void unaHoraunMinutodosSegundos()
{
String retorno = FormatoAmigable.duracion(3662);
Assert.assertEquals(retorno, "1 hora, 1 minuto y 2 segundos");
}
@Test
public void unaHoradosMinutos()
{
String retorno = FormatoAmigable.duracion(3720);
Assert.assertEquals(retorno, "1 hora y 2 minutos");
}
@Test
public void unaHoradosMinutosunSegundo()
{
String retorno = FormatoAmigable.duracion(3721);
Assert.assertEquals(retorno, "1 hora, 2 minutos y 1 segundo");
}
@Test
public void unaHoradosMinutostresSegundos()
{
String retorno = FormatoAmigable.duracion(3723);
Assert.assertEquals(retorno, "1 hora, 2 minutos y 3 segundos");
}
@Test
public void dosHoras()
{
String retorno = FormatoAmigable.duracion(7200);
Assert.assertEquals(retorno, "2 horas");
}
public void dosHoras59Segundos()
{
String retorno = FormatoAmigable.duracion(7259);
Assert.assertEquals(retorno, "2 horas y 59 segundos");
}
@Test
public void dosHorascuarentaMinutos()
{
String retorno = FormatoAmigable.duracion(9600);
Assert.assertEquals(retorno, "2 horas y 40 minutos");
}
@Test
public void dosHorascuarentaMinutosonceSegundos()
{
String retorno = FormatoAmigable.duracion(9611);
Assert.assertEquals(retorno, "2 horas, 40 minutos y 11 segundos");
}
@Test
public void unDia()
{
String retorno = FormatoAmigable.duracion(86400);
Assert.assertEquals(retorno, "1 dia");
}
@Test
public void unDiaunSegundo()
{
String retorno = FormatoAmigable.duracion(86401);
Assert.assertEquals(retorno, "1 dia y 1 segundo");
}
@Test
public void unDia48Segundos()
{
String retorno = FormatoAmigable.duracion(86448);
Assert.assertEquals(retorno, "1 dia y 48 segundos");
}
@Test
public void unDiaUnHoraTresMinutos59segundos()
{
String retorno = FormatoAmigable.duracion(90239);
Assert.assertEquals(retorno, "1 dia, 1 hora, 3 minutos y 59 segundos");
}
@Test
//1 segundo menos para un ano.
public void trescientossesentaycuatrodias23horas59minutos59segundos()
{
String retorno = FormatoAmigable.duracion(31535999);
Assert.assertEquals(retorno, "364 dias, 23 horas, 59 minutos y 59 segundos");
}
@Test
public void unAno()
{
String retorno = FormatoAmigable.duracion(31536000);
Assert.assertEquals(retorno, "1 ano");
}
@Test
public void unAnoUnSegundo()
{
String retorno = FormatoAmigable.duracion(31536001);
Assert.assertEquals(retorno, "1 ano y 1 segundo");
}
@Test
public void unAnoUnDia53MinutosUnSegundo()
{
String retorno = FormatoAmigable.duracion(31625581);
Assert.assertEquals(retorno, "1 ano, 1 dia, 53 minutos y 1 segundo");
}
@Test
public void nueveAnosDosDias()
{
String retorno = FormatoAmigable.duracion(283824000+172800);
Assert.assertEquals(retorno, "9 anos y 2 dias");
}
@Test
public void FatigaDeVariable()
{
String retorno = FormatoAmigable.duracion(9223372036854775807L);
Assert.assertEquals(retorno, "292471208677 anos, 195 dias, 15 horas, 30 minutos y 7 segundos");
}
@Test
public void CasiUnDia()
{
String retorno = FormatoAmigable.duracion(86399);
Assert.assertEquals(retorno, "23 horas, 59 minutos y 59 segundos");
}
public void SobrePasoFatigaVariable()
{
//No me deja escribir el numero directamente.
//String retorno = FormatoAmigable.duracion(9223372036854775808L);
//System.out.println(retorno);
//Assert.assertEquals(retorno, "292471208677 anos, 195 dias, 15 horas, 30 minutos y 7 segundos");
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment