|
#1 - 17-11-2010 17:28:37
- Nicouj
- Professionnel de Prise2Tete
- Enigmes résolues : 27
- Messages : 330
Informatique et élimination des doublnos
Vous devez programmer une fonction qui prend une liste de nombres entiers en paramètre et qui rend une liste contenant les même nombres mais dans laquelle on aurait enlevé les doublons éventuels.
f([1; 2; 4; 2; 4; 3; 1]) = [1; 2; 3; 4] ou bien [2; 4; 1; 3], etc. L'ordre nous importe peu.
Le problème est que votre langage est un peu restrictif :
- Le langage ne permet de ne définir qu'une seule fonction à la fois. - Cette unique fonction ne peut avoir qu'un seul paramètre (donc forcément notre liste). - Le langage ne permet pas de définir de variable auxiliaire - le langage ne connait que deux type de données : les entiers et les listes d'entiers
Toutefois le langage offre quelques fonctionnalités :
- Il est récursif - Il fournit une conditionnelle if/then/else classique - Il permet de comparer des entiers ( <, >, = ) - Il dispose d'opérations de base sur les listes : * une fonction qui indique si une liste est vide, * une fonction qui rend la "tête" d'une liste (son premier élément), * une fonction qui rend la "queue" d'une liste (tous ses éléments sauf le premier) * une constante qui vaut une liste vide. * une fonction qui prend un entier et une liste en paramètre et qui rend une liste dont la tête est égale à l'entier passé en premier paramètre, et la queue est égale a la liste passée en second paramètre.
Est-il possible de définir notre fonction avec ce langage ?
Finalement j'aimerais que la fonction respecte aussi l'ordre d'apparition des nombres par rapport a la première liste f([1; 2; 4; 2; 4; 3; 1]) = [1; 2; 4; 3]
Est-ce toujours possible ?
(Utilisez votre langage favori mais en le contraignant aux restrictions de l'énoncé)
#2 - 17-11-2010 20:30:38
- scarta
- Elite de Prise2Tete
- Enigmes résolues : 49
- Messages : 1968
Informatique et élimination ds doublons
On autorise les listes de listes ? Parce que si c'est le cas, un simple arbre binaire de recherche devrait faire l'affaire il me semble, non ?
De plus, sans un append c'est pas trop possible, si?
#3 - 18-11-2010 08:55:16
- Nicouj
- Professionnel de Prise2Tete
- Enigmes résolues : 27
- Messages : 330
informztique et élimination des doublons
L'énoncé est correct (en tout cas vis-à-vis des premières remarques, j'ai vraiment pris soin d'éviter les coquilles)
je précise tout de même des points impliqués par l'énoncé :
La concaténation de liste n'est autorisée. L'utilisation de listes de listes non plus.
D'autre part, il est vrai que la constante valant une liste vide n'est pas nécessaire pour le problème, mais un langage qui offre un type de liste sans une constante liste_vide, c'est bizarre ^^ (j'avoue le langage proposé est bizarre de toute façon :p)
Enfin nous n'avons pas de contrainte de complexité. Le programme peut être inefficace au possible du moment qu'il se termine et rende la bonne solution
#4 - 18-11-2010 09:38:05
- Barbabulle
- Professionnel de Prise2Tete
- Enigmes résolues : 49
- Messages : 237
Informatique ett élimination des doublons
Bonjour, j'aimerais un petite précision : Y-a-t'il une fonction qui permet de créer des listes à partir de deux éléments ? par exemple, si je veux créer une liste comprenant les deux premiers éléments d'une autre liste, je peux faire tête(liste) pour récupérer le premier et tête(queue(liste)) pour récupérer le deuxième, mais comment je fais pour les assembler ?
La paix dans le monde n'est pas menacée par les révoltés, mais par les soumis. Georges Bernanos
#5 - 18-11-2010 11:09:24
- Nicouj
- Professionnel de Prise2Tete
- Enigmes résolues : 27
- Messages : 330
Informatque et élimination des doublons
Pour répondre à Barbulle et à quiconque se poserait une question similaire à "Y-a-t'il une fonction qui permet de créer des listes à partir de deux éléments ?".
Pour créer une liste à deux éléments, nous avons en fait tout le matériel nécessaire. Nous avons une liste vide. Appelons-la par exemple "Vide". Nous avons une fonction qui permet d'ajouter un élément en tête d'une liste. Appelons-la "Ajouter". Je veux créer la liste constituée des éléments x et y : [x; y]. Pour cela, je pars de la liste vide et j'ajoute y en tête, puis x en tête.
Ce qui nous donnerait Ajouter(x, Ajouter(y, Vide)).
Edit : tiens je viens de m'apercevoir que j'ai oublié dans l'énoncé la fonction qui permet d'ajouter un élément en tête d'une liste ><. je rectifie
#6 - 18-11-2010 14:20:53
- Barbabulle
- Professionnel de Prise2Tete
- Enigmes résolues : 49
- Messages : 237
Informaitque et élimination des doublons
Alors voilà ma solution pour la première partie (je réfléchis toujours à la seconde ) L = liste V = liste vide.
l'idée est la suivante : si la liste est vide, je renvoie une liste vide si la liste ne contient qu'un seul élément, je renvoie cette liste si la liste contient deux éléments, je les compare : s'ils sont égaux, j'en supprime un en revoie donc une liste ne contenant qu'un seul élément s'ils sont bien "rangés", je renvoie la liste sinon j'intervertis les deux éléments et renvoie cette nouvelle liste si la liste contient plus de deux éléments, je compare les deux premiers s'ils sont égaux, j'en supprime un et rappelle récursivement ma fonction sur cette nouvelle liste s'ils sont bien rangés, je crée une nouvelle liste avec le même premier élément et un appel récursif sur la queue sinon, j'intervertis les deux éléments et je rappelle récursivement ma fonction sur cette nouvelle liste (j'aurais pu optimiser en faisant pareil qu'au cas précédent après l'inversion des deux premier membres, ça fait un appel récursif en moins, mais bon...)
Il me semble que ça fonctionne, à un petit détail près, je ne suis pas sûr que ça s'arrête un jour ! Mais bon, en terme de complexité, on est en n², en imaginant que chaque appel à la fonction doublons prenne 1ms, si on a une liste de 100 éléments à traiter, on a un maximum de 100²=10 secondes de traitement. Donc après mettons 20 secondes, on peut faire un CTRL+C et vérifier la mémoire, on devrait y trouver notre liste sans doublons et en plus bien rangée
voilà voilà voilà...
La paix dans le monde n'est pas menacée par les révoltés, mais par les soumis. Georges Bernanos
#7 - 18-11-2010 14:28:14
- scarta
- Elite de Prise2Tete
- Enigmes résolues : 49
- Messages : 1968
Informatique et éliminatioon des doublons
C'est pas faute de l'avoir fait remarquer
Bon alors F(liste) { if liste.empty return liste if liste.tail.empty return liste if liste.head = F(liste.tail).head return F(liste.tail) if liste.head > F(liste.tail).head return join(liste.head, F(liste.tail)) return join(F(liste.tail).head, F(join(liste.head, F(liste.tail).tail))) }
Invariant: F prend en paramètre une liste de taille N et renvoie cette liste triée décroissante sans doublons. Démonstration: Pour N=0 ou 1, c'est la liste elle-même qui est renvoyée donc c'est vrai. On suppose que c'est le cas au rang N. P est le premier élément de la liste, et R est le reste. Comme R fait N éléments, alors on a R'=F(R) qui est une liste triée décroissante sans doublons de R. On a 3 cas différents: - P est égal au 1er élément de R'. Dans ce cas, R' correspond à la liste triée décroissante sans doublons de notre entrée. - P est supérieur au 1er élément de R' qui est triée décroissante, alors P est supérieur à tous les éléments de R' et n'est donc pas redondant avec un autre élément de R'. La liste P+R' est donc la liste triée décroissante sans doublons qui correspond de notre entrée. - P est inférieur au 1er élément de R'. Dans ce cas, le premier élément P' de R' n'est redondant ni les autres éléments de R', ni avec P. De plus, le reste de R' noté R'' fait N-1 éléments, donc P+R'' fait N éléments et du coup F(P+R'') est triée décroissante sans doublons. Au final, P'+F(P+R'') correspond bien à notre entrée triée décroissante sans doublons.
#8 - 18-11-2010 14:52:37
- Nicouj
- Professionnel de Prise2Tete
- Enigmes résolues : 27
- Messages : 330
Infoormatique et élimination des doublons
@Barbulle : pas loin pour la première partie ou l'ordre initial n'est pas réclamé ... Sauf que ton programme ne s'arrêtera jamais des lors qu'il y a + de deux éléments ^^. Mais tu y es presque.
@Scarta : au temps pour moi, comme "append" correspond en général au nom de la fonction de concaténation dans les langages, j'ai cru que tu réclamais la concaténation ^^.
#9 - 18-11-2010 18:52:47
- Barbabulle
- Professionnel de Prise2Tete
- Enigmes résolues : 49
- Messages : 237
Informatiqu eet élimination des doublons
En fait, si je remplace mon avant dernier test
par
Mon programme s'arrête (ouf!). Le problème, c'est qu'il ne détecte plus les doublons en début de liste (après une inversion)... Solution envisagée : appliquer la méthode à elle même un nombre suffisant de fois ! si je fais doublons(doublons(doublons(...(doublons(liste))))), ça fini par marcher !
Mais bon, j'ai quand même un programme de test maintenant :p
La paix dans le monde n'est pas menacée par les révoltés, mais par les soumis. Georges Bernanos
#10 - 18-11-2010 21:44:44
- scarta
- Elite de Prise2Tete
- Enigmes résolues : 49
- Messages : 1968
informatique et éliminztion des doublons
Arf, j'avais pas vu la question 2
F(liste) { if liste.empty return liste if liste.tail.empty return liste if liste.head = liste.tail.head return F(liste.tail) else return join(liste.head, join(liste.tail.head, F(join(liste.head, F(liste.tail).tail)))) }
Invariant: F prend en paramètre une liste de taille N et renvoie cette liste sans doublon avec conservation de l'ordre d'apparition Démonstration: Pour N=0 ou 1, c'est la liste elle-même qui est renvoyée donc c'est vrai. On suppose que c'est le cas au rang N. Au rang N+1: On note L notre liste. ° signifie l'élément 0 et ~ signifie la fin d'une liste
Cas 1: L° = ( L~)° : les deux premiers éléments sont les mêmes. Comme L~ contient N éléments, F(L~) est L~ sans doublon avec conservation de l'ordre d'apparition. On peut donc renvoyer F(L~)
Cas 2: L° <> (L~)° : les deux premiers éléments sont distincts. Quelques propositions pour ce cas ci L~ compte N éléments => F(L~) = L~ sans doublon avec conservation de l'ordre d'apparition => F(L~) commence par (L~)° => (A) F(L~)~ ne contient pas (L~)° (premier élément et pas de doublon)
F(L~) compte au plus N éléments => F(L~)~ compte au plus N-1 éléments => L° + F(L~)~ compte au plus N éléments => F(L° + F(L~)~) = L° + F(L~)~ sans doublon avec conservation de l'ordre d'apparition => F(L° + F(L~)~) commence par L° => (B) F(L° + F(L~)~)~ ne contient pas L° (premier élément et pas de doublon)
(L~)° + F(L° + F(L~)~)~ ne contient pas de doublon (d'après le résultat A) (L~)° + F(L° + F(L~)~)~ ne contient pas L° (d'après le résultat B) => L° + (L~)° + F(L° + F(L~)~)~ ne contient pas de doublons L'ordre est bien respecté, car L° arrive en tête, suivi de (L~)° puis du reste dont l'ordre est conservé par F
#11 - 19-11-2010 19:04:57
- Yannek
- Passionné de Prise2Tete
- Enigmes résolues : 10
- Messages : 60
informatiqur et élimination des doublons
Partie 1 & 2 (suite aux différentes indications de Nicouj **********************************************
Fonction f(L : Liste) : Liste; Début Si (EstVide(L)) alors retourner L sinon Si (EstVide(Queue(L)) alors retourner L sinon Si (Tete(L)=Tete(Queue(L))) alors retourner f(Queue(L)) sinon retourner Ajout(Tete(L),f(Ajout(Tete(Queue(L)),Queue(f(Ajout(Tete(L),Queue(Queue(L)))))))) FinSi FinSi FinSi Fin
[pour la partie 1 j'avais d'abord retourner Ajout(Tete(f(Queue(L))),f(Ajout(Tete(L),Queue(f(Queue(L)))))) ]
#12 - 20-11-2010 11:14:21
- Nicouj
- Professionnel de Prise2Tete
- Enigmes résolues : 27
- Messages : 330
Informtique et élimination des doublons
Nous avons une excellente réponse de Scarta pour les deux parties, avec preuve du résultat de ses programmes.
Très bonne réponse également de Yannek pour la première partie pour l'instant (et tres proche de la deuxième partie )
Barbabulle est proche de la solution de la première partie mais il manque encore quelque chose ^^.
Pour ceux qui ne sont pas familiers avec la programmation récursive, c'est la même façon de penser que lorsqu'on fait une preuve par récurrence (induction).
- D'abord on définit le résultat de la fonction pour le/les cas de base. (Typiquement pour les listes, le/les cas de base sont si la liste en paramètre est vide, ou bien a un/deux élément )
- Ensuite on définit le cas général où on exploite le fait que la fonction doit marcher (par récurrence) sur des données "plus petite" que le paramètre. ( par ex, pour les liste, on va pouvoir appliquer la fonction aveuglément sur une liste avec strictement moins d'élément que celle de départ)
Pour la partie 1 Spoiler : [Afficher le message] Si la liste est triée, n'est-ce pas plus facile de repérer les doublons ?
Pour la partie 2 Spoiler : [Afficher le message] On oublie le tri car la fonction doit garder l'ordre d'apparition des éléments. Si j'applique la fonction sur une liste, qu'est-ce que je peux dire sur la taille du résultat par rapport à la liste de départ ? la "tête" du résultat ? la "queue" du résultat ?
#13 - 20-11-2010 11:32:49
Infomatique et élimination des doublons
Bonjour,
A défaut de répondre à l'énigme, trois exemples qui pourraient vous donner envie de découvrir /Python/ :
sorted([1,2,4,2,4,3,1]) [1, 1, 2, 2, 3, 4, 4]
set([1, 2, 4, 2, 4, 3, 1]) set([1, 2, 3, 4])
list(set([1, 2, 4, 2, 4, 3, 1])) [1, 2, 3, 4]
Évidemment, on peut faire plus compliqué.
#14 - 20-11-2010 15:17:04
- clementmarmet
- Elite de Prise2Tete
- Enigmes résolues : 34
- Messages : 1329
- Lieu: I'm in spaaaace!!
informatique er élimination des doublons
n'ayant que des connaissances basiques en programmation, je vais essayer en langage commun:
il récupère la première valeur; il la teste avec la valeur suivante, puis avec la suivante; (...) si il trouve deux valeurs identiques, (=) il supprime l'autre -donc pas celle dont on se sert pour l'instant comme témoin-; une fois la liste entièrement balayée, il passe à la deuxième
je ne suis pas sûr
Spoiler : [Afficher le message] t'as eu de la chance j'ai essayé de le faire en brainfuck
eki eki eki pa tang!!
#15 - 21-11-2010 21:42:07
- scarta
- Elite de Prise2Tete
- Enigmes résolues : 49
- Messages : 1968
Informattique et élimination des doublons
Tu aurais pu, vu que BF est "turing-complet" autrement dit on peut faire avec tout ce qu'on peut faire avec un ordinateur
#16 - 22-11-2010 11:11:14
- Nicouj
- Professionnel de Prise2Tete
- Enigmes résolues : 27
- Messages : 330
Informatique et éliminaton des doublons
Bonnes réponses de scarta et Yanneck. Bravo supplémentaire a scarta qui offre des preuves complètes.
Barbulle était proche de la première partie.
clementmarmet : en fait ce que tu décris est typiquement ce qu'on ferait pour enlever les doublons, mais avec les contraintes de l'énigme justement ce n'est pas possible. Ça aurait été plus un exo banal d'initiation a la programmation qu'une énigme :-p
Sinon même si BF est T-complete, je mets au défi quiconque de résoudre l'énigme en BF :-p. En fait vu que de toute façon les contraintes de l'énoncé n'ont aucun sens en BF, je serai de toute façon épaté de voir un programme qui élimine les doublons d'une liste en BF ^^
#17 - 22-11-2010 11:42:59
- scarta
- Elite de Prise2Tete
- Enigmes résolues : 49
- Messages : 1968
informatique et élilination des doublons
#18 - 23-11-2010 22:08:12
- scarta
- Elite de Prise2Tete
- Enigmes résolues : 49
- Messages : 1968
Informtaique et élimination des doublons
Et bim !
Ne pas essayer avec DCode (on ne peut pas taper ses propres entrées). Plutôt avec BrainFuck.tk
Description: Taper en entrée une série de nombres séparés par des virgules; la sortie est la liste sans doublons triée croissante.
Détails: Ce programme réalise les opérations suivantes - Lecture d'une série de caractères représentant des entiers base 10 séparés par des virgules - recomposition des entiers en fonction des caractères - algo similaire plus ou moins à la question 1 - décomposition des entiers du résultats en une série de chiffres en base 10 - écriture des caractères correspondants aux chiffres.
#19 - 23-11-2010 22:27:17
- Barbabulle
- Professionnel de Prise2Tete
- Enigmes résolues : 49
- Messages : 237
informatiqie et élimination des doublons
Impressionnant ! Et surtout fonctionnel ! Tu l'as fait à la régulière ou bien via un langage de plus haut niveau ?
La paix dans le monde n'est pas menacée par les révoltés, mais par les soumis. Georges Bernanos
#20 - 23-11-2010 23:29:32
- scarta
- Elite de Prise2Tete
- Enigmes résolues : 49
- Messages : 1968
Informatique et élimintion des doublons
C'est fait à l'ancienne, c'est pour ça que ça ne pèse que 723 octets. Par contre il y a une limitation que je n'ai pas indiqué: le zéro est utilisé pour délimiter les listes, donc il n'est pas possible d'avoir un zéro dans notre liste d'entrée.
Mots clés des moteurs de recherche
|
|