Created
March 19, 2012 19:38
-
-
Save andrelaszlo/2125516 to your computer and use it in GitHub Desktop.
Source code for the blog post at http://www.laszlo.nu/post/87090336/antal-kombinationer-av-ord
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<html> | |
<head><title>Kombinationer</title></head> | |
<body> | |
<script> | |
// shorthand function | |
function $(id) { | |
return document.getElementById(id); | |
} | |
// sorter for a list containing tuples | |
function tupleSort(a,b) { | |
if (a[0] < b[0]) | |
return -1; | |
else if(a[0] > b[0]) | |
return 1; | |
else | |
return 0; | |
} | |
// return an array containing tuples of doubled letters and number of occurences | |
function getDoubles(txt) { | |
var list = txt.split(""); | |
var ret = new Array(); | |
while (list.length > 0) { | |
var search = list.pop(); | |
var occ = 1; | |
var tmp = list.slice(); | |
var tail = new Array(); | |
while (tmp.length > 0) { | |
var current = tmp.pop(); | |
if (current == search) | |
occ++; | |
else | |
tail.push(current); | |
} | |
list = tail.slice(); | |
if (occ > 1) | |
ret.push(new Array(search,occ)); | |
} | |
ret.sort(tupleSort); | |
return ret; | |
} | |
// factorial function | |
function fac(num) { | |
if (num < 2) | |
return 1; | |
else | |
return num * fac(num-1); | |
} | |
// print the new calculation | |
function reCalc() { | |
$("outstr").innerHTML = ""; // clear output | |
var txt = $("instr").value; | |
$("outstr").innerHTML += "Texten innehåller " + txt.length + " tecken<br><br>"; | |
var doubles = getDoubles(txt.toUpperCase()); | |
for (x in doubles) | |
$("outstr").innerHTML += doubles[x][0] + " förekommer " + doubles[x][1] + " gånger<br>"; | |
$("outstr").innerHTML += "<br>Man får då följande formel för antal unika ord som bildas när man sorterar om ordet:<br>"; | |
$("outstr").innerHTML += txt.length + "!"; | |
if (doubles.length > 0) { | |
$("outstr").innerHTML += " / ("; | |
var first = true; | |
for (x in doubles) | |
if (first) { | |
$("outstr").innerHTML += doubles[x][1] + "!"; | |
first = false; | |
} else { | |
$("outstr").innerHTML += " * " + doubles[x][1] + "!"; | |
} | |
$("outstr").innerHTML += ")"; | |
} | |
$("outstr").innerHTML += "<br><br>Vilket blir:<br>"; | |
var n = fac(txt.length); | |
for (x in doubles) | |
n /= fac(doubles[x][1]); | |
$("outstr").innerHTML += n + " stycken"; | |
} | |
</script> | |
Jag fick frågan av <a href="http://senzaroz.tumblr.com/" target="_blank">Pär</a> om hur många sätt man kan ordna om "ronaldreagan". Det blir ju ett par stycken, närmare 20 miljoner faktiskt om man inte räknar med de dubbletter som uppstår när man till exempel byter plats på de två a:na. Ett av anagrammen är "an oral danger", vilket ju är lite komiskt.<br><br> | |
Skriv in ett ord för att räkna ut hur många unika ord som bildas när man sorterar om bokstäverna, och för att visa uträkninge (javascript krävs):<br><br> | |
<input type="text" value="ronaldreagan" id="instr" onchange="reCalc()" onkeydown="reCalc()" onkeyup="reCalc()"><br><br> | |
<div id="outstr"></div> | |
<script>reCalc();</script> | |
</body> | |
</html> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment