We did it! Thanks to snowlord and especially to p01 for pointing in the right direction
-
-
Save Prinzhorn/1258724 to your computer and use it in GitHub Desktop.
| /** | |
| @param s the string you want to get the soundex value of | |
| @param i placeholder for counter | |
| @param j placeholder for ordinal value of char | |
| @param r placeholder for string concatenation | |
| */ | |
| function(s,i,j,r){ | |
| //Iterate over all characters in s starting from second letter. | |
| //Init r with first character of s. | |
| //Init i with 0. | |
| //Read ordinal value of current character into j. | |
| for(r=s[i=0];j=s.charCodeAt(++i);) | |
| //Concat next character | |
| r += | |
| //Look up the number for the current character, but only if the character does not equal the last character. | |
| s[i] != s[i-1] && +'1230120022455012623010202'[j-98] | |
| //Empty string if | |
| || ''; | |
| return(r+'000').slice(0,4) | |
| } |
| function(s,i,j,r){for(r=s[i=0];j=s.charCodeAt(++i);)r+=s[i]!=s[i-1]&&+'1230120022455012623010202'[j-98]||'';return(r+'000').slice(0,4)} |
| DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE | |
| Version 2, December 2004 | |
| Copyright (C) 2011 YOUR_NAME_HERE <YOUR_URL_HERE> | |
| Everyone is permitted to copy and distribute verbatim or modified | |
| copies of this license document, and changing it is allowed as long | |
| as the name is changed. | |
| DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE | |
| TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION | |
| 0. You just DO WHAT THE FUCK YOU WANT TO. |
| { | |
| "name": "americanSoundex", | |
| "description": "An implementation of the American Soundex algorithm.", | |
| "keywords": [ | |
| "soundex", | |
| "american" | |
| ] | |
| } |
| <!DOCTYPE html> | |
| <title>American Soundex</title> | |
| <div>Expected value: <b>R163, A500, B556</b></div> | |
| <div>Actual value: <b id="ret"></b></div> | |
| <script> | |
| // write a small example that shows off the API for your example | |
| // and tests it in one fell swoop. | |
| var myFunction = function(s,i,j,r){for(r=s[i=0];j=s.charCodeAt(++i);)r+=s[i]!=s[i-1]&&+'1230120022455012623010202'[j-98]||'';return(r+'000').slice(0,4)} | |
| document.getElementById( "ret" ).innerHTML = [myFunction('Robert'), myFunction('Anna'), myFunction('Bananarama')].join(', '); | |
| </script> |
164 bytes using a LUS ( Look Up String :p )
function(s,i,j,r){s=s.toUpperCase();for(r=s[i=0];j=s.charCodeAt(++i);)r+=+'1230120022455012623010202'[j-66]||'';return(r.replace(/(\d)\1+/g,'$1')+'000').slice(0,4)}Looks interesting.
Maybe you should fork my gist so we can golf on two courses, because both approaches seem fundamentally different. And don't forget the "annotated.js" file :-D
Edit: One more thing. The algorithm says "Two adjacent letters with the same number are coded as a single number.". I thought "555" should get "5" but obviously "55" is correct. So we both can strip the plus sign in our regex.
Edit2: LUS ftw!
What was the idea behind "toUpperCase"? Remove it and subtract 98 instead and BAM 146 bytes.
I wanted to make my function case insensitive but, yes this is Spa^W140bytes and surely I can get away with that. Thanks
136 bytes
function(s,i,j,r){for(r=s[i=0];j=s.charCodeAt(++i);)r+=s[i]!=s[i-1]&&+'1230120022455012623010202'[j-98]||'';return(r+'000').slice(0,4)}:) That was fast! Nice move getting rid of the replace(...)
A little too late (things have moved on, I see), but for the record: I did not intend to remove the backslashes. It was probably a copy-and-paste error. Sorry about that!
I got it down to 133 : https://gist.github.com/1263293
Good idea. Will commit.
But you removed one of the two backslashes in the regex ("\d" and "\1"). They are needed. I will add a test case for that.
Edit: I guess GitHub removed them, just as in my comment. Maybe we should use the appropriate Markdown for code in future.