login
 1 point by jsgrahamus 3754 days ago | link | parent `````` arc> (def 1st-diff (str1 str2 i) (if (or (is str1 "") (is str2 "")) 0 (or (> i (- (len str1) 1)) (> i (- (len str2) 1))) i (no (is (str1 i) (str2 i))) i (1st-diff str1 str2 (+ i 1)))) # arc> (1st-diff "" "" 0) 0 arc> (1st-diff "" "" 0) 0 arc> (= astring "abcde") "abcde" arc> (= bstring "abced") "abced" arc> (1st-diff "" "" 0) 0 arc> (1st-diff astring "" 0) 0 arc> (1st-diff "" astring 0) 0 arc> (1st-diff astring bstring 0) 3 arc> (1st-diff bstring astring 0) 3 arc> (1st-diff astring "abcdef" 0) 5 arc> (1st-diff "abcdef" astring 0) 5 arc>``````

 1 point by jsgrahamus 3754 days ago | link It's interesting to compare this to the solution in my workday language. One of the reasons that M is shorter is because its functions are more tolerant. For arc, I had to make sure that the index to the string was not too large. In M, it simply returns an empty string if you attempt to access a string position beyond the length. And I used iteration with M. Perhaps the arc solution would have been shorter had I done the same there.Interesting exercise for this newbie.-----
 2 points by akkartik 3754 days ago | link Yeah you can index past the end in my arc variant (http://github.com/akkartik/wart). But it currently returns nil. What should it be?I'd love to see the M version expanded into english.-----
 2 points by jsgrahamus 3754 days ago | link Great.I'm used to seeing it as the empty stringHere is the expanded M version (! = LF):`````` IF X=Y WRITE !,0 ; No difference ELSE FOR I=1:1 IF \$EXTRACT(X,I)'=\$EXTRACT(Y,I) WRITE !,I QUIT``````-----
 1 point by akkartik 3754 days ago | link I still don't know enough MUMPS to follow it :)Are you concatenating strings? Is that where returning "" is useful? In wart concatenating strings is tolerant of non-strings, so I think returning nil should be ok.-----
 2 points by jsgrahamus 3752 days ago | link If the string X = the string Y, print 0 (to indicate there are no differences / MUMPS uses 1-based indexing of strings)Otherwise, go through each character of the strings and at the point where they differ, print that index and quit looping.MUMPS does not error out on attempting to extract a character beyond the string's length. So in that event, 1 string's extract will return the empty string, which will differ from the other string's extract and will cause you to print the index and quit. Not generating such an error, of course, cuts down on the code needed.-----
 2 points by zck 3753 days ago | link So if we enter the for loop, we know there is a difference between the two sequences.So we just need to find an index position i where (isnt seq1.i seq2.i) is true. If indexing off the end of a string causes an error, we need to put in code to prevent that. If indexing off the end of a string returns anything that can't be an element of the string, we can compare each index i until we find a difference, knowing that we'll eventually find one.-----
 1 point by jsgrahamus 3752 days ago | link Correct.-----