#!./wisp-multiline.sh
; !#
use-modules
srfi srfi-1
define base60chars
. "0123456789ABCDEFGHJKLMNPQRSTUVWXYZ_abcdefghijkmnopqrstuvwxyz"
define : base60encode number
let moddown : (base60 "") (quotient number)
if : < quotient 60
string-append (substring base60chars quotient (+ 1 quotient)) base60
let : : remainder : floor-remainder quotient 60
moddown
string-append
substring base60chars remainder : + 1 remainder
. base60
floor-quotient quotient 60
define : base60decode string
let decode : (number 0) (rest string)
if : = 1 : string-length rest
+ (* number 60) : string-index base60chars : string-ref rest 0
decode
+ (* number 60) : string-index base60chars : string-ref rest 0
string-drop rest 1
define testnumbers
let
: start : list 0 1 10 60 59 61 100 1000 1e4 1e5 1e6 1e7 1e8 1e9 64 128
multiplesof256 1000
let loop : (numbers start) (exponent 1)
if : > exponent multiplesof256
. numbers
loop
append numbers : list : expt 256 exponent
+ 1 exponent
define : displaywithnewline foo
display foo
newline
; map displaywithnewline
; map base60encode
; map inexact->exact testnumbers
; map displaywithnewline
; map base60decode
; map base60encode
; map inexact->exact testnumbers
define kitlogo "
...... ................. ............... ...................................
............. ................. ............... ...................................
. ............. ................. ............... ...................................
........ ............ ................. ............... ...................................
............. ........... ................. ............... ...................................
............... ........... ................. ............... ...................................
.............. .......... ................. ............... ...............
............. ......... .................. ............... ...............
... ............ ......... ................. ............... ...............
........ ............ ........ ............... ............... ...............
............ ........... ....... ............. ............... ...............
................. .. ....... ....... ............. ............... ...............
..................... ......... ...... ............... ............... ...............
................... ........ ...... ................. ............... ...............
................. ........ ..... ................. ............... ...............
.............. ....... .... ................. ............... ...............
.. ............ ...... .... ................. ............... ...............
........... .......... ..... ... ................. ............... ...............
...................... ....... ... .. ................. ............... ...............
................................ ..... .. .. ................. ............... ...............
.......................................... . . . ................. ............... ...............
...................................................... ................. ............... ...............
"
define kitlogosmall "
... .... .... .... ........
... ... .... .... ........
.... .. ....... .... ....
.... .. ....... .... ....
.... .... . .... .... ....
.............. .... .... ....
Karlsruher Institut fuer Technologie
"
define : kittify numbers
. "Display a list of numbers as Text in a KIT Logo."
let*
: base60numbers : map base60encode numbers
requiredletters : + (length base60numbers) : apply + : map string-length base60numbers
logo kitlogosmall
charsinlogo : string-count logo #\.
requiredlogos : ceiling-quotient requiredletters charsinlogo
text : xsubstring logo 0 : * requiredlogos : string-length logo
let logofyer
: kittified "" ; the new logo with the numbers
rawlogo text ; the template
nums base60numbers ; the numbers to add to the logo
justadded #f ; did I just add a number, in that case, keep one .
if : equal? rawlogo ""
. kittified
let : : s : substring rawlogo 0 1
if : not : equal? s "."
logofyer
string-append kittified s
string-drop rawlogo 1
. nums
. justadded
; else: we have a .
if justadded ; need one more . to separate numbers
logofyer
string-append kittified s
string-drop rawlogo 1
. nums
. #f
if : = 0 : length nums ; no more numbers to add, just add a .
logofyer
string-append kittified s
string-drop rawlogo 1
. nums
. #f
; check whether the last number was completely
; added. In that case drop the number and note that
; we just added a number
if : = 0 : string-length : list-ref nums 0
logofyer
. kittified
. rawlogo
drop nums 1
. #t
; otherwise add the first char of the number to
; kittified and take it away from the number.
let : : firstnum : list-ref nums 0
logofyer
string-append kittified : substring firstnum 0 1
string-drop rawlogo 1
append (list (string-drop firstnum 1)) : drop nums 1
. #f ; not yet done
; unkittify: first take out "Karlsruher Institut fuer Technologie" and all spaces and linebreaks, then split by . and base60decode the result.
; we first need a quick way to replace substrings in strings
; taken from string-replace-benchmark.w
define*
string-replace-substring s substr replacement
. #:optional (start 0) (end (string-length s))
. "Replace every instance of substring in s by replacement."
let : : substr-length : string-length substr
if : zero? substr-length
error "string-replace-substring: empty substr"
let loop
: start start
pieces : list : substring s 0 start
let : : idx : string-contains s substr start end
if idx
loop : + idx substr-length
cons* replacement
substring s start idx
. pieces
string-concatenate-reverse
cons : substring s start
. pieces
define : emptystring? string
if : equal? "" string
. #t
. #f
define : unkittify text
. "Turn a kittified string into a list of numbers."
; first remove the name and spaces
let*
: text : string-replace-substring text "Karlsruher Institut fuer Technologie" ""
text : string-replace-substring text " " ""
text : string-replace-substring text "\n" ""
text : string-replace-substring text "\r" ""
base60numbers : string-split text #\.
base60numbers : remove emptystring? base60numbers
map base60decode base60numbers
display : kittify : map inexact->exact : take testnumbers 35
newline
display : unkittify : kittify : map inexact->exact : take testnumbers 35
newline
display : map inexact->exact : take testnumbers 35
newline
; TODO: Final step: Take files, read them as bytevectors, turn the bytevectors into ints and encode them. Same in reverse. Then we can encode any file in kitty-style - uh I mean KIT-style :)