Extraer y dividir la implementación del algoritmo en elixir -- recursion campo con integer campo con elixir camp codereview Relacionados El problema

Extract and divide algorithm implementation in Elixir


1
vote

problema

Español

Acabo de empezar a aprender elixir y tropezó con este desafío sobre PROGRAMANTE PUZZLES & AMP; Código Golf . Es una tarea bien adecuada para los principiantes, por lo que elegí darle una oportunidad (a ser clara, darle una oportunidad significa resolverlo normalmente , no golf ). Para mantener esta pregunta autónoma, aquí está la tarea, citando la publicación vinculada:

para un entero positivo dado $ n $:

  1. repite lo siguiente hasta $ n & lt; 10 $ (hasta que $ n $ contiene un dígito).
  2. extrae el último dígito.
  3. Si el dígito extraído es incluso (incluyendo 0) Multiplica el resto del entero por $ 2 $ y agregue $ 1 $ ( $ 2n + 1 $). Luego vuelva a step 1 Mover a step 4 .
  4. Divide el resto del entero con el dígito extraído (entero / dígito) y agregue el resto (Dígito Integer%), es su nuevo $ N $.

Por ejemplo, $ 61407 $ da $ 5 $ cuando pasó por este mecanismo. He llegado con el siguiente código:

  defmodule ExtractAndDivide do   def extract_and_divide(x) do     if x < 10 do x     else       head = div x, 10       tail = rem x, 10       case rem tail, 2 do         0 -> head * 2 + 1 |> extract_and_divide         1 -> div(head, tail) + rem(head, tail) |> extract_and_divide       end     end   end end 3  

Estoy buscando asesoramiento general, pero principalmente centrándome en lo siguiente:

  • Nombrar y sintaxis mejores prácticas (uso de paréntesis, nombres de variables, etc.)
  • Uso de |> (tubería) en este contexto. ¿Alguna vez verías que usaba la forma en que lo hice en el código de producción? ¿Debo cambiar a la notación "normal" en su lugar?
  • Una forma menos detallada o más elegante de evitar la estructura aparentemente sin preocupación 9988776655544335 , tal vez usando case sería mejor aquí?
  • es la recursión de la manera de ir? ¿Debo seguirlo o hay mejores métodos equivalentes?
Original en ingles

I just started learning Elixir and stumbled upon this challenge over on Programming Puzzles & Code Golf. It is a well-suited task for beginners, so I chose to give it a go (to be clear, give it a go means solve it normally, not golfing it). To keep this question self-contained, here is the task xe2x80x93 citing the linked post:

For a given positive integer \$n\$:

  1. Repeat the following until \$n < 10\$ (until \$n\$ contains one digit).
  2. Extract the last digit.
  3. If the extracted digit is even (including 0) multiply the rest of the integer by \$2\$ and add \$1\$ ( \$2n+1\$ ). Then go back to step 1 else move to step 4.
  4. Divide the rest of the integer with the extracted digit (integer / digit) and add the remainder (integer % digit), that is your new \$n\$.

For example, \$61407\$ gives \$5\$ when ran through this mechanism. I've come up with the following code:

defmodule ExtractAndDivide do   def extract_and_divide(x) do     if x < 10 do x     else       head = div x, 10       tail = rem x, 10       case rem tail, 2 do         0 -> head * 2 + 1 |> extract_and_divide         1 -> div(head, tail) + rem(head, tail) |> extract_and_divide       end     end   end end 

I'm seeking general advice, but mainly focusing on the following:

  • Naming and Syntax better practices (usage of parenthesises, variable names etc.)
  • Usage of |> (pipe) in this context. Would you ever see it used the way I did it in production code? Should I switch to "normal" notation instead?
  • Less verbose or more elegant way to avoid the seemingly unaesthetic if x < 10 do x ... else ... end structure, perhaps using case would be better here?
  • Is recursion the way to go? Should I stick to it or are there better, equivalent methods?
        
 
 

Lista de respuestas

1
 
vote
vote
La mejor respuesta
 

No tengo mucho que decir sobre el operador de la tubería. Me parece bien, aunque quizás alguien más tiene algo que decir ...

En cuanto a la cláusula if-else , puede usar cond . Es básicamente una declaración estilizada 9988776655544332 que se parece a una declaración 9988777665544333 . Una de sus condiciones puede ser x < 10 -> y la otra declaración predeterminada sería true -> .

No estoy del todo seguro si esta es la mejor práctica, ya que la redacción es un poco ambigua en la documentación. En el caso de uso para cond dice lo siguiente:

Esto es equivalente a else if cláusulas en muchos idiomas imperativos (Aunque se utiliza con menos frecuencia aquí).

¿Cuál interpreto a ser else if Las cláusulas se utilizan con menos frecuencia (implicando que a menudo se prefiere que 9988776655544339 ).

 

I do not have much to say about the pipe operator. It looks fine to me, although maybe some else has something to say...

As for the if-else clause, you can use cond. It is basically a stylized if statement that looks like a case statement. One of your conditions can be x < 10 -> and the other default statement would be true ->.

I am not entirely sure if this is the best practice since the wording is a bit ambiguous in the documentation. Under the use case for cond it says the following:

This is equivalent to else if clauses in many imperative languages (although used way less frequently here).

Which I interpret to be else if clauses are used less often (implying that cond is often preferred).

 
 
2
 
vote

(no probado)

  cond0  

La idea con que tiene múltiples cláusulas de función condicional es doble: reduce la anidación (y, por lo tanto, debe aumentar la legibilidad), y, bastante potente, permite probar fácilmente las piezas condicionales individuales. Si debe hacer la llamada recursiva para extraer_and_divide por tuberías del cálculo a través de la invocación de la función o directamente (como lo hice puramente para mostrar la alternativa) es en gran medida una cuestión de gusto.

(Nota: omitido / robusto Potencial Nitpicking Alrededor de nombrar y si cond1 no debería ser un booleano; Solo quería ilustrar el patrón de hacer lógica usando múltiples cabezales de función)

 

(untested)

defmodule ExtractAndDivide do   def extract_and_divide(x) when x < 10, do: x   def extract_and_divide(x) do     head = div x, 10     tail = rem x, 10     up_or_down = rem tail, 2     go_up_or_down(head, tail, up_or_down)   end   defp go_up_or_down(head, tail, up_or_down) when up_or_down == 0 do     extract_and_divide(head * 2 + 1)   end   defp go_up_or_down(head, tail, _up_or_down_is_one) do     extract_and_divide(div(head, tail) + rem(head, tail))   end end 

The idea with having multiple conditional function clauses is twofold: it reduces nesting (and thus should increase readability), and - quite powerful - it allows to to easily test individual conditional parts. Whether to make the recursive call to extract_and_divide by piping the calculation through the function invocation or directly (like I did purely to show the alternative) is largely a matter of taste.

(note: skipped/circumvented potential nitpicking around naming and whether up_or_down shouldn't be a boolean; I just wanted to illustrate the pattern of doing logic by using multiple function heads)

 
 
 
 

Relacionados problema

13  Multi-Process Fizzbuzz en Elixir  ( Multi process fizzbuzz in elixir ) 
Así que estaba jugando con la escritura de FIZZBBUZZ EN ELIXIR; Esta es mi primera implementación ingenua: defmodule FizzBuzz do def getFB(n) do cond...

5  Generando todas las fechas válidas  ( Generating all valid dates ) 
He llegado con el siguiente código para generar una lista de todas las fechas entre dos fechas dadas: @Override0 Agradecería cualquier comentario sobre ...

7  Tubos elixir y funciones anónimas  ( Elixir pipes and anonymous functions ) 
Recientemente comenzó con Elixir. Estoy acostumbrado a los tubos de F # y Seq.map3 Y LINQ '9988776655544334 Las cosas son diferentes en Elixir, y el código...

9  Berlín Reloj Kata en Elixir  ( Berlin clock kata in elixir ) 
Estoy empezando con elixir y como ejercicio, escribí la kata kata : El reloj se compone de 5 filas. En la parte superior del reloj hay una lámpara que p...

2  Conversión de la notación de alojamiento de ajedrez a una tupla y espalda  ( Converting chess fen notation to a tuple and back ) 
Este módulo va a formar parte de un más grande 9988777665544330 biblioteca para Validando las posiciones de ajedrez y los movimientos, pero comencé con el...

4  Elixir genera mapa invertido / invertido  ( Elixir generate inverted reversed map ) 
Me gustaría transformar la entrada [HttpGet] [Route("getBackEndWebApi")] public async Task<HttpResponseMessage> GetBackEndWebApi() { var results = Read...

6  Patrón que coincide con argumentos profundamente anidados en elixir  ( Pattern matching deeply nested arguments in elixir ) 
Recientemente comencé a trabajar con Elixir y estoy escribiendo una aplicación que consulta varias URL y analiza la respuesta. Estoy teniendo problemas con mi...

3  Implementación simple / ingenua de la identidad y tal vez Mónad en elixir  ( Simple naive implementation of identity and maybe monad in elixir ) 
Esta es mi primera grieta en una identidad monada y una Mónada Tal vez en Elixir: sign_up_individual()4 Me gustaría ver si hay una manera de hacer que l...

10  Numeral romano kata en elixir  ( Roman numeral kata in elixir ) 
Soy nuevo en Elixir, y para aprender la sintaxis, estoy haciendo un kata numérico romano que convierte un número decimal en el número romano. Agradecería cual...

1  Almacenamiento de datos temporales en ETS, por ejemplo, utilizando ETS en un asistente web  ( Storing temporary data in ets for example using ets in a web wizard ) 
Estoy aprendiendo el idioma elixir y el marco web de Phoenix. Y tuve una idea. ¿Qué sucede si, en un escenario Wizard (forma multipunto), almacené los datos i...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos