PowerShell, если не читает последнюю функцию - PullRequest
0 голосов
/ 04 февраля 2019

При распечатке функции она только распечатывает делимые на 3 и 5, но не распечатывает делимые на 15.

function Print-Numbers-Weird ([int]$count) {
    for ($i=1; $i -le $count; $i++) {
        $isdivisibleby3  = $i % 3 -eq 0
        $isdivisibleby5  = $i % 5 -eq 0
        $isdivisibleby15 = $i % 15 -eq 0

        if ($isdivisibleby3) {
            Write-Host $i "- divisibleby3"
        } elseif ($isdivisibleby5) {
            Write-Host $i "- divisibleby5"
        } elseif ($isdivisibleby15) {
            Write-Host $i "- divisibleby15"
        } else {
            Write-Host $i
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

Вот альтернативное решение, которое вы можете использовать с if/elseif

1..100 | %{

    $x = $_

    if($x %15 -eq 0)
    {
        Write-Host "fizzbuzz"
    }elseif($x %3 -eq 0)
    {
        Write-Host "fizz"
    }elseif($x %5 -eq 0)
    {
        Write-Host "buzz"
    }
    else
    {
        Write-Host $x
    }        
}

Объяснение из mklement0, однако, абсолютно верно.

0 голосов
/ 05 февраля 2019

Ansgar Wiechers предоставил критический указатель в комментарии:

Числа, которые можно разделить на 15, также можно разделить на 3, поэтому ваш кодникогда не достигает предложения $isdivisibleby15, потому что предложение $isdivisibleby3 соответствует первому.

Олаф указывает на то, что ваш вопрос касается воплощения PowerShell «FizzBuzz» на собеседовании по поводу работы и UnhandledExcepSean балловчто выполнение теста $isdivisibleby15 сначала решает вашу проблему.

Чтобы решить вашу проблему с помощью PowerShell-idiomatic , используйте switch.оператор :

function Get-WeirdNumbers ([int] $count) {
  switch (1..$count) {
    { $_ % 3 -eq 0 }  { "$_ - divisibleby3" }
    { $_ % 5 -eq 0 }  { "$_ - divisibleby5" }
    { $_ % 15 -eq 0 } { "$_ - divisibleby15" }
    default           { $_ }
  }
}

Приведенное выше решение оценивает все условия (за исключением того, что ветвь default выполняется только в том случае, если больше ничего не соответствует ).Это покажет вам, как определенные числа соответствуют кратным разам, а именно тем, которые делятся на и 3 и 5, что означает, что они также делятся на 15.


Специально для решения проблемы "FizzBuzz" (выведите Fizz для чисел, кратных 3, Buzz для чисел, кратных 5, или FizzBuzz для чисел, кратных и 3 и 5, и всем остальным числам как самим, т. Е. Выведите одно представление для каждого входного числа):

  • Ветви должны быть расположены таким образом, чтобы проверять делимость на 15 сначала .

  • Обработка остальных ветвей должна быть пропущено , как только совпадение найдено.

function Get-FizzBuzz ([int] $count) {
  switch (1..$count) {
    { $_ % 15 -eq 0 } { "FizzBuzz"; continue }
    { $_ % 5 -eq 0 }  { "Buzz"; continue }
    { $_ % 3 -eq 0 }  { "Fizz"; continue }
    default           { $_ }
  }
}

Обратите внимание, как continue используется для пропуска обработки оставшихся ветвей.Хотя break также доступен, он будет пропускать обработку любых оставшихся входных чисел, учитывая, что вход представляет собой массив чисел.


Вот альтернативное решение, основанное наЦикл foreach, в котором снова используются условия, для которых может соответствовать более 10 * * в сочетании с конкатенацией строк для достижения желаемого результата:

function Get-FizzBuzz ([int] $count) {
  foreach ($num in 1..$count) {
    $output = ''
    if ($num % 5 -eq 0) { $output =  'Fizz' }
    if ($num % 3 -eq 0) { $output += 'Buzz' }
    # Output the result
    if ($output) { $output } else { $num }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...