AMcoder - javascript, python, java, html, php, sql

Խրված է Prolog ծրագրի հետ

Ես վարժ տիրապետում եմ Java-ին և C#-ին, ուստի Prolog-ում կոդավորումն ինձ համար բավականին դժվար էր, քանի որ թվում է, թե դա բոլորովին այլ մտածելակերպ է:

Խնդիրը, որը ես պետք է լուծեմ, պարզ է, և ես կարող եմ այն ​​ջնջել Java-ում տասը րոպեում: Ես պարզապես, անկեղծ ասած, դժվարություններ ունեմ այստեղ սկսելու համար: Ինձ տրվում է ընտրողների «ձայն» ներկայացնող տասը թվերի ցուցակ: Քվեարկությունը կա՛մ 0 է, կա՛մ -1, կա՛մ 1: Հետո ինձ տրվում է նաև ցուցակների ցուցակ, յուրաքանչյուր ցուցակ թեկնածուի ցուցակ է: Յուրաքանչյուր թեկնածուի ցուցակը ներառում է անուն, որին հաջորդում է Ընտրողների ցուցակի տասը միավոր:

Իմ նպատակն է այնուհետև համեմատել Ընտրողների ցուցակը յուրաքանչյուր Թեկնածուների ցուցակի հետ և վերադարձնել լավագույն համընկնող ցուցակը՝ հիմնվելով նույն ձայների վրա:

Ահա թե ինչ է ինձ տրված.

?- best_candidates(
    [           0,   0,   0,   1,   1,   1,  -1,  -1,  -1,   1],
    [[adams     1,   1,   1,   1,   1,   1,   1,   1,   1,   1],
     [grant    -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1],
     [polk      1,  -1,   1,  -1,   1,  -1,   1,  -1,   1,  -1],
     [jackson   1,   0,   1,   0,   1,   0,   1,   0,   1,   0],
     [taft      0,  -1,   0,  -1,   0,  -1,   0,  -1,   0,  -1],
     [ford      1,   1,   1,   1,   0,   0,   0,   0,   0,   0],
     [madison   0,   0,   0,   1,  -1,   0,   0,  -1,   1,   1]],
    BestMatches).

Սա պետք է վերադարձնի BestMatches = [adams, ford, madison]:

Առայժմ ես շատ բան չունեմ: Ես պարզապես փորձում եմ պարզել, թե ինչպես պետք է դա անեմ: Արդյո՞ք ինձ պետք են մի քանի մեթոդներ, թե՞ պետք է կարողանամ այս ամենը անել best_candidates մեթոդի շրջանակներում:

Ի պատասխան Էդմունդի առաջարկի, ահա թե ինչ ունեմ մինչ այժմ.

% match V1 and V2 and unify M with the match score
% match(V1, V2, M)
match([], [], 0).
match([H1|T1], [H2|T2], M) :-
    match_single_entry(H1, H2, M1),
    match(T1, T2, M2), 
    M is M1+M2.

% match_single_entry(I, J, M)
match_single_entry(X, Y, M) :-
    X =\= 0,
    Y =\= 0,
    I =:= J, 
    M is 1.
19.11.2012

  • 1) Ինչու՞ կվերադարձնի այդ երեքը: Ադամսն ու Ֆորդը իմաստ ունեն, բայց Մեդիսոնը՝ ոչ այնքան: 2) Prolog-ը տարբերվում է ձեր հանդիպած ցանկացած այլ լեզվից. դուք պարզապես պետք է ասեք, թե ինչ է ճիշտ ձեր տիեզերքի մասին: Այնուհետև դուք հարցումներ և/կամ գրում եք գործառույթներ՝ ձեր տիեզերքից ճշմարտությունը պարզելու համար: 19.11.2012
  • Կներեք, մոռացա նշել, որ միակ միավորները, որոնք իրականում հաշվի են առնվում նմանատիպ միավորների հաշվարկի համար, այն միավորներն են, որոնք զրոյական չեն: 19.11.2012
  • Իմ պատասխանի վերաբերյալ user1704677-ի պարզաբանմամբ՝ ես այդ երեքից յուրաքանչյուրի համար ստանում եմ 1, իսկ մյուսների համար՝ ավելի քիչ: 19.11.2012
  • Դուք նաև պետք է կանոններ ավելացնեք match_single_entry-ին այն դեպքերի համար, երբ X = 0 կամ Y = 0, կամ X \= Y և այլն: 19.11.2012

