T*******x 发帖数: 8565 | 1 找出一段Clojure代码,命名为x,使得迭代"eval"之后,每一步的代码长度比前一步更
长。
举个结果不正确的例子。比如"(inc 1)"。
(def x '(inc 1))
(take 10 (iterate eval x))
结果是
((inc 1) 2 2 2 2 2 2 2 2 2)
越来越短,不符合要求。
再举一个,比如"1"。
(def x 1)
(take 10 (iterate eval x))
结果是
(1 1 1 1 1 1 1 1 1 1)
每一步一样长,也不符合要求。 |
T*******x 发帖数: 8565 | 2 这个题我稍微改一下,我觉得应该是等价的:
找出一个字符串x,使得迭代“read-string然后eval”之后,每一步得到的字符串长度
比前一步更长。
也就是:
(def x "????")
(def eval-string (comp eval read-string))
(take 10 (iterate eval-string x))
read-string把一段字符串变成一段Clojure代码,eval再执行这段代码,结果还得是一
段字符串,而且是一段代码的字符串。
【在 T*******x 的大作中提到】 : 找出一段Clojure代码,命名为x,使得迭代"eval"之后,每一步的代码长度比前一步更 : 长。 : 举个结果不正确的例子。比如"(inc 1)"。 : (def x '(inc 1)) : (take 10 (iterate eval x)) : 结果是 : ((inc 1) 2 2 2 2 2 2 2 2 2) : 越来越短,不符合要求。 : 再举一个,比如"1"。 : (def x 1)
|
g****t 发帖数: 31659 | 3 就是要知道自己被调用了多少次吧?clojure是不是所谓的
Lexical scope什么的。
真要看这些东西。找个本科生的lambda calculus 课程
做一下题似乎更有效。
: 这个题我稍微改一下,我觉得应该是等价的:
: 找出一个字符串x,使得迭代“read-string然后eval”之后,
每一步得到的字符
串长度
: 比前一步更长。
: 也就是:
: (def x "????")
: (def eval-string (comp eval read-string))
: (take 10 (iterate eval-string x))
: read-string把一段字符串变成一段Clojure代码,eval再执行这段代码,
结果还
得是一
: 段字符串,而且是一段代码的字符串。
【在 T*******x 的大作中提到】 : 这个题我稍微改一下,我觉得应该是等价的: : 找出一个字符串x,使得迭代“read-string然后eval”之后,每一步得到的字符串长度 : 比前一步更长。 : 也就是: : (def x "????") : (def eval-string (comp eval read-string)) : (take 10 (iterate eval-string x)) : read-string把一段字符串变成一段Clojure代码,eval再执行这段代码,结果还得是一 : 段字符串,而且是一段代码的字符串。
|
T*******x 发帖数: 8565 | 4 谢谢。lambda calculus我肯定要看的。一直没找到机会。:)
你说的这个思路听起来有道理,知道了自己被调用了多少次,然后怎么办呢?写一下伪
代码吧。或者你给预估一下此题的难度,是几行代码的事还是说它肯定短不了?
我觉得此题挺深奥。因为不管你给出的答案是什么样,我都可以稍微修改一下问题,使
原答案的方法不适用。似乎。
【在 g****t 的大作中提到】 : 就是要知道自己被调用了多少次吧?clojure是不是所谓的 : Lexical scope什么的。 : 真要看这些东西。找个本科生的lambda calculus 课程 : 做一下题似乎更有效。 : : : 这个题我稍微改一下,我觉得应该是等价的: : : 找出一个字符串x,使得迭代“read-string然后eval”之后, : 每一步得到的字符 : 串长度 : : 比前一步更长。
|
T*******x 发帖数: 8565 | 5 看了wiki,不错。看到很多熟悉的东西。Y-Combinator也里面。:)
【在 g****t 的大作中提到】 : 就是要知道自己被调用了多少次吧?clojure是不是所谓的 : Lexical scope什么的。 : 真要看这些东西。找个本科生的lambda calculus 课程 : 做一下题似乎更有效。 : : : 这个题我稍微改一下,我觉得应该是等价的: : : 找出一个字符串x,使得迭代“read-string然后eval”之后, : 每一步得到的字符 : 串长度 : : 比前一步更长。
|
T*******x 发帖数: 8565 | 6 我起个头,定义了一个xx,它还不是想要的结果。
(def space " ")
(def lparen "(")
(def rparen ")")
(defn wrap [wrapped] (str lparen "wrap" space wrapped rparen))
(def eval-string (comp eval read-string))
(def xx "xx")
(def result (take 8 (iterate (comp eval-string wrap) xx)))
(for [one result] (println one))
结果打印如下:
xx
(wrap xx)
(wrap (wrap xx))
(wrap (wrap (wrap xx)))
(wrap (wrap (wrap (wrap xx))))
(wrap (wrap (wrap (wrap (wrap xx)))))
(wrap (wrap (wrap (wrap (wrap (wrap xx))))))
(wrap (wrap (wrap (wrap (wrap (wrap (wrap xx)))))))
每次迭代长度都增加,但是迭代的操作包含一个wrap函数。现在目标是要把这个wrap函
数push到静态代码中。
【在 T*******x 的大作中提到】 : 这个题我稍微改一下,我觉得应该是等价的: : 找出一个字符串x,使得迭代“read-string然后eval”之后,每一步得到的字符串长度 : 比前一步更长。 : 也就是: : (def x "????") : (def eval-string (comp eval read-string)) : (take 10 (iterate eval-string x)) : read-string把一段字符串变成一段Clojure代码,eval再执行这段代码,结果还得是一 : 段字符串,而且是一段代码的字符串。
|
T*******x 发帖数: 8565 | 7 哦。定义一个double wrap就可以了。
(def wrap-with (partial format "(%s %s)"))
(def dwrap- (partial wrap-with "dwrap"))
(def dwrap (comp dwrap- dwrap-))
(def eval-string (comp eval read-string))
(def xx "xx")
(def x "(dwrap xx)")
(def result (take 4 (iterate eval-string x)))
(for [item result] (println item))
结果是这样:
(dwrap xx)
(dwrap (dwrap xx))
(dwrap (dwrap (dwrap (dwrap xx))))
(dwrap (dwrap (dwrap (dwrap (dwrap (dwrap (dwrap (dwrap xx))))))))
【在 T*******x 的大作中提到】 : 我起个头,定义了一个xx,它还不是想要的结果。 : (def space " ") : (def lparen "(") : (def rparen ")") : (defn wrap [wrapped] (str lparen "wrap" space wrapped rparen)) : (def eval-string (comp eval read-string)) : (def xx "xx") : (def result (take 8 (iterate (comp eval-string wrap) xx))) : (for [one result] (println one)) : 结果打印如下:
|
T*******x 发帖数: 8565 | 8 这个增长太快了,缺乏控制。
这个问题实际上要定义一套新的操作和符号,大概相当于Clojure的子集。下面这个增
长速度为线性。
;;define symbols
(def o "o")
(defn e [x] (format "(e %s)" x))
(defn t [x] (format "(t (e %s))" x))
(def eval-string (comp eval read-string))
(def x "(t o)")
(def result (take 10 (iterate eval-string x)))
(doseq [item result] (println item))
结果如下:
(t o)
(t (e o))
(t (e (e o)))
(t (e (e (e o))))
(t (e (e (e (e o)))))
(t (e (e (e (e (e o))))))
(t (e (e (e (e (e (e o)))))))
(t (e (e (e (e (e (e (e o))))))))
(t (e (e (e (e (e (e (e (e o)))))))))
(t (e (e (e (e (e (e (e (e (e o))))))))))
【在 T*******x 的大作中提到】 : 哦。定义一个double wrap就可以了。 : (def wrap-with (partial format "(%s %s)")) : (def dwrap- (partial wrap-with "dwrap")) : (def dwrap (comp dwrap- dwrap-)) : (def eval-string (comp eval read-string)) : (def xx "xx") : (def x "(dwrap xx)") : (def result (take 4 (iterate eval-string x))) : (for [item result] (println item)) : 结果是这样:
|
T*******x 发帖数: 8565 | 9 这个挺好玩,还有很多变种。
;;define symbols
(def p "p")
(def q "q")
(defn e [x y] (format "(e %s %s)" x y))
(defn t [x y] (format "(t (e %s %s) q)" x y))
(def eval-string (comp eval read-string))
(def x "(t p q)")
(def result (take 5 (iterate eval-string x)))
(doseq [item result] (println item))
;;;;
(t p q)
(t (e p q) q)
(t (e (e p q) q) q)
(t (e (e (e p q) q) q) q)
(t (e (e (e (e p q) q) q) q) q)
【在 T*******x 的大作中提到】 : 这个增长太快了,缺乏控制。 : 这个问题实际上要定义一套新的操作和符号,大概相当于Clojure的子集。下面这个增 : 长速度为线性。 : ;;define symbols : (def o "o") : (defn e [x] (format "(e %s)" x)) : (defn t [x] (format "(t (e %s))" x)) : (def eval-string (comp eval read-string)) : (def x "(t o)") : (def result (take 10 (iterate eval-string x)))
|