[11] Concurs - Triunghi

Re: [11] Concurs - Triunghi

Postby eni4ever » 11 Jul 2011, 20:19

^ Încerc să nu vorbesc degeaba : vezi și aplică exemplul de aici.
0,0p / 0 votes
Image

"Rațiunea vine în umbre scurte numite suferințe." Victor Adăscăliței
"Bender: Anything less than immortality is a complete waste of time.
Zoidberg: Then suicide it is! Step into my office ..." Futurama S06E06
User avatar
eni4ever
DWord
 
Joined: 03 Jan 2010
Location: Timișoara
Status: 57.83

Re: [11] Concurs - Triunghi

Postby Mihai » 18 Jul 2011, 09:18

În afară de aplicația lui sharky92 care mi s-a blocat pe mai multe teste, toate funcționează corect. Ce trebuie observat:

  • aplicația lui eni4ever afișează rezultatele în ordine inversă. Varianta interactivă e foarte mișto - deși nu aplicația lui a câștigat concursul, Victor primește puncte bonus pentru inventivitate.
  • cata45 nu a respectat formatul fișierului de ieșire - chiar dacă aici concurăm din plăcerea de a programa, dacă ești neatent poți avea surprize la concursurile la care detaliile chiar contează. Acum 2 ani la finala .Campion, doi tipi rezolvaseră aproape perfect problemele însă au uitat să schimbe numele fișierelor de intrare și ieșire. Adică de la premiul II și III, cât ar fi luat dacă erau puțin mai atenți, au ajuns la coada listei cu 0 puncte. Îți spun asta pentru că știu că nu e prima dată când nu respecți enunțul (la problema Fracții, ai decis că e mai bine să afișezi pe ecran decât în fișier).
  • aplicația lui payne a respectat întru totul regulile impuse și a fost suficient de rapidă încât să merite să câștige concursul. Felicitări!

Sursele pot fi descărcate din atașament. Dacă vreți să vă testați programele, puteți folosi acest evaluator pe care l-a creat eni4ever - e același evaluator pe care l-am folosit și eu :).

Felicitări băieți! Payne, așteptăm tema noului concurs!
0,0p / 0 votes
Attachments
C11_Surse.zip
(10.06 KiB) Downloaded 26 times
User avatar
Mihai
Byte
 
Joined: 29 Dec 2009
Status: 25

Re: [11] Concurs - Triunghi

Postby eni4ever » 18 Jul 2011, 20:53

Având în vedere că Mihai are un examen important mâine (admiterea), mi-am luat libertatea de a sublinia fundamentul matematic asupra căreia se poate construi o soluție corectă la această problemă în ideea că putem învăța ceva împreună. Explicația ce va urma nu este considerată unică în abordare ci doar una corectă.

Pornim de la
ipoteză : fiecare triunghi este reprezentat de coordonatele a 3 puncte și fie acele puncte A(x0,y0), B(x1,y1), C(x2,y2). În problemă mai apare un al 4-lea punct : originea. Fie originea notată, clasic, O(0,0).
Concluzie : găsirea dreptei a cărei distanță de la origine la ea este minimă.

Abordarea pe care v-o propun presupune, simplu, calculul distanței de la O la dreptele suport ale laturilor triunghiului : AB, BC, AC și alegerea, dintre aceste distanțe, a dreptei a cărei distanță este cea mai mică.
În consecință, ceea ce trebuie să aflăm noi este distanța de la o dreaptă la un punct ( O(0,0) ).
Prin definiție, distanța de la un punct la o dreaptă dată prin ecuația este . Aplicând informațiile problemeni noastre și anume aceea că P este chiar originiea deci are coordonatele 0 și 0 => o ușurare a formulei mai sus menționate : .
Problema următoare care se pune este : cum construim acea dreaptă d având 2 puncte date A(x0,y0) și B(x1,y1) de pildă.
Pentru asta apelăm la o altă formulă cunoscută din geometrie : Ecuaţia dreptei determinate de două puncte distincte.
Există 3 cazuri după care se construiește această ecuație :
  1. Dacă atunci dreapta este orizontală şi va avea ecuaţia de unde identificăm coeficienții generici de mai sus :
  2. Dacă atunci dreapta este verticală şi va avea ecuaţia rezultând coeficienții .
  3. Dacă și atunci ecuația dreptei reiese din calculul expresiei
