Войти

Показать полную графическую версию : [решено] Снегерировал нейросетью скрип но нужна доработка


aVitaliy
14-04-2025, 18:48
Добрый день.
Помогите доработать скрипт.

Мне нужно было сгенерировать все варианты почтового адреса v.i.t.a.l.i.k.an.tr.ak.xi.mo.v@yandex.kz меняя в адресе местами точки и тире с помощью скрипта PowerShell и вывести результат в отдельный файл. Но в нем во первых в самом начале после "v" удаляется "." и самом конце удаляется буква "v".
То есть выводит скрип так:
vi.t.a.l-i-k.an.tr.ak-xi-mo.@yandex.kz
vi.t.a.l-i-k.an.tr.ak-xi-mo-@yandex.kz


# Исходный почтовый адрес
$email = "v.i.t.a.l.i.k.an.tr.ak.xi.mo.v"
$parts = $email -split '\.|-' # Разделяем адрес на части, используя точку и тире как разделители

# Функция для генерации всех комбинаций точек и тире
function Get-Combinations {
param (
[int]$index,
[string]$currentString,
[string[]]$parts
)
if ($index -eq $parts.Length - 1) {
return $currentString # Возвращаем строку, когда достигли конца
} else {
$result = @()
$result += Get-Combinations -index ($index + 1) -currentString ($currentString + $parts[$index] + ".") -parts $parts # Добавляем точку
$result += Get-Combinations -index ($index + 1) -currentString ($currentString + $parts[$index] + "-") -parts $parts # Добавляем тире
return $result
}
}

# Запускаем генерацию комбинаций, начиная со второго элемента массива parts
$combinations = Get-Combinations -index 1 -currentString $parts[0] -parts $parts

# Добавляем "@yandex.kz" к каждой комбинации и выводим в файл
$combinations | ForEach-Object { $_ + "@yandex.kz" } | Out-File "email_combinations.txt"

Write-Host "Варианты почтовых адресов сохранены в файл email_combinations.txt"

NickM
14-04-2025, 19:15
return $currentString # Возвращаем строку, когда достигли конца »
return $currentString + $parts[$parts.Length-1] # Возвращаем строку, когда достигли конца
А, ещё же ., сейчас найдём и её, но скорее всего сам алгоритм не оптимальный, но сходу рабочий.
# Запускаем генерацию комбинаций, начиная со второго элемента массива parts
$combinations = Get-Combinations -index 0 -currentString "" -parts $parts

aVitaliy
14-04-2025, 19:24
NickM, сработало спасибо.
Еще не понятно почему при выводе в файл удаляется точка после буквы "v"
Вместо
v.i.t.a.l.i.k.an.tr.ak.xi.mo.v@yandex.kz
Выводит слитно без точки после 2-й буквы
vi.t.a.l.i.k.an.tr.ak.xi.mo.v@yandex.kz

NickM
14-04-2025, 19:25
Еще не понятно почему при выводе в файл удаляется точка после буквы "v" »
Добавил в ответ выше.

aVitaliy
14-04-2025, 19:26
NickM, Да только увидел, когда отправил.
Все работает теперь отлично.
Большое спасибо за помощь!

DJ Mogarych
14-04-2025, 22:16
0..4095 |% {
$i = ([Convert]::ToString($_,2).PadLeft(12,'0') -replace '0','-' -replace '1','.' ).ToCharArray()
"v"+$i[0]+"i"+$i[1]+"t"+$i[2]+"a"+$i[3]+"l"+$i[4]+"i"+$i[5]+"k"+$i[6]+"an"+$i[7]+"tr"+$i[8]+"ak"+$i[9]+"xi"+$i[10]+"mo"+$i[11]+"v@yandex.kz"
} > C:\temp\email_combinations.txt

Sham
15-04-2025, 09:13
Идея с представлением набора символов в виде числа с соответствующим основанием и разрядностью неплоха. Максимальное число будет и количеством вариантов. В этом случае основание будет 2 (два символа), а разрядность = количество позиций этих символов в строке. Имеем 111111111111(двоичное) == 4095(десятичное). Но это всё можно вычислить и сделать "покрасивше".
$user = "v.i.t.a.l.i.k.an.tr.ak.xi.mo.v"
$domain = "@yandex.kz"
$chars = '.', '-'
$regexp = '[{0}]' -f ([regex]::Escape($chars -join ''))
$parts = $user -split $regexp
# v{0}i{1}t{2}a{3}l{4}i{5}k{6}an{7}tr{8}ak{9}xi{10}mo{11}v
$format_str = [regex]::Replace($user, $regexp, {"{$([int]($global:c++))}"})
$max_variants = [Math]::Pow($chars.length, $parts.length - 1) - 1
0..$max_variants | % {
$num = [Convert]::ToString($_, $chars.length).PadLeft($parts.length - 1, '0')
0..($chars.length - 1) | % { $num = $num -replace "$_", $chars[$_] }
($format_str -f @($num.ToCharArray())) + $domain
} > 'email_combinations.txt'

YuS_2
15-04-2025, 12:52
Ну и ещё вариант:
Порылся в загашниках, нашел функцию перестановок символов...
permutationwithrepetition.ps1
[cmdletbinding()]
Param (
[string]$arr = '.-',
[int]$count = 12
)
function perm ($values,$size,$offset){
$count = $values.length
$array = new-object object[] $size
for ($i = 0; $i -lt $size; $i++) {
$selector = [math]::truncate($offset / [math]::pow($count,$i)) % $count
$array[$i] = $values[$selector]
}
return $array
}
function permutations ($values, $size) {
$Ar = [math]::pow($values.length, $size)
$a = new-object object[] $Ar
for ($i = 0; $i -lt $Ar; $i++) {
$a[$i] = perm $values $size $i
}
return $a
}

$charr = $arr.tochararray()

$out = permutations $charr $count

foreach ($item in $out){$item -join ' '}

$out.count
- запуск скрипта без параметров выведет все варианты перестановок символов точка-тире на 12 знакомест и количество вариантов.
Адаптировать под задачу несложно, если что...




© OSzone.net 2001-2012