プログラマーlv.1起動パスワード
4438 ワード
皆さんこんにちはAydenです
この問題はうまく答えられなかった.約4時間かけて謎を解きほぐそうとしたところ、6、7、8、10、12回の未合格で61.5点を獲得した.このままでは、長期的な勉強に飽きてしまうかもしれないので、他の人が解いたコードの分析に集中します.
1つの暗号化方法は、1つの文の各アルファベットを一定の距離で伸ばし、別のアルファベットに変換することです.例えば、「AB」は1で「BC」、3で「DE」を表す.「z」が1に等しいと「a」になります.文字列sと距離nを入力し、sがnの暗号文の関数を生成し、ソリューションを完了します.
いくら押してもスペースは空いています.
sは、小文字、大文字、スペースのみから構成されます.
sの長さは8000以下です.
nは1以上,25以下の自然数である.
for文を使用して、保存された配列を1つずつ参照します.
私の解答の中の問題は、大文字Askyコードからの距離がnに移動すると、小文字の範囲を超えることがあります.
大文字は大文字の輪、小文字は小文字の輪を巻きます.
この問題はうまく答えられなかった.約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文を大量に繰り返すと、効率的で無毒なコードになりますので、後で説明します.Reference
この問題について(プログラマーlv.1起動パスワード), 我々は、より多くの情報をここで見つけました https://velog.io/@aydenote/프로그래머스-lv.1-시저-암호テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol