Введение

Задача FizzBuzz — это классическое упражнение по программированию, которое проверяет способность разработчика логически мыслить и решать простую, но часто неправильно понимаемую задачу. Ранее я писал о вызове FizzBuzz здесь и здесь. В этой статье мы рассмотрим десять творческих решений проблемы FizzBuzz с использованием языка программирования R. Эти решения продемонстрируют различные подходы, от базовых условных операторов до более продвинутых методов, демонстрирующих универсальность и мощь R.

Решение 1. Традиционный подход с условными операторами:

Это решение следует традиционному подходу FizzBuzz, используя условные операторы для проверки делимости и вывода соответствующего результата.

# Solution 1: Traditional Approach with Conditional Statements
for (i in 1:100) {
  if (i %% 3 == 0 & i %% 5 == 0)
    print("FizzBuzz")
  else if (i %% 3 == 0)
    print("Fizz")
  else if (i %% 5 == 0)
    print("Buzz")
  else
    print(i)
}

Решение 2: векторизованное решение с использованием оператора по модулю:

Используя векторизованные возможности R, это решение использует оператор по модулю для одновременной проверки делимости для нескольких входных данных, что приводит к эффективному коду.

# Solution 2: Vectorized Solution using Modulo Operator
numbers <- 1:100
result <- ifelse(numbers %% 15 == 0, "FizzBuzz",
         ifelse(numbers %% 3 == 0, "Fizz",
           ifelse(numbers %% 5 == 0, "Buzz", numbers)))
print(result)

Решение 3. Рекурсивный функциональный подход

Это решение демонстрирует элегантность рекурсии, определяя рекурсивную функцию, которая выводит последовательность FizzBuzz.

# Solution 3: Recursive Function Approach
fizzbuzz <- function(n) {
  if (n == 0)
    return()
  fizzbuzz(n - 1)
  if (n %% 3 == 0 & n %% 5 == 0)
    print("FizzBuzz")
  else if (n %% 3 == 0)
    print("Fizz")
  else if (n %% 5 == 0)
    print("Buzz")
  else
    print(n)
}
fizzbuzz(100)

Решение 4. Тернарные операторы для краткого кода:

Используя тернарный оператор, это решение позволяет получить краткий код за счет объединения условных операторов в одну строку.

# Solution 4: Ternary Operators for Concise Code
for (i in 1:100)
  print(ifelse(i %% 3 == 0 & i %% 5 == 0, "FizzBuzz",
         ifelse(i %% 3 == 0, "Fizz",
           ifelse(i %% 5 == 0, "Buzz", i))))

Решение 5. Использование функции ifelse():

Функция ifelse() в R позволяет использовать краткие и эффективные условные операторы. Это решение демонстрирует его использование для решения проблемы FizzBuzz.

# Solution 5: Utilizing the `ifelse()` Function
for (i in 1:100) {
  result <- ifelse(i %% 15 == 0, "FizzBuzz",
              ifelse(i %% 3 == 0, "Fizz",
                ifelse(i %% 5 == 0, "Buzz", i)))
  print(result)
}

Решение 6. Функциональный подход к программированию с помощью пакета purrr

Используя мощь функционального программирования, это решение использует функцию map() из пакета purrr для решения проблемы FizzBuzz.

# Solution 6: Functional Programming Approach with `purrr` Package
library(purrr)
map(1:100, function(i) {
  if (i %% 3 == 0 & i %% 5 == 0)
    return("FizzBuzz")
  else if (i %% 3 == 0)
    return("Fizz")
  else if (i %% 5 == 0)
    return("Buzz")
  else
    return(i)
})

Решение 7. Создание таблицы поиска

Создавая таблицу поиска с использованием фрейма данных или именованного вектора, это решение упрощает логику FizzBuzz и повышает читабельность кода.

# Solution 7: Creating a Lookup Table
lookup_table <- data.frame(number = 1:100, result = as.character(1:100))
lookup_table$result[lookup_table$number %% 3 == 0] <- "Fizz"
lookup_table$result[lookup_table$number %% 5 == 0] <- "Buzz"
lookup_table$result[lookup_table$number %% 15 == 0] <- "FizzBuzz"
print(lookup_table$result)

Решение 8. Функциональное реактивное программирование с помощью Shiny

Это решение демонстрирует возможности Shiny, пакета R для разработки веб-приложений, путем создания интерактивного генератора FizzBuzz.

# Solution 8: Functional Reactive Programmming with Shiny
library(shiny)

ui <- fluidPage(
  numericInput("n", "Enter a number:", min = 1, max = 100, value = 1),
  verbatimTextOutput("result")
)

server <- function(input, output) {
  output$result <- renderPrint({
    if (input$n %% 3 == 0 & input$n %% 5 == 0)
      return("FizzBuzz")
    else if (input$n %% 3 == 0)
      return("Fizz")
    else if (input$n %% 5 == 0)
      return("Buzz")
    else
      return(input$n)
  })
}

shinyApp(ui, server)

Заключение:

Задача FizzBuzz предоставляет прекрасную возможность изучить различные методы программирования в R, начиная от базовых условных операторов и заканчивая расширенными концепциями функционального программирования. Представляя восемь различных решений, эта статья стремилась продемонстрировать гибкость и креативность, которые R предлагает при решении задач кодирования. Каждый подход предлагает уникальную перспективу и подчеркивает различные аспекты языка R, позволяя разработчикам расширять свои знания и навыки решения проблем. Независимо от того, являетесь ли вы новичком или опытным программистом на R, эти решения предоставляют ценную информацию о различных способах решения проблемы FizzBuzz в R.