From 8afc823916f5a06198e6375dadf0cc1032ad2d0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?c=C3=A6l=C5=8Drum=20spect=C4=81tr=C4=ABx?= Date: Wed, 3 Dec 2025 01:41:00 +0100 Subject: [PATCH 1/3] Replace loko with sagittarius (loko sucks) --- common.mk | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/common.mk b/common.mk index 92f3e3c..6578529 100644 --- a/common.mk +++ b/common.mk @@ -1,27 +1,27 @@ # -*- makefile-bsdmake -*- INPUTS=sample.txt input.txt -SCHEMES=chibi chicken gauche guile loko racket skint +SCHEMES?=chibi chicken gauche guile racket sagittarius skint all: ${SCHEMES} benchmark: @i=0; \ for scheme in ${SCHEMES}; do \ - tput setaf $$i; \ - printf %8s $$scheme; \ + tput setaf $$((i%6+1)); \ + printf %12s $$scheme; \ tput sgr0; \ : $$((i+=1)); \ time ${MAKE} $$scheme >/dev/null; \ done -chicken: main.scm - csi -script main.scm ${INPUTS} -guile: main.scm - guile --no-auto-compile main.scm ${INPUTS} 2>/dev/null chibi: main.scm chibi-scheme main.scm ${INPUTS} -racket: main.scm - racket -I r7rs --script main.scm ${INPUTS} +chicken: main.scm + /opt/chicken/bin/csi -script main.scm ${INPUTS} gauche: main.scm gosh main.scm ${INPUTS} -loko: main.scm - loko --script main.scm ${INPUTS} +guile: main.scm + guile --no-auto-compile main.scm ${INPUTS} 2>/dev/null +racket: main.scm + racket -I r7rs --script main.scm ${INPUTS} +sagittarius: main.scm + sagittarius --standard=7 main.scm ${INPUTS} skint: main.scm skint --script main.scm ${INPUTS} From 828f123cd881f031a30705d192f3531da8275e51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?c=C3=A6l=C5=8Drum=20spect=C4=81tr=C4=ABx?= Date: Wed, 3 Dec 2025 01:41:14 +0100 Subject: [PATCH 2/3] Add string-split to common.scm --- common.scm | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/common.scm b/common.scm index 094a23f..e2a75d4 100644 --- a/common.scm +++ b/common.scm @@ -1,6 +1,28 @@ +;; Shitty print for convenience (define (print . args) (display (apply string-append args)) (newline)) +;; Chicken command-line-arguments for no reason at all (define (command-line-arguments) (cdr (command-line))) + +;; Guile string-split +(define (string-split str delim?) + (let ((in (open-input-string str))) + (let loop ((acc '()) + (out (open-output-string))) + (let ((c (read-char in))) + (cond + ((eof-object? c) + (reverse (cons (get-output-string out) acc))) + ((delim? c) + (loop (cons (get-output-string out) acc) + (open-output-string))) + (else + (write-char c out) + (loop acc out))))))) + +;; Reverse for-each, for convenience +(define (xfor-each1 lst fn) + (for-each fn lst)) From 880d6c526436502686e03f8480e22588ed545d2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?c=C3=A6l=C5=8Drum=20spect=C4=81tr=C4=ABx?= Date: Wed, 3 Dec 2025 01:41:30 +0100 Subject: [PATCH 3/3] Add day two --- 2/GNUmakefile | 2 ++ 2/main.scm | 80 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2/makefile | 4 +++ 3 files changed, 86 insertions(+) create mode 100644 2/GNUmakefile create mode 100644 2/main.scm create mode 100644 2/makefile diff --git a/2/GNUmakefile b/2/GNUmakefile new file mode 100644 index 0000000..eed98a1 --- /dev/null +++ b/2/GNUmakefile @@ -0,0 +1,2 @@ +# -*- makefile-gmake -*- +include ../gnu.mk diff --git a/2/main.scm b/2/main.scm new file mode 100644 index 0000000..90683dc --- /dev/null +++ b/2/main.scm @@ -0,0 +1,80 @@ +(import (scheme base) + (scheme cxr) + (scheme file) + (scheme inexact) + (scheme process-context) + (scheme write)) + +(include "../common.scm") + +(define powers-of-ten + #(1 10 100 1000 10000 100000 1000000 10000000 100000000 1000000000 10000000000)) + +(define (sum-invalid-in-range-part1 from to) + (let loop ((i from) + (acc 0)) + (if (> i to) + acc + (let ((ndigits (exact (+ 1 (floor (log i 10)))))) + (if (even? ndigits) + (let ((pow-of-ten (vector-ref powers-of-ten (exact (/ ndigits 2))))) + (if (= (exact (floor (/ i pow-of-ten))) + (modulo i pow-of-ten)) + (loop (+ i 1) (+ acc i)) + (loop (+ i 1) acc))) + (loop (+ i 1) acc)))))) + +;; i think i was on drugs when i wrote this +(define (test-equal-sections i nd div k) + (and (zero? (modulo nd div)) + (not (= nd div)) + (let*-values (((ln) (- nd div)) + ((hd tl) (truncate/ i (vector-ref powers-of-ten ln)))) + (let loop ((ln ln) + (hd hd) + (tl tl)) + (if (zero? ln) + (k #t) + (let*-values (((nln) (- ln div)) + ((nhd ntl) (truncate/ tl (vector-ref powers-of-ten nln)))) + (and (= hd nhd) + (loop nln nhd ntl)))))))) + +(define (iota n) + (let loop ((i 1) + (acc '())) + (if (> i n) + (reverse acc) + (loop (+ i 1) (cons i acc))))) + +(define (sum-invalid-in-range-part2 from to) + (let loop ((i from) + (acc 0)) + (if (> i to) + acc + (let ((nd (exact (+ 1 (floor (log i 10)))))) + (if (call-with-current-continuation + (lambda (k) + (for-each (lambda (div) (test-equal-sections i nd div k)) (iota (/ nd 2))) + #f)) + (loop (+ i 1) (+ acc i)) + (loop (+ i 1) acc)))))) + +(define (part file sumfn) + (let ((ranges (map (lambda (s) (string-split s (lambda (c) (char=? c #\-)))) + (string-split (with-input-from-file file read-line) (lambda (c) (char=? c #\,)))))) + (let loop ((ranges ranges) + (sum 0)) + (if (null? ranges) + (begin + (display (number->string sum)) + (newline)) + (loop (cdr ranges) (+ sum (sumfn (string->number (caar ranges)) (string->number (cadar ranges))))))))) + +(for-each (lambda (file) (part file sum-invalid-in-range-part1)) (command-line-arguments)) +(for-each (lambda (file) (part file sum-invalid-in-range-part2)) (command-line-arguments)) + + +;; (print (number->string (sum-invalid-in-range 11 22))) + +#;(for-each print (map part2 (command-line-arguments))) diff --git a/2/makefile b/2/makefile new file mode 100644 index 0000000..116f73a --- /dev/null +++ b/2/makefile @@ -0,0 +1,4 @@ +# -*- makefile-bsdmake -*- +# Disable Skint because no numerical tower +SCHEMES=chibi chicken gauche guile racket sagittarius +.include "../common.mk"