#lang racket

(define haz-lista
  (lambda (n-elem valor)
    (if (= n-elem 0)
        '()
        (cons valor
              (haz-lista (sub1 n-elem) valor))
        )
    ))
(define haz-configuracion
  (lambda (n-elem porciento center); p. ej., 300 30
    (let* ((unos (round (/ (* n-elem porciento) 100)))
           (L-1 (haz-lista unos 1))
           (L-0 (haz-lista (- n-elem unos) 0))
           )
      (if center
          (centrado L-1 L-0)
          (mezcla-azar n-elem unos)
          )
;      (mezcla L-0 L-1 '())
      )
    ))
(define mezcla
  (lambda (l1 l2 tmp)
    (cond
      ((null? l1)
       (append tmp l2))
      ((null? l2)
       (append tmp l1))
      (else
       (mezcla (cdr l1) (cdr l2)
               (let ((azar (random 2)))
                 (if (= azar 0)
                     (cons (car l2) (cons (car l1) tmp))
                     (cons (car l1) (cons (car l2) tmp))
                     )
                 )
               )
       )
      )
    ))
(define mezcla-azar
  (lambda (n-elem unos)
    (let go ((i 0)
             (j unos)
             (list-azar '())
             (salida (make-vector n-elem 0))
             )
      (if (= i j)
          (begin
            (for-each
             (lambda (n)
               (vector-set! salida n 1)
               )
             list-azar)
            (vector->list salida)
            )
          (let salta ((ubi (random n-elem)))
            (if (member ubi list-azar)
                (salta (random n-elem))
                (go (add1 i) j (cons ubi list-azar) salida)
                )
            )
          )
      )
    )
  )
(define centrado
  (lambda (l1 l2)
    (let ((mitad (quotient (length l2) 2)) )
      (append
       (take l2 mitad)
       l1
       (list-tail l2 mitad)
       )
      )
    ))
(define una-configuracion
  (lambda (n-elem unos center)
    (let* ((L-1 (haz-lista unos 1))
           (L-0 (haz-lista (- n-elem unos) 0))
           )
      (if center
          (centrado L-1 L-0)
          (mezcla L-1 L-0 '())
          )
      )
    ))


(provide una-configuracion haz-configuracion)