Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Cine suporta cheltuielile de jude...

Apartament Grecia - Kavala

obtinere venituri PFA / PFI in ti...

Recomandare Volvo
 Diferenta suprafata teren

Plafonare preturi energie

Vanzari foto - CIPA 2023

Recomandare perdele sau draperii ...
 Invertor Victron Easysolar-II 48/...

"Militarizarea" Antifraudei

Washington DC in 1940 - secvente ...

Miniatur Wunderland - Monaco
 Familia Simpson

plata impozit profit actiuni trad...

Extras de cont cu semnatura elect...

Ce parere aveti despre ascasa.de ...
 

[Provocare] Cum afli zodia pornind de la zi/luna

- - - - -
  • Please log in to reply
44 replies to this topic

#19
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,111
  • Înscris: 24.02.2007

View PostLOLkekLOL, on 11 octombrie 2019 - 11:04, said:

Pentru cazul de fata, in opinia mea, codul din pastebin este foarte bun, mai clar si mai mentenabil decat ce aveti voi aici(sigur, la niste zodii fixe nu se pune problema de mentenanta presupun, dar in alte cazuri cu logica asemanatoare, da).

Codul din pastebin e simplu, il poate citi/intelege oricine cunoaste bazele limbajului (ce inseamna ==, &&, ||). Este insa mai clar/mentenabil?
  • Pe langa ca sunt foarte multe if-uri, fiecare if contine nu mai putin de 9 operatori
  • Foarte multe numere. Poti zice ca sunt corecte toate aceste comparatii fara a o citi cu foarte mare atentie pe fiecare?
  • Cod duplicat: intr-un if se verifica luna==4 && ziua <= 20, iar in urmatorul luna == 4 && ziua >= 21. Macar aici se putea compara ziua > 20 pentru a da o continuitate comparatiei precedente.
  • Incepe comparatia de la pozitia 3, cand programatorul e obisnuit sa inceapa de la 0 (hai 1)
Ce concluzie vreau sa trag: chiar daca un cod e construit doar din elemente simple ale unui limbaj, nu inseamna ca nu te poate bulversa cand logica ar trebui defapt sa fie simpla.

#20
karax

karax

    Guru Member

  • Grup: Senior Members
  • Posts: 21,839
  • Înscris: 14.10.2017

View PostMarianG, on 09 octombrie 2019 - 19:36, said:

var zodii = ["Sagetator","Capricorn","Varsator","Pesti","Berbec", "Taur","Gemeni","Rac","Leu","Feciora","Balanta","Scorpion"];
ziua = 1
luna = 9
if (( luna == 2 && ziua >= 20 && ziua <=31 ) ||
( (luna == 1 || luna ==3 || luna == 4) && (ziua >=21 && ziua <=31) )||
( (luna == 6 || luna == 11 || luna == 12 ) && (ziua >=22 && ziua <=31) )||
( (luna => 7 && luna <=10 ) && (ziua >= 23 && ziua <=31)))
{
luna+=1
}
document.getElementById("zodie").innerHTML = zodii[luna%12];



exact cu ai banuit, prima zodie din an pica pe pozitia 1 din lista, doar ca lista noastra incepe de la 0
o fi posibil ca sa se scurteze algoritmul asta si mai mult folosind operatorii mai bine? imi trece prin cap ca este dupa cum sunt alese intervalele , posibil ca un interval anume ales sa faca exact cat mai multi operatori si sa rezulte in putine parsari

#21
parabellum

parabellum

    Senior Member

  • Grup: Senior Members
  • Posts: 2,439
  • Înscris: 06.01.2010
Se mai poate simplifica. De exemplu ziua <= 31 apare peste tot.
Inainte de if bagi
var isDayPossible = ziua <=31;

Si folosesti flag-ul isDayPossible peste tot in loc de comparatie.

Edited by parabellum, 12 October 2019 - 10:00.


#22
iulian_1976

iulian_1976

    Active Member

  • Grup: Members
  • Posts: 1,569
  • Înscris: 10.05.2008
