El reto de sheldon cooper

Iniciado por Baphomet2204, 21 Julio 2019, 22:18 PM

0 Miembros y 1 Visitante están viendo este tema.

Baphomet2204

hola a todos los miembros de foro, creo recordamos el capitulo 73 de la teoria del big bang donde sheldon nos dice porque el 73 es el mejor número, pues hoy quiero proponer una comprobación, hacer un programa en cualquier lenguaje para comprobar si solo el 73 cumple con lo dicho por sheldon, el programa solicitaría el número a comprobar y solo diría si cumple o no con lo estipulado, debe cumplir con lo siguiente el número:

* N debe de ser primo (73 es primo)
* el número formado por las cifras invertidas de N debe ser primo (37 es primo)
* la posición en la lista de números primos de N debe ser el inverso a la de la posición del inverso de N, (73 ocupa el lugar 21 y 37 el 12 que es el inverso de 21)
* El producto de las cifras de N debe ser igual a su posición en la lista (7*3=21 que es su lugar en la lista).

Desde luego el programa más sencillo es:

if(n==73) cumple
else nocumple


ya que solo el 73 cumple con los requisitos pero el caso es comprobarlo realmente y por eso este reto por diversión, que tal el reto, lo veo bien para pasar unas horas.
$Diseñando_vida

while(vivas)
{
       Come();
       //Duerme();
       Programa();
       Repite();
}

tincopasan

No tengo la menor idea de quien hablas, y no creo que esto sea una tarea, pero es simple no más de 5 minutos para ecscribir(se nota que soy muy lerdo).
una forma simple y sin demasiadas comprobaciones de errores es:
Código (python) [Seleccionar]

#-*- coding: utf -8 -*-
'''
* 1) N debe de ser primo (73 es primo)
* 2)el número formado por las cifras invertidas de N debe ser primo (37 es primo)
* 3)la posición en la lista de números primos de N debe ser el inverso a la de la posición del inverso de N, (73 ocupa el lugar 21 y 37 el 12 que es el inverso de 21)
* 4)El producto de las cifras de N debe ser igual a su posición en la lista (7*3=21 que es su lugar en la lista).
'''

def lista_primos(n):
    return ([2] + [x for x in range(3, n+1, 2) if not [y for y in range(3, int(x**0.5)+1, 2) if (float(x) / y).is_integer()]]) if n >= 2 else []


def comprobar(numero):
    if len(str(numero)) < 2 :
        print("El número debe ser de por lo menos 2 cifras")
        return
    if numero in lista_primos(numero):
        print("Comprobación 1 aceptada")
    else:
        print("el número no es primo")
        return
    reverso = int(str(numero)[::-1])
    if  int(str(numero)[::-1]) in lista_primos(reverso):
        print("Comprobación 2 aceptada")
    else:
        print("Comprobación 2 no aceptada")
        return
   
    posicion_numero =  str(lista_primos(numero).index(numero)+1)
    posicion_reverso =  str(lista_primos(reverso).index(reverso)+1)
   
    if posicion_numero == posicion_reverso[::-1]:
        print("Comprobación 3 aceptada")
    else:
        print("Comprobación 3 no aceptada ")
    y = 1
   
    for x in str(numero):
        y = y * int(x)
       
    if str(y) == posicion_numero:
        print("Comprobación 4 aceptada")
           
comprobar(73)       


Citarpor eso este reto por diversión, que tal el reto, lo veo bien para pasar unas horas.

lo de diversión si, lo de horas ni por casualidad.
Saludos.


Baphomet2204

Efectivamente no es una tarea, puedes leer este link para ver la teoría que se comprobó con un episodio de una serie y en la que base este reto, muy bueno tu método, el que había pensado es muy similar con la diferencia que nunca se me ocurrió   

Citardef lista_primos(n):
    return ([2] + [x for x in range(3, n+1, 2) if not [y for y in range(3, int(x**0.5)+1, 2) if (float(x) / y).is_integer()]]) if n >= 2 else []

estaba como loco comprobando de uno en uno hasta que se encontrara el número y veía cuantas veces se hizo para ver su posición en la lista, el tuyo sin duda mucho mejor
$Diseñando_vida

while(vivas)
{
       Come();
       //Duerme();
       Programa();
       Repite();
}

Tachikomaia

Demasiado complicado me parece para lo que se logra haciéndolo, mejor hacer un videojuego por ejemplo.

"la posición en la lista de números primos de N debe ser el inverso a la de la posición del inverso de N, (73 ocupa el lugar 21 y 37 el 12 que es el inverso de 21)"

