Scripting Games: Advanced PowerShell — Event 6

Ну тут ничего интересного и красивого — находим простые числа до 200🙂 Решение честно нагуглил🙂

SG6-Primes.ps1
function Test-Prime ($t,$prs) { $isprime = $true foreach ($i in 2..([math]::Sqrt($t))) { if ($t % $i -eq 0) { $isprime = $false break } } if ($isprime) {$prs += $t} $isprime } $Primes = 1,2; @(2;1..200 | where {Test-prime $_ $primes}) | Select @{n="Prime";e={$_}} | Out-GridView

Другие варианты: Mow, Per Østergaard, Scripting Guys, Thomas Lee.

комментариев 6 to “Scripting Games: Advanced PowerShell — Event 6”

  1. komatozo Says:

    Я был проще — даже решето Эратосфена применять не стал — тупо перебрал — мне машинного времени не жалко😉
    Получилось почти так же коротко, как у тебя, хотя и не столь элегантно…

  2. Mc'key Says:

    Сделал так:

    param([int]$LastNum = 200)
    $Primes = ,2
    function CheckPrime([int]$Num)
    {
    $IsPrime = $true;
    foreach ($P in $Primes)
    {
    if ($P -gt [Math]::Sqrt($Num)) {break;}
    if (($Num % $P) -eq 0)
    {
    $IsPrime = $false;
    break;
    }
    }
    if ($IsPrime) {$Script:Primes+=$Num}
    }
    3..$LastNum | ? {($_ % 2) -ne 0} | % {CheckPrime($_)}
    «1»
    $Primes

    Немного эффективнее… Просто недавно писал программки для Project-Euler — так что алгоритм практически один в один оттуда.

  3. Roman Kuzmin Says:

    Не совсем по теме, но все-таки: избегайте конструкции типа как в примере (не критика, а совет): 2..([math]::Sqrt($t)). По крайней мере, где есть альтернативы. Недостатки этой конструкции: *) реально создает массив из указанного числа элементов (зачем в данном случае?); *) имеет ограничениие на примерно 50000 элементов (почему такое количество, понятия не имею), можете проверить: 2..50003 – ошибка, так что алгоритм не годится в таком варианте для больших чисел.

  4. Xaegr Says:

    2 Roman Kuzmin: Зачем же избегать? Это очень удобная фишка. Да, не очень производительная (из за этого кстати и лимит на 50к😉 ) но скорость работы — не часто является главной задачей скриптов 🙂

  5. Roman Kuzmin Says:

    В ком. строке лаконичность чаще важнее. А вот скрипты должны быть по возможности оптимальны; предела совершенству нет, конечно, но разумные меры можно и нужно применять.

    В любом случае, знаю по опыту, что люди рано или поздно встают на эти грабли 2..50003. Почему бы и не предупредить по случаю?

  6. Xaegr Says:

    Ну тут в задаче скрипта было 200 элементов…🙂 Да, конечно оптимальнее и правильнее было бы делать for… а еще лучше писать на ассемблере😉
    Когда на грабли с 50к элементов натыкаюсь (пару раз было🙂 ) просто меняю на for🙂 Предупредить конечно полезно — вдруг кто-то не знал, но совсем отказываться тоже не стоит.


Обсуждение закрыто.

%d такие блоггеры, как: