PasteRack.org
Paste # 76815
2019-12-09 09:13:48

Fork as a new paste.

Paste viewed 582 times.


Embed:

  1. #lang racket
  2.  
  3.  
  4. (define (valid-number? num)
  5.   (define digit-list (map char->integer (string->list (number->string num))))
  6.   (define-values (found-decrease found-equal last)
  7.     (for/fold ([found-decrease #f]
  8.                [found-equal #f]
  9.                [last (first digit-list)])
  10.               ([digit (in-list (rest digit-list))])
  11.       #:break found-decrease
  12.       (values (digit . < . last)
  13.               (or found-equal (digit . = . last))
  14.               digit)))
  15.   (and (not found-decrease) found-equal))
  16.  
  17. ;; still wrong
  18.  
  19. (define (valid-number2? num)
  20.   (define digit-list (map char->integer (string->list (number->string num))))
  21.   (define-values (found-decrease found-2-equal last-was-equal last)
  22.     (for/fold ([found-decrease #f]
  23.                [found-2-equal 'no]
  24.                [last-was-equal #f]
  25.                [last (first digit-list)])
  26.               ([digit (in-list (rest digit-list))])
  27.       #:break found-decrease
  28.       (let ([current-is-equal (digit . = . last)])
  29.         (values (digit . < . last)
  30.                 (cond [(symbol=? found-2-equal 'yes)
  31.                        'yes]
  32.                       [(and current-is-equal last-was-equal)
  33.                        'no]
  34.                       [current-is-equal
  35.                        'maybe]
  36.                       [last-was-equal
  37.                        'yes])
  38.                 current-is-equal
  39.                 digit))))
  40.   (and (not found-decrease) (or (symbol=? found-2-equal 'yes) last-was-equal)))
  41.  
  42. (define (count-valid from to)
  43.   (define (counter current last so-far)
  44.     (cond [(current . = . last)
  45.            (if (valid-number? current) (add1 so-far) so-far)]
  46.           [else
  47.            (if (valid-number? current)
  48.                (counter (add1 current) last (add1 so-far))
  49.                (counter (add1 current) last so-far))]))
  50.   (counter from to 0))
  51.  
  52. (define (count-valid2 from to)
  53.   (define (counter current last so-far)
  54.     (cond [(current . = . last)
  55.            (if (valid-number2? current) (add1 so-far) so-far)]
  56.           [else
  57.            (if (valid-number2? current)
  58.                (counter (add1 current) last (add1 so-far))
  59.                (counter (add1 current) last so-far))]))
  60.   (counter from to 0))
  61.  
  62. (valid-number2? 123444)

=>

symbol=?: contract violation

  expected: symbol?

  given: #<void>

  argument position: 1st

  other arguments...:

   'yes