Sugerencias de solución para el Ejercicio 1: Relleno de números. Autor: jthi. Fecha de creación: 05/01/2024. Versión de JMP: JMP Pro 17.2. Descripción: Descubra cómo añadir relleno a los números usando la presentación de caracteres, de modo que los números siempre tengan tres caracteres. Pruebe con valores entre 0 y 999. Nota: El objetivo no es crear una función para realizar esta tarea. Por supuesto, puede crear una función o usar expresiones, pero aún no las hemos cubierto en este curso. Ejemplos: Entrada/Salida: 1 "001" 10 "010" 100 "100". Bonus 1: Si el valor es menor que 0 o mayor que 999, defina el valor como una cadena vacía. Bonus 2: Encuentre al menos un método adicional para realizar esta misma tarea. Extra: Realice un cálculo similar en una tabla de datos y cree una nueva columna """*/". //=========================================================== // Entrada //============================================================ Nombres predeterminados aquí(1); lista_de_entrada = {1, 10, 100}; // puedes crear tus propios ejemplos //============================================================ // Solución paso a paso //============================================================ // Nota: Todos los valores están entre 0 y 999 (no hay necesidad de preocuparse por valores faltantes O valores que sean 1000 o mayores) // Comienza en piezas pequeñas muy simples // en esta solución paso a paso, asumimos que la cantidad máxima de ceros que agregamos es 2 val = 1; val_str = Char(val); // cambiar a cadena res1 = "00" || val_str; // "001" -> OK -> no hay ceros para eliminar val2 = 10; val_str2 = Char(val2); // cambiar a cadena res2 = "00" || val_str2; // "0010" -> NOK -> Debemos eliminar UN cero val3 = 100; val_str3 = Char(val3); // cambiar a cadena res3 = "00" || val_str3; // "00010" -> NOK -> Debemos eliminar DOS ceros // Crea un bucle básico para facilitar las pruebas For Each({val}, input_list, val_str = Char(val); res = "00" || val_str; Print(Eval Insert("Input: ¤val¤, Result: ¤res¤", "¤")); ); // ¿cómo podemos agregar la cantidad correcta de ceros? // podríamos basar la cantidad de ceros en la longitud de val_str // longitud 1 -> sumar 2 // longitud 2 -> sumar 1 // longitud 3 -> sumar 0 len_val = Length(val_str); // Podríamos usar If, Match o Choose zeros_to_add = If(len_val == 1, 2 , len_val == 2, 1 , len_val == 3, // también podríamos usar else para esto 0 ); zeros_to_add = Match(len_val, 1, 2, 2, 1, 3, 0 ); zeros_to_add = Choose(len_val, 2, 1, 0 ); // o una solución más genérica // cuando la longitud aumenta en 1, los ceros agregados disminuyen en 1 COMENZANDO desde 2 zeros_to_add = 3 - len_val; // La longitud mínima es 1 -> comienza desde la suma de 3 // Podemos probar esto con un bucle (en la siguiente lección podemos convertirlo en una función para que sea aún más fácil) For Each({val}, input_list, val_str = Char(val); zeros_to_add = 3 - Length(val_str); show(zeros_to_add); ); // Ahora sabemos cuántos ceros agregar. ¿Cómo crearlos? // Repetir es una buena opción val = 1; val_str = Char(val); len_val = Length(val_str); zeros_to_add = 3 - len_val; zero_str = Repeat("0", zeros_to_add); // Y ahora creamos nuestra cadena final val_output = zero_str || val_str; // prueba con bucle For Each({val}, lista_de_entrada, val_str = Char(val); len_val = Length(val_str); ceros_a_suma = 3 - len_val; cero_str = Repeat("0", ceros_a_suma); val_salida = cero_str || val_str; mostrar(val_salida); ); // convertir en solución (lista de cadenas) resultado = {}; For Each({val}, lista_de_entrada, val_str = Char(val); len_val = Length(val_str); ceros_a_suma = 3 - len_val; cero_str = Repeat("0", ceros_a_suma); val_salida = cero_str || val_str; Insertar en(resultado, val_salida); ); mostrar(resultado); //============================================================ // Soluciones que no son paso a paso //================================================================ //============================================================== // Opción 1: agregar ceros y usar la transformación cada //= ... //=========================================================== // Opción 2: eliminar ceros usando Derecha //=========================================================== input_list = {1, 10, 100}; // sabemos que la cantidad máxima de ceros que podemos tener es 2 -> podemos crear nuestra cadena de antemano MAX_STR_LENGTH = 3; zero_str = Repeat("0", MAX_STR_LENGTH - 1); // -1 para dejar espacio para nuestro número result = Transform Each({val}, input_list, val_str = Char(val); Right(zero_str || val_str, MAX_STR_LENGTH); ); show(result); //=========================================================== // Opción 3: eliminar ceros usando Substr //============================================================= input_list = {1, 10, 100}; MAX_ZERO_STR = "00"; resultado = Transformar Each({val}, lista_de_entrada, val_str = Char(val); res_str = MAX_ZERO_STR || val_str; id_inicial x = Longitud(res_str) - 2; Substr(res_str, id_inicial x); // Substr(res_str, id_inicial x, Longitud(res_str)); // Substr(res_str, -3); // también debería funcionar ); mostrar(resultado); //=========================================================== // Opción 4 - Regex (no se recomienda en casos simples como este) //===================================================================== input_list = {1, 10, 100}; MAX_ZERO_STR = "00"; result = Transform Each({val}, input_list, val_str = Char(val); res_str = MAX_ZERO_STR || val_str; Regex(res_str, "\d{3}$"); // toma los últimos tres números ); show(result); //============================================================ // Opción 5 - No hagas esto //================================================================= input_list = {1, 10, 100}; result = Transform Each({val}, input_list, str = Char(val, 4, 3); // el ancho de la cadena es 4 para tener en cuenta el separador decimal str_l = Words(str, "."); Concat Items(Reverse(str_l), ""); ); show(result); //============================================================ // Bono 1: uso de la opción 1 //================================================================ input_list = {1, 10, 100, -1, 1000, 0, ., 99, 10, 999, 9}; MAX_STRING_LENGTH = 3; result = Transform Each({val}, lista_de_entrada, If(!IsMissing(val) & 0 < val < 1000, val_str = Char(val); ceros_a_agregar = MAX_STRING_LENGTH - Length(val_str); Repeat("0", ceros_a_agregar) || val_str; // se devolverá la última línea de Transform Each, // de lo contrario ""; ); ); show(resultado); //============================================================ // Bono 1 (solución que no funciona) - Depuración de script usando Try-Catch //============================================================= input_list = {1, 10, 100, -1, 1000, 0, .}; MAX_STRING_LENGTH = 3; result = Transform Each({val}, input_list, Try( If(!IsMissing(val) | 0 < val < 1000, val_str = Char(val); zeros_to_add = MAX_STRING_LENGTH - Length(val_str); Repeat("0", zeros_to_add) || val_str; // la última línea será devuelta por Transform Each , // de lo contrario ""; ); , Show(val, exception_msg); // útil para imprimir el valor, ya que luego puedes probar con él ); ); show(result); //============================================================ // Bono 1: agregar solo opciones válidas a una lista y devolver la lista de problemas //============================================================== // cambiamos a For Each ya que administrar lo que se devuelve es mucho más fácil de esta manera input_list = {1, 10, 100, -1, 1000, 0, .}; MAX_STRING_LENGTH = 3; result = {}; issue_list = {}; // almacenar la lista de listas con índice y valor aa_issues = Associative Array(); // otra opción (usar idx como clave y valor como valor) For Each({val, idx}, input_list, Try( If(!IsMissing(val) & 0 < val < 1000, val_str = Char(val); zeros_to_add = MAX_STRING_LENGTH - Length(val_str); res = Repeat("0", zeros_to_add) || val_str; // se devolverá la última línea de Transform Each Insert Into(result, res); , // de lo contrario Insert Into(issue_list, Eval List({Eval List({idx, val})})); aa_issues[idx] = val; // otra opción ); , // catch Show(val, exception_msg); ); ); show(result, issue_list, aa_issues); //============================================================ // Extra, crea una fórmula para realizar una acción similar //============================================================== dt_input = New Table("Exercise1_Padding_Solution", Add Rows(1000), Compress File When Saved(1), New Column("Input", Numeric, "Continuous", Set Values(0::999)) ); //============================================================ // Uso de una fórmula simple con valores codificados //============================================================ dt_input << New Column("Solution1", Character, Nominal, Formula( Right("00" || Char(:Input), 3); )); //=========================================================== // Uso de Local() y variables //============================================================= dt_input << New Column("Solution2", Character, Nominal, Formula( Local({ MAX_STR_LENGTH = 3, zero_str = Repeat("0", MAX_STR_LENGTH - 1) }, Right(zero_str || Char(:Input), MAX_STR_LENGTH); ); )); //=========================================================== // Usando como constante() //============================================================ // las variables deben evaluarse solo en la primera fila cuando se usa esto dt_input << New Column("Solution3", Character, Nominal, Formula( As Constant( MAX_STR_LENGTH = 3; zero_str = Repeat("0", MAX_STR_LENGTH - 1); ); Right(zero_str || Char(:Input), MAX_STR_LENGTH); )); //============================================================ // Usando variable de tabla //============================================================= dt_input << New Table Variable("MAX_INPUT_LENGTH", 3); // Las variables de tabla se almacenan como cadenas, por lo que las convertiría solo para estar seguro // dt_input << Get Table Variable("MAX_INPUT_LENGTH"); dt_input << New Column("Solution4", Character, Nominal, Formula( Right(Repeat("0", Num(:MAX_INPUT_LENGTH) - 1) || Char(:Input), Num(:MAX_INPUT_LENGTH)); )); // Nota: para asegurarse de que se hayan evaluado las fórmulas, utilice dt_ref << Run Formulas; NOT wait(0); // Nota: al utilizar fórmulas, puede ser una buena idea eliminarlas O suprimir su evaluación // si no es necesario que los valores se actualicen después de la creación inicial // col_ref << Delete Formula; // col_ref << Suppress Eval(1); //=========================================================== // Usando Para cada fila en lugar de la fórmula //============================================================== // si puede estar seguro acerca del nombre de la columna dt_input << New Column("Solution5", Character, Nominal); For Each Row(dt_input, :Solution5 = Right("00" || Char(:Input), 3); ); // si no lo está, puede usar la referencia de columna new_col = dt_input << New Column("Solution5.1", Character, Nominal); Para cada fila (dt_input, new_col[Row()] = Right("00" || Char(:Input), 3); // también podría usar :Solution5 ); // o con el nombre de columna new_col = dt_input << New Column("Solution5.2", Character, Nominal); Para cada fila (dt_input, As Column(dt_input, (new_col << get name)) = Right("00" || Char(:Input), 3); ); // o con el nombre de columna new_col = dt_input << New Column("Solution5.3", Character, Nominal); Para cada fila (dt_input, Column(dt_input, (new_col << get name))[] = Right("00" || Char(:Input), 3); ); // note cómo se usan [] y [Row()] (son lo mismo pero [Row()] es más explícito) //=========================================================== // Usando << Establecer cada valor (ESTE NO ES EL COMPORTAMIENTO PREVISTO, POR LO QUE PODRÍA CAMBIAR) //
https://community.jmp.com/t5/JMP-Wish-List/Make-using-formula-expressions-in-Set-Each-Value-and-using/idi-p/666966 //============================================================= dt_input << Nuevo Columna("Solución6", Carácter, Nominal, << Establecer cada valor( Derecha("00" || Char(:Input), 3); )); Escribir();