elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: (TUTORIAL) Aprende a emular Sentinel Dongle By Yapis


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  El reto de sheldon cooper
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: El reto de sheldon cooper  (Leído 3,757 veces)
Baphomet2204

Desconectado Desconectado

Mensajes: 56


Programo luego existo


Ver Perfil
El reto de sheldon cooper
« 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.


« Última modificación: 21 Julio 2019, 22:21 pm por Baphomet2204 » En línea

$Diseñando_vida

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


Desconectado Desconectado

Mensajes: 1.286

No es lo mismo conocer el camino que recorrerlo.


Ver Perfil
Re: El reto de sheldon cooper
« Respuesta #1 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.



En línea

Baphomet2204

Desconectado Desconectado

Mensajes: 56


Programo luego existo


Ver Perfil
Re: El reto de sheldon cooper
« Respuesta #2 en: 22 Julio 2019, 18:04 pm »

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ó   

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
En línea

$Diseñando_vida

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


Desconectado Desconectado

Mensajes: 1.420


Hackentifiko!


Ver Perfil
Re: El reto de sheldon cooper
« Respuesta #3 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
En línea

@XSStringManolo
Hacker/Programador
Colaborador
***
Desconectado Desconectado

Mensajes: 2.399


Turn off the red ligth


Ver Perfil WWW
Re: El reto de sheldon cooper
« Respuesta #4 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.  :-\

En línea

Mi perfil de patrocinadores de GitHub está activo! Puedes patrocinarme para apoyar mi trabajo de código abierto 💖

Baphomet2204

Desconectado Desconectado

Mensajes: 56


Programo luego existo


Ver Perfil
Re: El reto de sheldon cooper
« Respuesta #5 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 
En línea

$Diseñando_vida

while(vivas)
{
       Come();
       //Duerme();
       Programa();
       Repite();
}
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines