Привет, читатели! Это еще один эпизод из этой серии, в котором мы погружаемся в проблему информатики и анализируем ее на пяти языках программирования. Вероятно, это последняя серия в этом году, так что считайте ее моим рождественским подарком.
Проблема, которую мы собираемся решить сегодня, — это классическая проблема простоты, которую я выбрал из hackerrank, давайте посмотрим на описание проблемы:
Простым числом называется натуральное число больше 1, не имеющее положительных делителей, кроме 1 и самого себя. Для заданного целого числа p определите простоту каждого целого числа и верните Prime или Not Prime в новой строке.
Поэтому, если число простое, мы возвращаем "Prime", если нет, то возвращается "Not Prime".
С введением выше, я думаю, мы уже достаточно освоились, чтобы начать искать решения, выбранные для этой проблемы.
Юлия
Первое решение взято из языка, который играет главную роль в этой серии, язык Julia очень приятно удивил меня своими функциями и простотой, а также тем, насколько естественно и приятно писать код на Julia, даже если у вас нет опыта. на языке
function primality(n) if n <= 1 return "Not prime" end for x in 2:n-1 if n%x == 0 return "Not prime" end end "Prime" end
Способ, которым Джулия автоматически возвращает последний оператор без необходимости возврата, очень интересен и полезен, потому что, как только Джулия сделает это, нам просто нужно проверить, где это не простое число, если оно меньше 1, это не простое число.
Если n больше 1, создается диапазон от 2 до n-1, и мы устанавливаем цикл для итерации по нему, и если n делится на любое значение в этом диапазоне, нам просто нужно вернуть “Not премьер”.
Вланг
Из всех решений в этой статье я думаю, что это решение было самым подробным из всех решений из-за того, что V ближе к языку системы или к более явному типу языка, такому как GO.
fn primality(n int) string { if n <= 1 { return "Not prime" } arr_size := n-2 entries := []int{len: arr_size, init: it+2} for i in entries { if n%i == 0 { return "Not prime" } } return "Prime" }
Процесс похож на решение Джулии, мы проверяем, больше ли n 1, если это не так, мы определяем размер возможных делимых значений, а после этого мы заполняем массив записей, которые могут быть возможными делителями.
Затем по записям выполняется цикл, и проверяется, делится ли он, если да, то возвращаем "Не простое", иначе нам просто нужно вернуть "Премиум".
JavaScript
Следующее решение - это решение JavaScript, для императивного языка решение было довольно коротким и лаконичным, единственное, что мне не понравилось, это то, что мне пришлось использовать цикл for, потому что я думал, что это будет более подходящим, чем цикл while, который меняет состояние рукой
const primality = (n) => { if(n<=1) return "Not prime" for (let divisor = 2; divisor < n-1; divisor++) { if(n%divisor == 0) return "Not prime" } return "Prime" }
Эликсир
Функциональные языки — это те, которые будут больше расходиться в формате решения.
defmodule Primality do def primality(n) when n <= 1 do "Not prime" end def primality(2), do: "Prime" def primality(n) do any_divisible = Enum.any? 2..n-1, &(rem(n, &1)==0) case any_divisible do true -> "Not prime" _ -> "Prime" end end end
Используя сопоставление с образцом в решении, мы объявляем функции несколько раз, проверяя, меньше ли оно единицы в первом объявлении, проверяя, является ли оно 2 во втором объявлении, а в последнем объявлении мы используем ». любой?» функция, которая проверяет, делится ли n на любую запись в интервале от 2 до n-1, если это так, мы возвращаем «Не простое число», а в противном случае мы просто возвращаем Prime в структуре case.
Хаскелл
Второй функциональный язык также имеет решение, отличное от всех предыдущих.
primality n | n <= 1 || anyDivisible = "Not prime" | otherwise = "Prime" where interval = [2..n-1] anyDivisible = length (filter (\v -> n`rem`v==0) interval) > 0
В Haskell я решил использовать охранников для проверки условий, в области где я определил интервал от 2 до n-1 и применил фильтр, чтобы получить все возможные делители.
В первом сторожевом предложении мы проверяем, меньше ли оно 1 или были ли найдены какие-либо делители, если да, то это не простое число.
И в последнем предложении нам просто нужно вернуть "Prime".
Сначала мне показалось, что это решение достаточно хорошее, но потом я вспомнил, что в Haskell также есть функция any, поэтому я внес несколько улучшений в решение, используя функцию «any» и оценивая логическое значение, которое я использовал из композиции функций «function2 . function1'где я выполняю оставшуюся часть деления и передаю этот результат второй функции, которая сравнивает, равен ли он нулю.
primality n | n <= 1 || anyDivisible = "Not prime" | otherwise = "Prime" where interval = [2..n-1] anyDivisible = any ((0 ==) . (n`rem`)) interval
Вот и все, мы сделали еще одну серию из этой серии, было очень приятно попробовать новые языки и представить новые в этой серии, и, конечно же, в следующем году будет больше серий, так что следите за обновлениями
Приятного просмотра курортного сезона и до встречи в следующем году!!
Спасибо за чтение!