Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Снегерировал нейросетью скрип но нужна доработка (http://forum.oszone.net/showthread.php?t=356252)

aVitaliy 14-04-2025 18:48 3037253

Снегерировал нейросетью скрип но нужна доработка
 
Добрый день.
Помогите доработать скрипт.

Мне нужно было сгенерировать все варианты почтового адреса 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 3037254

Цитата:

Цитата aVitaliy
Код:

  return $currentString # Возвращаем строку, когда достигли конца
»

Код:

return $currentString + $parts[$parts.Length-1] # Возвращаем строку, когда достигли конца
А, ещё же ., сейчас найдём и её, но скорее всего сам алгоритм не оптимальный, но сходу рабочий.
Код:

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


aVitaliy 14-04-2025 19:24 3037255

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 3037256

Цитата:

Цитата aVitaliy
Еще не понятно почему при выводе в файл удаляется точка после буквы "v" »

Добавил в ответ выше.

aVitaliy 14-04-2025 19:26 3037257

NickM, Да только увидел, когда отправил.
Все работает теперь отлично.
Большое спасибо за помощь!

DJ Mogarych 14-04-2025 22:16 3037265

Код:

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 3037270

Идея с представлением набора символов в виде числа с соответствующим основанием и разрядностью неплоха. Максимальное число будет и количеством вариантов. В этом случае основание будет 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 3037279

Ну и ещё вариант:
Порылся в загашниках, нашел функцию перестановок символов...
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 знакомест и количество вариантов.
Адаптировать под задачу несложно, если что...


Время: 01:34.

Время: 01:34.
© OSzone.net 2001-