M README.md => README.md +12 -9
@@ 1,13 1,11 @@
# Números y letras
-Este programa ayuda a visualizar la sucesión creada a partir del
-siguiente procedimiento:
+Este programa ayuda a visualizar la sucesión creada a partir de tomar un
+número arbitrario (lo haremos con enteros positivos aunque se puede
+hacer con cualquier entero) y seguir el procedimiento:
-1. Se toma un número inicial arbitrario (lo haremos con enteros
- positivos aunque se puede hacer con cualquier entero).
1. Se cuenta el número de letras con el que se escribe en español.
-1. Se repite el procedimiento desde el punto anterior con el número
- obtenido.
+1. Se repite el procedimiento con el número obtenido.
Por ejemplo, partiendo del 1, se obtendría la sucesión 1, 3, 4, 6, 4, 6…
@@ 19,6 17,11 @@ Y partiendo de números negativos (que también lo dejaremos fuera del
ámbito de este programa) sería lo mismo pero sumando 5, que corresponde
a las letras en la palabra `menos`.
-El programa debería parar justo antes de que aparezca un número
-repetido, ya que la sucesión entra en bucle, y mostrar la sucesión así
-como cuántos números hay en ella hasta llegar al ciclo.
+En algún momento de la secuencia aparece un número repetido, que suele
+ser el 4, 5 o 6, y ya después de eso se entra en bucle, lógicamente. El
+programa debería parar justo antes de que aparezca este número repetido
+y mostrar la sucesión así como cuántos números hay en ella hasta llegar
+al ciclo.
+
+El programa hace esto para todos los enteros positivos hasta el número
+recibido, que debe ser como máximo 999\_999\_999\_999.
M src/main.rs => src/main.rs +35 -6
@@ 1,10 1,15 @@
// SPDX-FileCopyrightText: 2024 José Alberto Orejuela García <libre@josealberto4444.com>
// SPDX-License-Identifier: AGPL-3.0-or-later
-const TESTED_NUMBERS : std::ops::RangeInclusive<usize> = 1..=9_999999;
+use std::io;
+
+const UPPER_BOND : usize = 999999_999999;
fn main() {
- for number in TESTED_NUMBERS {
+ let highest_number = ask_number();
+ let test_numbers = 1..=highest_number;
+ println!("Longitud\tSecuencia");
+ for number in test_numbers {
let mut sequence = vec![number];
let mut next_element = letters(number);
while ! sequence.contains(&next_element) {
@@ 12,13 17,37 @@ fn main() {
next_element = letters(next_element);
}
let length = sequence.len();
- if length > 5 || ! [4, 5, 6].contains(sequence.last().expect("La sucesión está vacía.")) {
- println!("Secuencia {sequence:?}");
- println!("Longitud {length}");
- }
+ println!("{length}\t\t{sequence:?}");
+ }
+}
+
+fn ask_number() -> usize {
+ println!("Introduce el número hasta el cual quieres calcular secuencias\n(máximo {UPPER_BOND}).");
+
+ loop {
+ let mut highest_number = String::new();
+
+ io::stdin()
+ .read_line(&mut highest_number)
+ .expect("Ha habido algún fallo al recibir el número.");
+
+ match highest_number.trim().parse::<usize>() {
+ Ok(number) => {
+ if number <= UPPER_BOND && number > 0 {
+ break number;
+ } else {
+ invalid_number();
+ }
+ },
+ Err(_) => invalid_number(),
+ };
}
}
+fn invalid_number() {
+ println!("Por favor, introduce únicamente un número\nentre 1 y {UPPER_BOND}.");
+}
+
fn letters(number: usize) -> usize {
// Esta función devuelve el número de letras que se obtienen al escribir un número en
// español