2016-11-22 2 views
1

Ich habe eine Funktion geschrieben, bei der die Werte der Buchstaben in einer empfangenen Zeichenfolge um 13 Stellen verschoben sind.ROT13-Chiffre in so wenigen Codezeilen möglich

Meine Lösung ist sehr ineffizient und müsste komplett neu geschrieben werden, wenn der Verschiebungsfaktor geändert wurde.

Hier ist meine Lösung:

function rot13(str) { 
 
    var charArray = str.split(""); 
 
    var myArray = []; 
 

 
    for (var i = 0; i < charArray.length; i++) { 
 
    switch (charArray[i]) { 
 

 
     case "A": 
 
     myArray.push("N"); 
 
     break; 
 

 
     case "B": 
 
     myArray.push("O"); 
 
     break; 
 

 
     case "C": 
 
     myArray.push("P"); 
 
     break; 
 

 
     case "D": 
 
     myArray.push("Q"); 
 
     break; 
 

 
     case "E": 
 
     myArray.push("R"); 
 
     break; 
 

 
     case "F": 
 
     myArray.push("S"); 
 
     break; 
 

 
     case "G": 
 
     myArray.push("T"); 
 
     break; 
 

 
     case "H": 
 
     myArray.push("U"); 
 
     break; 
 

 
     case "I": 
 
     myArray.push("V"); 
 
     break; 
 

 
     case "J": 
 
     myArray.push("W"); 
 
     break; 
 

 
     case "K": 
 
     myArray.push("X"); 
 
     break; 
 

 
     case "L": 
 
     myArray.push("Y"); 
 
     break; 
 

 
     case "M": 
 
     myArray.push("Z"); 
 
     break; 
 

 
     case "N": 
 
     myArray.push("A"); 
 
     break; 
 

 
     case "O": 
 
     myArray.push("B"); 
 
     break; 
 

 
     case "P": 
 
     myArray.push("C"); 
 
     break; 
 

 
     case "Q": 
 
     myArray.push("D"); 
 
     break; 
 

 
     case "R": 
 
     myArray.push("E"); 
 
     break; 
 

 
     case "S": 
 
     myArray.push("F"); 
 
     break; 
 

 
     case "T": 
 
     myArray.push("G"); 
 
     break; 
 

 
     case "U": 
 
     myArray.push("H"); 
 
     break; 
 

 
     case "V": 
 
     myArray.push("I"); 
 
     break; 
 

 
     case "W": 
 
     myArray.push("J"); 
 
     break; 
 

 
     case "X": 
 
     myArray.push("K"); 
 
     break; 
 

 
     case "Y": 
 
     myArray.push("L"); 
 
     break; 
 

 
     case "Z": 
 
     myArray.push("M"); 
 
     break; 
 

 
     case " ": 
 
     myArray.push(" "); 
 
     break; 
 

 
     case ",": 
 
     myArray.push(","); 
 
     break; 
 

 
     case "!": 
 
     myArray.push("!"); 
 
     break; 
 

 
     case "?": 
 
     myArray.push("?"); 
 
     break; 
 

 
     case ".": 
 
     myArray.push("."); 
 
     break; 
 
    } 
 
    } 
 

 
    
 

 
    console.log(myArray.join("")); 
 

 
} 
 
rot13("GUR DHVPX OEBJA QBT WHZCRQ BIRE GUR YNML SBK.");

Können Sie mir zeigen eine effizientere weniger umständliche Lösung?

+3

Tipps: 'var map = {A: 'N', ...}' Tipp 2: 'String.fromCharCode (str.charCodeAt (...) + 13)' ... – deceze

+3

Diese Frage könnte sein, geeignet für [Code Review] (http://codereview.stackexchange.com/help), solange (a) Ihr Code wie vorgesehen funktioniert, (b) Ihr Code aus echtem Code und nicht aus Beispielcode besteht und (c) Ihr Code ist im Hauptteil der Frage enthalten. Wenn Sie möchten, dass ein Peer-Review alle Aspekte Ihres Codes verbessert, veröffentlichen Sie ihn bitte in der Code Review. –

+0

Vielleicht mit ihren ASCII-Werten und dann verschieben sie um eine beliebige Zahl, in diesem Fall 13? – praetoriaen

Antwort

1

Hier ist ein Beispiel, um die Funktion reduzieren unter Verwendung von:

function rot13(str) { 
 
    chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" 
 
    return str.split("").reduce(function(a, b) { 
 
    if (chars.indexOf(b) == -1) { 
 
     return a + b; 
 
    } 
 
    return a + chars[(chars.indexOf(b)+13) % chars.length] 
 
    }, ""); 
 
} 
 

 
console.log(rot13("GUR DHVPX OEBJA QBT WHZCRQ BIRE GUR YNML SBK."));

+0

Warum überprüfen Sie nicht, ob 'b' in' chars ist 'anstelle von' extra_chars'? Dann müssen Sie nicht angeben, was ein zusätzliches Zeichen ist. – L3viathan

+0

@ L3viathan, guter Punkt, werde es aktualisieren :) – Dekel

+0

Ich dachte, Strings waren in JS unveränderlich, und so würde dies O (n^2) Zeit Komplexität haben, oder? (Nur ein bisschen seltsam, Sie würden es über eine O (n) -Funktion auswählen, die ich sicher bin _you_ könnte lesbarer machen.) – Peilonrayz

2

Hier ist eine mögliche Realisierung, mit der Fähigkeit, in jedem (positiven) Drehwert und eine Tabelle der anderen Ersetzungen passieren. Geschrieben in ES6.

function rotn(str, rotation = 13, map = {}) { 
    const table = {}; // New table, to avoid mutating the parameter passed in 
    // Establish mappings for the characters passed in initially 
    for (var key in map) { 
     table[map[key]] = key; 
     table[key] = map[key]; 
    } 
    // Then build the rotation map. 
    // 65 and 97 are the character codes for A and a, respectively. 
    for (var i = 0; i < 26; i++) { 
     table[String.fromCharCode(65 + i)] = String.fromCharCode(65 + (i + rotation) % 26); 
     table[String.fromCharCode(97 + i)] = String.fromCharCode(97 + (i + rotation) % 26); 
    } 

    return str.split('').map((c) => table[c] || c).join(''); 
} 


console.log(rotn("Gur dhvpx oebja Qbt whzcrq bire gur ynml Sbk.", 13, {'.': '!'}));