Number Palindrome Checker -- # campo con palindrome camp codereview Relacionados El problema

Number palindrome checker


4
vote

problema

Español

Mi hija, nueve, recientemente tuvieron algunas tareas que miran a Number Palindromes. Parte de la asignación fue tomar un número, revertirlo, agregar los dos juntos y repetir hasta que ella consiguió un palíndromo y para hacer esto por varios números diferentes.

Mientras lo ayudaste con esto me sorprendió que sería una buena idea simple para un programa de computadora. Ella y amp; Me he metido un poco en cero, pero esto sonaba como un buen problema que hacer en un idioma más comercial. Pensé que podría escribirlo y luego mostrarle cómo funcionó.

así lo hice. Resultó no ser tan amigable para los niños como me había imaginado.

  using System; using System.Collections.Generic; using System.Text; using System.Linq;  namespace CheckNumberPalindrome {     class Program     {         static void Main(string[] args)         {             string rollingSum;             int iterations = 1;              if(IsNumeric(args[0]) == false)             {                 Console.WriteLine("You did not enter a numeric value");             }              rollingSum = RecurseUntilPalindrome(args[0], ref iterations);             Console.WriteLine(string.Format("The final palindrome is {0}, which took {1} steps.", rollingSum, iterations));         }          private static bool IsNumeric(string s)         {             long result;             return Int64.TryParse(s, out result);         }          private static string RecurseUntilPalindrome(string s, ref int iterations)         {             long rollingSum = AddToPalindrome(s);              if(IsPalindrome(rollingSum.ToString()))             {                 return rollingSum.ToString();             }              iterations++;             return RecurseUntilPalindrome(rollingSum.ToString(), ref iterations);         }          private static long AddToPalindrome(string s)         {             string reversedString = ReverseString(s);             long result = Convert.ToInt64(s) + Convert.ToInt64(reversedString);             Console.WriteLine(string.Format("Adding {0} to {1} = {2}", s, reversedString, result));             return result;         }          private static string ReverseString(string s)         {             char[] charArray = s.ToCharArray();             Array.Reverse(charArray);             return new string(charArray);         }          private static bool IsPalindrome(string s)         {             return s.SequenceEqual(ReverseString(s));         }     } }   

Hay dos preguntas aquí:

  1. ¿Cómo podría hacer esto mejor o más limpio o más limpio o más eficiente o alguna de las otras cosas que CR lo hace tan bien?

  2. ¿Qué podría hacer (además de ocultar algunas de las funciones en el código pre-compilado en otros lugares) para que esto sea más amigable para los niños, o mejor para enseñar / explicar algunos conceptos básicos del código?

Original en ingles

My daughter, nine, recently had some homework looking at number palindromes. Part of the assignment was to take a number, reverse it, add the two together and repeat until she got a palindrome and to do this for several different numbers.

While helping her with this it struck me it'd be a nice simple idea for a computer program. She & I have messed about in Scratch a bit, but this sounded like a nice problem to do in a more commercial language. Thought I could write it and then show her how it worked.

So I did. It turned out to be not quite as child-friendly as I'd imagined.

using System; using System.Collections.Generic; using System.Text; using System.Linq;  namespace CheckNumberPalindrome {     class Program     {         static void Main(string[] args)         {             string rollingSum;             int iterations = 1;              if(IsNumeric(args[0]) == false)             {                 Console.WriteLine("You did not enter a numeric value");             }              rollingSum = RecurseUntilPalindrome(args[0], ref iterations);             Console.WriteLine(string.Format("The final palindrome is {0}, which took {1} steps.", rollingSum, iterations));         }          private static bool IsNumeric(string s)         {             long result;             return Int64.TryParse(s, out result);         }          private static string RecurseUntilPalindrome(string s, ref int iterations)         {             long rollingSum = AddToPalindrome(s);              if(IsPalindrome(rollingSum.ToString()))             {                 return rollingSum.ToString();             }              iterations++;             return RecurseUntilPalindrome(rollingSum.ToString(), ref iterations);         }          private static long AddToPalindrome(string s)         {             string reversedString = ReverseString(s);             long result = Convert.ToInt64(s) + Convert.ToInt64(reversedString);             Console.WriteLine(string.Format("Adding {0} to {1} = {2}", s, reversedString, result));             return result;         }          private static string ReverseString(string s)         {             char[] charArray = s.ToCharArray();             Array.Reverse(charArray);             return new string(charArray);         }          private static bool IsPalindrome(string s)         {             return s.SequenceEqual(ReverseString(s));         }     } } 

There are two questions here:

  1. How could I make this better or cleaner or more efficient or any of the other things that CR does so well?

  2. What could I do (beside hiding some of the functions in pre-compiled code elsewhere) to make this more child-friendly, or better for teaching/explaining some basic code concepts?

     
 
 

Lista de respuestas

3
 
vote
vote
La mejor respuesta
 

En general, su código se ve muy bien, legible y se puede mantener. Solo tengo algunas observaciones:

  • validación de entrada:
  pathlib2  

¿Por qué continuar el programa cuando la entrada no es válida (no numérica)? Compruebe si hay un valor numérico y solo continúe si la entrada es un número:

  pathlib3  
  • Formato en pathlib4 :

siguiente línea:

  pathlib5  

se puede reescribir como:

  pathlib6  

No es necesario llamar al pathlib7 .

  • cheque para palindrome:

Mientras escribo puntos anteriores, encontré que allí tenía para ser una forma más fácil de lograr el mismo resultado. Hay numerosas formas de comprobar un palíndromo. Para los números, también puede usar este método:

  pathlib8  

Cuando utilice este método, no hay necesidad de crear cadenas y matrices y nuevamente las conversiones en los números. Su código completo se puede escribir de la siguiente manera:

  pathlib9  
 

