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
  63 			Then
  64 				jesmo_li_nasli_potreban_broj_kolizija := 1;	
  65 			EndIf
  66 			unutarnji_brojac += 1;
  67 		EndWhile
  68 		If jesmo_li_nasli_potreban_broj_kolizija Then
  69 			koliko_smo_puta_dobili_toliko_kolizija += 1;
  70 		ElseIf koliko_ima_ljudi > koliko_godina_ima_dana Then
  71 			printString("---");
  72 			printString("Brojevi za debuggiranje:");
  73 			unutarnji_brojac := 0;
  74 			While unutarnji_brojac < koliko_ima_ljudi Loop
  75 				printInt(dani_za_debuggiranje[
  76 						unutarnji_brojac
  77 					]);
  78 				unutarnji_brojac += 1;
  79 			EndWhile
  80 			printString("Koliko ljudi ima rodendan na taj dan:");
  81 			unutarnji_brojac := 0;
  82 			While unutarnji_brojac < koliko_godina_ima_dana Loop
  83 				printInt(koliko_ljudi_ima_rodendan_na_taj_dan[
  84 						unutarnji_brojac
  85 					]);
  86 				unutarnji_brojac += 1;
  87 			EndWhile
  88 			printString("---");
  89 		EndIf
  90 		vanjski_brojac += 1;
  91 	EndWhile
  92 	Return Decimal32(
  93 			koliko_smo_puta_dobili_toliko_kolizija
  94 		) / koliko_smo_puta_izvrtili_simulaciju;
  95 EndFunction
  96