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)))
 |