Mired in code
Hex Artifact Content
Not logged in
Public Repositories
mwm's Repositories

Artifact 2dda0382ade7c9650a9c327bcd62b629e0030d02:


0000: 23 21 2f 75 73 72 2f 62 69 6e 2f 65 6e 76 20 63  #!/usr/bin/env c
0010: 6c 6a 0a 0a 28 64 65 66 6e 20 6d 66 69 6c 74 65  lj..(defn mfilte
0020: 72 0a 20 20 22 52 65 74 75 72 6e 20 61 20 68 61  r.  "Return a ha
0030: 73 68 2d 6d 61 70 20 62 75 69 6c 74 20 62 79 20  sh-map built by 
0040: 72 65 6d 6f 76 69 6e 67 20 65 6e 74 72 69 65 73  removing entries
0050: 20 66 6f 72 20 77 68 69 63 68 20 28 70 72 65 64   for which (pred
0060: 20 28 6b 65 79 20 65 6e 74 72 79 29 29 0a 20 20   (key entry)).  
0070: 72 65 74 75 72 6e 73 20 66 61 6c 73 65 20 66 72  returns false fr
0080: 6f 6d 20 6d 61 70 69 6e 2e 22 0a 20 20 5b 70 72  om mapin.".  [pr
0090: 65 64 20 6d 61 70 69 6e 5d 0a 20 20 28 61 70 70  ed mapin].  (app
00a0: 6c 79 20 68 61 73 68 2d 6d 61 70 20 28 61 70 70  ly hash-map (app
00b0: 6c 79 20 63 6f 6e 63 61 74 20 28 66 69 6c 74 65  ly concat (filte
00c0: 72 20 23 28 70 72 65 64 20 25 29 20 6d 61 70 69  r #(pred %) mapi
00d0: 6e 29 29 29 29 0a 0a 28 64 65 66 6e 20 65 6e 75  n))))..(defn enu
00e0: 6d 65 72 61 74 65 0a 20 20 22 52 65 74 75 72 6e  merate.  "Return
00f0: 20 70 61 69 72 73 20 6f 66 20 61 6e 20 69 6e 64   pairs of an ind
0100: 65 78 20 69 6e 74 6f 20 73 65 71 75 65 6e 63 65  ex into sequence
0110: 2c 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20  , and the value 
0120: 61 74 20 74 68 61 74 20 69 6e 64 65 78 22 0a 20  at that index". 
0130: 20 5b 73 65 71 75 65 6e 63 65 5d 0a 20 20 28 6d   [sequence].  (m
0140: 61 70 20 76 65 63 74 6f 72 20 28 69 74 65 72 61  ap vector (itera
0150: 74 65 20 69 6e 63 20 30 29 20 73 65 71 75 65 6e  te inc 0) sequen
0160: 63 65 29 29 0a 0a 28 64 65 66 6e 20 61 64 64 2d  ce))..(defn add-
0170: 70 68 72 61 73 65 2d 74 6f 2d 70 68 72 61 73 65  phrase-to-phrase
0180: 2d 64 69 63 74 20 5b 70 68 72 61 73 65 2d 64 69  -dict [phrase-di
0190: 63 74 20 70 68 72 61 73 65 20 6c 69 73 74 2d 69  ct phrase list-i
01a0: 6e 64 65 78 20 70 68 72 61 73 65 2d 69 6e 64 65  ndex phrase-inde
01b0: 78 5d 0a 20 20 28 69 66 20 28 6f 72 20 28 70 68  x].  (if (or (ph
01c0: 72 61 73 65 2d 64 69 63 74 20 70 68 72 61 73 65  rase-dict phrase
01d0: 29 20 28 3d 20 6c 69 73 74 2d 69 6e 64 65 78 20  ) (= list-index 
01e0: 30 29 29 0a 20 20 20 20 28 75 70 64 61 74 65 2d  0)).    (update-
01f0: 69 6e 20 70 68 72 61 73 65 2d 64 69 63 74 20 5b  in phrase-dict [
0200: 70 68 72 61 73 65 20 6c 69 73 74 2d 69 6e 64 65  phrase list-inde
0210: 78 5d 20 63 6f 6e 6a 20 70 68 72 61 73 65 2d 69  x] conj phrase-i
0220: 6e 64 65 78 29 0a 20 20 20 20 70 68 72 61 73 65  ndex).    phrase
0230: 2d 64 69 63 74 29 29 0a 20 20 0a 28 64 65 66 6e  -dict)).  .(defn
0240: 20 61 64 64 2d 6c 69 73 74 2d 74 6f 2d 70 68 72   add-list-to-phr
0250: 61 73 65 2d 64 69 63 74 20 5b 70 68 72 61 73 65  ase-dict [phrase
0260: 2d 64 69 63 74 20 6c 69 73 74 2d 69 6e 64 65 78  -dict list-index
0270: 20 6c 69 73 74 5d 0a 20 20 28 72 65 64 75 63 65   list].  (reduce
0280: 20 28 66 6e 20 5b 70 68 72 61 73 65 2d 64 69 63   (fn [phrase-dic
0290: 74 20 5b 70 68 72 61 73 65 2d 69 6e 64 65 78 20  t [phrase-index 
02a0: 70 68 72 61 73 65 5d 5d 0a 09 20 20 20 20 28 61  phrase]]..    (a
02b0: 64 64 2d 70 68 72 61 73 65 2d 74 6f 2d 70 68 72  dd-phrase-to-phr
02c0: 61 73 65 2d 64 69 63 74 20 70 68 72 61 73 65 2d  ase-dict phrase-
02d0: 64 69 63 74 20 70 68 72 61 73 65 20 6c 69 73 74  dict phrase list
02e0: 2d 69 6e 64 65 78 20 70 68 72 61 73 65 2d 69 6e  -index phrase-in
02f0: 64 65 78 29 29 0a 09 20 20 70 68 72 61 73 65 2d  dex))..  phrase-
0300: 64 69 63 74 0a 09 20 20 28 65 6e 75 6d 65 72 61  dict..  (enumera
0310: 74 65 20 28 6d 61 70 20 76 65 63 74 6f 72 20 6c  te (map vector l
0320: 69 73 74 20 28 72 65 73 74 20 6c 69 73 74 29 20  ist (rest list) 
0330: 28 6e 74 68 6e 65 78 74 20 6c 69 73 74 20 32 29  (nthnext list 2)
0340: 29 29 29 29 0a 0a 28 64 65 66 6e 20 62 75 69 6c  ))))..(defn buil
0350: 64 2d 70 68 72 61 73 65 2d 64 69 63 74 20 5b 6c  d-phrase-dict [l
0360: 69 73 74 73 5d 0a 20 20 28 6c 65 74 20 5b 70 68  ists].  (let [ph
0370: 72 61 73 65 2d 64 69 63 74 20 28 72 65 64 75 63  rase-dict (reduc
0380: 65 20 28 66 6e 20 5b 70 68 72 61 73 65 2d 64 69  e (fn [phrase-di
0390: 63 74 20 5b 6c 69 73 74 2d 69 6e 64 65 78 20 6c  ct [list-index l
03a0: 69 73 74 5d 5d 0a 09 09 09 20 20 20 20 20 20 28  ist]]....      (
03b0: 61 64 64 2d 6c 69 73 74 2d 74 6f 2d 70 68 72 61  add-list-to-phra
03c0: 73 65 2d 64 69 63 74 20 70 68 72 61 73 65 2d 64  se-dict phrase-d
03d0: 69 63 74 20 0a 09 09 09 09 09 09 20 20 20 20 20  ict .......     
03e0: 20 20 6c 69 73 74 2d 69 6e 64 65 78 20 6c 69 73    list-index lis
03f0: 74 29 29 0a 09 09 09 20 20 20 20 7b 7d 0a 09 09  t))....    {}...
0400: 09 20 20 20 20 28 65 6e 75 6d 65 72 61 74 65 20  .    (enumerate 
0410: 6c 69 73 74 73 29 29 0a 09 6c 69 73 74 2d 63 6f  lists))..list-co
0420: 75 6e 74 20 28 63 6f 75 6e 74 20 6c 69 73 74 73  unt (count lists
0430: 29 5d 0a 20 20 20 20 28 6d 66 69 6c 74 65 72 20  )].    (mfilter 
0440: 23 28 3d 20 28 63 6f 75 6e 74 20 28 76 61 6c 20  #(= (count (val 
0450: 25 29 29 20 6c 69 73 74 2d 63 6f 75 6e 74 29 20  %)) list-count) 
0460: 70 68 72 61 73 65 2d 64 69 63 74 29 29 29 0a 0a  phrase-dict)))..
0470: 28 64 65 66 6e 20 72 65 6d 6f 76 65 2d 70 68 72  (defn remove-phr
0480: 61 73 65 73 2d 66 72 6f 6d 2d 6c 69 73 74 20 5b  ases-from-list [
0490: 70 68 72 61 73 65 2d 73 74 61 72 74 73 20 6c 69  phrase-starts li
04a0: 73 74 5d 0a 20 20 28 6d 66 69 6c 74 65 72 20 28  st].  (mfilter (
04b0: 66 6e 20 5b 5b 78 20 5f 5d 5d 20 28 6e 6f 74 2d  fn [[x _]] (not-
04c0: 61 6e 79 3f 20 23 28 61 6e 64 20 28 3e 3d 20 78  any? #(and (>= x
04d0: 20 25 29 20 28 3c 20 78 20 28 2b 20 25 20 33 29   %) (< x (+ % 3)
04e0: 29 29 20 70 68 72 61 73 65 2d 73 74 61 72 74 73  )) phrase-starts
04f0: 29 29 0a 09 20 20 20 28 61 70 70 6c 79 20 73 6f  ))..   (apply so
0500: 72 74 65 64 2d 6d 61 70 20 28 6d 61 70 63 61 74  rted-map (mapcat
0510: 20 76 65 63 74 6f 72 20 28 69 74 65 72 61 74 65   vector (iterate
0520: 20 69 6e 63 20 30 29 20 6c 69 73 74 29 29 29 29   inc 0) list))))
0530: 0a 0a 28 64 65 66 6e 20 72 65 6d 6f 76 65 2d 73  ..(defn remove-s
0540: 68 61 72 65 64 2d 70 68 72 61 73 65 73 20 5b 6c  hared-phrases [l
0550: 69 73 74 73 5d 0a 20 20 28 6c 65 74 20 5b 70 68  ists].  (let [ph
0560: 72 61 73 65 73 20 28 61 70 70 6c 79 20 6d 65 72  rases (apply mer
0570: 67 65 2d 77 69 74 68 20 63 6f 6e 63 61 74 20 28  ge-with concat (
0580: 76 61 6c 73 20 28 62 75 69 6c 64 2d 70 68 72 61  vals (build-phra
0590: 73 65 2d 64 69 63 74 20 6c 69 73 74 73 29 29 29  se-dict lists)))
05a0: 5d 0a 20 20 20 20 28 64 6f 73 65 71 20 5b 5b 69  ].    (doseq [[i
05b0: 64 78 20 6c 69 73 74 5d 20 28 65 6e 75 6d 65 72  dx list] (enumer
05c0: 61 74 65 20 6c 69 73 74 73 29 5d 0a 20 20 20 20  ate lists)].    
05d0: 20 20 28 70 72 69 6e 74 6c 6e 20 28 76 61 6c 73    (println (vals
05e0: 20 28 72 65 6d 6f 76 65 2d 70 68 72 61 73 65 73   (remove-phrases
05f0: 2d 66 72 6f 6d 2d 6c 69 73 74 20 28 70 68 72 61  -from-list (phra
0600: 73 65 73 20 69 64 78 29 20 6c 69 73 74 29 29 29  ses idx) list)))
0610: 29 29 29 0a 0a 0a 28 64 65 66 20 6d 70 20 5b 5b  )))...(def mp [[
0620: 22 41 73 22 20 22 69 6e 70 75 74 22 20 22 77 65  "As" "input" "we
0630: 22 20 22 67 65 74 22 20 22 74 68 65 22 20 22 70  " "get" "the" "p
0640: 68 72 61 73 65 22 20 22 64 69 63 74 69 6f 6e 61  hrase" "dictiona
0650: 72 79 22 20 22 77 65 27 72 65 22 20 22 67 6f 69  ry" "we're" "goi
0660: 6e 67 22 5d 0a 09 20 5b 22 74 6f 22 20 22 75 70  ng"].. ["to" "up
0670: 64 61 74 65 22 20 22 74 68 65 22 20 22 70 68 72  date" "the" "phr
0680: 61 73 65 22 20 22 64 69 63 74 69 6f 6e 61 72 79  ase" "dictionary
0690: 22 20 22 69 6e 70 75 74 22 20 22 6c 69 73 74 22  " "input" "list"
06a0: 20 22 69 6e 22 20 22 74 68 65 22 5d 0a 09 20 5b   "in" "the"].. [
06b0: 22 6c 69 73 74 22 20 22 6f 66 22 20 22 6c 69 73  "list" "of" "lis
06c0: 74 73 22 20 22 61 6e 64 22 20 22 74 68 65 22 20  ts" "and" "the" 
06d0: 22 70 68 72 61 73 65 22 20 22 64 69 63 74 69 6f  "phrase" "dictio
06e0: 6e 61 72 79 22 20 22 57 61 6e 74 69 6e 67 22 20  nary" "Wanting" 
06f0: 22 74 6f 22 5d 5d 29 0a 0a 0a 28 72 65 6d 6f 76  "to"]])...(remov
0700: 65 2d 73 68 61 72 65 64 2d 70 68 72 61 73 65 73  e-shared-phrases
0710: 20 6d 70 29 0a                                    mp).