Foro de elhacker.net

Programación => Programación General => Mensaje iniciado por: Baphomet2204 en 21 Julio 2019, 22:18 pm



Título: El reto de sheldon cooper
Publicado por: Baphomet2204 en 21 Julio 2019, 22:18 pm
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:

Código:
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.


Título: Re: El reto de sheldon cooper
Publicado por: 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
  1. #-*- coding: utf -8 -*-
  2. '''
  3. * 1) N debe de ser primo (73 es primo)
  4. * 2)el número formado por las cifras invertidas de N debe ser primo (37 es primo)
  5. * 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)
  6. * 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).
  7. '''
  8.  
  9. def lista_primos(n):
  10.    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 []
  11.  
  12.  
  13. def comprobar(numero):
  14.    if len(str(numero)) < 2 :
  15.        print("El número debe ser de por lo menos 2 cifras")
  16.        return
  17.    if numero in lista_primos(numero):
  18.        print("Comprobación 1 aceptada")
  19.    else:
  20.        print("el número no es primo")
  21.        return
  22.    reverso = int(str(numero)[::-1])
  23.    if  int(str(numero)[::-1]) in lista_primos(reverso):
  24.        print("Comprobación 2 aceptada")
  25.    else:
  26.        print("Comprobación 2 no aceptada")
  27.        return
  28.  
  29.    posicion_numero =  str(lista_primos(numero).index(numero)+1)
  30.    posicion_reverso =  str(lista_primos(reverso).index(reverso)+1)
  31.  
  32.    if posicion_numero == posicion_reverso[::-1]:
  33.        print("Comprobación 3 aceptada")
  34.    else:
  35.        print("Comprobación 3 no aceptada ")
  36.    y = 1
  37.  
  38.    for x in str(numero):
  39.        y = y * int(x)
  40.  
  41.    if str(y) == posicion_numero:
  42.        print("Comprobación 4 aceptada")
  43.  
  44. comprobar(73)      
  45.  

Citar
por 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.



Título: Re: El reto de sheldon cooper
Publicado por: Baphomet2204 en 22 Julio 2019, 18:04 pm
Efectivamente no es una tarea, puedes leer este link (https://tecreview.tec.mx/primo-sheldon-comprueban-teoria-matematica-the-big-bang-theory_/) 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ó   

Citar
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 []

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


Título: Re: El reto de sheldon cooper
Publicado por: Tachikomaia en 24 Julio 2019, 04:34 am
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


Título: Re: El reto de sheldon cooper
Publicado por: @XSStringManolo en 24 Julio 2019, 17:14 pm

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
  1. #-*- coding: utf -8 -*-
  2. '''
  3. * 1) N debe de ser primo (73 es primo)
  4. * 2)el número formado por las cifras invertidas de N debe ser primo (37 es primo)
  5. * 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)
  6. * 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).
  7. '''
  8.  
  9. def lista_primos(n):
  10.    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 []
  11.  
  12.  
  13. def comprobar(numero):
  14.    if len(str(numero)) < 2 :
  15.        print("El número debe ser de por lo menos 2 cifras")
  16.        return
  17.    if numero in lista_primos(numero):
  18.        print("Comprobación 1 aceptada")
  19.    else:
  20.        print("el número no es primo")
  21.        return
  22.    reverso = int(str(numero)[::-1])
  23.    if  int(str(numero)[::-1]) in lista_primos(reverso):
  24.        print("Comprobación 2 aceptada")
  25.    else:
  26.        print("Comprobación 2 no aceptada")
  27.        return
  28.  
  29.    posicion_numero =  str(lista_primos(numero).index(numero)+1)
  30.    posicion_reverso =  str(lista_primos(reverso).index(reverso)+1)
  31.  
  32.    if posicion_numero == posicion_reverso[::-1]:
  33.        print("Comprobación 3 aceptada")
  34.    else:
  35.        print("Comprobación 3 no aceptada ")
  36.    y = 1
  37.  
  38.    for x in str(numero):
  39.        y = y * int(x)
  40.  
  41.    if str(y) == posicion_numero:
  42.        print("Comprobación 4 aceptada")
  43.  
  44. comprobar(73)      
  45.  

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. 


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.  :-\



Título: Re: El reto de sheldon cooper
Publicado por: Baphomet2204 en 24 Julio 2019, 17:56 pm
Citar
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. 

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