Contact
CoCalc Logo Icon
StoreFeaturesDocsShareSupport News AboutSign UpSign In
| Download
Project: PICASyFAMAS
Views: 45
# "Picas y famas" es un juego entretenido para EJERCITAR EL CEREBRO en el que los objetos son números con 4 dígitos no repetidos. Se trata de localizar el número a partir de 'pistas' que le indican al dar uno un candidato cuántas picas y cuantas famas tiene ese candidato. Una pica es un dígito que está en el número pero que no coicide en el lugar, una fama es cuando el dígito coincide en el lugar. Por ejemplo si el número escondido es '1968' y se da el candidato '3518' hay una pica (el 1) y una fama (el 8) pero si el candidato es '2689' hay tres picas y 0 famas.
# Este sencillo programa trata el asunto desde la teoría de conjuntos. Si ud le da FyP((1968),1,2) el devuelve el conjunto de todos los números de 4 dígitos no repetidos que tienen con 1968 una fama y dos picas, debe suceder que si mi=FyP((1,9,6,8),1,2) entonces (1,9,3,2) no está en mi, pero (1,9,8,6) sí está en mi.
Digitos=Set([0,1,2,3,4,5,6,7,8,9]) Primers=Set(cartesian_product([Digitos,Digitos,Digitos])) #Primers tiene las funciones en dígitos como n-plas aquí está todos los 'numeros' de 4 cifras aún repetidas Primers.random_element() # saca un elemento al azar de Primers Mitra=[];kk=0 # Creamos el conjunto Mito de todos los números de cuatro cifras no repetidas for tus in Primers: # pasea por todos los de Primers 'tus' es una lista if Set(tus).cardinality()==4: #y escoje aquellos que tienen un conjunto de 4 elementos kk=kk+1;Mitra.append(tus) # si es así 'tus' lo junta a Mitra. kk cuenta cuántos hay print kk Mito=Set(Mitra); #Mito es Mitra convertida a conjunto (Mitra es una lista) print Mito.cardinality()
(6, 9, 6)
Error in lines 5-7 Traceback (most recent call last): File "/projects/sage/sage-7.3/local/lib/python2.7/site-packages/smc_sagews/sage_server.py", line 968, in execute exec compile(block+'\n', '', 'single') in namespace, locals File "", line 2, in <module> File "/projects/sage/sage-7.3/local/lib/python2.7/site-packages/sage/sets/set.py", line 144, in Set raise TypeError("Element has no defined underlying set") TypeError: Element has no defined underlying set
tuya=[1,1,2,1,3] tita=Set(tuya) tita.cardinality() for ii in tuya: print ii
3 1 1 2 1 3
for ik in tita: print ik
1 2 3
def FyP(uu,k,j): #atrapa exactamente k y pica j mii=Subsets(range(4),2);TANIA=Set(uu) # es la misma estrusctura que picados TITA=Set([]) for vv in Mito: #pasea por todos los elementos Tuna=Set(vv).intersection(TANIA) if Tuna.cardinality()==k+j: # escoje palabras que tengan exactamente k+j letras de las mismas Kana=Set([tt for tt in range(4) if (uu[tt]==vv[tt])]) #aquí busca los lugares if Kana.cardinality()==k: #si coincide en k lugares (tiene k famas) TIMA=Set([vv]) TITA=TITA.union(TIMA) # se la pega a TITA return TITA # y ya
TO=FyP((1,9,6,8),2,2)
Error in lines 1-1 Traceback (most recent call last): File "/projects/sage/sage-7.3/local/lib/python2.7/site-packages/smc_sagews/sage_server.py", line 968, in execute exec compile(block+'\n', '', 'single') in namespace, locals File "", line 1, in <module> File "", line 4, in FyP NameError: global name 'Mito' is not defined
TO.cardinality()
6
TO #TO son todas las que tiene 2 picas y dos famas con (1968)
{(8, 9, 6, 1), (1, 8, 6, 9), (1, 9, 8, 6), (6, 9, 1, 8), (1, 6, 9, 8), (9, 1, 6, 8)}
# supongamos que el número escondido es 1968 y me toca buscarlo entonces yo le digo '1234' me dicen tiene 1 fama 0 picas entonces hago te1 el conjunto: te1=FyP((1,2,3,4),1,0);te1.cardinality() (1,5,6,7) in te1 (7,1,8,9) in te1
480 True False
#hay 480 porque debo escoger un número y en los otros lugares debo escoger 6*5*4 en total 4*6*5*4
480
# se que hay 480 candidatos ¡es mucho! . Ahora digo '5678' me dicen que tiene 1 fama y 1 pica. hagamos te2 el conjunto correspondiente te2=FyP((5,6,7,8),1,1);te2.cardinality()
720
# debo escoger la fama de 4 maneras, luego escoger la pica de 3 formas, la debo colocar en los otros dos lugares, y llenar los dos lugares que queda con 6*5 posibilidades, total 4*3*2*6*5
720
# ahora hago te3 la intersección: te3=te2.intersection(te1);te3.cardinality()
96
# solo hay 96 que cumplan las condiciones (con 1234 1 fama y con 5678 1 pica y una fama). Propongo '0912' y me dicen tiene 1 pica y 1 fama yo sé que una es entre 0 y 9 la otra tiene que ser entre 1 y 2. Ya sé que 3 y 4 NO están. te4=FyP((0,9,1,2),1,1);te4.cardinality()
720
#ahora busco los comunes: te5=te3.intersection(te4);te5.cardinality() te5
8 {(1, 9, 5, 8), (0, 2, 7, 6), (1, 9, 7, 5), (0, 2, 5, 8), (0, 2, 6, 8), (1, 9, 7, 6), (0, 2, 7, 5), (1, 9, 6, 8)}
#hay 8 candidatos propongo '0978' me dicen tiene 2 famas 0 picas: ya sé un entre 0,9 y la otra entre 7 o 8 como ya sé que entre 3 y 4 no hay, los meto en el último que dije y propongo '3948' como la respuesta es que sigue teniendo dos famas ya sé que 9 y 8 son la famas, el número es de la forma _9_8 así habría 8*7= 56 opciones; menos porque 3 y 4 fueron descartados quedan 6*5 =30 opciones ¿nos lo dirá FyP? te6=te5.intersection(FyP((0,9,7,8),2,0)) te6.cardinality() te7=te6.intersection(FyP((3,9,4,8),2,0)) te7.cardinality() te6 te7
8 2 {(1, 9, 5, 8), (0, 2, 7, 6), (0, 2, 6, 8), (0, 2, 5, 8), (1, 9, 7, 5), (1, 9, 7, 6), (0, 2, 7, 5), (1, 9, 6, 8)} {(1, 9, 5, 8), (1, 9, 6, 8)}
# sin al ayuda de FyP llevo 30 propongo alguna digamos '1928' me dicen 3 famas 0 picas (estuve de buenas) te8=te7.intersection(FyP((1,9,2,8),3,0)) te8.cardinality() te8
2 {(1, 9, 5, 8), (1, 9, 6, 8)}
# el 1 es la fama o el dos propongo '3928' me dicen dos picas o sea que 2 no es la pica. me quedan 19_8 con 4 opciones de llenar te9=te8.intersection(FyP((3,9,2,8),2,0)) te9
{(1, 9, 5, 8), (1, 9, 6, 8)}
#No coloco en el tercer lugar ni 1,9,8,3,4,2,0 queda 5,6,7 si adivino el 6: me dicen ganó! 4 famas te10=te9.intersection(FyP((1,9,6,8),4,0)) te10
{(1, 9, 6, 8)}
#Este pasatiempo apareció en el espectador el domingo 18 de enero en la sección juegos de ingenio se pide hallar el números sabiendo que los que se tan teine tantas picas y tantas famas: # 3605 1f # 4927 1f 1p # 4107 2p # 3975 1f # 8641 2p es1=FyP((3,6,0,5),1,0) es2=es1.intersection(FyP((4,9,2,7),1,1)) es3=es2.intersection(FyP((4,1,0,7),0,2)) es4=es3.intersection(FyP((3,9,7,5),1,0)) es5=es4.intersection(FyP((8,6,4,1),0,2)) es5.cardinality()
1
es5 #esta es la respuesta
{(1, 4, 2, 5)}
#Este otro pasatiempo apareció al lado: # 1657 2p # 3842 1f # 7096 2p # 3105 1f # 4509 1f 1p es1=FyP((1,6,5,7),0,2) es2=es1.intersection(FyP((3,8,4,2),1,0)) es3=es2.intersection(FyP((7,0,9,6),0,2)) es4=es3.intersection(FyP((3,1,0,5),1,0)) es5=es4.intersection(FyP((4,5,0,9),1,1)) es5.cardinality()
1
es5 # esta es la SOLUCIÓN
{(6, 1, 4, 9)}
titi=FyP((2,3,7,5),0,2)
tite=titi.intersection(FyP((8,9,0,1),1,0)) tito=tite.intersection(FyP((6,4,0,1),1,0)) titu=tito.intersection(FyP((6,5,3,2),1,0))
titu
{(8, 4, 3, 7)}