Պատասխանները:


1

Թվում է, թե խնդրի էությունը մի ֆունկցիա է, որը վերցնում է 10 թվից երկու վեկտոր և վերադարձնում է համընկնման ընդհանուր միավորը:

Առաջինն այն է, որ Prolog-ը գործառույթներ չունի. այն ունի պրեդիկատներ։ Բայց դուք կարող եք հեշտությամբ թարգմանել ֆունկցիայի հայեցակարգը պրեդիկատ հասկացության՝ տրամադրելով փոփոխականներ, որոնք կարող են կապված լինել «ֆունկցիայի» ելքերի հետ.

% Match V1 and V2, and unify M with the match score.
match(V1, V2, M) :- ...

Պարզ չէ, թե ինչպես են վեկտորները համընկնում (բայց ես կարծում եմ, որ դա նույնական գրառումների քանակն է, թե՞ յուրաքանչյուր զույգ մուտքերի միջև բացարձակ տարբերությունների գումարը): Բայց այս պրեդիկատը, հավանաբար, կսահմանվի բազային գործով (0 երկարությամբ ցուցակների համար) և ընդհանուր դեպքով, որը հաշվարկում է այն յուրաքանչյուր ցուցակի գլուխների և ցուցակների վերջում գտնվող ռեկուրսների համար:

match([], [], 0).  % I'm assuming the match score for empty lists is 0.
match([H1|T1], [H2|T2], M) :-
    match_single_entry(H1, H2, M1),  % Somehow compute the score for two single entries.
    match(T1, T2, M2),  % Recurse on the tails.
    M is M1+M2.  % Combine the two scores and bind to the output variable M.

Ես թողել եմ match_single_entry անորոշ: Այն սահմանելուց հետո դուք պետք է փորձեք առաջադրել match-ը տարբեր թեկնածուների վեկտորներով՝ ընդդեմ ընտրողի վեկտորի.

% Let's try getting the match score for adams:
?- match([1,1,1,1,1,1,1,1,1,1], [0,0,0,1,1,1,-1,-1,-1,1], AdamsScore).

AdamsScore = 3 ;

No

Հաջորդ մարտահրավերը մեկ այլ պրեդիկատ գրելն է՝ best_candidates, որը վերցնում է ընտրողի վեկտորը գումարած թեկնածուի վեկտորների բազմությունը, յուրաքանչյուրը գնահատում և վերադարձնում է, այսինքն՝ կապում է BestMatchesին համապատասխանող ելքային փոփոխականին՝ նրանց, ովքեր լավագույնն են գնահատում: Կրկին, այս պրեդիկատը կարող է կրկնվել թեկնածու վեկտորների բազմության վրա՝ սահմանելով բազային դեպք (առանց թեկնածուների, հետևաբար՝ լավագույնների) և ռեկուրսիվ դեպքի, որը միաժամանակ մշակում է մեկ թեկնածու:

Յուրաքանչյուր թեկնածուի վեկտորի գնահատում

Ինչպես նշում եք, թեկնածու վեկտորն ունի անուն, որին հաջորդում են արժեքները: Սա նշանակում է, որ վեկտորը հեշտությամբ կարելի է բաժանել [Name|Values] = V-ով, իսկ Values-ը կարող է փոխանցվել matchին՝ ընտրողների վեկտորի հետ համեմատելու համար:

Մյուս բանը անունները BestMatches ցուցակում պահելն է: best_candidates պրեդիկատը պետք է գնահատի յուրաքանչյուր թեկնածուի վեկտոր՝ ինչ-որ տեղ պահելով այդ միավորները, այնուհետև պետք է գտնի լավագույն միավորը, այնուհետև պետք է անցնի սկզբնական թեկնածուների անունները և ավելացնի դրանք, որոնք նույնքան լավն են, որքան լավագույն միավորը:

