PowerShell и другие скрипты

6.3.2008

Scripting Games: Advanced PowerShell – Event 6

Рубрика: Learn, PowerShell, Scripting, Scripting Games — Xaegr @ 9:22

Ну тут ничего интересного и красивого – находим простые числа до 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) »

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

    Комментарий от komatozo — 6.3.2008 @ 10:52

  2. Сделал так:

    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 – так что алгоритм практически один в один оттуда.

    Комментарий от Mc'key — 6.3.2008 @ 14:16

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

    Комментарий от Roman Kuzmin — 6.3.2008 @ 15:05

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

    Комментарий от Xaegr — 6.3.2008 @ 15:07

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

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

    Комментарий от Roman Kuzmin — 6.3.2008 @ 15:18

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

    Комментарий от Xaegr — 6.3.2008 @ 15:20


RSS-лента комментариев к этой записи. URI для обратной ссылки

Оставить комментарий

Блог на WordPress.com.