Forum » Programiranje » Python - naloga z računanjem
Python - naloga z računanjem
ktka ::
Rabim pomoč. Navodilo naloge je tako:
---------------------------------------------------------------------------------------------------------------------
Vhodni podatki
Vhod sestavlja več primerov. Vsak je dolg eno vrstico in vsebuje n (največ 11) celih števil med (vključno) 0 in 100. Prvih n-1 števil predstavlja operande, zadnje pa rezultat računa.
Izhodni podatki
Vstavi operatorje +, -, *, /, oklepaje in znak =, tako da bo iz niza števil nastala veljavna enakost. Pri tem je potrebno upoštevati, da znajo učenci računati samo do 100, zato morajo biti vsi vmesni rezultati cela števila med 0 in 100. Če v računu uporabiš deljenje, se mora deljenje iziti brez ostanka. Znak = mora biti vedno pred zadnjim številom.
Če ugotoviš, da nikakor ni mogoče sestaviti veljavnega računa (kar pomeni, da se je učitelj očitno zmotil med sestavljanjem testa), izpiši samo vrstico z besedo "nemogoce".
Če obstaja več pravilnih računov za iste podatke, izpiši kateregakoli izmed njih (npr. nič ni narobe, če ima izraz preveč oklepajev, če je le sintaktično in računsko pravilen).
Primer
Vhod
3 4 5 35
90 21 11 5 6
3 1 5
Izhod
(3+4)*5=35
90/(21-(11-5))=6
nemogoce
--------------------------------------------------------------------------------------------------------------------
Zanima me, kako naj se naloge lotim. Kako naj vstavljam znake?
---------------------------------------------------------------------------------------------------------------------
Vhodni podatki
Vhod sestavlja več primerov. Vsak je dolg eno vrstico in vsebuje n (največ 11) celih števil med (vključno) 0 in 100. Prvih n-1 števil predstavlja operande, zadnje pa rezultat računa.
Izhodni podatki
Vstavi operatorje +, -, *, /, oklepaje in znak =, tako da bo iz niza števil nastala veljavna enakost. Pri tem je potrebno upoštevati, da znajo učenci računati samo do 100, zato morajo biti vsi vmesni rezultati cela števila med 0 in 100. Če v računu uporabiš deljenje, se mora deljenje iziti brez ostanka. Znak = mora biti vedno pred zadnjim številom.
Če ugotoviš, da nikakor ni mogoče sestaviti veljavnega računa (kar pomeni, da se je učitelj očitno zmotil med sestavljanjem testa), izpiši samo vrstico z besedo "nemogoce".
Če obstaja več pravilnih računov za iste podatke, izpiši kateregakoli izmed njih (npr. nič ni narobe, če ima izraz preveč oklepajev, če je le sintaktično in računsko pravilen).
Primer
Vhod
3 4 5 35
90 21 11 5 6
3 1 5
Izhod
(3+4)*5=35
90/(21-(11-5))=6
nemogoce
--------------------------------------------------------------------------------------------------------------------
Zanima me, kako naj se naloge lotim. Kako naj vstavljam znake?
ktka ::
Veliko sem že probala. Ne vem kako naj ustavljam znake. Jst sm si neki zamislna, ampak bo miljon if stavkov, in to ni ravno najboljše. Rabim kakšno idejo, potem bom probala sama.
Genetic ::
Postfixna notacija, skladovni avtomat.
Infix -> Postfix: (3+4)*5=35 -> 3,4,+,5,*
Infix -> Postfix: 90/(21-(11-5))=6 -> 90,21,11,5,-,-,/
Postfix niz je pravilen, ce je v njem stevilo operandov == stevilo stevil -1 in ce ima vedno vec stevil kot operandov:
3,4,5,+,* pravilen = 3*(4+5)
3,4,+,* nepravilen = 3+4, ostane *
3,+,5,6,* nepravilen, pri + ima eno stevilo (3) in en operand (+), stevil mora biti vec
Primer: postfix = [3,4,+,5,*]
stack = []
push(3); stack=[3]
4: push(4); stack=[4,3]
+: st2=pop()=4; st1=pop()=3; st1+st2=7; push(7); stack=[7]
5: push(5); stack=[5,7]
*: st2=pop()=5;st1=pop()=7; st1*st2=35
Konec postfix niza: preveris, ce je na stacku samo en element ter ce je njegova vrednost enaka rezultatu: pop()=35==35
Torej, kaj moras narediti:
array operatorjev = [+,-,*,/]
array stevil, razen rezultata = [N1,N2,..,Nk]
Naredis vse mozne kombinacije postfix izrazov, stevila ostanejo v vrstnem redu:
N1,N2,..,Nk,+,+,..,+ ;kjer je stevilo plusov == k-1
..
N1,N2,/,N3,/,..,Nk,/
..
Primer: 3,4,5
3,4,5,+,+
3,4,5,+,-
3,4,5,+,*
3,4,5,+,/
..
3,4,5,/,/
3,4,+,5,+
3,4,+,5,-
..
3,4,/,5,/
Vsak postfix izracunas, pri tem se preverjas:
- pri / dobis ostanek -> invalid, next postfix;
- pri - negativno stevilo -> invalid, next postfix;
- pri + ali * rezultat > 100 -> invalid, next postfix;
- ce je izracun valid, se preveris, ali je rezultat pravilen
- rezultat pravilen -> pretvoris v infix obliko z oklepaji, izpises
- rezultat ni pravilen -> pojdi na naslednji postfix
- po vseh postfixih ni pravilnega rezultata -> izpisi napako
Infix -> Postfix: (3+4)*5=35 -> 3,4,+,5,*
Infix -> Postfix: 90/(21-(11-5))=6 -> 90,21,11,5,-,-,/
Postfix niz je pravilen, ce je v njem stevilo operandov == stevilo stevil -1 in ce ima vedno vec stevil kot operandov:
3,4,5,+,* pravilen = 3*(4+5)
3,4,+,* nepravilen = 3+4, ostane *
3,+,5,6,* nepravilen, pri + ima eno stevilo (3) in en operand (+), stevil mora biti vec
Primer: postfix = [3,4,+,5,*]
stack = []
push(3); stack=[3]
4: push(4); stack=[4,3]
+: st2=pop()=4; st1=pop()=3; st1+st2=7; push(7); stack=[7]
5: push(5); stack=[5,7]
*: st2=pop()=5;st1=pop()=7; st1*st2=35
Konec postfix niza: preveris, ce je na stacku samo en element ter ce je njegova vrednost enaka rezultatu: pop()=35==35
Torej, kaj moras narediti:
array operatorjev = [+,-,*,/]
array stevil, razen rezultata = [N1,N2,..,Nk]
Naredis vse mozne kombinacije postfix izrazov, stevila ostanejo v vrstnem redu:
N1,N2,..,Nk,+,+,..,+ ;kjer je stevilo plusov == k-1
..
N1,N2,/,N3,/,..,Nk,/
..
Primer: 3,4,5
3,4,5,+,+
3,4,5,+,-
3,4,5,+,*
3,4,5,+,/
..
3,4,5,/,/
3,4,+,5,+
3,4,+,5,-
..
3,4,/,5,/
Vsak postfix izracunas, pri tem se preverjas:
- pri / dobis ostanek -> invalid, next postfix;
- pri - negativno stevilo -> invalid, next postfix;
- pri + ali * rezultat > 100 -> invalid, next postfix;
- ce je izracun valid, se preveris, ali je rezultat pravilen
- rezultat pravilen -> pretvoris v infix obliko z oklepaji, izpises
- rezultat ni pravilen -> pojdi na naslednji postfix
- po vseh postfixih ni pravilnega rezultata -> izpisi napako
Randomness ::
- inicializacija: potencialno delno rešitev predstavimo s seznamom
- rekurzija: izvajamo, dokler je dolžina seznama večja od 1, v nasprotnem rekurzijo ustavimo in preverimo rezultat
Na delni rešitvi izvedemo vse dovoljene operacije. Operacije vedno izvajamo na vseh zaporednih dvojicah, pri čemer ohranimo vrstni red operandov.
Primer:
[3, 4, 5] -> [[7, 5], [3, 9], [12, 5], [3, 20]] (tukaj smo zavrgli vse nedovoljene možnosti: 3-4, 4-5, 3/4, 4/5)
[7, 5] -> [[12], [2], [35]]
[12] bad
[2] bad
[35] ok
[3, 9] -> [[12], [27]]
[12] bad
[27] bad
[12, 5] -> [[17], [7], [60]]
[17] bad
[7] bad
[60] bad
[3, 20] -> [[23], [60]]
[23] bad
[60] bad
K tej rešitvi je potrebno seveda dodati še ustrezen "bookkeeping", da lahko rekonstruiramo iskani izraz.
- rekurzija: izvajamo, dokler je dolžina seznama večja od 1, v nasprotnem rekurzijo ustavimo in preverimo rezultat
Na delni rešitvi izvedemo vse dovoljene operacije. Operacije vedno izvajamo na vseh zaporednih dvojicah, pri čemer ohranimo vrstni red operandov.
Primer:
[3, 4, 5] -> [[7, 5], [3, 9], [12, 5], [3, 20]] (tukaj smo zavrgli vse nedovoljene možnosti: 3-4, 4-5, 3/4, 4/5)
[7, 5] -> [[12], [2], [35]]
[12] bad
[2] bad
[35] ok
[3, 9] -> [[12], [27]]
[12] bad
[27] bad
[12, 5] -> [[17], [7], [60]]
[17] bad
[7] bad
[60] bad
[3, 20] -> [[23], [60]]
[23] bad
[60] bad
K tej rešitvi je potrebno seveda dodati še ustrezen "bookkeeping", da lahko rekonstruiramo iskani izraz.
Grumf ::
Human beings, who are almost unique in having the ability to learn from the
experience of others, are also remarkable for their apparent disinclination
to do so.
experience of others, are also remarkable for their apparent disinclination
to do so.
Spura ::
Spura, oklepaje moraš tud upoštevat.
(90+21-11)*5 recimo ni v tvojem prosturu.
So upostevani v 9!. Samo mogoce sem dal premalo. Sicer pa je vseeno koliko jih je, pac probas vse variante.
Zgodovina sprememb…
- spremenil: Spura ()
Randomness ::
Preiskati je potrebno največ 4^(n-1) (n-1)! (napaka se odpravlja) možnosti, kjer je n (napaka se odpravlja) število operandov. Če izločimo vse neveljavne kombinacije, potem je teh možnosti lahko precej manj.
Zgodovina sprememb…
- spremenilo: Randomness ()
ktka ::
Živjo. Kako naj uporabim rekurzijo, če pa imam funkcijo, ki ima za parameter datoteko? Se opravičujem, ampak takega primera se nisem videla.
kr?en ::
Naredis si pomozno metodo z lastnimi parametri, ki jo klices rekurzivno, in jo uporabis v tej tvoji metodi.
ktka ::
Hvala, sem ugotovila.
Zdej pa še nekaj:
kako naj napišem, da mi dva elementa seznama sešteje, vsoto doda v nov seznam, nato pa v nov seznam doda še vse ostale elemente starega seznama.
[3, 4, 5, 6, 5] -> [7, 5, 6, 5]
Zdej pa še nekaj:
kako naj napišem, da mi dva elementa seznama sešteje, vsoto doda v nov seznam, nato pa v nov seznam doda še vse ostale elemente starega seznama.
[3, 4, 5, 6, 5] -> [7, 5, 6, 5]
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | Postfiksni izraz - računanjeOddelek: Šola | 1721 (1360) | lebdim |
» | Matematika: Deljivost naravnih in celih števil.Oddelek: Šola | 3241 (3043) | lebdim |
» | Asus EEE Transformer in slovenski znakiOddelek: Kaj kupiti | 1081 (772) | DimmniBurek |
» | Matematika na maturi 2004Oddelek: Šola | 2789 (2084) | s5cougar |
» | matematika - verjetnostOddelek: Šola | 2301 (2170) | losnah |