108 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
		
		
			
		
	
	
			108 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
| 
								 | 
							
								0% ----------------------------------------------------------------------
							 | 
						||
| 
								 | 
							
								% The Computer Language Benchmarks Game
							 | 
						||
| 
								 | 
							
								% http://shootout.alioth.debian.org/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								% Modified to run with YAP by Glendon Holst
							 | 
						||
| 
								 | 
							
								% ----------------------------------------------------------------------
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:- yap_flag(unknown,error).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:- initialization(main).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								main :-
							 | 
						||
| 
								 | 
							
								  unix( argv([H|_]) ), number_atom(Height,H), Width = Height,
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  format('P4~N~d ~d~N',[Height, Width]),
							 | 
						||
| 
								 | 
							
								  pointsY(Height, Width, 0, 0, 0, 0, 0),
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  statistics,
							 | 
						||
| 
								 | 
							
								  statistics_jit.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								% ------------------------------- %
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								pointsY(Height, Width, Y, X,
							 | 
						||
| 
								 | 
							
									OUTFLAG0,
							 | 
						||
| 
								 | 
							
									BYTEOUT0,
							 | 
						||
| 
								 | 
							
									BITN0) :-
							 | 
						||
| 
								 | 
							
									Y1 is Y + 1, Height >= Y1, !,
							 | 
						||
| 
								 | 
							
									pointsX(Height, Width, Y, 0,
							 | 
						||
| 
								 | 
							
										OUTFLAG0, OUTFLAG,
							 | 
						||
| 
								 | 
							
										BYTEOUT0, BYTEOUT,
							 | 
						||
| 
								 | 
							
										BITN0, BITN),
							 | 
						||
| 
								 | 
							
									pointsY(Height, Width, Y1, X,
							 | 
						||
| 
								 | 
							
										OUTFLAG,
							 | 
						||
| 
								 | 
							
										BYTEOUT,
							 | 
						||
| 
								 | 
							
										BITN).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								pointsY(_, _, _, _, _, _, _) :- !.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								% ------------- %
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								pointsX(Height, Width, Y, X,
							 | 
						||
| 
								 | 
							
									OUTFLAG0, OUTFLAG,
							 | 
						||
| 
								 | 
							
									BYTEOUT0, BYTEOUT,
							 | 
						||
| 
								 | 
							
									BITN0, BITN) :-
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									X1 is X + 1, Width >= X1, !,
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									(mandel(Height, Width, Y, X, 50) -> LimitAdj = 0 ; LimitAdj = 1),
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									BITN1 is BITN0 + 1,
							 | 
						||
| 
								 | 
							
									(BITN1 == 8 -> OUTFLAG1 = 1 ; OUTFLAG1 = OUTFLAG0),
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									BYTEOUT1 is BYTEOUT0 * 2 + LimitAdj,
							 | 
						||
| 
								 | 
							
									(
							 | 
						||
| 
								 | 
							
										(Width == X1, BITN1 \== 8) ->
							 | 
						||
| 
								 | 
							
										(BYTEOUT2 is BYTEOUT1 * integer(2 ** (8 - Width mod 8)), OUTFLAG2 = 1)
							 | 
						||
| 
								 | 
							
									;
							 | 
						||
| 
								 | 
							
										(BYTEOUT2 = BYTEOUT1, OUTFLAG2 = OUTFLAG1)
							 | 
						||
| 
								 | 
							
									),
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									output(OUTFLAG2, OUTFLAG3, BYTEOUT2, BYTEOUT3, BITN1, BITN2),
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									pointsX(Height, Width, Y, X1,
							 | 
						||
| 
								 | 
							
										OUTFLAG3, OUTFLAG,
							 | 
						||
| 
								 | 
							
										BYTEOUT3, BYTEOUT,
							 | 
						||
| 
								 | 
							
										BITN2, BITN).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								pointsX(_, _, _, _, OUTFLAG, OUTFLAG, BYTEOUT, BYTEOUT, BITN, BITN) :- !.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								% ------------- %
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								mandel(Height, Width, Y, X, Repetitions) :-
							 | 
						||
| 
								 | 
							
									Cr is (2.0 * X / Width - 1.5), Ci is (2.0 * Y / Height - 1.0),
							 | 
						||
| 
								 | 
							
									mandel_(Cr, Ci, 0.0, 0.0, Repetitions, 0).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								mandel_(_, _, Zr, Zi, Repetitions, Repetitions) :- !,
							 | 
						||
| 
								 | 
							
									Limit is Zr * Zr + Zi * Zi, Limit > 4.0.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								mandel_(Cr, Ci, Zr, Zi, Repetitions, N) :-
							 | 
						||
| 
								 | 
							
									Zr1 is Zr * Zr - Zi * Zi + Cr,
							 | 
						||
| 
								 | 
							
									Zi1 is 2.0 * Zr * Zi + Ci,
							 | 
						||
| 
								 | 
							
									Limit is Zr1 * Zr1 + Zi1 * Zi1,
							 | 
						||
| 
								 | 
							
									Limit =< 4.0, N1 is N + 1, !,
							 | 
						||
| 
								 | 
							
									mandel_(Cr, Ci, Zr1, Zi1, Repetitions, N1).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								mandel_(_, _, _, _, _, _) :- !.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								% ------------- %
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								output(OUTFLAG0, OUTFLAG, BYTEOUT0, BYTEOUT, BITN0, BITN) :-
							 | 
						||
| 
								 | 
							
								(
							 | 
						||
| 
								 | 
							
									OUTFLAG0 =:= 1 ->
							 | 
						||
| 
								 | 
							
									(
							 | 
						||
| 
								 | 
							
										put_byte(BYTEOUT0),
							 | 
						||
| 
								 | 
							
										BITN = 0,
							 | 
						||
| 
								 | 
							
										BYTEOUT = 0,
							 | 
						||
| 
								 | 
							
										OUTFLAG = 0
							 | 
						||
| 
								 | 
							
									)
							 | 
						||
| 
								 | 
							
								;
							 | 
						||
| 
								 | 
							
									(
							 | 
						||
| 
								 | 
							
										BYTEOUT = BYTEOUT0,
							 | 
						||
| 
								 | 
							
										BITN = BITN0,
							 | 
						||
| 
								 | 
							
										OUTFLAG = OUTFLAG0
							 | 
						||
| 
								 | 
							
									)
							 | 
						||
| 
								 | 
							
								).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								% ------------------------------- %
							 |