Thank you, I am incredibly impressed.
I did the following tests to make sure that this was a legitimate solve:
1. I ran the existing Golang implementation:
fred@mapache:~/Workspace/vanity-monero$ go run cmd/vanity-monero/main.go
Select work mode:
1) Standard mode
2) Split-key mode
3) About
Your choice: 1
Select network:
1) Monero main network
2) Monero test network
3) GRAFT main network
Your choice: 1
Select mnemonic seeds language:
1) English
2) Dutch
3) Esperanto
4) Spanish
5) French
6) German
7) Italian
8) Japanese
9) Lojban
10) Portuguese
11) Russian
12) Chinese (Simplified)
Your choice: 1
Select match mode:
1) Prefix from the 3rd character. (fast)
For example, pattern "Ai" matches "42Aiabc..." and "48Aiabc...".
2) Prefix from the 1st character. (medium)
For example, pattern "44Ai" matches "44Aiabc..." and "44Aidef...".
3) Regex. (slow)
For example, pattern ".*A[0-9]{1,3}i.+" matches "44abcA233idef...".
Note that in Regex mode there is no guarantee that there exists such address matching the pattern.
Your choice: 1
Enter your prefix/regex, which must be in ASCII and not include 'I', 'O', 'l': speak
Case sensitive? [Y/n] n
Specify how many threads to run. 0 means all CPUs: 0
=========================================
Difficulty (est.): 16777215
Threads: 16
Key Rate: 120428 key/s || Total: 3461792 (20.63%) || Time: 29s / 1m50s
In the same amount of time, your result was:
fred@mapache:~/Workspace/vanity_xmr_cuda/build$ ./vanity_xmr_cuda -i 4?speak
Thread 0: running on NVIDIA GeForce RTX 3080 Laptop GPU
9a777818bf8d7ee345f0047c5eab47f4b354e9b2626db189eff5348961345c03 47SPeaKPxDYUoHg2Q7FWHp9shpsKYmcXT59cU8R2cAh8AR3v6RyzyF53DihppjkX2jaHrNNmFf2njZXh78co6MvpSagh3wp
8c8b1ffab8a2b7ed9110b6f0bf4d54140e9d00bac16ce16c806852f64fd94c05 48SpEAKmCtLGM5Xx1tYUopfnQ8uQHACQJETa5Cga8p3PQLnxkQjq6ZoFGsv7khRZw6b2PM95Z9nN9ZGgXxYrB6xkPADwC7i
3fc8701cf73f3ae06ebf156f6fb235115227bbe80a5dfe9d69cb163130b9170e 47sPeAKLoBkDT8QrSZUBpERB2Yhe5qcw91zUCqpVnP5AVyCHQPqAepVKZufAbu422jDgTs6zzRZaKNiAVpbd2z3pKjV4hJE
c9b679fbd135d76474af954370bd777df24778d6418deb51bc2dfa59638d630b 48spEAKcTH1SUGNorrzqnQNNrgGoAjfdqbrsWyJ37FNpVEcr2GKeGExZJbRwzbYDn6irWTiLSotWnJwwJbrXEzv4Ks6wgft
88913f4c6b7c2795657cc43f0ef3ad66bd4093adef58cc7c9c404faf73a63a06 48SpEAKKattMKGbEjiYwYE4iKJKYFnquHhrtzaXbEr5jWHHs1uCJmdWdFqHiFe3Q3x1qzsY9xPW8xLMZX5tHz1GREadP5LP
cfcf2893130355cc5febd8540d9d2638a377af8d27d305a23a64949e7911f308 48speaKDwR4T6P86keR2NobmBHGxhgYctW7aVDjx8x6S6WjNwtmxy8MhySbJdyUJAJMg4rjVkBGywY2LFEis2QVY8MuDbvp
e45d003580759ca4667984b2b5deb66b80df5f3a589c66cf96eeaca62f23b300 4AsPEaKGrSGUwNHai5jRMN32bEsa9t1yeVw1onvVZtd8bJ6RvJvyZYi7xAXdNHPxHfJu6A8i7tJ2AcTY9cCTA7uoSPn3pyW
2e014b38be71a578e1c88230a146193f2bf56e22e466601fcb7da4cb8ce8960b 42sPEAKeqU6PHAaNGyVAiUcrT5Htt9uV3FgnCUQ9zDd9Cc6cESKXMYVYRx3PQXJq8ZLckDXbjSc5VEMZvwFaoCSTLgyBpDE
f368752a9ddc30c5195516289a8db3966420f96f9607f714d79cff13a8790d04 42SPeaKf2zpjRzG398fiGp3CMB9rS2ZyLGf6JnRBqCpvQbxZnkn5ssxLANdDMnLYQDU16NuduGVazfrPaPVAddsQ6jek22m
12.6527 million keys/second
b4d2542d443088a040c133d55b289aa2f769ba7d658a2518b2e19f331d437804 49SpeAKmbNhfv5SL6oMM2D6kgSoqaUgYuQE4ceQfBjf1i4Y69rDoFe7HawErQe4tss5F3KA2UACHgJB6BEsq7G9uKtgY6YS
eaf29beaff634166eab20ee312bb9427b1fa8decf2834bc25df0afae2355050b 48SpEAKoKiYfvh9gWtctg7YjvZQ9NUpaZ7SrQE6udTwJCruJPKF7MW2AXmgwEfLyfMU43u9ZTVxtx6CuzYtKVi5SV4PbFMU
94b92182ddec3c753a0d1c83889b65e6ab8ee2f5d12340a4c96e647da285b10d 46sPEaKN33FZRQJBsbsQvXj3KDhenvZdfV8oYyuwkbJBPh3A8DBxAcA1gC4XbkfsvhTUBTQiXNFHF4SF76TrBaxe2CQ4EhG
c3835f7c62152e865936976767ccac686fc7f3831d6f48fc8b313e6bae957907 44sPeAKSc1eHpZSEUeBGsGVnxbuxX5L9MYN6Ci4tgiC5GvwS7Y2iAFyLiyF9g9oR6hYCLAgxZBHYsFAYzDRZ1xgN776u9Gm
Fantastic.
I then loaded a generated address into MyMonero to make sure we have a match—
651507438fb1691ec1c617ea1773ad93b0036fd79295ee8173c98f4c6de72e0c 46SPEAKZWk9PtTM2Ziitmh5msxYDowPbNPKxid2wwUVBgghMzxPJMTBTZr8S6ngick7tmNUapWRsSd8ouAJdsPKU17gHfr9
I found this helpful page—https://xmr.llcoins.net/addresstests.html which gave me after clickig a bunch
46SPEAKZWk9PtTM2Ziitmh5msxYDowPbNPKxid2wwUVBgiMXXf8T7vVGq9Vco38GSBCYGoJ1vD81a9Vnr5MHUHUx95QQX7z
Note the mismatch beginning after
46SPEAKZWk9PtTM2Ziitmh5msxYDowPbNPKxid2wwUVBg, where next token becomes
i….
Clearly this still works, but I'm weary of why this is happening and hope for an explanation. You've clearly done the bounty so deserve the money, so no one else should work on this while you're preparing answer.