Super, aproape că am terminat! Tot ce mai trebuie să facem acum este să contopim cele 2 formule rezultând 3 cazuri de a calcula distanța de la origine (O(0,0)) la dreapta noastră luată arbitrar AB cu A(x0,y0) și B(x1,y1) :
  1. Pentru avem ceea ce este normal dacă ne gândim că dreapta este paralelă cu Ox
  2. Pentru avem ceea ce este normal dacă ne gândim că dreapta este paralelă cu Oy
  3. Pentru și avem, mai complicat, dar de așteptat :
Aplicând acest raționament și pentru celelalte drepte (BC și AC) și verificând care dintre cele 3 distanțe este minimă duce, inevitabil, la rezolvarea problemei.
Problema nu a fost nici ușoară, dar nici grea. După cum se poate observa: fără cunoștințe de matematică, nu aveai cum s-o abordezi darmite să o rezolvi corect (eventual cu un random :) ).
Morala : stay in school and keep away from drugs :)) .

În altă ordine de idei : Sincere felicitări pentru toți participanții acestui concurs! În opinia mea, fericirea ar trebui să fie 80% din participare și 20% din câștig. Dacă câștigul nu este, cei 20% nu se risipesc ci se însumează la motivare. E clar că vrem mereu 100% sau mai mult dacă se poate, dar simplul fapt că v-ați lucrat tărtăcuța mereu vă cizelează spre a deveni cu toții, cândva, mai buni programatori.

Haideți să trecem printr-o analiză de bun simț sursele voastre și să remarcăm câte ceva :
sharky92:
  1. Un sfat referitor la variabilele globale : încearcă să nu mai depinzi așa mult de ele. Gândește-te așa : o funcție matematică primește parametrii și returnează valori, ori dacă valorile sunt într-un mediu global poluat, mai sunt acelea funcții? Sintactic da (doarde sunt compilabile), dar logic nu. Încearcă să te înveți cu parametrii. La proiecte mai mari, vei înțelege probabil mai bine de ce.
  2. Încearcă să-ți scindezi algoritmul de rezolvare pe funcții care au un singur scop și doar unul. Asta este valabil pentru orice funcție. Mă refer aici la build(). Când am văzut-o pentru prima dată, mă așteptam să-mi construiască și să-mi returneze ceva, dar nicidecum să îmi și scrie rezultatul în fișiere. Un nume mai sugestiv ar fi fost de un mai mare folos.
  3. Nu aș vrea să fac referire excesivă la cod, dar sper că asta este o greșeală de neatenție și/sau oboseală:
    1. pozitie poz[2];
    2. // ...
    3. for(i=0; i<=2; i++)
    4. f>>poz[i].p>>aux>>poz[i].x>>aux>>poz[i].y>>aux;

    Vectorii nativi încep în C/C++ de la 0 (așa cum ai început și tu), dar sunt alocați până la n-1 cu n lungimea lor. Dacă n = 2 atunci ultimul element din vector la care avem acces va fi poz[1] și nu poz[2].
  4. Un ultim pont : când tu scrii așa : atunci tu forțezi ca pentru fiecare iterație a for-ului, înainte de compararea j<=nr-1, să se efectueze acea scădere nr-1 ceea ce consumă timp. Gândește-te dacă mai apare această problemă atunci când scriu, lafel de corect, :
  5. Am observat că ai abordat aceeași logică de a rezolva problema ca cea discutată mai sus. Frumos!, dar ai pierdut din cele 3 cazuri.
payne :
  1. Se observă experiența : cod frumos formatat, categorizat fluent și ușor de urmărit. Nu prea am înțeles ce face funcția sti (se citește ști ?), dar cred că sunt eu greu de cap :)) . Ca și hint : încearcă să folosești pasarea prin referință, mai ales în cazul în care știi că nu ți se va modifica valoarea în cadrul funcției (const-like). În felul acesta elimini duplicare de obiecte. const string no, de pildă, devine const string &no
  2. Felicitări pentru acel 100% :)