$zodie=[1=>["Capricorn","Varsator"],2=>["Varsator","Pesti"],3=>["Pesti","Berbec"],4=>["Berbec","Taur"],5=>["Taur","Gemeni"],6=>["Gemeni","Rac"],
7=>["Rac","Leu"],8=>["Leu","Feciora"], 9=>["Feciora","Balanta"],10=>["Balanta","Scorpion"],11=>["Scorpion","Sagetator"],12=>["Sagetator","Capricorn"]];
$ziua=20;// pentru test
$luna=1;//pentru test
foreach ($zodie as $key=>$value)
{
 if($key==$luna) {
	 if ((($key == 1 || $key == 3|| $key == 4) && $ziua <= 20) ||
		 (($key == 2) && ($ziua <= 19)) ||
		 (($key == 5|| $key == 6|| $key == 11|| $key == 12) && $ziua <= 21)||
		 (($key == 7|| $key==8 || $key==9 || $key==10 ) && $ziua <= 22)
	 ) {
		 echo $value[0];
		 break;
	 }
	 else{
		 echo $value[1];
		 break;
	 }
 }
}


Edited by iulian_1976, 13 October 2019 - 21:52.


#23
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,294
  • Înscris: 10.08.2005

View Postkarax, on 12 octombrie 2019 - 09:35, said:

o fi posibil ca sa se scurteze algoritmul asta si mai mult folosind operatorii mai bine? imi trece prin cap ca este dupa cum sunt alese intervalele , posibil ca un interval anume ales sa faca exact cat mai multi operatori si sa rezulte in putine parsari
sa vedem care ar fi urmatorul pas

int main()
{
const char *zodiac[] = {"Sagetator", "Capricorn", "Varsator", "Pesti", "Berbec", "Taur", "Gemeni", "Rac", "Leu", "Fecioara", "Balanta", "Scorpion"};
unsingned int month, day;
switch (month)
{
case 2:
	 month += (day>=20)
break;
case 1:
case 3:
case 4:
	 month += (day>=21)
	 break;
case 5:
case 6:
case 11:
case 12:
	 month += (day>=22)
	 break;
case 7:
case 8:
case 9:
case 10:
	 month += (day>=23)
	 break;
}
printf("%s\n",zodiac[month]);
}

Edited by MarianG, 14 October 2019 - 14:31.


#24
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,294
  • Înscris: 10.08.2005
*** pasii sunt pentru karax
alt pas este trecerea cazurilor intr-un sir nou,
intr-un final ajungi la imbinarea celor doua asa cum ne-a exemplificat  dani.user (daca vrei sa inteti despre tuple)

Edited by MarianG, 14 October 2019 - 14:35.


#25
karax

karax

    Guru Member

  • Grup: Senior Members
  • Posts: 21,839
  • Înscris: 14.10.2017
mersi. evident eu inteleg destul de greu. insa e similar cu ce intrebasem eu acum ceva timp in legatura cu numere mari si alte alea.
ma bucura foarte mult faptul ca exista metode de a rezolva lucrurilePosted Image Posted Image
pana la urma eu am pus acea intrebare pur si simplu pentru a gasi ceva care sa fie de folos in dezvoltarea lumii, nu am fost motivat de altceva ca si lenea sau nepasarea.

#26
LOLkekLOL

LOLkekLOL

    Senior Member

  • Grup: Senior Members
  • Posts: 2,348
  • Înscris: 29.07.2019

View Postdani.user, on 11 octombrie 2019 - 17:41, said:


Codul din pastebin e simplu, il poate citi/intelege oricine cunoaste bazele limbajului (ce inseamna ==, &&, ||). Este insa mai clar/mentenabil?
  • Pe langa ca sunt foarte multe if-uri, fiecare if contine nu mai putin de 9 operatori
  • Foarte multe numere. Poti zice ca sunt corecte toate aceste comparatii fara a o citi cu foarte mare atentie pe fiecare?
  • Cod duplicat: intr-un if se verifica luna==4 && ziua <= 20, iar in urmatorul luna == 4 && ziua >= 21. Macar aici se putea compara ziua > 20 pentru a da o continuitate comparatiei precedente.
  • Incepe comparatia de la pozitia 3, cand programatorul e obisnuit sa inceapa de la 0 (hai 1)
