/*""" Exercise1_Padding_numbers 솔루션 제안 작성자: jthi 작성일: 2024-01-05 작성 JMP 버전: JMP Pro 17.2 설명: 숫자가 항상 3자 길이가 되도록 문자 표현을 사용하여 숫자에 패딩을 추가하는 방법을 알아냅니다. 0~999 사이의 값으로 테스트합니다. 참고: 이 작업을 수행하는 함수를 만드는 것이 목적이 아닙니다. 물론 함수를 만들거나 표현식을 사용할 수 있지만 이 과정에서는 아직 다루지 않았습니다. 예: 입력 출력 1 "001" 10 "010" 100 "100" 보너스 1: 값이 0보다 작거나 999보다 크면 값을 빈 문자열로 설정합니다. 보너스 2: 이와 동일한 작업을 수행하는 하나 이상의 추가 방법을 찾습니다. 추가: 데이터 테이블에서 비슷한 계산을 수행하고 새 열을 만듭니다. """*/ //================================================================ // 입력 //================================================================== 이름은 기본적으로 여기에(1); input_list = {1, 10, 100}; // 직접 예제를 만들 수 있습니다.//============================================================ // 단계별 솔루션 //============================================================ // 참고: 모든 값은 0-999 사이입니다(누락된 값이나 1000 이상의 값에 대해 걱정할 필요 없음) // 매우 간단한 작은 조각으로 시작합니다.// 이 단계별 솔루션에서는 추가하는 0의 최대 개수가 2라고 가정합니다.val = 1; val_str = Char(val); // 문자열로 변경 res1 = "00" || val_str; // "001" -> 확인 -> 제거할 0 없음 val2 = 10; val_str2 = Char(val2); // 문자열로 변경 res2 = "00" || val_str2; // "0010" -> 확인 안 됨 -> 0 하나를 제거해야 함 val3 = 100; val_str3 = Char(val3); // 문자열로 변경 res3 = "00" || val_str3; // "00010" -> 확인 안 됨 -> 0 두 개를 제거해야 함 // 테스트를 더 쉽게 하기 위한 기본 루프 생성 For Each({val}, input_list, val_str = Char(val); res = "00" || val_str; Print(Eval Insert("Input: ¤val¤, Result: ¤res¤", "¤")); ); // 올바른 양의 0을 추가하려면 어떻게 해야 할까? // val_str의 길이에 따라 0의 양을 결정할 수 있습니다.// 길이 1 -> 더하기 2 // 길이 2 -> 더하기 1 // 길이 3 -> 더하기 0 len_val = Length(val_str); // If, Match 또는 Choose를 사용할 수 있습니다. zeros_to_add = If(len_val == 1, 2 , len_val == 2, 1 , len_val == 3, // else를 사용할 수도 있습니다. 0 ); zeros_to_add = Match(len_val, 1, 2, 2, 1, 3, 0 ); zeros_to_add = Choose(len_val, 2, 1, 0 ); // 또는 더 일반적인 솔루션 // 길이가 1만큼 증가하면 추가된 0이 2에서 시작하여 1만큼 감소합니다. zeros_to_add = 3 - len_val; // 최소 길이는 1 -> 3부터 더하기 시작 // 루프로 테스트할 수 있습니다(다음 수업에서는 함수로 바꿔서 더 쉽게 만들 수 있습니다) For Each({val}, input_list, val_str = Char(val); zeros_to_add = 3 - Length(val_str); show(zeros_to_add); ); // 이제 0을 몇 개 더해야 할지 알게 되었습니다. 어떻게 만들까요? // 반복하는 것이 좋은 방법입니다. val = 1; val_str = Char(val); len_val = Length(val_str); zeros_to_add = 3 - len_val; zero_str = Repeat("0", zeros_to_add); // 이제 마지막 문자열을 만듭니다. val_output = zero_str || val_str; // 루프로 테스트 For Each({val}, input_list, val_str = Char(val); len_val = Length(val_str); zeros_to_add = 3 - len_val; zero_str = Repeat("0", zeros_to_add); val_output = zero_str || val_str; show(val_output); ); // 솔루션(문자열 목록)으로 만들기 result = {}; For Each({val}, input_list, val_str = Char(val); len_val = Length(val_str); zeros_to_add = 3 - len_val; zero_str = Repeat("0", zeros_to_add); val_output = zero_str || val_str; Insert Into(result, val_output); ); show(result); //============================================================== // 단계별 솔루션이 아님 //=============================================================== //====================================================================== // 옵션 1 - 0을 추가하고 각각 변환을 사용 //============================================================= input_list = {1, 10, 100}; MAX_STRING_LENGTH = 3; result = Transform Each({val}, input_list, val_str = Char(val); zeros_to_add = MAX_STRING_LENGTH - Length(val_str); Repeat("0", zeros_to_add) || val_str; // 마지막 줄은 Transform Each에서 반환됨 ); show(result); //================================================================ // 옵션 2 - 오른쪽을 사용하여 0 제거 //============================================================= input_list = {1, 10, 100}; // 최대 0의 개수가 2임을 알고 있음 -> 문자열을 미리 생성할 수 있음 MAX_STR_LENGTH = 3; zero_str = Repeat("0", MAX_STR_LENGTH - 1); // -1은 숫자 결과에 대한 공간을 허용합니다. Transform Each({val}, input_list, val_str = Char(val); Right(zero_str || val_str, MAX_STR_LENGTH); ); show(result); //============================================================= // 옵션 3 - Substr을 사용하여 0 제거 //=============================================================== 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; start_idx = Length(res_str) - 2; Substr(res_str, start_idx); // Substr(res_str, start_idx, Length(res_str)); // Substr(res_str, -3); // 역시 작동해야 합니다); show(result); //============================================================== // 옵션 4 - 정규식(이런 간단한 경우에는 권장하지 않음) //============================================================ 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}$"); // 마지막 세 개의 숫자를 가져옵니다); show(result); //============================================================== // 옵션 5 - 이렇게 하지 마세요 //============================================================ input_list = {1, 10, 100}; result = Transform Each({val}, input_list, str = Char(val, 4, 3); // 소수 구분 기호를 고려하여 문자열 너비는 4입니다 str_l = Words(str, ".,"); Concat Items(Reverse(str_l), ""); ); show(result); //============================================================== // 보너스 1 - 옵션 1 사용 //=========================================================== input_list = {1, 10, 100, -1, 1000, 0, ., 99, 10, 999, 9}; MAX_STRING_LENGTH = 3; result = Transform Each({val}, input_list, 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; // 마지막 줄은 Transform Each에서 반환됩니다. // else ""; ); ); show(result); //============================================================== // 보너스 1(작동하지 않는 솔루션) - 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; // 마지막 줄은 Transform Each에서 반환됩니다. , // else ""; ); , Show(val, exception_msg); // 값을 인쇄한 후 테스트하는 데 유용합니다. ); ); show(result); //============================================================= // 보너스 1 - 유효한 옵션만 목록에 추가하고 문제 목록 반환 //================================================================== // 반환되는 내용을 관리하는 것이 훨씬 더 쉽기 때문에 For Each로 변경합니다 input_list = {1, 10, 100, -1, 1000, 0, .}; MAX_STRING_LENGTH = 3; result = {}; issue_list = {}; // 인덱스와 값이 있는 목록의 목록을 저장합니다 aa_issues = Associative Array(); // 다른 옵션(키로 idx, 값으로 value 사용) 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; // 마지막 줄은 Transform Each에서 반환됩니다. Insert Into(result, res); , // else Insert Into(issue_list, Eval List({Eval List({idx, val})})); aa_issues[idx] = val; // 다른 옵션 ); , // catch Show(val, exception_msg); ); ); show(result, issue_list, aa_issues); //=============================================================== // 추가, 비슷한 작업을 수행하는 수식을 만듭니다. //=================================================================== dt_input = New Table("Exercise1_Padding_Solution", Add Rows(1000), Compress File When Saved(1), New Column("Input", Numeric, "Continuous", Set Values(0::999)) ); //================================================================ // 하드코딩된 값을 사용하는 간단한 수식 사용 //================================================================ dt_input << New Column("Solution1", Character, Nominal, Formula( Right("00" || Char(:Input), 3); )); //============================================================== // Local() 및 변수 사용 //================================================================== 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); ); )); //=============================================================== // As Constant() 사용 //============================================================= // 이 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); )); //================================================================= // 테이블 변수 사용 //=================================================================== dt_input << New Table Variable("MAX_INPUT_LENGTH", 3); // 테이블 변수는 문자열로 저장되므로 확실히 하기 위해 문자열로 변환합니다. // 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)); )); // 참고로, 수식이 계산되었는지 확인하려면 dt_ref << Run Formulas; NOT wait(0); // 참고로, 수식을 사용할 때는 수식을 제거하거나 계산을 억제하는 것이 좋습니다. // 초기 생성 후 값을 업데이트할 필요가 없는 경우 // col_ref << Delete Formula; // col_ref << Suppress Eval(1); //============================================================== // 수식 대신 For Each Row 사용 //============================================================= // 열 이름을 확신할 수 있는 경우 dt_input << New Column("Solution5", Character, Nominal); For Each Row(dt_input, :Solution5 = Right("00" || Char(:Input), 3); ); // 확신하지 못하는 경우 열 참조를 사용할 수 있습니다 new_col = dt_input << New Column("Solution5.1", Character, Nominal); For Each Row(dt_input, new_col[Row()] = Right("00" || Char(:Input), 3); // 또한 :Solution5를 사용할 수 있음); // 또는 열 이름을 사용하는 경우 new_col = dt_input << New Column("Solution5.2", Character, Nominal); For Each Row(dt_input, As Column(dt_input, (new_col << get name)) = Right("00" || Char(:Input), 3); ); // 또는 열 이름을 사용하는 경우 new_col = dt_input << New Column("Solution5.3", Character, Nominal); For Each Row(dt_input, Column(dt_input, (new_col << get name))[] = Right("00" || Char(:Input), 3); ); // []와 [Row()]가 어떻게 사용되는지 주목하세요(둘은 동일한 것이지만 [Row()]가 더 명시적입니다) //============================================================== // <<를 사용하여 각 값 설정(이것은 의도된 동작이 아니므로 변경될 수 있음) //
https://community.jmp.com/t5/JMP-Wish-List/Make-using-formula-expressions-in-Set-Each-Value-and-using/idi-p/666966 //================================================================ dt_input << 새 열("솔루션6", 문자, 명목, << 각 값 설정(오른쪽("00" || 문자(:입력), 3); )); 쓰기();