Overall your code looks very nice, readable and maintainable. I only have a few remarks:

  • Input validation:
if(IsNumeric(args[0]) == false)  {      Console.WriteLine("You did not enter a numeric value");  }  rollingSum = RecurseUntilPalindrome(args[0], ref iterations); 

Why continue the program when the input is invalid (not numeric)? Check for a numeric value and only continue if the input is a number:

if(IsNumeric(args[0])) {     //Continue here... } else {     Console.WriteLine("You didn't enter a valid number!"); } 
  • Format in Console.WriteLine:

Following line:

Console.WriteLine(string.Format("The final palindrome is {0}, which took {1} steps.", rollingSum, iterations)); 

can be rewritten as:

Console.WriteLine("The final palindrome is {0}, which took {1} steps.", rollingSum, iterations); 

No need to call the String.Format.

  • Check for palindrome:

While writing previous points I found that there had to be an easier way to achieve the same result. There are numerous ways to check for a palindrome. For numbers you can also use this method:

public static bool IsPalindrome(Int64 input) {     Int64 reverse = 0;     var temp = input;      while (temp != 0)     {         var rem = temp % 10;         reverse = reverse * 10 + rem;         temp /= 10;     }      return reverse == input; } 

When using this method, there's no need for creating strings and arrays and again conversions to numbers. Your entire code can be written as follows:

Int64 startNumber; var steps = 1; var input = args[0];  if (Int64.TryParse(input, out startNumber)) {     Int64 reversed;      while(!IsPalindrome(startNumber, out reversed))     {         steps++;         var temp = startNumber + reversed;         Console.WriteLine("Adding {0} to {1} = {2}", reversed, startNumber, temp);         startNumber = temp;     }      Console.WriteLine("The final palindrome is {0}, which took {1} steps.", startNumber, steps); } else {     Console.WriteLine("You didn't enter a valid number!"); } 
 
 
   
   
3
 
vote

Esto puede ayudar con su segundo punto sobre los conceptos de código:

¿Qué tal cómo abordar el caso especial para cuando el usuario ingresa a un palíndromo? Me parece que está asumiendo que el número ingresado no será un palíndromo y se le agregará automáticamente (llamando a recebeuntilpalindrome). ¿Qué tal agregar un cheque inicial para tener en cuenta ese caso? Creo que iría bien con su cheque de entrada de valor numérico (considero la entrada de usuario no válida como una especie de caso especial también).

Para abordar su primer punto, ¡creo que su código se ve bastante limpio como está! Muy fácil de seguir.

 

This may help with your second point about code concepts:

How about addressing the special case for when the user enters a palindrome? It looks to me like you are assuming the entered number will not be a palindrome and you automatically add to it (calling RecurseUntilPalindrome). How about adding an initial check to account for that case? I think it would go along well with your numerical value input check (I consider invalid user input as a sort of special case as well).

To address your first point, I think your code looks pretty clean as is! Really easy to follow.

 
 
 
 

Relacionados problema

6  Encontrar el siguiente palíndromo de una cadena de números  ( Finding the next palindrome of a number string ) 
Aquí está el problema: Un entero positivo se llama palíndromo si su representación en el El sistema decimal es el mismo cuando se lee de izquierda a dere...

6  Palindrome más largo en una matriz  ( Longest palindrome in an array ) 
Soy nuevo en la programación, y creo que este código podría mejorarse. ¿Alguna sugerencia? 'done'0 ...

8  Checker Palindrome usando un bucle Sentinel  ( Palindrome checker using a sentinel loop ) 
Esta es mi primera presentación y ha completado una cuarta parte de la programación de Java. Tengo una tarea para crear un corrector de palíndromo. Bastante...

4  Crea palíndromo al reorganizar letras de una palabra  ( Create palindrome by rearranging letters of a word ) 
inspirado en una pregunta reciente que captó mi interés (ahora eliminado < / a>), escribí una función en Python 3 para reorganizar las letras de una cadena d...

1  Encontrar el palíndromo más largo de la cadena dada  ( Finding the longest palindrome from the given string ) 
Recientemente me encontré con este problema que me instruye a encontrar el Subcanera más larga que es un palíndromo: Como todos sabemos, un palíndromo es...

17  Devuelve el palíndromo más grande de la cuerda  ( Return the largest palindrome from the string ) 
Aquí está la pregunta: Encuentre el palíndromo más grande de una cadena. ex: ABCBAHELLOHOWRACECARAREYOUILOVEUEVOLIIAMAIDOINGGOOD Resultado: ILOVEU...

2  Palidrome Checker en Haskell  ( Palidrome checker in haskell ) 
Decidí evitar el 9988776655544339 intentado escribir un método con la coincidencia de patrones y la recursión. #include <stdio.h> #include <fcntl.h> #inc...

6  Encontrar el mayor palíndromo del producto de dos números de n-dígitos  ( Finding the largest palindrome from the product of two n digit numbers ) 
El programa encuentra al palíndromo más grande hecho del producto de dos números n -digit, donde el usuario especifica n . El código incluido funciona, s...

3  Compruebe si una cadena dada puede ser un palíndromo alterando algún carácter sin usar una función de biblioteca  ( Check if a given string can be a palindrome by altering some character without u ) 
Me preguntaron en una entrevista para escribir código para verificar si una cadena dada es un palíndromo o puede ser un palíndromo al alterar algún carácter s...

1  La cadena de verificación es permutación del palíndromo  ( Check string is permutation of palindrome ) 
Supongo que puede haber espacio entre y he ignorado eso. Además, solo habrá caracteres minúsculas en la cadena. Mi lógica: solo puede haber una ocurrencia d...




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