Jump to content

Konkurss 2! (closed)


0xDEAD BEEF
 Share

Recommended Posts

Uģis Lācis

Draugi - flame off!

[..]

 

Jā, nu šeit konkrētas cīņas panesās... Šoreiz gan daļai varētu kremt tas, ka kāds cits ieraudzija vienkāršo algoritmu, uzrakstīja un ātri atkoda uzdevumu. Tāda neliela skaudība, ja varam tā izteikties. :D Gan jāatzīst, ka saprotama un dabiska, jo "loģikas" un "domājamā" uzdevumā pielietot datoru un pilno pārlasi šķiet tāds "daļēji tīrs" piegājiens.

 

Es tik pēdējo komentāru ierakstīšu par šo:

[..]Izdomāt labu modifikāciju - miskuzi, to manuprāt var jebkurš, kuram ir kaut cik prāta.

Šoreiz nevarētu šim piekrist. Ja mazām problēmām pilnā pārlase strādā saprātīgā laikā, tad lielām nē.. Un Dead Beef jau pareizi atsaucās uz NP problēmām. Tā kā laba modifikācija - var nebūt nemaz tik vienkāršs uzdevums.

Link to comment
Share on other sites

Kamēr gaidāt pirmdienu, varbūt kāds uz ātro grib atrisināt 3. klases matemātikas mājasdarbu?

 

Anniņa ir sakrājusi 222 santīmus. 5-santīmnieki un 2-santīmnieki. Kopā ir 66 monētas. Cik ir 5-santīmnieku un cik 2-santīmnieku?

Link to comment
Share on other sites

Леший

P.S. - ja mēs atgrieztos pie šī uzdevuma, tad jau pie n = 12 austeres algoritms (skripts) nebutu izmantojams.

Teorētiski var saīsināt uzdevumu. Konkrēti, šajā piemērā 7 1 7 8 1 1 = 27 bija vairāk ka skaidrs, ka ir jāmeklē 7 1 7 8 1 = 28, nu vismaz šo varēja apgalvot ar diezgan lielu varbūtību.

Link to comment
Share on other sites

Anniņa ir sakrājusi 222 santīmus. 5-santīmnieki un 2-santīmnieki. Kopā ir 66 monētas. Cik ir 5-santīmnieku un cik 2-santīmnieku?

30*5 + 36*2

 

p.s. tx 5 (var droši samazināt līdz 3) šūnām iekš ms excel (blush)

Labots - binary
Link to comment
Share on other sites

Леший

Kamēr gaidāt pirmdienu, varbūt kāds uz ātro grib atrisināt 3. klases matemātikas mājasdarbu?

 

Anniņa ir sakrājusi 222 santīmus. 5-santīmnieki un 2-santīmnieki. Kopā ir 66 monētas. Cik ir 5-santīmnieku un cik 2-santīmnieku?

x+y=66
5x+2y=222
x=66-y
330-5y+2y=222
-3y=-108
y=36
x=66-36=30

  • Patīk 1
Link to comment
Share on other sites

Trešās klases vielu neatceros, bet domāju, ka jā :) Spraužam mērķus augstāk!

 

p.s. ja palīdzi viņam, tad galvenais - nevis iedod risinājumu, bet "izdomā kopā ar viņu"

Labots - binary
Link to comment
Share on other sites

Uģis Lācis
Trešās klases vielu neatceros[..]

 

Nu, manā laikā, manuprāt, divu vienādojumu sistēmas (kaut vai tik primitīvas) 3. klasē vēl nebija... Jautājums, kas bērnam ir mācīts un kas ir mācību vielā. Var jau mēģināt apiet šo te ar kaut kādiem šādiem spriedumiem (pieņemot, ka 3. kalsē ir operācijas ar daļskaitļiem!?):

 

222 izdalam ar 5+2 222/7 = 31.714285714

Redz, ka rezultāts ir tuvs 66/2 = 33, tad attiecība starp 5 un 2 santīmniekiem ir tuva ~ 1:1, tad var pārbaudīt kombinācijas: 29 37; 30 36; 31 35 utt.

 

Bet - šis, visticamāk, ir sarežģītāk, nekā iemācīt vienkāršākās operācijas ar x un y. :sorry:

 

EDIT:

Ok, šajā gadījumā var vienkārši sākt un pārbaudīt 33*5 + 33*2 = ? = 231

Redz, ka pa daudz, samazina 5santīmnieku skaitu, palielina 2santīmnieku skaitu.

32*5 + 34*2 = ? = 228

31*5 + 35*2 = ? = 225

30*5 + 36*2 = ? = 222

 

Voilā.

 

Šis varētu strādāt, vienkārša pieeja, bet ja atbilde nav tuvu 33 33, tad aizņems ilgu laiku, tomēr līdz galam tiks.

Labots - Uģis Lācis
Link to comment
Share on other sites

Manā laikā daļskaitļi, šķiet, bija vēlākās klasēs. Kaut ko pa miglai atceros, ka "nejauši sapratu" kaut kādas parastās darbības ar daļskaitļiem pirms tas vēl bija mācību vielā, un tas laikam notika vismaz 5. klasē (sākot ar 5. klasi, bijām pārcelti uz citu skolu un pie citiem skolotājiem, jo vecajā skolā mācīja tikai pirmās 4 klases).

Link to comment
Share on other sites

Man liekas, ka šis uzdevums ir kļūdas pēc ielikts 3. kasē. Pats 3. klasē gāju 1980. gadā, var jau būt, ka līmenis ir cēlies. :swoon:

Link to comment
Share on other sites

Леший

