#lang racket

(define (get-input)
  (display "Enter your string ")
  (read-line (current-input-port) 'any))

(define (decode input)
  (define bits '())
  (for/list ((c (string->list input)))
    (cond ((equal? c #\u200C) (set! bits (append bits '(0))))
          ((equal? c #\u200B) (set! bits (append bits '(1))))))
  (bits->text bits))

(define (bits->text bits)
  (define bytes (collect-bytes bits))
  (apply string (map (lambda (byte)
         (integer->char (bits->number byte)))
       bytes)))

(define (collect-bytes bits)
  (define (collect-bytes-iter bits acc)
    (cond ((null? bits) (reverse acc))
          ((>= (length bits) 8) (collect-bytes-iter (drop bits 8) (cons (take bits 8) acc)))
          (else (error "Invalid bits"))))
  (collect-bytes-iter bits '()))

(define (bits->number bits)
  (let ((binary-string (apply string (map (lambda (bit) (if (= bit 1) #\1 #\0)) bits))))
    (string->number binary-string 2)))

(define (main)
  (let ((input (get-input)))
    (displayln (decode input))))

(main)