» »

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?

Isotropic ::

vau, kar huda naloga :D

techfreak :) ::

Koliko si že sam napisal oz. kje se ti je ustavilo?

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.

Spura ::

Imas manj kot 9! * 4^9 opcij kako razporedit stvari. Naredis search po tem prostoru.

technolog ::

Spura, oklepaje moraš tud upoštevat.

(90+21-11)*5 recimo ni v tvojem prosturu.

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

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.

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.

Spura ::

technolog je izjavil:

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…

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]


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Postfiksni izraz - računanje

Oddelek: Šola
141736 (1375) lebdim
»

Matematika: Deljivost naravnih in celih števil.

Oddelek: Šola
193296 (3098) lebdim
»

Asus EEE Transformer in slovenski znaki

Oddelek: Kaj kupiti
51087 (778) DimmniBurek
»

Matematika na maturi 2004

Oddelek: Šola
422798 (2093) s5cougar
»

matematika - verjetnost

Oddelek: Šola
92311 (2180) losnah

Več podobnih tem