[Odin] Rolling the base[Odin] Rolling the base
🕵️
Veni, Vidi, Decrypti
Week 43, 2026
package main
import "core:fmt"
import "core:strings"
main :: proc () {
buf: [1000] byte
text := "dfIrJmI dEDfl. RhLfE iMnJ atILnaNCrbC, DPnJi cDDnVsCeQ oStLk QmbHgeO CmCIBf, " +
"FbefKb Ed CBlcJqI aMtbBLfhI dcDJBCrbC acI. Ip, GJ kNkDnNkQCr, Ob jNtbDRe ahHiIjgLk " +
"CeUtabGd bScpJk, CeMHtC GiHKrC BNcclbD, CIbddeEbIHtbC acI: EChFk OjFe aiBTtLgBJi " +
"IbadGgl, TqeU fgjMFflTtPi dcReDdp, aPnaR vNlTm gcCbLfJp, Ten FcfbI MfaBnc. RsI " +
"MuBPi Ef CjHNm, gEDHi, gbPhaLsCeQ ocCDHGgeiC, CeMfgbI IhHiIjgbI, EF bob TepMDnR, " +
"ccnEFeiC. DBeb HInJFfEi Md DmdIblMDEtCdI HgLvNmI EnN, mB BDHGsJjI, hLjDBJi, KmBgCR " +
"apeFBJpbI dfOhNngPi gDLCrTrNi. eeUmeeUm FbG qOBbCge jNGrFdJIs SngPE rNlBdcTvRnRt, " +
"aTmIj FfgPn eNnHe KIm bbB ahIInRtbD. eNj BeMFbi bbNhdDk aDLnRrN lBfPob BO ef JhnGKmI " +
"fNCclebI EjJ; It NfLdfItFdJ nNp VpNBfHhdH aob EEjBFBJi hTlHi gEdcPi KmBLcoacDdI IoaO."
fmt.println(decode(text, buf[:]))
}
decode :: proc (s: string, buf: [] byte) -> string {
assert(len(s) > 0 && is_alpha(s[0]))
assert(len(s) <= len(buf))
sb := strings.builder_from_bytes(buf)
base := int(s[0])
for r, i in s {
curr := byte(r)
result := curr
if is_alpha(curr) {
if i > 0 {
base += curr<='Z' ? 'A'-int(curr) : int(curr)-'a'
result = byte(base)
assert(is_lower_alpha(result))
}
}
strings.write_byte(&sb, result)
}
return strings.to_string(sb)
}
is_alpha :: proc (c: byte) -> bool {
return (c>='A' && c<='Z') || (c>='a' && c<='z')
}
is_lower_alpha :: proc (c: byte) -> bool {
return c>='a' && c<='z'
}