Me perdí bastante ahí, quizá sería mejor:
"la posición de N en la lista de números primos debe ser inversa a la posición del inverso de N (73 ocupa el lugar 21, y 37 el 12 que es el inverso de 21)"
Puedes intentar hacer un programa para comprobar eso si quieres xD

@XSStringManolo


Cita de: tincopasan en 22 Julio 2019, 04:46 AM
No tengo la menor idea de quien hablas, y no creo que esto sea una tarea, pero es simple no más de 5 minutos para ecscribir(se nota que soy muy lerdo).
una forma simple y sin demasiadas comprobaciones de errores es:
Código (python) [Seleccionar]

#-*- coding: utf -8 -*-
'''
* 1) N debe de ser primo (73 es primo)
* 2)el número formado por las cifras invertidas de N debe ser primo (37 es primo)
* 3)la posición en la lista de números primos de N debe ser el inverso a la de la posición del inverso de N, (73 ocupa el lugar 21 y 37 el 12 que es el inverso de 21)
* 4)El producto de las cifras de N debe ser igual a su posición en la lista (7*3=21 que es su lugar en la lista).
'''

def lista_primos(n):
    return ([2] + [x for x in range(3, n+1, 2) if not [y for y in range(3, int(x**0.5)+1, 2) if (float(x) / y).is_integer()]]) if n >= 2 else []


def comprobar(numero):
    if len(str(numero)) < 2 :
        print("El número debe ser de por lo menos 2 cifras")
        return
    if numero in lista_primos(numero):
        print("Comprobación 1 aceptada")
    else:
        print("el número no es primo")
        return
    reverso = int(str(numero)[::-1])
    if  int(str(numero)[::-1]) in lista_primos(reverso):
        print("Comprobación 2 aceptada")
    else:
        print("Comprobación 2 no aceptada")
        return
   
    posicion_numero =  str(lista_primos(numero).index(numero)+1)
    posicion_reverso =  str(lista_primos(reverso).index(reverso)+1)
   
    if posicion_numero == posicion_reverso[::-1]:
        print("Comprobación 3 aceptada")
    else:
        print("Comprobación 3 no aceptada ")
    y = 1
   
    for x in str(numero):
        y = y * int(x)
       
    if str(y) == posicion_numero:
        print("Comprobación 4 aceptada")
           
comprobar(73)       


lo de diversión si, lo de horas ni por casualidad.
Saludos.
Lo has hecho bastante compacto. Yo en C++ usaría el operador módulo para sacar los primos o usaría cualquier algoritmo para generarlos con un contador que aumente con cada número primo generado. Guardaría cada primo junto a su posición en un vector. Guardaría cada cifra como elemento en un vector de ints. Despues para comprobarl si coinciden al revés leería el vector con begin() y end() de la stl y leería con rbegin() y rend() para comparar el contenido apuntado por el iterador a ver si coinciden o no.
Finalmente recorrería el vector que almacena el primo junto a su posición buscando ambos valores, el primo y el inverso para comprobar si el orden en la serie también coincide con el inverso en la serie. 


Cita de: Tachikomaia en 24 Julio 2019, 04:34 AM
Demasiado complicado me parece para lo que se logra haciéndolo, mejor hacer un videojuego por ejemp

"la posición en la lista de números primos de N debe ser el inverso a la de la posición del inverso de N, (73 ocupa el lugar 21 y 37 el 12 que es el inverso de 21)"

Me perdí bastante ahí, quizá sería mejor:
"la posición de N en la lista de números primos debe ser inversa a la posición del inverso de N (73 ocupa el lugar 21, y 37 el 12 que es el inverso de 21)"
Puedes intentar hacer un programa para comprobar eso si quieres xD
Se hace en 5 minutos...
No sé que juego harás tú en 5 minutos.  :-\


Baphomet2204

CitarLo has hecho bastante compacto. Yo en C++ usaría el operador módulo para sacar los primos o usaría cualquier algoritmo para generarlos con un contador que aumente con cada número primo generado. Guardaría cada primo junto a su posición en un vector. Guardaría cada cifra como elemento en un vector de ints. Despues para comprobarl si coinciden al revés leería el vector con begin() y end() de la stl y leería con rbegin() y rend() para comparar el contenido apuntado por el iterador a ver si coinciden o no.
Finalmente recorrería el vector que almacena el primo junto a su posición buscando ambos valores, el primo y el inverso para comprobar si el orden en la serie también coincide con el inverso en la serie. 

Exacto, es justo lo que yo pensaba hacer, pero aquí el amigo tincopasan lo resumió de manera increíble, sinceramente no pensé en hacerlo así, estaba pensado el camino largo 
$Diseñando_vida

while(vivas)
{
       Come();
       //Duerme();
       Programa();
       Repite();
}