π
<-

[Mini-Challenge Basic #10] : Conjecture de Syracuse

Sous-forums réunissant les mini-challenges en TI-Basic Nspire

[Mini-Challenge Basic #10] : Conjecture de Syracuse

Unread postby davidElmaleh » 12 Jul 2014, 22:38

Le but de ce défi est de créer une fonction syracuse(u0) qui donne, en sortie, une liste de dimension 3 contenant le nombre d'itérations i tel que
$mathjax$u_i = 1$mathjax$
après passage de u0 par la suite de Syracuse définie par :

Image


le terme maximal de la suite ainsi que le plus petit indice n tel que
$mathjax$u_{n+1} <= u_0$mathjax$
. Ces données sont aussi appelées temps de vol, altitude maximale et temps de vol en altitude.

Il va falloir gérer à la fois la longueur de l'algorithme et sa rapidité :). En effet, chaque algorithme aura une note. Par exemple, un algorithme de n caractères et qui répond en x secondes pour une entrée u0 aura une note égale à : n*50%+x*log(u0)*50% (le log est utilisé car u0 va être grand aussi, c'est une fonction croissante et donc, plus u0 est grand et plus. Bien entendu les notes seront attribuées en fonction du u0 d'entrée. Un exemple plus concret : un algorithme de 50 caractères qui répond au bout de 2.53 secondes pour u0=10^6 aura une note de 32.59.
Le gagnant sera le créateur de l'algorithme qui possédera le nombre de points le plus faible.

L'algorithme devra être présenté comme celui-ci :

Code: Select all
Define syracuse(u0)=
Func
VOTRECODE
EndFunc


On déterminera la longueur de l'algorithme en comptant le nombre de caractères de VOTRECODE.

NB :

  • On entrera un nombre u0 positif.
  • Si l'algorithme n'est pas exact (s'il ne sors pas le bon nombre d'itérations), il n'est pas noté est donc son créateur ne concourt pas.
  • Le retour à la ligne est considéré comme un caractère (car remplacé par : si le code est en ligne)
  • Les espaces ne sont pas comptés (pour l'indentation par exemple)
  • La ligne "Local" n'est pas comptée
  • Les noms des variables, peu importe leur longueur, auront une longueur de 1 (car d:=1 ou diviseur:=1 revient au même après tout :p)


Mais, ce n'est pas fini ! À l'aide de cet algorithme vous devrez créer un second qui permettra de trouver le nombre qui possède le plus grand temps de vol entre 1 et 10^7 !
Cette fonction renverra une liste de dimension 2 avec les deux données recherchées : le nombre en entrée et le temps de vol.
Là aussi, vous serez évalué sur la durée et la longueur du programme et vous aurez une seconde note (si le résultat trouvé est juste). La note finale sera donnée par une moyenne des deux notes.

Bonne chance ;)

PS : Mon score au premier algorithme, en ne me cassant pas trop la tête : 79.5771 (avec u0 = 2361235441021745907775 qui correspond au nombre connu aujourd'hui dont le temps de vol est maximal)

--------------------------Scores 1er Algo (avec u0 = 2361235441021745907775)
davidElmaleh : 79.5771
Critor: 57.1198
Bisam : 52.9595
--------------------------Scores 2e Algo
Image
User avatar
davidElmalehProgrammeur
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Level up: 19.6%
 
Posts: 409
Images: 9
Joined: 14 Oct 2012, 23:30
Location: Paris 19
Gender: Male
Calculator(s):
MyCalcs profile
Class: PSI*

Re: [Mini-Challenge Basic #10] : Conjecture de Syracuse

Unread postby critor » 12 Jul 2014, 23:53

Tu devrais préciser avec quelle Nspire tu testes (ClickPad, TouchPad, CX, logiciel...).

Parce que en ce qui me concerne, ton dernier exemple est instantané sous le logiciel Nspire.
Image
User avatar
critorAdmin
Niveau 19: CU (Créateur Universel)
Niveau 19: CU (Créateur Universel)
Level up: 53.4%
 
Posts: 42393
Images: 17088
Joined: 25 Oct 2008, 00:00
Location: Montpellier
Gender: Male
Calculator(s):
MyCalcs profile
YouTube: critor3000
Twitter: critor2000
GitHub: critor

Re: [Mini-Challenge Basic #10] : Conjecture de Syracuse

Unread postby davidElmaleh » 12 Jul 2014, 23:55

Sous le logiciel, mais j'utilise un script Lua pour mesurer le temps. Mais, en fait, le premier algo est plus orienté sur la longueur de celui-ci. Tandis que le deuxième, sur le temps d'execution ;)
Image
User avatar
davidElmalehProgrammeur
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Level up: 19.6%
 
Posts: 409
Images: 9
Joined: 14 Oct 2012, 23:30
Location: Paris 19
Gender: Male
Calculator(s):
MyCalcs profile
Class: PSI*

Re: [Mini-Challenge Basic #10] : Conjecture de Syracuse

Unread postby critor » 12 Jul 2014, 23:57

Ah ok, c'est pour ça.
Je n'ai codé que le 1er pour le moment.

L'ennui avec le logiciel, c'est que nous n'aurons pas tous les mêmes temps d'exécution avec le même algo...
Image
User avatar
critorAdmin
Niveau 19: CU (Créateur Universel)
Niveau 19: CU (Créateur Universel)
Level up: 53.4%
 
Posts: 42393
Images: 17088
Joined: 25 Oct 2008, 00:00
Location: Montpellier
Gender: Male
Calculator(s):
MyCalcs profile
YouTube: critor3000
Twitter: critor2000
GitHub: critor

Re: [Mini-Challenge Basic #10] : Conjecture de Syracuse

Unread postby davidElmaleh » 12 Jul 2014, 23:58

Peux-tu me l'envoyer? Comme ca j'évalue ton score..
Image
User avatar
davidElmalehProgrammeur
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Level up: 19.6%
 
Posts: 409
Images: 9
Joined: 14 Oct 2012, 23:30
Location: Paris 19
Gender: Male
Calculator(s):
MyCalcs profile
Class: PSI*

Re: [Mini-Challenge Basic #10] : Conjecture de Syracuse

Unread postby critor » 13 Jul 2014, 00:01

Cela ne me dérange pas de le publier, et si quelqu'un réussit à l'améliorer tant mieux.
Mais pour le moment, j'aurai du mal à améliorer en performances un algo qui est déjà instantané.

Algo n°1 donc, sauf erreur de ma part:
Image

Code source sans prettyprint afin de mieux compter les caractères:
Code: Select all
Define syracuse(u0)=
Func
   Local i,m,u,n
   0→i
   u0→u
   u→m
   0→n
   While u>1
      piecewise(((u)/(2)),mod(u,2)=0,3*u+1)→u
      If n≤0 and u≤u0
         i-1→n
      If u>m
         u→m
      i+1→i
   EndWhile
   {i,m,n}
EndFunc

(supprimé le return après la capture d'écran)
Image
User avatar
critorAdmin
Niveau 19: CU (Créateur Universel)
Niveau 19: CU (Créateur Universel)
Level up: 53.4%
 
Posts: 42393
Images: 17088
Joined: 25 Oct 2008, 00:00
Location: Montpellier
Gender: Male
Calculator(s):
MyCalcs profile
YouTube: critor3000
Twitter: critor2000
GitHub: critor

Re: [Mini-Challenge Basic #10] : Conjecture de Syracuse

Unread postby critor » 13 Jul 2014, 00:18

Algo n°1 corrigé:
Image

Code: Select all
Define syracuse(u0)=
Func
   Local i,m,u,n
   0→i
   u0→u
   u→m
   0→n
   While u>1
      piecewise(((u)/(2)),mod(u,2)=0,3*u+1)→u
      If n≤0 and u≤u0
         i→n
      If u>m
         u→m
      i+1→i
   EndWhile
   {i,m,n}
EndFunc
Image
User avatar
critorAdmin
Niveau 19: CU (Créateur Universel)
Niveau 19: CU (Créateur Universel)
Level up: 53.4%
 
Posts: 42393
Images: 17088
Joined: 25 Oct 2008, 00:00
Location: Montpellier
Gender: Male
Calculator(s):
MyCalcs profile
YouTube: critor3000
Twitter: critor2000
GitHub: critor

Re: [Mini-Challenge Basic #10] : Conjecture de Syracuse

Unread postby davidElmaleh » 13 Jul 2014, 00:39

Score de critor : 57.1198

Comment s'auto-évaluer?

Je prends l'exemple de critor :
  • Commençons par compter le nombre de caractère:
    • On enlève les lignes "Define..", Func, EndFunc et Local
    • On remplace tous les noms des variables par 1 caractère : par exemple u0 devient u
    • On supprime les retours à la ligne qu'on remplace par des :
  • Puis mesurons le temps d’exécution du programme à l'aide du script lua suivant:
    Code: Select all
    function on.enterKey()
        local tstart = timer.getMilliSecCounter()
        math.evalStr("syracuse(2361235441021745907775)")
        local tend = timer.getMilliSecCounter()
        print(tend-tstart)
    end

Par exemple, pour le script de critor :
Code: Select all
Define syracuse(u0)=
Func
   Local i,m,u,n
   0→i
   u0→u
   u→m
   0→n
   While u>1
      piecewise(((u)/(2)),mod(u,2)=0,3*u+1)→u
      If n≤0 and u≤u0
         i→n
      If u>m
         u→m
      i+1→i
   EndWhile
   {i,m,n}
EndFunc


devient :
Code: Select all
0→i:u→u:u→m:0→n:Whileu>1:piecewise(((u)/(2)),mod(u,2)=0,3*u+1)→u:Ifn≤0andu≤u:i→n:Ifu>m:u→m:i+1→i:EndWhile:{i,m,n}


Donc la longueur de l'algo est de 113 caractères et son temps d'exéction est de 58 ms. Ce qui donne un score de 57.1198
Image
User avatar
davidElmalehProgrammeur
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Level up: 19.6%
 
Posts: 409
Images: 9
Joined: 14 Oct 2012, 23:30
Location: Paris 19
Gender: Male
Calculator(s):
MyCalcs profile
Class: PSI*

Re: [Mini-Challenge Basic #10] : Conjecture de Syracuse

Unread postby Bisam » 13 Jul 2014, 01:00

Mon algo est très proche de celui de critor mais un poil plus court (et peut-être même plus rapide) :
Code: Select all
Define syracuse(u0)=
Func
Local u,i,m,p
u0→u
0→i
0→p
u→m
While u>1
  when(mod(u,2)=0,u/2,3*u+1)→u
  If p=0 and u≤u0
    i→p
  If u>m
    u→m
  i+1→i
EndWhile
{i,m,p}
EndFunc
User avatar
BisamAdmin
Niveau 15: CC (Chevalier des Calculatrices)
Niveau 15: CC (Chevalier des Calculatrices)
Level up: 69.6%
 
Posts: 5670
Joined: 11 Mar 2008, 00:00
Location: Lyon
Gender: Male
Calculator(s):
MyCalcs profile

Re: [Mini-Challenge Basic #10] : Conjecture de Syracuse

Unread postby critor » 13 Jul 2014, 01:59

Pour l'algo n°2, j'ai tenté d'éviter d'avoir à dérouler 10 millions de suites.

Pour cela je commence par la valeur initiale la plus élevée et utilise des listes retenant ce que je sais et ce que je ne sais pas sur les temps de vol correspondants à tous les termes rencontrés.

Sur les exemples testés, j'obtiens le temps de vol maximal des n suites en n'en déroulant qu'environ 27%:
Image

Mais hélas, le volume de données nécessaire selon cette implémentation explose rapidement la capacité limite des listes en TI-Basic. :(
Image
User avatar
critorAdmin
Niveau 19: CU (Créateur Universel)
Niveau 19: CU (Créateur Universel)
Level up: 53.4%
 
Posts: 42393
Images: 17088
Joined: 25 Oct 2008, 00:00
Location: Montpellier
Gender: Male
Calculator(s):
MyCalcs profile
YouTube: critor3000
Twitter: critor2000
GitHub: critor

Next

Return to Mini-Challenges

Who is online

Users browsing this forum: ClaudeBot [spider] and 0 guests

-
Search
-
Social TI-Planet
-
Featured topics
Comparaisons des meilleurs prix pour acheter sa calculatrice !
"1 calculatrice pour tous", le programme solidaire de Texas Instruments. Reçois gratuitement et sans aucune obligation d'achat, 5 calculatrices couleur programmables en Python à donner aux élèves les plus nécessiteux de ton lycée. Tu peux recevoir au choix 5 TI-82 Advanced Edition Python ou bien 5 TI-83 Premium CE Edition Python.
Enseignant(e), reçois gratuitement 1 exemplaire de test de la TI-82 Advanced Edition Python. À demander d'ici le 31 décembre 2024.
Aidez la communauté à documenter les révisions matérielles en listant vos calculatrices graphiques !
1234
-
Donations / Premium
For more contests, prizes, reviews, helping us pay the server and domains...
Donate
Discover the the advantages of a donor account !
JoinRejoignez the donors and/or premium!les donateurs et/ou premium !


Partner and ad
Notre partenaire Jarrety Calculatrices à acheter chez Calcuso
-
Stats.
1655 utilisateurs:
>1635 invités
>14 membres
>6 robots
Record simultané (sur 6 mois):
6892 utilisateurs (le 07/06/2017)
-
Other interesting websites
Texas Instruments Education
Global | France
 (English / Français)
Banque de programmes TI
ticalc.org
 (English)
La communauté TI-82
tout82.free.fr
 (Français)