PasteRack.org
Paste # 75479
2017-10-10 15:08:10

Fork as a new paste.

Paste viewed 156 times.


Embed:

Butterfly pattern

  1. #lang racket
  2.  
  3. ; n represents size of butterfly
  4.  
  5. (define (get-size n)
  6.   (- (* n 2) 1))
  7.  
  8. (define (get-row n)
  9.   (map
  10.    (λ (i)
  11.      (+ 1 (abs (- i n))))
  12.    (range 1 (+ 1 (get-size n)))))
  13.  
  14. (define (get-mid n)
  15.   (- (ceiling (/ (get-size n) 2)) 1))
  16.  
  17. ; r represents row
  18.  
  19. (define (get-spaces n r)
  20.   (let loop ([n n][r r][i 0][v (get-size n)])
  21.     (if (eq? i r) (- v 2) (loop n r (+ 1 i) (- v 2)))))
  22.  
  23. (define (get-raw-string n)
  24.   (apply string-append (map number->string (get-row n))))
  25.  
  26. (define (get-out-string n r)
  27.   (let*
  28.       ([spaces (get-spaces n r)]
  29.        [offset (/ (- (get-size n) spaces) 2)]
  30.        [raw    (get-raw-string n)])
  31.     (string-append
  32.      (substring raw 0 offset)
  33.      (make-string spaces #\ )
  34.      (substring raw (- (get-size n) offset)))))
  35.  
  36. (define (get-butterfly-top n)
  37.   (map
  38.    (λ (i)
  39.      (get-out-string n i))
  40.    (range 0 (get-mid n))))
  41.  
  42. (define (get-butterfly n)
  43.   (let ([top (get-butterfly-top n)])
  44.     (string-join (flatten `(,top ,(get-raw-string n) ,(reverse top))) "\n")))
  45.  
  46. (for-each
  47.  (λ (i)
  48.    (displayln (format "Size: ~a" i))
  49.    (displayln (get-butterfly i)))
  50.  (range 2 10))
  51.  

=>

Size: 2

2 2

212

2 2

Size: 3

3   3

32 23

32123

32 23

3   3

Size: 4

4     4

43   34

432 234

4321234

432 234

43   34

4     4

Size: 5

5       5

54     45

543   345

5432 2345

543212345

5432 2345

543   345

54     45

5       5

Size: 6

6         6

65       56

654     456

6543   3456

65432 23456

65432123456

65432 23456

6543   3456

654     456

65       56

6         6

Size: 7

7           7

76         67

765       567

7654     4567

76543   34567

765432 234567

7654321234567

765432 234567

76543   34567

7654     4567

765       567

76         67

7           7

Size: 8

8             8

87           78

876         678

8765       5678

87654     45678

876543   345678

8765432 2345678

876543212345678

8765432 2345678

876543   345678

87654     45678

8765       5678

876         678

87           78

8             8

Size: 9

9               9

98             89

987           789

9876         6789

98765       56789

987654     456789

9876543   3456789

98765432 23456789

98765432123456789

98765432 23456789

9876543   3456789

987654     456789

98765       56789

9876         6789

987           789

98             89

9               9