プログラマーlv.1起動パスワード


皆さんこんにちはAydenです
この問題はうまく答えられなかった.約4時間かけて謎を解きほぐそうとしたところ、6、7、8、10、12回の未合格で61.5点を獲得した.このままでは、長期的な勉強に飽きてしまうかもしれないので、他の人が解いたコードの分析に集中します.

1.質問


問題の説明


1つの暗号化方法は、1つの文の各アルファベットを一定の距離で伸ばし、別のアルファベットに変換することです.例えば、「AB」は1で「BC」、3で「DE」を表す.「z」が1に等しいと「a」になります.文字列sと距離nを入力し、sがnの暗号文の関数を生成し、ソリューションを完了します.

せいげんじょうけん


いくら押してもスペースは空いています.
sは、小文字、大文字、スペースのみから構成されます.
sの長さは8000以下です.
nは1以上,25以下の自然数である.

I/O例



2.私のソースコード

function solution(s, n) {
    let arr = s.split("");
    let temp=[];
    let a=0;
    let answer = '';
        for(let x of arr){
        if(x===" "){
            temp.push(" ");
        } else{
            a= x.charCodeAt()+n; // 아스키코드 변환 및 +n
            if(123<=a || 90<a && a<97 ){
                a-=26;
                temp.push(String.fromCharCode(a));
            } else{
                temp.push(String.fromCharCode(a));
            }
        }
    }
    answer=temp.join("")
    return answer;
 }
let arr = s.split("");
文字列sをarrに配列として格納する各要素.
for文を使用して、保存された配列を1つずつ参照します.
if(x===" "){
            temp.push(" ");
        }
ナビゲーション中にスペースが発生した場合は、tempという名前の配列に保存します.
else{
    a= x.charCodeAt()+n; // 아스키코드 변환 후 +n
スペースでない場合は、文字をaskiコードに変換し、aという変数にnを追加して格納します.
 if(123<=a || 90<a && a<97 ){
                a-=26;
                temp.push(String.fromCharCode(a));
            } 
移動した数字nをAskiコードに追加した値がアルファベットAskiコードの範囲を超えている場合、-26は文字に置き換えられtemp配列に保存されます.
else{
 		temp.push(String.fromCharCode(a));
    }
移動した数字nをAskiコードの値がアルファベットAskiコードの範囲内に追加した場合、それを文字に置き換えてtemp配列に保存します.
answer=temp.join("")
    return answer;
tempに格納されている配列を答えの文字として保存し、返します.

3.他人の説明

function solution(s, n) {
   let answer = "";

 for (let x of s){        
   if (x === ' ' ) 
    answer += ' ';
   else 
       answer += String.fromCharCode( (x.charCodeAt()>90)?
     (x.charCodeAt()+n-97)%26+97 : (x.charCodeAt()+n-65)%26+65 )     
 }

   return answer;
}
私が初めてこの問題を見たとき、まずアスキーコードを思い出して、私はアスキーコードを勉強します.
for (let x of s){        
   if (x === ' ' ) 
    answer += ' ';
各要素のs文字列をチェックし、スペースがある場合は答えにスペースを追加します.
else 
       answer += String.fromCharCode( (x.charCodeAt()>90)?
     (x.charCodeAt()+n-97)%26+97 : (x.charCodeAt()+n-65)%26+65 ) 
x要素がスペースでない場合は、3つの演算を使用してAskyコードに変換します.コードを以下に示します.
(변환한 아스키 코드 값이 90↑) ? 
(변환한 아스키 코드 값+거리- 'a'아스키 코드 값)%(소문자 알파벳 수)+
'a'아스키 코드 값 : (변환한 아스키 코드 값+거리-'A'아스키 코드 값)
%(대문자 알파벳 수)+'A'아스키 코드 값

4.終了


私の解答の中の問題は、大文字Askyコードからの距離がnに移動すると、小文字の範囲を超えることがあります.
大文字は大文字の輪、小文字は小文字の輪を巻きます.
function solution(s, n) {
    let arr = s.split("");
    let temp=[];
    let a=0;
    let answer = '';
        for(let x of arr){
        if(x===" "){
            temp.push(" ");
        } else{
            a= x.charCodeAt()+n; // 아스키코드 변환 및 +n
            if(65<=x.charCodeAt()&& x.charCodeAt()<=90){ // 대문자
                if(a>=91){ // 대문자 범위를 벗어나는 경우
                    a=((a-65)%26+65); // 대문자에서 소문자 아스키로 넘어가는 경우 다시 대문자 아스키로 전환 
                    temp.push(String.fromCharCode(a));
                } else{
                    temp.push(String.fromCharCode(a));
                }
            } else if(97<=x.charCodeAt() && x.charCodeAt()<=122){
                if(a>=123){
                    a=((a-97)%26+97);
                    temp.push(String.fromCharCode(a));
                }
                else{
                    temp.push(String.fromCharCode(a));
                }
             }
            } 
        }
        answer=temp.join("")
        return answer;
    }
私は他の人の資料を見て、私のコードを修正しました.if文を大量に繰り返すと、効率的で無毒なコードになりますので、後で説明します.