The second task was very annoying because you had to guess the actual rules (overlapping words), as they're not explained correctly in the task. My solution hardcodes those cases. Change-Id: Idf24579a78a1b8ede368504d3ff0c58c9978f069 Reviewed-on: https://cl.tvl.fyi/c/depot/+/10183 Tested-by: BuildkiteCI Autosubmit: tazjin <tazjin@tvl.su> Reviewed-by: tazjin <tazjin@tvl.su>
		
			
				
	
	
		
			52 lines
		
	
	
	
		
			1.4 KiB
		
	
	
	
		
			EmacsLisp
		
	
	
	
	
	
			
		
		
	
	
			52 lines
		
	
	
	
		
			1.4 KiB
		
	
	
	
		
			EmacsLisp
		
	
	
	
	
	
| (require 's)
 | |
| (require 'f)
 | |
| 
 | |
| ;; task 1
 | |
| 
 | |
| (defun digit-p (c)
 | |
|   (and (> c ?0)
 | |
|        (<= c ?9)))
 | |
| 
 | |
| (defun aocd1-sum-values (lines)
 | |
|   (-sum
 | |
|    (-map (lambda (line)
 | |
|            (let ((digits (-filter #'digit-p (string-to-list line))))
 | |
|              (string-to-number (string (-first-item digits) (-last-item digits)))))
 | |
|          lines)))
 | |
| 
 | |
| (let ((lines (s-lines (s-trim (f-read "~/Downloads/input.txt")))))
 | |
|   (aocd1-sum-values lines))
 | |
| 
 | |
| ;; task 2
 | |
| 
 | |
| (defun replace-written-numbers (input)
 | |
|   (with-temp-buffer
 | |
|     (insert input)
 | |
|     (let ((start 1))
 | |
|       (while (< start (point-max))
 | |
|         (format-replace-strings
 | |
|          '(("oneight" . "18")
 | |
|            ("twone" . "21")
 | |
|            ("threeight" . "38")
 | |
|            ("fiveight" . "58")
 | |
|            ("sevenine" . "79")
 | |
|            ("eightwo" . "82")
 | |
|            ("eighthree" . "83")
 | |
|            ("nineight" . "98"))
 | |
|          nil start (min (+ 10 start) (point-max)))
 | |
|         (format-replace-strings
 | |
|          '(("one" . "1")
 | |
|            ("two" . "2")
 | |
|            ("three" . "3")
 | |
|            ("four" . "4")
 | |
|            ("five" . "5")
 | |
|            ("six" . "6")
 | |
|            ("seven" . "7")
 | |
|            ("eight" . "8")
 | |
|            ("nine" . "9"))
 | |
|          nil start (min (+ 5 start) (point-max)))
 | |
|         (setq start (1+ start))))
 | |
|     (buffer-string)))
 | |
| 
 | |
| (let ((lines (s-lines (s-trim (f-read "~/Downloads/input.txt")))))
 | |
|   (aocd1-sum-values (-map #'replace-written-numbers lines)))
 |