扭转"广告素材中的简单功能"球拍的方式

时间:2017-11-23 21:39:42

标签: scheme racket reverse

我需要一些帮助:D。

我编写了这个程序,将字符串转换为数字列表:

ngrok

我需要一个完全相反的函数。换句话说,获取基数4中的数字列表,将其转换为基数10,然后创建一个字符串。是否有"创意"改变我的功能的方法或我必须再次写相反的步骤。非常感谢你的帮助。

4 个答案:

答案 0 :(得分:0)

取决于您如何定义" creative"。在Racket中你可以这样做:

(define (f lst)
  (number->string
   (for/fold ([r 0]) ([i (in-list lst)])
     (+ i (* r 4)))))

然后

> (f '(1 0 0))
"16"
> (f '(1 3 2 0 2 1 0 0 0))
"123456"

答案 1 :(得分:0)

使用SRFI-1 List library

的标准Scheme实施
#!r6rs
(import (rnrs base)
        (only (srfi :1) fold))

(define (base4-list->number b4l)
  (fold (lambda (digit acc)
          (+ digit (* acc 4)))
        0
        b4l))

(base4-list->number '(1 2 3))
; ==> 27

它在#lang racket中的工作方式相同,但您(require srfi/1)

PS:我不完全确定你从基数10到基数4的转换是否是最好的解决方案。想象一下应该变成95的数字(1 1 3 3)。我会在SRFI-1中使用unfold-right完成它。

答案 2 :(得分:0)

您正在寻找的关系称为isomorphism

此处的其他答案使用折叠证明了这一点,但在您的级别上我认为您应该自己这样做 - 或者至少在您更熟悉该语言之前

#lang racket

(define (base10 ns)
  (let loop ((ns ns) (acc 0))
    (if (empty? ns)
        acc
        (loop (cdr ns) (+ (car ns)
                          (* 4 acc))))))

(displayln (base10 '(3 0)))               ; 12
(displayln (base10 '(3 1)))               ; 13
(displayln (base10 '(3 2)))               ; 14
(displayln (base10 '(3 3)))               ; 15
(displayln (base10 '(1 0 0)))             ; 16
(displayln (base10 '(1 3 2 0 2 1 0 0 0))) ; 123456

答案 3 :(得分:0)

@ naomik的回答提到isomorphisms。当你构造一个同构时,你正在构造一个函数及其反转。通过组合和连接同构,你可以同时构建两个方向。"

;; Converts between a base 4 list of digits (least significant first, most
;; significant last) and a number.
(define iso-base4->number
  (iso-lazy
   (iso-cond

     ;; an iso-cond clause has an A-side question, an A-to-B isomorphism,
     ;; and a B-side question. Here the A-side is empty and the B-side is 
     ;; zero.
     [empty?  (iso-const '() 0)  zero?]

     ;; Here the A-side is a cons, and the B-side is a positive number.
     [cons?
      (iso-join
        cons
        (λ (r q) (+ (* 4 q) r))
        [first  iso-identity       (curryr remainder 4)]
        [rest   iso-base4->number  (curryr quotient 4)])
      positive?])))

此代码包含将基本4列表转换为数字并再次返回所需的所有信息。 (此处的基数4列表从最低有效数字到最高有效数字排序。这与正常方向相反,但是可以在外面修复。)

第一个cond案例将空白映射为零并再次返回。

第二个cond案例将(cons r q)映射到(+ (* 4 q) r)并再次映射,但是q递归地在列表和数字之间进行转换。

正如可以使用firstrest分割cons单元格,可以将实证数字拆分为" remaining-wrt-4"和它的"商-wrt-4"。由于余数是固定大小且商是任意大小,remainder类似于firstquotient类似于rest

firstremainder不需要相互转换,因此第一个iso-join子句使用iso-identity,这是同时无效的同构。

[first  iso-identity       (curryr remainder 4)]

restquotient确实需要转换。其余部分是最低至最高有序的基数4位数,而商是与之对应的数。它们之间的转换是iso-base4->number

[rest   iso-base4->number  (curryr quotient 4)]

如果您对iso-constiso-condiso-join这些同构形式的定义感兴趣,this gist包含此示例所需的所有内容。< / p>