Я предположил, что заменяемые символы не обязательно должны быть случайными, а просто отличаться друг от друга и отличаться от всех других символов в строке. Если они по какой-либо причине выбираются случайным образом, требуется дополнительная конкретность, в частности, набор символов, из которых символы должны быть выбраны случайным образом. У меня есть еще один комментарий по этому поводу в конце моего ответа.
REQD_BEGIN = 15
REQD_END = 4
PERMITTED_CHARS = ('a'..'z').to_a.join
#=> "abcdefghijklmnopqrstuvwxyz"
str = "abcdefrqsjklmnoXX_123"
nbr_replacements = str.size - REQD_BEGIN - REQD_END
#=> 2
available_chars =
PERMITTED_CHARS.delete(str[0,REQD_BEGIN].downcase +
str[-REQD_END, REQD_END].downcase)
#=> "ghiptuvwxyz"
str[0, REQD_BEGIN] + available_chars[0, nbr_replacements] +
str[-REQD_END, REQD_END]
#=> "abcdefrqsjklmnogh_123"
Это не меняет ("mutate") str
. Чтобы изменить строку, измените последнюю строку на:
s[REQD_BEGIN, nbr_replacements] = available_chars[0, nbr_replacements]
#=> "gh"
Сейчас:
s #=> "abcdefrqsjklmnogh_123"
Если заменяющие символы должны выбираться случайным образом (но удовлетворять свойствам уникальности, указанным в начале), константа PERMITTED_CHARS
будет установлена равной строке, содержащей символы, из которых будет взята случайная выборка. available_chars
будет вычислено как сейчас, но available_chars[0, nbr_replacements]
будет изменено на available_chars.sample(nbr_replacements)
.