cata45:
  1. Utile comentarii! Practică apreciată.
  2. Încearcă să dai nume mai sugestive variabilelor. Nu de alta, dar vor ajunge zile în care cele 26 de litere ale alfabetului nu vor mai părea suficiente :). Noroc de Unicode.
  3. Ceea ce te-a costat la viteză au fost procesările acelea pe șiruri. Trage tu concluziile de aici :).
eni4ever:
  • Atenție la enunț! :"> No comment!
  • Dacă se doresc explicații punctuale la implementare în Qt, cereți-mi-le și le voi da cu cel mai mare drag.

Cred că este suficient, deocamdată.

Aștept nerăbdător proba următoare,
Payne, ai tastatura,
Spor, colocatari!

P.S: doritorii de a vedea sursele tester-ului le pot descărca de aici.
1p / 1 votes
Image

"Rațiunea vine în umbre scurte numite suferințe." Victor Adăscăliței
"Bender: Anything less than immortality is a complete waste of time.
Zoidberg: Then suicide it is! Step into my office ..." Futurama S06E06
User avatar
eni4ever
DWord
 
Joined: 03 Jan 2010
Location: Timișoara
Status: 57.83

Re: [11] Concurs - Triunghi

Postby cata45 » 19 Jul 2011, 17:45

^^ Chiar nu imi dau seama cum trebuia sa se numeasca fisierul. Adica vad ca toata lumea a pus "bitcell11.in" si "bitcell11.out". Inca mai am sursa si exact asa am pus si eu. Da-mi un BUZZ daca ma insel :-S
0,0p / 0 votes
The EARTH without ART is just EH.
User avatar
cata45
Byte
 
Joined: 02 Sep 2010
Status: 9

Re: [11] Concurs - Triunghi

Postby Mihai » 19 Jul 2011, 17:54

Îmi cer scuze că nu am fost destul de explicit. Problema cu codul tău a fost că nu afișai numărul de teste din fișierul de intrare, așa cum cere în enunț. Exemplul ăla cu numele fișierelor de intrare/ieșire ți l-am dat ca să te fac să înțelegi că detaliile pot conta foarte mult!
0,0p / 0 votes
User avatar
Mihai
Byte
 
Joined: 29 Dec 2009
Status: 25

Re: [11] Concurs - Triunghi

Postby cata45 » 19 Jul 2011, 18:02

Da... se pare ca e a doua oara cand o patesc. Imi cer scuze. Mi s-a intamplat si la concursuri mari sa uit sa maresc limita vectorilor si am pierdut puncte serioase (85 ... OUCH )
0,0p / 0 votes
The EARTH without ART is just EH.
User avatar
cata45
Byte
 
Joined: 02 Sep 2010
Status: 9

Re: [11] Concurs - Triunghi

Postby Mihai » 19 Jul 2011, 18:12

"Memory limit exceeded" pe toate testele la o problemă la OJI - deși era făcută perfect, am lăsat niște variabile folosite pentru debugging declarate, pentru că n-am dat prea mare importanță limitei de memorie. So shit happens, da' e bine să se întâmple cât mai rar.
0,0p / 0 votes
User avatar
Mihai
Byte
 
Joined: 29 Dec 2009
Status: 25

Re: [11] Concurs - Triunghi

Postby Payne » 19 Jul 2011, 18:40

Functia sti = string to int (e o functie pe care o creasem acu mult timp)

O sa ma gandesc la o tema pana maine, daca nu va trebui sa puneti voi un concurs.(Nu le prea am cu concursurile)
0,0p / 0 votes
Suit up!

Image
User avatar
Payne
Byte
 
Joined: 04 Jan 2010
Location: 0x7C00
Status: 17

Re: [11] Concurs - Triunghi

Postby sharky92 » 19 Jul 2011, 19:22

Ms pentru sfaturi eni4ever. La urmatoarea problema voi incerca sa le respect.
0,0p / 0 votes
User avatar
sharky92
Bit
 
Joined: 09 Nov 2010
Status: 2

Previous

Return to Concursuri de programare desktop

Who is online

Users browsing this forum: No registered users and 0 guests

cron