Ce concluzie vreau sa trag: chiar daca un cod e construit doar din elemente simple ale unui limbaj, nu inseamna ca nu te poate bulversa cand logica ar trebui defapt sa fie simpla.
Nu vad absolut nicio problema cu mai multe if-uri, pot fi foarte citibile.
Nu m-am uitat la detalii cred ca-s incorecte oricum niste date din pastebin.
Mda, asa listeaza astia zodiile, de prin martie.

Cam asa as face(ignorand desigur o validare precisa a datelor, care nici in codul vostru nu e)

// Example program
#include <iostream>
#include <string>
using namespace std;
enum { IANUARIE = 1, FEBRUARIE = 2, MARTIE = 3, APRILIE = 4, MAI = 5, IUNIE = 6,
			IULIE = 7, AUGUST = 8, SEPTEMBRIE = 9, OCTOMBRIE = 10, NOIEMBRIE = 11, DECEMBRIE = 12
};
string getZodie(int zi, int luna) {
   if ((luna == IANUARIE && zi >= 20) || (luna == FEBRUARIE && zi <= 18)) return "VARSATOR";
   if ((luna == FEBRUARIE && zi >= 19) || (luna == MARTIE && zi <= 20)) return "PESTI";
   if ((luna == MARTIE && zi >= 21) || (luna == APRILIE && zi <= 20)) return "BERBEC";
   if ((luna == APRILIE && zi >= 21) || (luna == MAI && zi <= 20)) return "TAUR";
   if ((luna == MAI && zi >= 21) || (luna == IUNIE && zi <= 21)) return "GEMENI";
   if ((luna == IUNIE && zi >= 22) || (luna == IULIE && zi <= 22)) return "RAC";
   if ((luna == IULIE && zi >= 23) || (luna == AUGUST && zi <= 22)) return "LEU";
   if ((luna == AUGUST && zi >= 23) || (luna == SEPTEMBRIE && zi <= 22)) return "FECIOARA";
   if ((luna == SEPTEMBRIE && zi >= 23) || (luna == OCTOMBRIE && zi <= 22)) return "BALANTA";
   if ((luna == OCTOMBRIE && zi >= 23) || (luna == NOIEMBRIE && zi <= 21)) return "SCORPION";
   if ((luna == NOIEMBRIE && zi >= 22) || (luna == DECEMBRIE && zi <= 20)) return "SAGETATOR";
   if ((luna == DECEMBRIE && zi >= 21) || (luna == IANUARIE && zi <= 19)) return "CAPRICORN";
   return "invalid input"; //si nu doar
}
int main()
{
   cout << getZodie(20, 1);
}



#27
LOLkekLOL

LOLkekLOL

    Senior Member

  • Grup: Senior Members
  • Posts: 2,348
  • Înscris: 29.07.2019

View Postdani.user, on 11 octombrie 2019 - 17:41, said:

  • Foarte multe numere. Poti zice ca sunt corecte toate aceste comparatii fara a o citi cu foarte mare atentie pe fiecare?
Numerele alea sunt foarte bune, indica exact intervalele de date. In codul tau spre exemplu cam trebuie efort suplimentar pt. a obtine ghici .. ce? Aceleasi date!

Sa ne uitam pe codul tau un pic:

				{ 21, "CAPRICORN" },
				{ 20, "VARSATOR" },
				{ 21, "PESTI" },
			  [...]
				{ 21, "CAPRICORN" }

Ai un numar urmat de zodie... ce reprezinta acel numar? data de inceput? de sfarsit? apoi ai aia cu capricorn care se repeta la sfarsit... de ce? stiu de ce, dar iti ia timp sa vezi ce-i acolo...

apoi ai aceasta linie:
return std::get<1>(data.at(zi < std::get<0>(data.at(luna - 1)) ? luna - 1 : luna));

