[Défi] Je vous sers un petit algo ?
19 posts
• Page 1 of 2 • 1, 2
[Défi] Je vous sers un petit algo ?
Bon, l'année scolaire est finie ou presque... mais je sens que vous avez encore envie de vous lancer un petit défi.
Voici ce que je vous propose : répondez à la question 9 de ce sujet :
Je vous laisse une totale liberté sur le langage (ou pseudo-langage) utilisé du moment que l'algorithme écrit répond à la question.
Je laisse le sujet en entier car les autres questions peuvent vous aider à comprendre et vous inspirer.
Répondez directement sur le forum en utilisant la balise [code] et éventuellement la balise [spoiler] si vous ne voulez pas influencer les autres.
J'espère que ça vous plaira... bon courage.
PS : N'hésitez pas à mettre un petit mot juste pour dire si vous souhaitez participer... ou non.
Voici ce que je vous propose : répondez à la question 9 de ce sujet :
Je vous laisse une totale liberté sur le langage (ou pseudo-langage) utilisé du moment que l'algorithme écrit répond à la question.
Je laisse le sujet en entier car les autres questions peuvent vous aider à comprendre et vous inspirer.
Répondez directement sur le forum en utilisant la balise [code] et éventuellement la balise [spoiler] si vous ne voulez pas influencer les autres.
J'espère que ça vous plaira... bon courage.
PS : N'hésitez pas à mettre un petit mot juste pour dire si vous souhaitez participer... ou non.
You do not have the required permissions to view the files attached to this post.
-
BisamAdmin
Niveau 15: CC (Chevalier des Calculatrices)- Posts: 5670
- Joined: 11 Mar 2008, 00:00
- Location: Lyon
- Gender:
- Calculator(s):→ MyCalcs profile
Re: [Défi] Je vous sers un petit algo ?
Voila, ma réponse :
Show/Hide spoilerAfficher/Masquer le spoiler
Si j'ai bien compris, on doit carrément déterminer l'écriture de x en base 3 dans ce cas, voila mon code en TI-BASIC
- Code: Select all
Define balance2(x)=
Func
Local bin,reste,i
reste:={}
bin:=""
While x≥3
reste:=augment(reste,{mod(x,3)})
x:=int(((x)/(3)))
EndWhile
reste:=augment(reste,{mod(x,3)})
For i,0,dim(reste)-1
bin:=string(reste[i+1])&"*"&string(3^(i))&"+"&bin
EndFor
Return mid(bin,1,dim(bin)-1)
EndFunc
-
davidElmalehProgrammeur
Niveau 14: CI (Calculateur de l'Infini)- Posts: 409
- Images: 9
- Joined: 14 Oct 2012, 23:30
- Location: Paris 19
- Gender:
- Calculator(s):→ MyCalcs profile
- Class: PSI*
Re: [Défi] Je vous sers un petit algo ?
J'ai bien peur, David, que tu n'aies lu un peu trop en diagonale... mais peut-être y a-t-il quelques éléments un peu compliqués dans l'énoncé.
Clarifions :
1) On appelle développement ternaire classique d'un entier
2) On appelle développement ternaire balancé d'un entier
La question 9) demande de trouver la liste des coefficients
Clarifions :
1) On appelle développement ternaire classique d'un entier
$mathjax$x$mathjax$
une écriture $mathjax$x=t_0+t_1\times 3+t_2\times 3^2+\cdots+ t_n\times 3^n$mathjax$
pour laquelle tous les $mathjax$t_k$mathjax$
sont égaux à 0, 1 ou 2.2) On appelle développement ternaire balancé d'un entier
$mathjax$x$mathjax$
une écriture $mathjax$x=b_0+b_1\times 3+b_2\times 3^2+\cdots+ b_n\times 3^n$mathjax$
pour laquelle tous les $mathjax$b_k$mathjax$
sont égaux à -1, 0 ou 1.La question 9) demande de trouver la liste des coefficients
$mathjax$(b_k)$mathjax$
d'un entier $mathjax$x$mathjax$
donné, en suivant l'algorithme décrit un peu plus haut dans l'énoncé. La fonction doit simplement renvoyer une liste d'entiers.-
BisamAdmin
Niveau 15: CC (Chevalier des Calculatrices)- Posts: 5670
- Joined: 11 Mar 2008, 00:00
- Location: Lyon
- Gender:
- Calculator(s):→ MyCalcs profile
-
davidElmalehProgrammeur
Niveau 14: CI (Calculateur de l'Infini)- Posts: 409
- Images: 9
- Joined: 14 Oct 2012, 23:30
- Location: Paris 19
- Gender:
- Calculator(s):→ MyCalcs profile
- Class: PSI*
Re: [Défi] Je vous sers un petit algo ?
Sympa ça
J'arrive à faire les parties I et II (et la IV ), mais j'ai du mal à comprendre le rapport entre le système ternaire balancé et la partie III...
Je ne suis pas non plus sur de ce que demande la question 9. Tu dis
J'arrive à faire les parties I et II (et la IV ), mais j'ai du mal à comprendre le rapport entre le système ternaire balancé et la partie III...
Je ne suis pas non plus sur de ce que demande la question 9. Tu dis
Mais n'est ce pas ce qui est demandé à la question 5 plutôt?trouver la liste des coefficients (bk) d'un entier x donné, en suivant l'algorithme décrit un peu plus haut dans l'énoncé.
-
m@thieu41Premium
Niveau 11: LV (Légende Vivante)- Posts: 230
- Joined: 20 Jun 2013, 14:24
- Gender:
- Calculator(s):→ MyCalcs profile
- Class: TS
Re: [Défi] Je vous sers un petit algo ?
La question 9) propose une autre façon de faire... (et la question 5 n'est pas guidée, de toute façon).
-
BisamAdmin
Niveau 15: CC (Chevalier des Calculatrices)- Posts: 5670
- Joined: 11 Mar 2008, 00:00
- Location: Lyon
- Gender:
- Calculator(s):→ MyCalcs profile
Re: [Défi] Je vous sers un petit algo ?
Voici ma proposition (en python):
Show/Hide spoilerAfficher/Masquer le spoiler
- Code: Select all
#On retourne la somme de la liste
def somme(l):
s = 0
for nb in l:
s += nb
return s
#la somme cumulée
def somCum(l):
s = 0
i = 1
cum = [0]
for nb in l :
s += nb
cum.append(s)
return cum
#rajoute les poids pour que la balance bascule ou s'équilibre
def equilibre(cote, objectif):
while somme(cote) < objectif:
poidsCum = somCum(poids)
i = n
while poidsCum[i] + somme(cote) >= objectif and i > 0:
i -= 1
cote.append(poids[i])
poids[i] = 0
def balance2(x):
#on récupère les poids possibles
global n
n = 5
i = 0
global poids
poids = []
while i <= 5 :
poids.append(3**i)
i += 1
#on équilibre chaque côté l'un après l'autre
cote1 = [x]
cote2 = []
while somme(cote1) != somme(cote2):
equilibre(cote2, somme(cote1))
equilibre(cote1, somme(cote2))
#on récupère la liste des bk
cote1[0] = 0
b = []
i = 0
while i <= n:
if 3**i in cote1:
b.append(-1)
elif 3**i in cote2:
b.append(1)
else:
b.append(0)
i+=1
print(b)
-
m@thieu41Premium
Niveau 11: LV (Légende Vivante)- Posts: 230
- Joined: 20 Jun 2013, 14:24
- Gender:
- Calculator(s):→ MyCalcs profile
- Class: TS
Re: [Défi] Je vous sers un petit algo ?
Voila donc ma réponse :
Show/Hide spoilerAfficher/Masquer le spoiler
- Code: Select all
Define balance2(x)=
Func
:Local puis,lstbk,lstpuis,i,bk,j
:puis:=round(log(x,3),0)
:lstbk:={}
:lstpuis:={puis}
:bk:={}
:j:=1
:While x≠0
: If x>0 Then
: x:=x-3^(puis)
: lstbk:=augment({1},lstbk)
: ElseIf x<0 Then
: x:=x+3^(puis)
: lstbk:=augment({−1},lstbk)
: EndIf
: If x≠0 Then
: puis:=round(log(abs(x),3),0)
: lstpuis:=augment({puis},lstpuis)
: EndIf
:EndWhile
:For i,0,lstpuis[dim(lstpuis)]
: bk:=augment(bk,{when(i=lstpuis[j],lstbk[j],0)})
: If bk[dim(bk)]≠0 Then
: j:=j+1
: EndIf
:EndFor
:Return bk
:EndFunc
-
davidElmalehProgrammeur
Niveau 14: CI (Calculateur de l'Infini)- Posts: 409
- Images: 9
- Joined: 14 Oct 2012, 23:30
- Location: Paris 19
- Gender:
- Calculator(s):→ MyCalcs profile
- Class: PSI*
Re: [Défi] Je vous sers un petit algo ?
@David : il manque une valeur absolue dans ton premier calcul de logarithme... et il y aura une erreur si x est nul au départ.
Par ailleurs, si x est trop grand au départ, il peut y avoir une erreur dans le calcul du logarithme en base 3... et du coup tout l'algorithme est faussé. Il vaut mieux toujours travailler avec des entiers.
À part ça, ça a l'air de marcher.
@mathieu : En Python, il existe une fonction "sum" qui fait ce que fait ta fonction "somme"... Par ailleurs, tu n'aurais pas dû te limiter à n=5... vois ce que tu peux faire pour modifier cela.
Ceci étant, tu sembles doué pour écrire des algorithmes compréhensibles ! Bravo !
Par ailleurs, si x est trop grand au départ, il peut y avoir une erreur dans le calcul du logarithme en base 3... et du coup tout l'algorithme est faussé. Il vaut mieux toujours travailler avec des entiers.
À part ça, ça a l'air de marcher.
@mathieu : En Python, il existe une fonction "sum" qui fait ce que fait ta fonction "somme"... Par ailleurs, tu n'aurais pas dû te limiter à n=5... vois ce que tu peux faire pour modifier cela.
Ceci étant, tu sembles doué pour écrire des algorithmes compréhensibles ! Bravo !
-
BisamAdmin
Niveau 15: CC (Chevalier des Calculatrices)- Posts: 5670
- Joined: 11 Mar 2008, 00:00
- Location: Lyon
- Gender:
- Calculator(s):→ MyCalcs profile
Re: [Défi] Je vous sers un petit algo ?
Merci !
Voici mes algos q2/5/9:
Voici mes algos q2/5/9:
Show/Hide spoilerAfficher/Masquer le spoiler
- Code: Select all
#la suite u(n)
def u(n):
return (3**(n+1) - 1) / 2
#q2
def ternaire(x, n = -1):
#on cherche n si besoin
if n == -1:
n = 0
while 2 * u(n) < x:
n += 1
#on écrit x en base 3
t = []
i = 0
while i <= n:
t.append(x % 3)
x //= 3
i+=1
return t
#q5
def balance(x, n = -1):
#on cherche n
if n == -1:
n = 0
while -u(n) > x or x > u(n):
n += 1
#on écrit en ternaire balancé
b = []
for tk in ternaire(x + u(n), n) :
b.append(int(tk - 1))
return b
#q9
#la somme cumulée
def somCum(l):
s = 0
i = 1
cum = [0]
for nb in l :
s += nb
cum.append(s)
return cum
#rajoute les poids pour que la balance bascule ou s'équilibre
def equilibre(cote, objectif):
while sum(cote) < objectif:
poidsCum = somCum(poids)
i = len(poids) - 1
while poidsCum[i] + sum(cote) >= objectif and i > 0:
i -= 1
cote.append(poids[i])
poids[i] = 0
def balance2(x, n = -1):
#On cherche n au besoin
if n == -1:
n = 0
while -u(n) > x or x > u(n):
n += 1
#on récupère les poids possibles
global poids
poids = []
i = 0
while i <= n :
poids.append(3**i)
i += 1
#on équilibre chaque côté l'un après l'autre
cote1 = [x]
cote2 = []
while sum(cote1) != sum(cote2):
equilibre(cote2, sum(cote1))
equilibre(cote1, sum(cote2))
#on récupère la liste des bk
cote1[0] = 0
b = []
i = 0
while i <= n:
if 3**i in cote1:
b.append(-1)
elif 3**i in cote2:
b.append(1)
else:
b.append(0)
i+=1
return b
-
m@thieu41Premium
Niveau 11: LV (Légende Vivante)- Posts: 230
- Joined: 20 Jun 2013, 14:24
- Gender:
- Calculator(s):→ MyCalcs profile
- Class: TS
19 posts
• Page 1 of 2 • 1, 2
Return to Maths, physique, informatique et autre...
Who is online
Users browsing this forum: ClaudeBot [spider] and 10 guests