Առաջարկվում է ավելացնել նախադրյալ՝ առաջին մասը կատարելու համար.

% Score all vectors, returning a list of scores.
% score_vectors(VoterVector, AllVectors, AllScores)
score_vectors(V, [], []).
score_vectors(V, [H|T], [SH, ST]) :-
    ... score V against H, matching the result against SH.
    ... recurse on T and ST.

(Լրացրե՛ք երկու տողերը ...-ով) Այնուհետև օգտագործեք պարզ նախադրյալ՝ AllScores-ից առավելագույն միավորը գտնելու համար (կամ կարող է ներկառուցված պրեդիկատ դա անելու համար):

Այնուհետև կազմեք մեկ այլ պրեդիկատ, որը կրկնում է բոլոր վեկտորները և միավորները և ընտրում նրանց, որոնք համապատասխանում են լավագույն գնահատականին.

% Pick best candidates.
% pick_best(AllVectors, AllScores, BestScore, BestNames).
pick_best([], [], BS, []).
pick_best([H|T], [SH|ST], BS, [Name|NT]) :-
    H = [Name|Values],
    SH >= BS.
pick_best([H|T], [SH|ST], BS, NT) :-
    H = [Name|Values],
    SH < BS.

Այնուհետև կառուցեք best_candidates այս երեք քայլերից.

best_candidates(VoterVector, CandidateVectors, BestNames) :-
    score_vectors(VoterVector, CandidateVectors, Scores),
    maximum(Scores, BestScore),
    pick_best(CandidateVectors, Scores, BestScore, BestNames).
19.11.2012
  • Շնորհակալություն, սա շատ, շատ օգտակար է: Յուրաքանչյուր թեկնածուի համար թիվը որոշելու տրամաբանությունը հետևյալն է... 19.11.2012
  • contract_score = (հարցերի քանակը, որոնց համար ընտրողը և թեկնածուն տվել են նույն ոչ զրոյական պատասխանը) - (հարցերի քանակը, որոնց համար ընտրողը և թեկնածուն տվել են տարբեր ոչ զրոյական պատասխաններ) 19.11.2012
  • Լավ, շնորհակալություն պարզաբանման համար: Այդ դեպքում, match_single_entry(X,Y, M)-ը կարող է կապել M = 1-ը, եթե X-ը և Y-ը ոչ զրոյական են և նույնը, կամ M = -1-ը, եթե դրանք ոչ զրոյական են և տարբեր են: Հակառակ դեպքում, եթե մեկը զրո է, ապա M = 0: Գիտե՞ք ինչպես գրել match_single_entry այդպես: 19.11.2012
  • Իսկապես դժվարանում եմ այս կոդը ցուցադրել կոդի բլոկում... lol.. սա այն է, ինչ ես եկել եմ մինչ այժմ: 19.11.2012
  • Ահ, լավ... Ես կպցրեցի այն, ինչ մինչ այժմ ունեմ իմ հարցի վերջում: 19.11.2012
  • Ես իսկապես խրված եմ երկու մասի հետ հիմա: Յուրաքանչյուր թեկնածուի ցուցակի համար ցուցակը սկսվում է Թեկնածուի անունով: Սա շեղում է ամեն ինչ, քանի որ այն տեխնիկապես ունի տասնմեկ արժեք, ի տարբերություն Ընտրողների ցուցակի, որն ունի 10, բոլոր միավորները: Ես նաև վստահ չեմ, թե ինչպես եմ իրականում պահելու Թեկնածուի անունը BestMatches ցուցակում: 19.11.2012

  • 2

    Ես ցույց կտամ լուծում, որն իրականացվել է SWI-Prolog գրադարանի օգնությամբ (ագրեգատ):

    :- [library(aggregate)].
    
    best_candidates(Votes, Candidates, Best) :-
        maplist(count_matched(Votes), Candidates, NamesCounted),
        keysort(NamesCounted, BestDown),
        reverse(BestDown, Best).
    
    count_matched(Votes, [Name|ThisVotes], MatchCount-Name) :-
        aggregate_all(sum(V * T),
            ( nth1(I, Votes, V),
              nth1(I, ThisVotes, T)
            ), MatchCount).
    
    test(BestMatches) :-
        best_candidates(
             [           0,   0,   0,   1,   1,   1,  -1,  -1,  -1,   1],
            [[adams   ,  1,   1,   1,   1,   1,   1,   1,   1,   1,   1],
             [grant   , -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1],
             [polk    ,  1,  -1,   1,  -1,   1,  -1,   1,  -1,   1,  -1],
             [jackson ,  1,   0,   1,   0,   1,   0,   1,   0,   1,   0],
             [taft    ,  0,  -1,   0,  -1,   0,  -1,   0,  -1,   0,  -1],
             [ford    ,  1,   1,   1,   1,   0,   0,   0,   0,   0,   0],
             [madison ,  0,   0,   0,   1,  -1,   0,   0,  -1,   1,   1]],
            BestMatches),
        BestMatches = [_-A, _-B, _-C|_],
        writeln([A, B, C]).
    

    փորձարկման արդյունք:

    ?- test(L).
    [madison,ford,adams]
    L = [1-madison, 1-ford, 1-adams, -1-jackson, -1-grant, -2-taft, -3-polk].
    
    19.11.2012
    Նոր նյութեր

    Օգտագործելով Fetch Vs Axios.Js-ը՝ HTTP հարցումներ կատարելու համար
    JavaScript-ը կարող է ցանցային հարցումներ ուղարկել սերվեր և բեռնել նոր տեղեկատվություն, երբ դա անհրաժեշտ լինի: Օրինակ, մենք կարող ենք օգտագործել ցանցային հարցումը պատվեր ներկայացնելու,..

    Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար
    Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար Ինչպե՞ս հանգստացնել ձեր միտքը և աշխատեցնել ձեր պրոցեսորը: Ինչպես մնալ հանգիստ և զարգանալ ճնշման տակ...

    Մեքենայի ուսուցում բանկային և ֆինանսների ոլորտում
    Բարդ, խելացի անվտանգության համակարգերը և հաճախորդների սպասարկման պարզեցված ծառայությունները բիզնեսի հաջողության բանալին են: Ֆինանսական հաստատությունները, մասնավորապես, պետք է առաջ մնան կորի..

    Ես AI-ին հարցրի կյանքի իմաստը, այն ինչ ասում էր, ցնցող էր:
    Այն պահից ի վեր, երբ ես իմացա Արհեստական ​​ինտելեկտի մասին, ես հիացած էի այն բանով, թե ինչպես է այն կարողանում հասկանալ մարդկային նորմալ տեքստը, և այն կարող է առաջացնել իր սեփական արձագանքը դրա..

    Ինչպես սովորել կոդավորումը Python-ում վագրի պես:
    Սովորելու համար ծրագրավորման նոր լեզու ընտրելը բարդ է: Անկախ նրանից, թե դուք սկսնակ եք, թե առաջադեմ, դա օգնում է իմանալ, թե ինչ թեմաներ պետք է սովորել: Ծրագրավորման լեզվի հիմունքները, դրա..

    C++-ի օրական բիթ(ե) | Ամենաերկար պալինդրոմային ենթաշարը
    C++ #198-ի ամենօրյա բիթ(ե), Ընդհանուր հարցազրույցի խնդիր. Ամենաերկար պալինդրոմային ենթատող: Այսօր մենք կանդրադառնանք հարցազրույցի ընդհանուր խնդրին. Ամենաերկար palindromic substring...

    Kydavra ICAReducer՝ ձեր տվյալների ծավալայինությունը նվազեցնելու համար
    Ի՞նչ է ICAReducer-ը: ICAReducer-ն աշխատում է հետևյալ կերպ. այն նվազեցնում է նրանց միջև բարձր փոխկապակցված հատկանիշները մինչև մեկ սյունակ: Բավականին նման է PCAreducer-ին, չնայած այն..