get 1 data.at .. get 0 data.at ? operator ternar ,,, cam greu de citit ,,,


View Postdani.user, on 11 octombrie 2019 - 17:41, said:

Ce concluzie vreau sa trag: chiar daca un cod e construit doar din elemente simple ale unui limbaj, nu inseamna ca nu te poate bulversa cand logica ar trebui defapt sa fie simpla.
Logica eu zic ca e foarte simpla la if-uri. Partea nasoala e cand incerci tot felul de trucuri pt. a avea cod cat mai scurt, tie ti se pare ca-i usor de citit dar nu prea.

Codul bun in opinia mea trebuie sa fie cat mai auto documentabil - sa-l citesti cat mai aproape de limbajul natural.

#28
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,294
  • Înscris: 10.08.2005
Unde este efortul suplimentar ?

#29
LOLkekLOL

LOLkekLOL

    Senior Member

  • Grup: Senior Members
  • Posts: 2,348
  • Înscris: 29.07.2019

View PostMarianG, on 09 octombrie 2019 - 19:36, said:

var zodii = ["Sagetator","Capricorn","Varsator","Pesti","Berbec", "Taur","Gemeni","Rac","Leu","Feciora","Balanta","Scorpion"];
ziua = 1
luna = 9
if (( luna == 2 && ziua >= 20 && ziua <=31 ) ||
( (luna == 1 || luna ==3 || luna == 4) && (ziua >=21 && ziua <=31) )||
( (luna == 6 || luna == 11 || luna == 12 ) && (ziua >=22 && ziua <=31) )||
( (luna => 7 && luna <=10 ) && (ziua >= 23 && ziua <=31)))
{
luna+=1
}
document.getElementById("zodie").innerHTML = zodii[luna%12];
exact cu ai banuit, prima zodie din an pica pe pozitia 1 din lista, doar ca lista noastra incepe de la 0
Cum citim din codul tau in care interval zi luna - zi luna se afla sa zicem zodia Varsator?
Cum modificam codul daca vrem sa introducem sa zicem un eveniment cu un nou interval?

In codul meu te uiti pur si simplu pe linia cu stringul varsator si vezi date: (>=)20 IANUARIE - (<=)18 FEBRUARIE iar de adaugat orice nou interval e trivial.

#30
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,294
  • Înscris: 10.08.2005
Daca vrei sa introduci evenimente atunci le introduci dinamic, cu structura
struct zodie
unsigned int dayStart
unsigned int dayEnd
unsigned int monthStart
char name


View PostLOLkekLOL, on 15 octombrie 2019 - 18:56, said:

In codul meu te uiti pur si simplu pe linia cu stringul varsator si vezi date: (>=)20 IANUARIE - (<=)18 FEBRUARIE iar de adaugat orice nou interval e trivial.
iar cand adaugi un interval schimbi alte doua

p.s.  vezi ca acel cod a suferit modificari

Edited by MarianG, 15 October 2019 - 19:26.


#31
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,111
  • Înscris: 24.02.2007
Incercarea #2, mai putin eficienta (nu ca ar conta la codul asta), dar mai natural de citit:

#include <compare>
#include <cstdint>
#include <iostream>
#include <string_view>
#include <stdexcept>

struct LunaZi
{
	LunaZi(uint16_t luna, uint16_t zi) : luna(luna), zi(zi)
	{
		if (luna < 1 || luna > 12) 
			throw std::runtime_error("Luna invalida");

		static constexpr int ziMaximaLuna[] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
		if (zi < 1 || zi > ziMaximaLuna[luna-1])
			throw std::runtime_error("Zi invalida");
	}
	bool operator<=(LunaZi other) const
	{
		if (luna == other.luna) return zi <= other.zi;
		return luna <= other.luna;
	}
	bool operator>=(LunaZi other) const
	{
		if (luna == other.luna) return zi >= other.zi;
		return luna >= other.luna;
	}

	const uint16_t luna;
	const uint16_t zi;
};

std::string_view getZodie(LunaZi input)
{
	static const std::tuple<LunaZi, LunaZi, const char*> zodii[] =
	{
		{{1, 20}, {2, 18}, "VARSATOR"},
		{{2, 19}, {3, 20}, "PESTI"},
		{{3, 21}, {4, 20}, "BERBEC"},
		{{4, 21}, {5, 20}, "TAUR"},
		{{5, 21}, {6, 21}, "GEMENI"},
		{{6, 22}, {7, 22}, "RAC"},
		{{7, 23}, {8, 22}, "LEU"},
		{{8, 23}, {9, 22}, "FECIOARA"},
		{{9, 23}, {10, 22}, "BALANTA"},
		{{10, 23}, {11, 21}, "SCORPION"},
		{{11, 22}, {12, 20}, "SAGETATOR"},
	};

	for (auto& [de_la, pana_la, zodie] : zodii)
	{
		if (input >= de_la && input <= pana_la) return zodie;
	}
	//{{12, 21}, {1, 19}, "CAPRICORN"},
	return "CAPRICORN";
}

int main()
{
	std::cout << getZodie(LunaZi{ 1, 15 }) << '\n';
}


Edited by dani.user, 15 October 2019 - 21:46.


#32
LOLkekLOL

LOLkekLOL

    Senior Member

  • Grup: Senior Members
  • Posts: 2,348
  • Înscris: 29.07.2019

View PostMarianG, on 15 octombrie 2019 - 19:25, said:

iar cand adaugi un interval schimbi alte doua
Nope, daca se suprapun intervale, bagi un vector si in loc de return, pui push_back; sau o concatenare, in functie de necesitati..

#33
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,294
  • Înscris: 10.08.2005
deci de la un sir banal trecem la un vector, de ce  nu o clasa ?

zodiacul este static, de adaptat se adapteaza intrarile,
a.i  daca zona geografica este america modifici ziua de nastere, sa fie echivalenta cu zona din Europa

Edited by MarianG, 15 October 2019 - 21:07.


#34
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006

View PostMarianG, on 15 octombrie 2019 - 21:10, said:

deci de la un sir banal trecem la un vector, de ce  nu o clasa ?

zodiacul este static, de adaptat se adapteaza intrarile,
a.i  daca zona geografica este america modifici ziua de nastere, sa fie echivalenta cu zona din Europa

Nu prea îmi sună bine. Mai degrabă împachetate intervalele într-un contract polimorfic si o funcție care rezolva problema "algoritmică".


Știu că te gândești la problema ca la una de normalizare, dar una e să normalizezi un pret al unui produs din orice monedă de schimb in cea in care firma face plățile, alta e sa schimbi in modelul din software ceva ce nu se schimba in viata reală.




#35
parabellum

parabellum

    Senior Member

  • Grup: Senior Members
  • Posts: 2,439
  • Înscris: 06.01.2010
Apropo de asta: 'struct LunaZi' in c++ 20 exista month_day. Exista si 'month' asa ca poti sa scrii cod mai expresiv (cu 'January' etc) fara sa butonezi mult cod.

#36
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,294
  • Înscris: 10.08.2005

View PostOriginalCopy, on 16 octombrie 2019 - 07:06, said:

Nu prea îmi sună bine. Mai degrabă împachetate intervalele într-un contract polimorfic si o funcție care rezolva problema "algoritmică".


Știu că te gândești la problema ca la una de normalizare, dar una e să normalizezi un pret al unui produs din orice monedă de schimb in cea in care firma face plățile, alta e sa schimbi in modelul din software ceva ce nu se schimba in viata reală.
in Romania ora 07:00 (16 octombrie) , iar pe coasta de vest a Americii 09:00 seara, (15 octombrie).
Ce data treci ca input ?

Din cate stiu zodiile sunt definite de pozitia Pamantului fata de Soare la o data si ora, dar avem mai multe ore (fusuri orare) pe glob, prin urmare acest lucru in vad necesar sa fie normalizat.

Edited by MarianG, 16 October 2019 - 11:04.


Anunturi

Bun venit pe Forumul Softpedia!

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate