2016-05-13 7 views
1

Ich schreibe das Hinweis-System für ein Quiz. Die Hinweise sollen Anagramme der Antworten sein. Um die Anagramme zu vereinfachen, behalte ich die ersten und letzten Buchstaben gleich.Wie erzeugt man einfache Anagramme, die Interpunktion erhalten?

var _ = require('underscore'); 

var easy = function(s) { 
    if (s.length <= 1) { 
     return s; 
    } 
    return s[0] + _.shuffle(s.slice(1, -1)).join("") + s.slice(-1); 
}; 

Für mehrere Wort Antworten möchte ich jedes Wort separat anagrammieren. Ich schrieb:

Allerdings verliert dies jede Interpunktion in der Antwort (Ersetzen Sie es mit einem Leerzeichen). Ich möchte die Interpunktion in ihrer ursprünglichen Position behalten. Wie kann ich das machen?

Hier sind drei Beispiele testen auf:

console.log(peasy("mashed potatoes")); 
console.log(peasy("computer-aided design")); 
console.log(peasy("sophie's choice")); 

Meine Funktion peasy über das zweite und drittes Beispiel schlägt fehl, weil es Bindestrich und Apostroph verliert.

+1

Ihre 'easy' Funktion kann zurückgeben 'S', wenn' (s.length <= 3) '. Wenn Sie die ersten und letzten Zeichen beibehalten, werden nur Strings mit einer Länge von mehr als 3 wirklich gemischt ... – ericbn

Antwort

4

Splitting von Worttrenn funktioniert der Trick:

var peasy = function(s) { 
    return s.split(/\b/).map(easy).join(""); 
} 

Erläuterung: "computer-aided design".split(/\b/) Ergebnisse in ["computer", "-", "aided", " ", "design"]. Dann sind Sie jedes Element mischen mit easy und sich ihnen anzuschließen, so etwas wie "ctemopur-adeid diegsn" immer wieder ...

+0

Danke das hat funktioniert –

2

Es ist einfacher String.prototype.replace statt Spaltung zu verwenden:

  • Sie nicht nach dem ersten schneiden müssen und vor dem letzten Brief.
  • Die Ersetzung erfolgt nur bei Wortzeichen (andere Zeichen bleiben unverändert)
  • Wörter mit weniger als 4 Zeichen werden übersprungen.
  • es ist kürzer und benötigt nicht die easy Funktion.
var _ = require('underscore'); 

var peasy = function(s) { 
    return s.replace(/\B\w{2,}\B/g, function (m) { 
     return _.shuffle(m).join(''); 
    }); 
} 
Verwandte Themen