Skip to content

Instantly share code, notes, and snippets.

@olligobber
Created July 13, 2023 07:26
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save olligobber/141cb7cfcf5f40121e0ca6f2a765a661 to your computer and use it in GitHub Desktop.
Save olligobber/141cb7cfcf5f40121e0ca6f2a765a661 to your computer and use it in GitHub Desktop.
Find all sets of words that are equivalent under Caesar cipher
Loaded dictionary with 82222 words
Looping over 484 sets of matches
Set number 1
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
Set number 2
cc
dd
ff
ii
ll
mm
pp
xx
Set number 3
iii
xxx
Set number 4
aah
eel
Set number 5
dds
ssh
Set number 6
ab
hi
kl
no
op
qr
rs
st
Set number 7
non
tut
Set number 8
eff
opp
Set number 9
deed
noon
Set number 10
deer
effs
Set number 11
defy
stun
Set number 12
nor
ops
tux
Set number 13
him
nos
opt
Set number 14
hims
nosy
Set number 15
not
sty
Set number 16
hint
stye
Set number 17
hip
tub
Set number 18
hips
tube
Set number 19
star
tubs
Set number 20
abjurer
nowhere
Set number 21
his
std
Set number 22
opal
step
Set number 23
nod
ope
zap
Set number 24
open
stir
Set number 25
dew
tum
Set number 26
hide
stop
Set number 27
ac
km
mo
pr
rt
ya
Set number 28
gig
mom
Set number 29
cede
mono
Set number 30
egg
moo
Set number 31
gin
mot
Set number 32
pry
sub
Set number 33
ego
mow
Set number 34
gird
pram
Set number 35
sue
yak
Set number 36
git
rte
Set number 37
mobs
prev
Set number 38
mocha
suing
Set number 39
mod
yap
Set number 40
acts
sulk
Set number 41
egad
moil
Set number 42
molt
prow
Set number 43
prob
sure
Set number 44
gift
surf
Set number 45
ad
be
cf
eh
kn
lo
mp
or
qt
Set number 46
figs
ruse
Set number 47
bed
ilk
qts
rut
Set number 48
add
bee
ill
loo
Set number 49
beef
loop
psst
Set number 50
adder
beefs
Set number 51
adds
beet
Set number 52
fills
lorry
Set number 53
fin
lot
qty
Set number 54
fir
lox
Set number 55
firs
rude
Set number 56
orb
rue
Set number 57
ado
fit
orc
Set number 58
loam
rugs
Set number 59
loaf
twin
Set number 60
lob
ore
Set number 61
ads
bet
fix
org
Set number 62
fizz
knee
Set number 63
fizzy
kneed
Set number 64
adv
log
mph
rum
two
Set number 65
advt
loge
Set number 66
fib
run
twp
Set number 67
fibs
rune
Set number 68
bf
cg
pt
Set number 69
imp
wad
Set number 70
qua
wag
Set number 71
quay
wage
Set number 72
swop
wast
Set number 73
ch
hm
in
yd
Set number 74
did
pup
Set number 75
dido
pupa
Set number 76
didos
pupae
Set number 77
dies
joky
Set number 78
diff
purr
Set number 79
cheer
diffs
jolly
Set number 80
chem
inks
jolt
Set number 81
glib
zebu
Set number 82
dig
pus
Set number 83
chg
put
zed
Set number 84
hmm
inn
Set number 85
chm
din
ins
jot
Set number 86
int
xci
Set number 87
dip
pub
Set number 88
pud
zen
Set number 89
dis
joy
Set number 90
div
job
van
Set number 91
jobs
vane
Set number 92
diva
vans
Set number 93
joey
puke
Set number 94
inf
jog
kph
Set number 95
diam
jogs
vase
Set number 96
pun
vat
Set number 97
john
punt
Set number 98
chain
ingot
Set number 99
tyre
xcvi
Set number 100
char
dibs
Set number 101
punk
tyro
Set number 102
fl
gm
ms
vb
ye
Set number 103
age
pvt
Set number 104
ion
out
Set number 105
ago
flt
Set number 106
cir
flu
yen
Set number 107
cit
yep
Set number 108
fly
yer
Set number 109
nth
yes
Set number 110
syn
yet
Set number 111
flap
sync
yeti
Set number 112
ah
bi
ho
ls
mt
nu
ta
Set number 113
aha
bib
nun
tat
Set number 114
bibs
elev
Set number 115
elf
tau
Set number 116
biffs
holly
Set number 117
big
nus
Set number 118
elk
hon
nut
Set number 119
elm
hop
tab
Set number 120
bin
hot
ova
Set number 121
hotel
ovals
Set number 122
bio
rye
tag
Set number 123
biol
hour
Set number 124
gnu
nub
Set number 125
bits
talk
Set number 126
hob
mtg
tan
Set number 127
gnat
tang
Set number 128
hod
tap
Set number 129
hods
tape
Set number 130
biz
pwn
tar
Set number 131
nulls
tarry
Set number 132
bias
task
Set number 133
ck
em
go
hp
jr
ks
mu
ow
tb
we
Set number 134
emf
mun
sat
Set number 135
munch
satin
Set number 136
emit
weal
Set number 137
sawn
wear
Set number 138
sax
web
Set number 139
mus
say
Set number 140
goo
wee
Set number 141
goon
weed
Set number 142
emo
sac
Set number 143
ail
sad
Set number 144
ails
gory
Set number 145
ems
sag
Set number 146
emu
owe
Set number 147
air
mud
wen
Set number 148
muffs
sally
Set number 149
gobs
sane
Set number 150
god
owl
sap
wet
Set number 151
own
tbs
Set number 152
mules
sarky
Set number 153
bk
cl
en
kt
ox
Set number 154
irk
rat
vex
Set number 155
folk
iron
Set number 156
clii
foll
Set number 157
for
lux
rad
Set number 158
clod
rads
Set number 159
luau
raga
Set number 160
rah
zip
Set number 161
lube
zips
Set number 162
envy
rail
Set number 163
luffs
rally
Set number 164
lug
ram
Set number 165
clxi
foal
Set number 166
foam
lugs
Set number 167
fob
ire
ran
Set number 168
enc
rap
vet
Set number 169
clad
raps
Set number 170
clap
rape
Set number 171
claw
ency
Set number 172
end
foe
Set number 173
bl
cm
hr
is
Set number 174
sch
yin
Set number 175
do
gr
it
oz
pa
xi
Set number 176
pap
xix
Set number 177
dodo
papa
Set number 178
alb
doe
Set number 179
par
why
Set number 180
dog
pas
Set number 181
ale
doh
jun
pat
Set number 182
ales
path
Set number 183
paw
tea
Set number 184
pawn
tear
Set number 185
grog
whew
Set number 186
doll
whee
Set number 187
dolls
wheel
Set number 188
dolt
grow
Set number 189
don
its
jut
ted
Set number 190
alkyd
epoch
Set number 191
all
tee
xii
Set number 192
dopy
whir
Set number 193
dopa
whit
Set number 194
alohas
grungy
Set number 195
dory
grub
Set number 196
alp
dos
Set number 197
pah
tel
who
Set number 198
alto
paid
Set number 199
pail
temp
Set number 200
itch
tens
Set number 201
doz
pal
Set number 202
dob
pan
xiv
Set number 203
dobro
panda
Set number 204
dobs
pane
Set number 205
term
whup
Set number 206
am
co
fr
gs
ht
kw
my
rd
Set number 207
cod
set
Set number 208
oar
wiz
Set number 209
cog
sew
Set number 210
dpi
oat
sex
Set number 211
col
fro
Set number 212
cold
frog
Set number 213
com
sec
vhf
wig
Set number 214
coo
see
Set number 215
coon
seed
Set number 216
cop
ugh
Set number 217
amp
cor
Set number 218
core
wily
Set number 219
cork
wile
Set number 220
corr
will
Set number 221
cos
dpt
Set number 222
cot
oaf
win
Set number 223
cote
winy
Set number 224
oafs
ugly
Set number 225
amt
fry
Set number 226
cows
semi
Set number 227
cox
sen
Set number 228
frag
sent
Set number 229
coy
oak
Set number 230
lxi
wit
Set number 231
cozy
wits
Set number 232
sera
wive
Set number 233
an
er
gt
iv
ob
re
sf
uh
vi
Set number 234
bob
ere
huh
nan
Set number 235
nans
viva
Set number 236
cpd
res
Set number 237
bod
erg
nap
Set number 238
bods
nape
Set number 239
obs
pct
rev
viz
Set number 240
bog
hum
via
Set number 241
bogon
rewed
Set number 242
cpl
vie
Set number 243
bolls
hurry
Set number 244
nay
rec
uhf
Set number 245
bomb
hush
Set number 246
hut
red
Set number 247
bony
redo
Set number 248
boo
err
vii
Set number 249
boob
naan
Set number 250
boon
reed
Set number 251
errs
reef
Set number 252
bop
nab
ref
Set number 253
cps
ivy
Set number 254
nae
vim
Set number 255
ans
bot
Set number 256
ant
lye
nag
Set number 257
ants
bout
Set number 258
hub
nah
obi
rel
Set number 259
bow
obj
rem
Set number 260
box
era
Set number 261
boy
hue
Set number 262
any
rep
Set number 263
boa
hug
Set number 264
boas
name
Set number 265
es
ft
ma
pd
wk
Set number 266
manful
thumbs
Set number 267
mar
thy
Set number 268
gulls
marry
Set number 269
gulf
marl
Set number 270
gum
mas
Set number 271
gun
mat
Set number 272
gunny
matte
Set number 273
ftp
maw
Set number 274
bpm
esp
max
the
Set number 275
espy
then
Set number 276
est
guv
Set number 277
bps
mad
Set number 278
dry
tho
Set number 279
guff
mall
Set number 280
ix
la
sh
ti
Set number 281
pep
tit
Set number 282
odor
peps
Set number 283
fug
lam
Set number 284
cred
shut
Set number 285
perk
shun
Set number 286
ape
lap
pet
Set number 287
aped
pets
Set number 288
full
tizz
Set number 289
crib
lark
Set number 290
fum
pew
Set number 291
fumy
lase
Set number 292
fun
lat
Set number 293
funny
latte
Set number 294
latex
shale
Set number 295
law
pea
tie
Set number 296
lawn
pear
Set number 297
fur
lax
she
Set number 298
sheer
tiffs
Set number 299
crop
furs
Set number 300
fusion
layout
Set number 301
pecan
tiger
Set number 302
app
odd
pee
shh
zoo
Set number 303
lab
ode
Set number 304
hwy
lac
peg
Set number 305
lad
til
Set number 306
aptly
timer
Set number 307
cry
eta
tip
Set number 308
pelt
show
Set number 309
etc
pen
Set number 310
etch
pens
Set number 311
crag
pent
Set number 312
cs
lb
pf
yo
Set number 313
sic
vlf
Set number 314
aqua
sims
Set number 315
rho
sip
Set number 316
bra
sir
Set number 317
bran
sire
Set number 318
ct
of
pg
Set number 319
dud
eve
Set number 320
dug
jam
Set number 321
are
duh
riv
Set number 322
arena
river
Set number 323
hymn
nest
Set number 324
duly
nevi
Set number 325
dumbo
newly
Set number 326
ark
dun
rib
Set number 327
dune
ribs
Set number 328
ctn
duo
Set number 329
arm
rid
Set number 330
dupe
rids
Set number 331
ctr
jay
rig
Set number 332
arr
nee
off
Set number 333
art
fwy
neg
Set number 334
dub
fwd
rip
Set number 335
as
cu
kc
me
um
Set number 336
ewe
wow
Set number 337
cud
men
Set number 338
gym
mes
sky
Set number 339
ash
met
Set number 340
ska
woe
Set number 341
ask
cum
mew
wog
Set number 342
asp
cur
Set number 343
phew
wold
Set number 344
curl
wolf
Set number 345
curly
wolfs
Set number 346
cushy
wombs
Set number 347
cut
med
won
Set number 348
ass
woo
Set number 349
meet
wood
Set number 350
phi
wop
Set number 351
meh
ump
Set number 352
gybe
umps
Set number 353
cubed
melon
Set number 354
at
bu
ex
ha
oh
pi
yr
Set number 355
bub
hah
oho
pip
Set number 356
bud
haj
Set number 357
ate
ohs
pit
Set number 358
buff
hall
Set number 359
halls
pitta
Set number 360
bug
ham
mfr
Set number 361
hap
let
pix
Set number 362
pixy
slab
Set number 363
bulk
exon
Set number 364
bulls
harry
Set number 365
bum
exp
has
Set number 366
bun
hat
Set number 367
hats
sled
Set number 368
bunny
sleep
Set number 369
ext
haw
lea
pie
Set number 370
lean
pier
Set number 371
hawk
pies
Set number 372
bur
vol
wpm
Set number 373
bury
slip
vols
Set number 374
bus
hay
pig
Set number 375
but
led
Set number 376
buts
hazy
Set number 377
mfg
yrs
Set number 378
ibex
pile
Set number 379
buy
lei
Set number 380
ohm
pin
Set number 381
ohms
pint
Set number 382
piny
vote
Set number 383
cw
mg
oi
tn
Set number 384
eye
gag
Set number 385
gal
mgr
Set number 386
gale
kepi
Set number 387
ice
keg
oik
Set number 388
aux
gad
oil
Set number 389
av
fa
id
lg
pk
rm
to
up
Set number 390
dye
fag
Set number 391
dyed
tout
Set number 392
fagot
touch
Set number 393
nip
wry
Set number 394
ave
pkt
Set number 395
fake
toys
Set number 396
avg
nit
Set number 397
fang
jerk
Set number 398
ids
jet
nix
Set number 399
sneer
toffs
Set number 400
fat
nib
Set number 401
faux
toil
Set number 402
niff
toll
Set number 403
fay
tom
Set number 404
faze
tons
Set number 405
fab
top
Set number 406
idem
snow
Set number 407
fad
nil
tor
ups
Set number 408
fade
tors
Set number 409
aw
bx
dz
ea
kg
mi
pl
so
Set number 410
min
sot
Set number 411
awe
sow
Set number 412
ply
sob
Set number 413
awl
mix
sod
Set number 414
awn
ear
Set number 415
eat
soh
Set number 416
eats
pled
Set number 417
bxs
mid
yup
Set number 418
milt
plow
Set number 419
mills
sorry
Set number 420
ax
by
he
if
jg
pm
vs
wt
Set number 421
limy
rose
Set number 422
ling
spun
Set number 423
link
spur
Set number 424
bye
dag
Set number 425
lion
rout
Set number 426
axe
lip
Set number 427
hem
liq
row
Set number 428
hen
spy
Set number 429
hep
lit
spa
Set number 430
dale
spat
Set number 431
damp
road
Set number 432
her
ifs
rob
Set number 433
dank
hero
Set number 434
lix
rod
Set number 435
spec
urge
Set number 436
hew
old
Set number 437
hewn
liar
Set number 438
hex
lib
ole
Set number 439
date
spit
Set number 440
dated
spits
Set number 441
byre
khan
spiv
Set number 442
byte
lido
Set number 443
lie
urn
Set number 444
dawn
hear
Set number 445
daze
spot
Set number 446
dazed
spots
Set number 447
ebb
lii
Set number 448
ebbs
roof
Set number 449
czar
dabs
Set number 450
ay
ca
db
hf
om
sq
tr
us
xv
Set number 451
cad
rps
Set number 452
aye
oms
Set number 453
gel
kip
try
Set number 454
gem
mks
Set number 455
cal
kit
Set number 456
calk
kits
Set number 457
cam
use
Set number 458
econ
used
Set number 459
can
xvi
Set number 460
tree
xvii
Set number 461
cant
trek
Set number 462
cap
get
Set number 463
capo
gets
Set number 464
caps
ecru
Set number 465
carp
trig
Set number 466
gee
sqq
Set number 467
dc
ed
ml
on
ts
Set number 468
babe
pops
Set number 469
jimmy
posse
Set number 470
jinns
potty
Set number 471
fem
pow
Set number 472
fen
pox
Set number 473
balk
onyx
Set number 474
ban
fer
hgt
Set number 475
banjo
ferns
Set number 476
bap
eds
pod
Set number 477
bar
one
Set number 478
barf
ones
Set number 479
bat
jib
Set number 480
fey
poi
Set number 481
pol
tsp
Set number 482
jiff
poll
Set number 483
bay
jig
pom
Set number 484
baa
fee
poo
import Data.List (sort)
import Data.Foldable (traverse_)
-- Locations of word lists to use
wordlists :: [String]
wordlists =
[ "/usr/share/dict/american-english"
, "/usr/share/dict/british-english"
]
isLower :: Char -> Bool
isLower c = c >= 'a' && c <= 'z'
-- Take the contents of some files and make a list of words
normaliseDictionary :: [String] -> [String]
normaliseDictionary files =
nub . sort . filter (all isLower) $ files >>= lines
-- Get all unqiue entries from a sorted list
nub :: Eq x => [x] -> [x]
nub [] = []
nub [x] = [x]
nub (x:y:xs) | x == y = nub (y : xs)
nub (x:xs) = x : nub xs
-- Get all duplicated entries from a sorted list
dups :: Eq x => [x] -> [x]
dups [] = []
dups [_] = []
dups (x:y:xs) | x == y = x : dups (dropWhile (== x) xs)
dups (_:xs) = dups xs
-- Put a word in standard form
toStandard :: String -> [Int]
toStandard word@(h:_) = fmap (\x -> (fromEnum x - fromEnum h) `mod` 26) word
main :: IO ()
main = do
allFiles <- traverse readFile wordlists
let dict = normaliseDictionary allFiles
putStrLn $ "Loaded dictionary with " <> show (length dict) <> " words"
let matches = dups $ sort $ toStandard <$> dict
putStrLn $ "Looping over " <> show (length matches) <> " sets of matches"
flip traverse_ (zip [1..] matches) $ \(i, match) -> do
putStrLn $ "\tSet number " <> show i
let matchedWords = filter ((== match) . toStandard) dict
flip traverse_ matchedWords (putStrLn . ("\t\t" <>))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment