t-names.scm 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. ;; import functions/repeat.scm numbers/linear-random.scm files/words.scm
  2. (define (assoc-all-cdr x xs)
  3. (let loop ((xs xs) (memo '()) (size 0))
  4. (if (null? xs)
  5. (cons memo size)
  6. (let ((f (car xs))
  7. (r (cdr xs))
  8. (size^ (+ size 1)))
  9. (if (eq? (car f) x)
  10. (loop r (cons (cdr f) memo) size^)
  11. (loop r memo size))))))
  12. (define (random-car table.size)
  13. (let* ((table (car table.size))
  14. (size (cdr table.size))
  15. (rand (modulo (random!) size)))
  16. (car (list-ref table rand))))
  17. (define (iter table p2 p1 memo)
  18. (let* ((table.size1 (assoc-all-cdr p2 table))
  19. (table1 (car table.size1))
  20. (table.size2 (assoc-all-cdr p1 table1))
  21. (next (random-car table.size2)))
  22. (if (null? next)
  23. (reverse memo)
  24. (iter table p1 next (cons next memo)))))
  25. (define (name! source table.size min)
  26. (let* ((table (car table.size))
  27. (first-letter (random-car source))
  28. (table.size1 (assoc-all-cdr first-letter table))
  29. (second-letter (random-car table.size1))
  30. (name (iter table first-letter second-letter (list second-letter first-letter))))
  31. (if (>= (length name) min)
  32. (list->string name)
  33. (name! source table.size min))))
  34. (define (build-names table.size file)
  35. (let ((letter-2 #f)
  36. (letter-1 #f)
  37. (first-letters '())
  38. (size 0))
  39. (for-each (lambda (word)
  40. (let ((word (string->list word)))
  41. (cond ((< 2 (length word))
  42. (set! first-letters (cons (list (car word)) first-letters))
  43. (set! size (+ 1 size))
  44. (set! letter-2 (car word))
  45. (set! letter-1 (cadr word))
  46. (set! word (cddr word))
  47. (for-each
  48. (lambda (letter)
  49. (set-cdr! table.size (+ 1 (cdr table.size)))
  50. (set-car! table.size (cons (list letter-2 letter-1 letter) (car table.size)))
  51. (set! letter-2 letter-1)
  52. (set! letter-1 letter))
  53. word)
  54. (set-cdr! table.size (+ 1 (cdr table.size)))
  55. (set-car! table.size (cons (list letter-2 letter-1 '()) (car table.size)))))))
  56. (with-input-from-file file words))
  57. (cons first-letters size)))
  58. (define names (cons '() 0))
  59. (define surnames (cons '() 0))
  60. (define names-source (build-names names "data/finnish_firstnames.txt"))
  61. (define surnames-source (build-names surnames "data/finnish_lastname.txt"))
  62. (repeat
  63. (lambda ()
  64. (display (name! names-source names 2)) (display " ")
  65. (display (name! surnames-source surnames 5)) (newline))
  66. 100)