L’enigma d’aquesta setmana es:
En un joc infantil es posen tots els nens en un cercle i es començar a recitar una frase de 13 paraules, de tal manera que a cada paraula es va passant de un nen al altre, a la paraula número 13 queda eliminat el nen. Sabent que en el cercle hi havia 8 nens, anomenats de A,B,C..H i que es contava en el sentit de les agulles del rellotge i que després de eliminar 7 vegades als nens corresponents, es va salvar el nen C, per quin nen es va començar a contar?
Recordeu que m’agraden les solucions amb raonament!
Pel que fa l’enigma de fa dos setmanes:
Un rei te 10 súbdits, cada un li paga amb un sac en el qual hi ha 10 monedes de 10 grams, però un d’ells li entrega fraudulentament monedes de 9 grams. El rei te una bascula la qual només es pot fer una sola pesada. Com s’ho farà el rei per descobrir el lladre fent només una sola pesada?
Solució:El rei col·locarà sobre la taula les 10 piles de 10 monedes en el ordre que els ha rebut, i agafarà una moneda del primer sac, dos del segon, 3 del tercer, així fins arribar al últim sac del qual agafarà 10 monedes (es a dir totes les del sac). En total haurà separat 55 monedes i les posara en la bascula, si les monedes tinguessin el pes exacte haurien de pesar 550 grams, si li falta un gram el fraudulent serà el qui ha entregat el primer sac, si li falten 2, seran el del segon sac, i així successivament.
Guanyador: Sergi
Ho deixaré per al vespre, aquesta hora no puc resoldre cap enigma, i encara menys si tinc en compte que l’hora ha canviat.
També em faràs un programa en C++ que resol l’enigma? ^^
Home, no voldràs també una GUI treballada i una base de dades de nens i unes casetes per introduir el número de paraules de la frase i uns efectes especials per escollir com desaparèixeran els nens eliminats de la pantalla del pal “fade out”, “genie effect”, “impressionist” etc.???
El que penso fer és un programa senzill en C amb una llista enllaçada de struct node { char nen; struct node *next;} i anar eliminant nens en 8 etapes a veure quina surt guanyadora. Però ara mateix he d’anar de compres, ja t’enganxaré el codi font més cap al vespre.
Bon dia. S’ha començat a comptar pel nen E, o altrament dit, el nen que estava dues posicions després (sempre en sentit horari) del que ens ha quedat viu. El meu raonament està en el dibuixet que acabo de fer a la part de darrera d’una participació de la loteria de nadal (no premiada). Quan vulguis te l’envio!
si no està premiat no cal que l’envïs…
Jo ho he fet darrere del full de calendari del març però em dóna també el nen E, com a la Yáiza. El meu raonament s’ha basat en anar eliminant-los un a un, set vegades.
No sé, però, si hi ha una fórmula matemàtica que doni directament la solució…
El jurat valora positivament que es reciclin els materials utilizats per resoldre l’enigma
El mateix resultat: la E. He substituït les lletres per números. Si començava per l’1, el que no s’eliminava era el 7. Si el 7 és la C, l’1 és la E.
Merda, perquè a mi em surt el nen C, però si es valora el fet de reutilitzar el paper en aquest cas també el compleixo, ho he fet darrere d’un full que em va quedar mal imprès.
Ah, doncs ara ja no em surt, no sé, m’estic marejant de comptar en rodonetes, si és el E ja m’ho crec, em dec saltar nens pel mig mentre els compto!!!
ja veig que els nens no son lo teu…
Intentaré un cop més, ni sé com m’atreveixo!
#include <stdio.h>
struct node {
char nen;
struct node *next;
};
void nen_print(struct node *nens, int n)
{
int i;
printf(“nens disponibles i els seus llocs a la memoria:\n”);
for (i = 0; i < n; i++)
printf(“%c – %#x\n”, nens[i].nen, (unsigned int) nens[i].next);
}
void nen_init(struct node *nens)
{
int i;
for (i = 0; i < 7; i++) {
nens[i].nen = 0x41 + i;
nens[i].next = nens + i + 1;
}
nens[7].nen = 0x48;
nens[7].next = nens;
}
void nen_circle(int nen_start)
{
struct node nens[8];
struct node *list, *tmp;
int i, j;
/* start eliminating from nen_start */
if (nen_start > 7 || nen_start < 0)
return;
nen_init(nens);
nen_print(nens, 8);
list = nens + nen_start;
printf(“primer nen es: %c\n”, list->nen);
for (j = 0; j < 8; j++) {
for (i = 0; i < 12; i++) {
printf(“nen %c \n”, list->nen);
tmp = list;
list = list->next;
}
printf(“eliminem el nen: %c\n\n”, list->nen);
tmp->next = list->next;
list = tmp->next;
}
}
int main(void)
{
int i;
for(i = 0; i < 8; i++)
nen_circle(i);
return 0;
}
Guardar com a nens.c, executar gcc nens.c no fent cas al warning que surt d’un printf, executar ./a.out > nens_eliminats.txt, obrir arxiu nens_eliminats.txt, escollir l’entrada on el últim eliminat és el C.
buff punters, quina por, d’això no en fem servir a java xD
Molt útils i utilitzables, de fet ni sé com es pot programar sense! Fan maca la vida del programador. A Java em sembla que tampoc teniu unsigned, oi?
Per cert, el codí és millorable, la funció d’inicialització dels nens es pot dividir en 2, una per ficar els nen_noms i l’altra per fer que els nens s-agafin les mans abans de començar el joc de paraules. També es poden retocar els printf-s i veig que falta un espai al últim for, queda lletgissim! Gairebé em costa creure que algú va poder llegir i entendre el main()…
[…] tan per què es salvi C que està oposat a G s’ha d’haver començat a contar per E. Guanyadora:Yaiza I mig punt pel programa en C++ de […]