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)

Edited by 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"

Edited by 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.

Edited by 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

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

Edited by 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.

Edited by 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 :)

Edited by bubu
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...