go: задачка для скрининга кандидата на "блатные" номера
Знакомый тимлид поделился интересной задачей, которую он использует на техническом скрининге.
Есть поставщик услуг связи с API. Отправляем ему запрос: четырёхзначный код и номер телефона клиента.
Дальше поставщик звонит клиенту. Причём последние четыре цифры входящего номера совпадают с переданным кодом.
Клиенту остаётся посмотреть на номер и ввести эти цифры для подтверждения. Лично меня сервисы которые предлагают такой способ сильно раздражает. лучше бы прислали смс. Но для бизнеса такие звонки могут обходиться дешевле отправки сообщений.
Но ок, звонить в данном случае будут не нам и хорошо.
Но вот досада.
Представим что у поставщика нет возможности выделить "блатные" номера с некоторыми комбинациями последних цифр: 9999 7777 0000
Дороговато для них. Но это не наши проблемы. Наша теперь в другом. Точнее не наша, а кандидата.
Но дело не только в четырёх одинаковых цифрах. Не подходят и номера, в которых повторяются две соседние цифры: 99 44 11 22
То есть комбинация 1123 не подойдёт, как и 1233. А вот 1234, 1212 или 9087 подойдут.
Задача: написать на функцию на го, которая генерирует случайный четырёхзначный код без двух одинаковых цифр подряд.
Например: 1234 -> подходит 1212 -> подходит 9087 -> подходит 1123 -> не подходит 1233 -> не подходит 7777 -> не подходит
Один из вариантов реализации: func isValidCode(code string) bool { if len(code) != 4 { return false } for i := 1; i < len(code); i++ { if code[i] == code[i-1] { return false } } return true }
Генерация с использованием crypto/rand:
func generateCode() (string, error) { max := big.NewInt(10000) for { n, err := rand.Int(rand.Reader, max) if err != nil { return "", err } code := fmt.Sprintf("%04d", n.Int64()) if isValidCode(code) { return code, nil } } }
Здесь мы случайно выбираем число от 0000 до 9999, проверяем его и повторяем попытку, если комбинация не подходит.
%04d нужен, чтобы не потерять ведущие нули. Например, 0072 должен остаться четырёхзначным кодом.
В реальном сервисе, конечно, ещё понадобятся ограничение числа попыток, срок действия кода и защита от повторного использования.
Небольшая задача, но хороший пример того, как обычная бизнес-логика превращается в алгоритм с конкретными ограничениями.
Взял на вооружение. А какое решение предложили бы вы?