~josealberto4444/numeros_y_letras

3bf36eede999c9e6382e1afad27db914885d81ff — José Alberto Orejuela García 2 months ago 9a3fb84 main 0.1
Recibe el número hasta el que probar

Ahora el programa recibe por línea de comandos el número que probar y
muestra las secuencias y sus longitudes de manera más organizada.
2 files changed, 47 insertions(+), 15 deletions(-)

M README.md
M src/main.rs
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