REBOL [
    Title: "String shuffle"
    Purpose: {Given a string that is intended to be a word,
    return a new string that has the same first and last
    characters, but has the middle characters randomly shuffled.}
]

STRSHUFFLE: func [
    STR
    /local LGH SHUFFLE FST LST MID MIDLGH
] [
    SHUFFLE: copy ""
    LGH: length? STR
    if lesser-or-equal? LGH 3 [ 
        SHUFFLE: copy STR
        return SHUFFLE
    ]
    MIDLGH: LGH - 2
    FST: first STR
    LST: last STR
    MID: copy/part skip STR 1 MIDLGH 
    append SHUFFLE rejoin [
        FST
        random MID
        LST
    ]
    return SHUFFLE
]

;Uncomment to test
;probe STRSHUFFLE ""
;probe STRSHUFFLE "a"
;probe STRSHUFFLE "to"
;probe STRSHUFFLE "the"
;probe STRSHUFFLE "four"
;probe STRSHUFFLE "five"
;probe STRSHUFFLE "postprandial"
;probe STRSHUFFLE "septuagenerian"
;probe STRSHUFFLE "spaniel"
;probe STRSHUFFLE "twenty"
;halt