Well, first of all, it would *really* help if you formatted your code,
because currently your code is almost impossible to read.

Let's format it first:

    (defn simplify-string [original substring replacement]
      (let [simplified (str/replace original substring replacement)]
        simplified))

    (defn simplify-dat-guy [exp]
      (loop [[k v] translations exp exp]
        (recur [k v] (simplify-string exp k v))))

    (defn completely-simplify-dat-guy [exp]
      (loop [exp exp]
        (cond
          (= (.length exp) 1) exp
          (second-condition exp)  (recur (simplify-dat-guy exp)))))

We can simplify this a little further still by removing simplify-string,
since it's just a wrapper around str/replace:

    (defn simplify-dat-guy [exp]
      (loop [[k v] translations exp exp]
        (recur [k v] (str/replace exp k v))))

And since recur works with functions, we can also remove the outer loop:

    (defn completely-simplify-dat-guy [exp]
      (cond
        (= (.length exp) 1) exp
        (second-condition exp)  (recur (simplify-dat-guy exp)))))

The loop in "simplify-dat-guy" is also an example of a fold over a map, so
we can replace it with reduce-kv:

    (defn simplify-dat-guy [exp]
      (reduce-kv str/replace exp translations))

Now let's look at your problem. Assuming I've understood correctly, you
want to simplify until you have a string of length 1, or a string that
cannot be reduced any further?

So in that case, something like:

    (defn simplify [expr translations]
      (if (= (count expr) 1)
        expr
        (let [next-expr (reduce-kv str/replace expr translations)]
          (if (< (count next-expr) (count expr)
            (recur next-expr)))))

If we cannot reduce the expression, rather than returning "-1", let's just
return nil instead.

- James


On 23 November 2014 at 16:25, Dan Campbell <dcwhat...@gmail.com> wrote:

> Hi,
>
> I have to loop through a string, consecutively replacing substrings with
> single characters, one substring at a time.  Each time through the loop, I
> need to use a cond to check that the length of the last replaced string, is
> shorter than the length of the previous replaced string.
>
> So, as an artificial example, say you have a string "1001110011011", and a
> map or vector of substrings and replacements
>
> ( def map_translations
> {
>   { "00" "0" },
>   { "01" "0" },
>   { "10" "0" },
>   { "11" "1" }
> }
>
> ( The resemblance to a conjunction truth table is coincidental.  This is
> the simplest example I could think of. )
>
>
> So I want to loop through the map of translations several times, each time
> trying to simplify the original expression further, until a result of
> either "-1" or a single character is returned.
>
> If the length of the replaced string is greater than or equal to the
> length of the last replacement, then I'd want to return a "-1" string.
>
> But I can't figure out, how to compare the length of a result of a recur
> assignment, to the length of the PREVIOUS recur assignment.
>
>
> So, it might look something like this (untested):
>
>
>
> ( defn simplify-string
>   [ s_original-string s_substring s_replacement-character ]
>   (
>     let [ s_simplified-string ( clojure.string/replace s_original-string
> s_substring s_replacement-character )  ]
>     s_simplified-string
>   )
> )
>
>
> ( defn simplify-dat-guy
>   "Loops through a map of substring to character translations,
>     attempting to simplify a given expression.
>     e.g., '00101' through successive translations would become a shorter
> form
>   "
>   [ s_exp ]
>   ( loop
>     [ [k v] map_longform-shortform-translation s_simplified-expression
> s_exp ]
>         ( recur [ k v ] ( simplify-string s_simplified-expression k v ) )
>   )
> )
>
>
> ( defn completely-simplify-dat-guy
>   "Loops through simplify-dat-guy several times,
>     until either a single character or a "-1" is returned.
>     e.g., '00101' through successive simplify-dat-guys would eventually
> become "0".
>   "
>   [ s_exp ]
>   ( loop
>     [ s_simplified-expression s_exp ]
>     (
>       cond
>       ( = ( .length s_simplified-expression ) 1 )
>         s_simplified-expression
> ( comment
>   I want to put a second condition in here, something like
>         ( = ( .length s_simplified-expression ) ( .length
> PREVIOUS_s_simplified_expression ) )
>         "-1"
> )
>         ( recur ( simplify-dat-guy s_simplified-expression ) )
>     )
>   )
> )
>
>  --
> You received this message because you are subscribed to the Google
> Groups "Clojure" group.
> To post to this group, send email to clojure@googlegroups.com
> Note that posts from new members are moderated - please be patient with
> your first post.
> To unsubscribe from this group, send email to
> clojure+unsubscr...@googlegroups.com
> For more options, visit this group at
> http://groups.google.com/group/clojure?hl=en
> ---
> You received this message because you are subscribed to the Google Groups
> "Clojure" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to clojure+unsubscr...@googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to