1 /*
   2  * Ovo je AEC program koji radi numeričke izračune vezane za Paradoks
   3  * rođendana, opisane ovdje: https://flatassembler.github.io/Karasica.doc
   4  */
   5 
   6 // Uvezimo funkcije za debuggiranje iz JavaScripta...
   7 Function printInt(Integer32 i) Which Returns Nothing Is External;
   8 Function printString(PointerToCharacter s) Which Returns Nothing Is External;
   9 
  10 Integer32 nasumican_broj := 9_907;
  11 Function nasumican_broj() Which Returns Integer16 Does
  12 	Return nasumican_broj := mod(nasumican_broj * 48_271, 2_147_483_647);
  13 	// http://cplusplus.com/reference/random/minstd_rand/
  14 EndFunction
  15 
  16 Integer16 koliko_ljudi_ima_rodendan_na_taj_dan[1_000];
  17 // Recimo da nikome neće trebati izračun za "godinu" s više od tisuću dana.
  18 
  19 Function numericki_izracun_rodendanskog_paradoksa(
  20 			Integer16 koliko_godina_ima_dana             ,
  21 			Integer16 koliko_ima_ljudi                   ,
  22 			Integer16 iznad_koliko_kolizija_brojimo      ,
  23 			Integer32 koliko_smo_puta_izvrtili_simulaciju,
  24 		) Which Returns Decimal32 Does
  25 	Integer32 koliko_smo_puta_dobili_toliko_kolizija := 0,
  26 		  vanjski_brojac                         := 0;
  27 	While vanjski_brojac < koliko_smo_puta_izvrtili_simulaciju Loop
  28 		Integer16 unutarnji_brojac := 0    ,
  29                 	dani_za_debuggiranje[1_000];
  30 		While unutarnji_brojac < koliko_godina_ima_dana Loop
  31 			koliko_ljudi_ima_rodendan_na_taj_dan[
  32 					unutarnji_brojac
  33 				]        := 0;
  34 			unutarnji_brojac += 1;
  35 		EndWhile
  36 		unutarnji_brojac := 0;
  37 		While unutarnji_brojac < koliko_ima_ljudi Loop
  38 			koliko_ljudi_ima_rodendan_na_taj_dan[
  39 						mod(
  40 							nasumican_broj()      ,
  41 							koliko_godina_ima_dana,
  42 						)
  43 					] += 1; // AECforWebAssembly stariji
  44 						// od v2.3.0 na ovu su
  45 						// naredbu ispisivali krivi
  46 						// asemblerski kod.
  47 			Integer16 nasumican_dan := mod(
  48 							nasumican_broj        ,
  49 							koliko_godina_ima_dana,
  50 						);
  51 			dani_za_debuggiranje[
  52 					unutarnji_brojac
  53 				]         := nasumican_dan;
  54 			unutarnji_brojac  += 1;
  55 		EndWhile
  56 		Integer16 jesmo_li_nasli_potreban_broj_kolizija := 0;
  57 		unutarnji_brojac := 0;
  58 		While unutarnji_brojac < koliko_godina_ima_dana Loop
  59 			If
  60 				koliko_ljudi_ima_rodendan_na_taj_dan[
  61 					unutarnji_brojac
  62 				] > iznad_koliko_kolizija_brojimo or
  63 				koliko_ljudi_ima_rodendan_na_taj_dan[
  64 					unutarnji_brojac
  65 				] = iznad_koliko_kolizija_brojimo
  66 			Then
  67 				jesmo_li_nasli_potreban_broj_kolizija := 1;	
  68 			EndIf
  69 			unutarnji_brojac += 1;
  70 		EndWhile
  71 		If jesmo_li_nasli_potreban_broj_kolizija Then
  72 			koliko_smo_puta_dobili_toliko_kolizija += 1;
  73 		ElseIf koliko_ima_ljudi > koliko_godina_ima_dana Then
  74 			printString("---");
  75 			printString("Brojevi za debuggiranje:");
  76 			unutarnji_brojac := 0;
  77 			While unutarnji_brojac < koliko_ima_ljudi Loop
  78 				printInt(dani_za_debuggiranje[
  79 						unutarnji_brojac
  80 					]);
  81 				unutarnji_brojac += 1;
  82 			EndWhile
  83 			printString("Koliko ljudi ima rodendan na taj dan:");
  84 			unutarnji_brojac := 0;
  85 			While unutarnji_brojac < koliko_godina_ima_dana Loop
  86 				printInt(koliko_ljudi_ima_rodendan_na_taj_dan[
  87 						unutarnji_brojac
  88 					]);
  89 				unutarnji_brojac += 1;
  90 			EndWhile
  91 			printString("---");
  92 		EndIf
  93 		vanjski_brojac += 1;
  94 	EndWhile
  95 	Return Decimal32(
  96 			koliko_smo_puta_dobili_toliko_kolizija
  97 		) / koliko_smo_puta_izvrtili_simulaciju;
  98 EndFunction
  99