Pašlaik prastākus vienādojumus māca tikai 4. klasē. Šī ir vai nu kļūda, vai arī viņi gaida, ka bērns meklēs atbildi bruteforce veidā, vai arī šī klase ir speciāli tiem, kas labi rubī matemātiku.

Link to comment
Share on other sites

0xDEAD BEEF

Tādēļ, ka jūs nepareizi risinat to uzdevumu! ;)

Es redzēju līdzīgu 3šajai klasei, bet ar 3 nezināmiem (btw).

x+y=66

5x+2y=222

 

šeit jārīkojas savādāk.

1)

2x + 2y = 132

5x + 2y = 222

2)

5x + 2y - (2x + 2y) = 222 - 132

3x = 90; x = 30;

3)

60 + 2y = 132

2y = 72

y = 36

 

Beefs

Labots - 0xDEAD BEEF
Link to comment
Share on other sites

Uģis Lācis
[..]šeit jārīkojas savādāk.[..]

 

Ta labi. Un ar ko Tavs atrisinājums ir labāks/vienkāršāks/skaistāks? :D

 

Tā metode, ko pielietoji tu, vispārīgā gadījumā saucas "mainīgo izslēgšanas metode" vai "Gausa metode". Man viņu mācīja >= 7. klasē. Pielietojot 3 līdz 5, moš vairāk mainīgajiem. Parasti gan izslēdzām pirmos mainīgos vispirms, bet tu izvēlējies izslēgt otro. Arī derīgs variants.

Labots - Uģis Lācis
Link to comment
Share on other sites

Uģis Lācis

Nu māca ta māca, bet jautājums, vai mūsdienās to dara 3. klasē.

Link to comment
Share on other sites

0xDEAD BEEF

Tur jau tas āķis! :) Tieši tā to dara 3šajā klasē! :)

Viņiem nemāca izteikt x. Viņiem māca ka šitos vienādojumus risināt saskaitot/atņemot tā, lai pazūd mainīgajiem.

Beefs

Link to comment
Share on other sites

Grossmeister

Man vispār škiet sarežģiti saprotamā valodā izskaidrot šī uzdevuma risinājumu trešklasniekam , kaut gan uz doto brīdi nezinu , kas viņiem tur jau būtu samācīts . Man gan te lūdza palīdzību dažu trešklasnieku uzdevumi risināšanā , bet tie bija stipri vienkāršāki , jo nebija no vispārizglītojošās skolas kursa .

Link to comment
Share on other sites

Konkurss, protams, beidzies, bet izskatījās interesants un manām zemajām spējām atbilstošs uzdevums, tāpēc patrenējos pythonā.

 

def get_comb_list(parts, count):
   if count == 1:
    return parts
   less_comb_list = get_comb_list(parts, count - 1)
   comb_list = []
   for p in parts:
    for i in range(len(less_comb_list)):
	    comb_list.append(p + less_comb_list[i])
   return comb_list
# http://www.hlevkin.com/Shell_progr/hellopython.htm
def perm(l):
   # Compute the list of all permutations of l
   if len(l) <= 1:
    return [l]
   r = []  # here is new list with all permutations!
   for i in range(len(l)):
    s = l[:i] + l[i+1:]
    p = perm(s)
    for x in p:
	    r.append(l[i:i+1] + x)
   return r
def evaluate(priorities, operators, nums):
   priorities = list(priorities)
   operators = list(operators)
   nums = list(nums)
   res = None
   i = 0
   while priorities:
    idx_p = priorities.index(i)
    op = operators[idx_p]
    num1 = nums[idx_p]
    num2 = nums[idx_p + 1]
    nums.pop(idx_p)
    priorities.pop(idx_p)
    operators.pop(idx_p)
    i += 1
    try:
	    res = nums[idx_p] = eval(str(float(num1)) + str(op) + str(float(num2)))
    except:
	    break
   return res

def solve(ops, nums, total):
   op_list = get_comb_list(ops, len(nums) - 1)
   op_prior_list = perm(range(len(nums) - 1))
   for operators in op_list:
    for priorities in op_prior_list:
	    res = evaluate(priorities, operators, nums)
	    if res and abs(res - total) < 0.00001:
		    print nums, priorities, operators

ops = [['+'], ['-'], ['*'], ['/']]
nums = [7, 1, 7, 8, 1, 1]
total = 27
#nums = [2, 9, 4, 6, 4]
#total = 29
solve(ops, nums, total)

 

Skripts izvada secīgi darbības, kuras jāievieto starp skaitļiem kā ar to izpildes prioritāti (0 - darbību skaits). Permutāciju funkcija nav mana, jo bija grūti izdomāt uz ātro.

Link to comment
Share on other sites

Permutācijām pitonā ir iebūvēta standartbibliotēkas funkcija. Ar šādu kodu var aizstāt visu tavu perm funkciju:

import itertools
perm = itertools.permutations

Tik to nevar piešķirt kā listu, tas atgriež ģeneratoru. Tāpēc to labāk lietot for izteiksmē:

for priorities in itertools.permutations(range(len(nums)-1):

 

un get_comb_list fjas vietā arī var izmantot iebūvētas fjas:

def get_comb_list(parts):

 for n in xrange(len(parts)+1):
for c in itertools.combinations(parts, n):
  yield c

 

Būs īsāks un saprotamāks kods :)

Labots - bubu
Link to comment
Share on other sites

Izveido kontu, vai pieraksties esošajā, lai komentētu

Jums ir jābūt šī foruma biedram, lai varētu komentēt tēmas

Izveidot jaunu kontu

Piereģistrējies un izveido jaunu kontu, tas būs viegli!

Reģistrēt jaunu kontu

Pierakstīties

Jums jau ir konts? Pierakstieties tajā šeit!

Pierakstīties tagad!
 Share

×
×
  • Izveidot jaunu...