2016-09-30 2 views
2

Ich muss mein Javascript auffrischen, weil es meine schwächste Sprache ist, also dachte ich "Hey, lasst uns ein einfaches" Übersetzungs-Programm machen, um meine Fähigkeiten zu testen ". Nun, ich war in der Lage, es bisher so zu übersetzen (ich habe nicht an der Übersetzung von Leuten gearbeitet), aber wie auch immer, es geschieht durch eine Reihe von Fällen in einem Switch. Ich wundere mich, wenn es irgendwie gibt, kann ich den Code vereinfachen, anstatt Millionen Fälle zu haben. Danke hier ist mein Code.Vereinfachte lange Schalteranweisungen

function main() { 
      var get = prompt("Enter what you would like to encode!","At the current time decoding is still a WIP").toLowerCase(); 
      var ina = [...get]; 
      for(i = 0; i < ina.length; i++) { 
       switch(ina[i]) { 
       case "a": 
        ina[i] = "z"; 
        break; 
       case "b": 
        ina[i] = "y"; 
        break; 
       case "c": 
        ina[i] = "x"; 
        break; 
       case "d": 
        ina[i] = "w"; 
        break; 
       case "e": 
        ina[i] = "v"; 
        break; 
       case "f": 
        ina[i] = "u"; 
        break; 
       case "g": 
        ina[i] = "t"; 
        break; 
       case "h": 
        ina[i] = "s"; 
        break; 
       case "i": 
        ina[i] = "r"; 
        break; 
       case "j": 
        ina[i] = "q"; 
        break; 
       case "k": 
        ina[i] = "p"; 
        break; 
       case "l": 
        ina[i] = "o"; 
        break; 
       case "m": 
        ina[i] = "n"; 
        break; 
       case "n": 
        ina[i] = "m"; 
        break; 
       case "o": 
        ina[i] = "l"; 
        break; 
       case "p": 
        ina[i] = "k"; 
        break; 
       case "q": 
        ina[i] = "j"; 
        break; 
       case "r": 
        ina[i] = "i"; 
        break; 
       case "s": 
        ina[i] = "h"; 
        break; 
       case "t": 
        ina[i] = "g"; 
        break; 
       case "u": 
        ina[i] = "f"; 
        break; 
       case "v": 
        ina[i] = "e"; 
        break; 
       case "w": 
        ina[i] = "d"; 
        break; 
       case "x": 
        ina[i] = "c"; 
        break; 
       case "y": 
        ina[i] = "b"; 
        break; 
       case "z": 
        ina[i] = "a"; 
        break; 
       default: 
        ina[i] = ina[i] 
        }; 
       }; 
       var outa = ina.join(""); 
       document.getElementById("output").innerHTML = outa; 

      };  
+0

das hängt davon ab, gibt es consistenc y? Zum Beispiel scheint es so, als würden Sie das gleiche Alphabet rückwärts übersetzen, was wahrscheinlich viel einfacher wäre, wenn Sie nur eine Reihe von Zeichen verwenden und die Länge usw. verwenden würden. Aber für andere Muster funktioniert das vielleicht nicht möchte nur etwas für dieses Muster, oder einen einfacheren Weg, um einen Schalter im Allgemeinen zu schreiben * (was gibt es wirklich keine) *. – adeneo

+1

Wenn Sie Arbeitscode haben, den Sie verbessern möchten, können Sie auch auf http://codereview.stackexchange.com nachfragen. Sie werden Ihnen helfen, alle Aspekte Ihres Codes zu verbessern. – tsleyson

Antwort

3

Sie könnten ein Objekt mit Eigenschaften wie

{ 
    a: 'z', 
    b: 'y', 
    c: 'x', 
    // ... 
    z: 'a' 
} 

Verwendung mit dem Standardwert von ina[i] verwenden.

ina[i] = object[ina[i]] || ina[i]; 
1

Sie könnten eine paar String-Variablen verwenden, um die Buchstaben abzubilden.

function translateLetter(input) { 
    const untranslated = "abcdefghijklmnopqrstuvwxyz"; 
    const translated = "zyxwvutsrqponmlkjihgfedcba"; 

    var i = untranslated.indexOf(input); 
    return translated[i]; 
} 
+0

Sie möchten sicherstellen, dass Sie den Fall behandelt haben, in dem die Eingabe nicht "nicht übersetzt" ist; so wie es ist, werden Sie für alle diejenigen "undefined" zurückgeben. Dies beinhaltet auch lineare Scans für jedes Zeichen; Zugegeben, es handelt sich wahrscheinlich um etwas wie einen 'memchr'-Aufruf, der ziemlich schnell ist, aber Sie könnten den Index direkt genauso einfach berechnen, ohne zu scannen. – ShadowRanger

+0

Compute v. Scanning - ein klassischer Fall von Performance v. Erweiterbarkeit. Nun, zumindest habe ich keinen Service angerufen. –

1

Die switch Sie verwenden Logik, die, ohne die switch überhaupt über einfache mathematische direkt umgesetzt werden können (I modernsten JS Interpreten glauben, sollte die tatsächliche Methode JIT entfernt ruft, wenn dies eine heiße Schleife ist, so dass die Kosten sollte es trivial):

var get = prompt("Enter what you would like to encode!","At the current time decoding is still a WIP").toLowerCase(); 
var ina = [...get]; 
for(i = 0; i < get.length; i++) { 
    var code = get.charCodeAt(i); 
    if (97 <= code && code <= 122) { // 'a' and 'z' ordinal values 
     // Invert lowercase letters with simple math and convert back to character 
     ina[i] = String.fromCharCode((122 + 97) - code); 
    } 
    // No need to handle non-lowercase/non-ASCII since ina initialized to match get 
} 
0

Nur die Mathematik auf den ASCII-Zeichencodes:

function main() { 
    var get = prompt("Enter what you would like to encode!","At the current time decoding is still a WIP").toLowerCase(); 
    var ina = [...get]; 

    for (i = 0; i < get.length; i++) { 
     var charNum = get.charCodeAt(i) - 96; 

     if (charNum > 0 && charNum < 27) { 
      ina[i] = String.fromCharCode((27 - charNum) + 96); 
     } 
    }; 

    var outa = ina.join(""); 
    document.getElementById("output").innerHTML = outa; 
};  
Verwandte Themen