Rebol3 Code Examplex


Anadromes

Find words or phrases that form a different valid word or phrase when spelled backward, such as a reverse pair.

Rebol [
    title: "Rosetta code: Anadromes"
    file:  %Anadromes.r3
    url:   https://rosettacode.org/wiki/Anadromes
]

;; download word list if not cached locally
unless exists? %words.txt [
    write %words.txt
    read https://raw.githubusercontent.com/dwyl/english-words/refs/heads/master/words.txt
]
words: read/lines %words.txt
count: length? words

;; pre-filter: keep only lowercase words longer than 6 chars
filtered: make map! count / 2
foreach word words [
    if 6 < length? word [
        word: lowercase word
        filtered/:word: reverse copy word
    ]
]

print [count "words," length? filtered "> 6 characters."]

;; find anadromes: pairs where both word and its reverse exist in the filtered map
result: copy []
foreach [word reversed] filtered [
    if all [
        find/case filtered reversed   ;; reverse also exists as a word
        word < reversed               ;; avoid recording each pair twice
    ][
        repend result [word reversed]
    ]
]

print ["Found" (length? result) / 2 "anadromes:"]
foreach [word reversed] result [
    printf [-17 " ↔ "] [word reversed]
]

Output:

466550 words, 387535 > 6 characters.
Found 32 anadromes:
          amaroid ↔ diorama
          anacara ↔ aracana
          annabal ↔ labanna
          artamus ↔ sumatra
          colbert ↔ trebloc
          degener ↔ reneged
          deifier ↔ reified
          delbert ↔ trebled
          delevan ↔ naveled
          deliver ↔ reviled
          dessert ↔ tressed
         desserts ↔ stressed
          deviler ↔ relived
         dioramas ↔ samaroid
          eimmart ↔ trammie
          emmeram ↔ maremme
          gateman ↔ nametag
          latimer ↔ remital
         lattimer ↔ remittal
          lessees ↔ seessel
          leveler ↔ relevel
         nicolaus ↔ sualocin
          pat-pat ↔ tap-tap
         redrawer ↔ rewarder
          reknits ↔ stinker
          relever ↔ reveler
          reliver ↔ reviler
          revotes ↔ setover
          roygbiv ↔ vibgyor
          rotanev ↔ venator
          sallets ↔ stellas
          sennits ↔ stinnes