2017-12-30 15 views
0

코딩을 연습하고 배우고 이해하는 데 어려움을 겪고 있습니다. 나는 열심히 우연히 만났고, 그것을보기 위해 결심했다. 운 좋게 시간 제한이 없습니다. 문제는 (원하는 경우 건너 뛸 수 있습니다.)while 루프에서 변수가 변경되지 않음

"JavaScript 언어를 사용하면 KaprekarsConstant (num) 함수가 전달되는 num 매개 변수를 가져와 적어도 두 자리가 다른 4 자리 숫자가됩니다. 프로그램은 숫자에 대해 다음 루틴을 수행해야합니다. 숫자를 내림차순과 오름차순으로 정렬하고 (4 자리 숫자에 맞추기 위해 0을 더하십시오) 더 큰 숫자에서 더 작은 숫자를 뺀 다음 이전 단계를 반복하십시오. 이 루틴을 수행하면 항상 고정 숫자 인 6174에 도달하게됩니다. 그런 다음 6174에서 루틴을 수행하면 항상 6174 (7641 - 1467 = 6174)가됩니다. 프로그램은 6174가 실행될 때까지이 루틴을 수행해야하는 횟수를 반환해야합니다 예를 들어 : num이 3524이면 프로그램은 다음 단계로 인해 3을 리턴합니다. (1) 5432 - 2345 = 3087, (2) 8730 - 0378 = 8352 , (3) 8532 - 2358 = 6174 "

(coderbyte)

오랜 동안 일한 후, 나는 일을 상상 무언가를 발견했다. 루프를 아직 테스트하지 못했습니다. 코드를 다시 실행할 수 없기 때문에 루프가 불완전하고 처리가 완료되지 않았기 때문입니다. 모든 작업이 끝나면 테스트를 마쳤습니다. 그리고 내가 뭘했는지에 상관없이 나는 0을 얻었습니다. 내가 편지를 입력하면 나는 어떤 오류가 발생했는데, 무슨 일이 일어날 지 아무리 내가 쓴 숫자이든, 예제의 4 자리 숫자조차도. 난 그냥 시작하고, 내가 정말 여기에 잘못이 무엇인지 모르는

function KaprekarsConstant(num) { 
 
    var forD = []; 
 
    var sNum = num.toString(); 
 
    var result = 0; 
 
    var chngdN = []; 
 
    var trkr = 0; 
 
    
 
for (var i = 0; i < sNum.length; i ++) { 
 
    forD.push(+sNum.charAt(i)); 
 
} 
 

 
for (var j = 0; j < sNum.length; j ++) { 
 
    chngdN.push(+sNum.charAt(j)); 
 
} 
 
     while(while(forD-chngdN === trkr){ 
 
    forD = trkr.toString(); 
 
    chngdN = trkr.toString(); 
 
    forD = forD.split(""); 
 
    chngdN = chngdN.split(""); 
 
    forD = forD.sort(); 
 
    chngdN = chngdN.sort(); 
 
    forD = forD.reverse(); 
 
    forD = forD.join(""); 
 
    chngdN = chngdN.join(""); 
 
    forD = parseFloat(forD); 
 
    chngdN = parseFloat(chngdN); 
 
    trkr = forD - chngdN; 
 
    forD = trkr.toString(); 
 
    chngdN = trkr.toString(); 
 
    result = result +1; 
 
} 
 
    // code goes here 
 
    return result; 
 
      
 
} 
 
    
 
// keep this function call here 
 
KaprekarsConstant(readline());

:

여기 내 코드입니다. 누군가가 나에게 무엇이 잘못되었다고 말할 수 있다면 나는 그것을 좋아할 것이다. (나는 그것이 내가 그 중 하나를 이해하지 못하는 것처럼 보이려고 노력하는 것처럼 들리지만, 나는 아직 배운 모든 것에 대해 확고한 이해를하지 못한다. 나는 짧은 시간 내에 그것을 모두 배웠다.). 미리 감사드립니다.

답변

0

다음은 문제를 해결합니다. 첫 번째 버전은 실제로 요구 사항을 구현 한 것이 아니지만이 문제는 해결되었습니다.

  1. 재귀 확인 번호 문자열 4 자인지 확인하기 위해

  2. Array.fromNumber.prototype.toString를 (함수가 원하는 결과까지 자신을 호출) :

    본인은이에 대해 다음을 사용했다.

  3. Ternary operator 방향이 오름차순 또는 내림차순 정렬을위한 sortNum의 인수입니다.

const makeAtLeast4 = num => 
 
     //number to string make sure you have a string that's 4 characters (add 0 if not) 
 
     num.toString() + 
 
     Array.from(//create an array from someghing 
 
      new Array(//that something is a new array 
 
      //the lenght of this array is 4 minus the length of the string 
 
      4-num.toString().length), 
 
      ()=>"0"//for each item of the array insert the string "0" 
 
     ).join("");//join this array (num 111 will be sring "1110") 
 
    //create ascending or descending sorted number 
 
    // if direction is 1 it's ascending 
 
    const sortNum = (numString,direction) => 
 
     parseInt(
 
     (direction === 1) 
 
     //if direction is 1 do ? else do : 
 
      ? numString.toString().split("").sort().join("") 
 
      : numString.toString().split("").sort().reverse().join("") 
 
     ,10//decimal number 
 
    ); 
 
    //take number, sort digits descending and ascending 
 
    // substract ascending from descending 
 
    const descending_minus_ascending = num => { 
 
     const stringNum = makeAtLeast4(num); 
 
     return sortNum(stringNum) - sortNum(stringNum,1) 
 
    } 
 
    const kaprekarsConstant = (num,times=0) => { 
 
     //get result for this number 
 
     const result = descending_minus_ascending(num); 
 
     //if result is the same as the number, return times tried 
 
     if(result === num){ 
 
     return times 
 
     } 
 
     console.log(`Try:${times+1}, result:${result}`); 
 
     //try again with the result and increase times tried by one 
 
     // recursively call this function 
 
     return kaprekarsConstant(result,times+1); 
 
    } 
 

 
    console.log(kaprekarsConstant(11))

[업데이트] 여기

당신이 재귀를 사용했습니다 때까지 루프의 어떤 종류를 방지 할 수있는 방법을 조언 것, while 루프와 같은 코드입니다 배열 함수를 사용하면 배울 시간이 조금 더 오래 걸릴 수 있지만 장기적으로 코드를 더 쉽게 이해할 수 있습니다.

const kaprekarsConstant = (num) => { 
    //get result for this number 
    // !! notice that result is not a constant but a var 
    // we will have keep re assigning it, this can be confusing 
    // in complex code and should be avoided if possible 
    // with recursion we don't need to do this 
    var result = descending_minus_ascending(num); 
    var times=0; 
    //keep re assigning result until it's same as num 
    while(result !== num){ 
    console.log(`Try:${times+1}, result:${result}`); 
    result = descending_minus_ascending(num); 
    } 
    return times; 
} 
+0

죄송합니다. 제가 잃어버린 것입니다. 도움이된다면 (내 말은 안됨) 내 지식은 var, function, return, array, some (.) (솔직하게 말해서, split이라고 부르는 것을 모른다.)), 모든 ===! == 등, if, for, while 루프, .match, parseInt, parseFloat 등등. 푸시 어구가 어떻게 작동하는지 완전히 이해하지 못했음을 인정합니다. 미안 해요, 당신이하고있는 것을보고, 정말로 어떻게 이해하는지 모르겠습니다. –

+0

또한, 나는 무례한 말을하는 것이 아니라, 내가 쓴 것을 잘못 알고 있다면 학습에 매우 유용 할 것입니다. –

+0

@BradenFoltz 주된 잘못은 재귀를 사용하지 않는다는 것입니다. 필자는 좀 더 간단하게 스펙을보다 정확하게 구현할 수 있도록 내 대답을 업데이트했습니다. – HMR

관련 문제