Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 23 additions & 0 deletions Analizador Léxico 2.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<?php

class Analyzer {
static function process($row_str) {
try {
if(strlen($row_str) > 250) //Valido que la cadena no sea mayor a 250 caracteres
throw new Exception('La cadena excede los 250 caracteres.');
else {
$indexes = preg_split("/\(\d+,\d+\)/", $row_str, null, PREG_SPLIT_OFFSET_CAPTURE); //Divido la cadena con una expresión regular y se guardan los resultados en un array
$count = count($indexes);
for($i = 1; $i < $count; $i++) { //Empiezo en 1 porque $indexes[0] no contiene ningun valor.
$coord_start = $indexes[$i-1][1] + strlen($indexes[$i-1][0]);
$coord_end = $indexes[$i][1];
echo substr($row_str, $coord_start, $coord_end - $coord_start).' '.$indexes[$i][0]."\n"; //Hago un substring de la cadena inicial dividiendo las coordenadas y el texto por un espacio
}
}
} catch(Exception $e) {
echo 'Error: '.$e->getMessage()."\n"; //Imprimo la excepción
}
}
}

Analyzer::process("(79,34)Holaefwefgw(10afef)(98,902843)oeijfwoijef(34,56)bingopingolingo");
36 changes: 36 additions & 0 deletions Analizador Léxico.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
var Analyzer = {
mainString: "",
indexes: [], //Utilizando un array y ciclos puedo procesar una cantidad n de líneas en lugar de sólo 3
getIndexes: function() { //Esta función divide la cadena y guarda los índices de las líneas para imprimirlas psoteriormente
let pattern = /\(\d+,\d+\)/g; //Con esta Expresión Regular logro diferenciar el formato de las coordenadas del resto de la cadena
let mainLength = Analyzer.mainString.length, i = 0;
try {
if(mainLength>250) //Lanza un error si la cadena excede 250 caracteres
throw Error();
while((coord = pattern.exec(Analyzer.mainString)) !== null) { //Recorro todas las coincidencias de "coordenadas" dentro de la cadena
let coordStart = coord.index;
let coordEnd = (coord.index+coord[0].length);
Analyzer.indexes.push({ coordStart, coordEnd, lineEnd: mainLength }); //Guardo los índices de donde empiezan y acaban las coordenadas y el texto de cada línea
if(i > 0) Analyzer.indexes[i-1].lineEnd = coordStart; //Para ahorrar ciclos asigno el final de la línea anterior como el inicio de la coordenada nueva
i++;
}
} catch(error) { //Si no se procesa correctamente la cadena, se pide que ingrese otra
Analyzer.getString("Formato no válido, ingresa otra cadena.");
}
},
printOutput: function() { //Esta función imprime la cadena procesada con base en los índices previamente obtenidos
console.log("Cadena: "+Analyzer.mainString);
Analyzer.indexes.forEach(element => { //Recorro todas las líneas obtenidas
let coord = Analyzer.mainString.substring(element.coordStart, element.coordEnd); //Obtengo y guardo las coordenadas
let line = Analyzer.mainString.substring(element.coordEnd, element.lineEnd); //Obtengo y guardo el texto
console.log(coord+" "+line+"\n"); //Imprimo todo con el formato especificado
});
},
getString: function(promptText) {
Analyzer.mainString = prompt(promptText); //Pido al usuario que ingrese la cadena
Analyzer.getIndexes(); //Proceso la cadena
Analyzer.printOutput(); //Imprimo el resultado
}
}

Analyzer.getString("Ingrese una cadena con el formato '(x1,y1)texto1(x2,y2)texto2(x3,y3)texto3'");
37 changes: 37 additions & 0 deletions Capicúa 2.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
<?php

class Capicua {
private static function isCapicua($num) {
$num_str = str_split((string)$num); //Divido el número en un array para poder recorrerlo
$digits = count($num_str); //Consigo el número de dígitos
$is_capicua = true;
for($i = 0; $i < $digits; $i++) {
if(strcmp($num_str[$i], $num_str[$digits-$i-1])){ //Comparo que la cadena coincida por ambos extremos
$is_capicua = false;
break; //Si los dígitos no coinciden, sale del ciclo
}
}
return $is_capicua;
}
public static function get($num) {
try {
if($num < 9 || $num > 10000) //Valido que el número sea mayor a 1 dígito y menor que 10,000
throw new Exception('La cadena excede los 250 caracteres.');
else {
$iteration = 0;
while(++$iteration) { //Un bucle infinito
$num += (int)strrev((string)$num); //Sumo el número inicial con su inverso
if(Capicua::isCapicua($num)){ //Reviso si la suma es capicúa
echo "{$num} {$iteration}";
break; //Salgo del bucle
}
}
}
}
catch(Exception $e) {
echo 'Error: '.$e->getMessage()."\n"; //Imprimo la excepción
}
}
}

Capicua::get(12);
41 changes: 41 additions & 0 deletions Capicúa.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
var Capicua = {
capicuaNum: 0,
iterations: 0,
isCapicua: function(num) { //Con este método reviso si el número es una Capicúa o no
let numStr = num.toString();
let numHalf = Math.floor(numStr.length/2);//Redondeando ignoro el número de en medio en caso de ser impar
let firstHalf = numStr.slice(0, numHalf);
let secondHalf = numStr.slice(-numHalf);
let newHalf = Capicua.flipNumber(secondHalf).toString();
return firstHalf===newHalf;
},
flipNumber: function(num) { //Este método me regresa el mismo número que ingrese pero invertido
let numStr = num.toString();
let flipped = "";
for(let digit of numStr) //Recorro los dígitos del número
flipped = digit + flipped; //Guardo los dígitos en orden inverso
return parseInt(flipped);
},
calculate: function(num) { //Con un bucle repito las iteraciones hasta conseguir una Capicúa
let suma = parseInt(num);
let iteration = 0;
do { //Realizo la suma de los números e incremento el número de iteraciones hasta que el resultado sea una Capicúa
suma = suma + Capicua.flipNumber(suma);
iteration++;
} while(!Capicua.isCapicua(suma))
Capicua.capicuaNum = suma;
Capicua.iterations = iteration;
},
printOutput: function() { //Imprimo el resultado solicitado
console.log(Capicua.capicuaNum + " " +Capicua.iterations );
},
getNumber: function(promptText) { //Pide el número y revisa que sea válido
let num = parseInt(prompt(promptText));
if(num<10||num>10000||!Number.isInteger(num))
Capicua.getNumber("Número no válido, intenta con otro");
Capicua.calculate(num); //Calculo el NC y las iteraciones
Capicua.printOutput(); //Imprimo el resultado
}
}

Capicua.getNumber("Ingresa un número entero de dos dígitos menor a 10,000");