Ulam spiral (for primes): Difference between revisions
Content added Content deleted
No edit summary |
|||
Line 3,386:
END.
</lang>
=== using FreePascal ===
{{works with|FreePascal|version 3.2.0 }}
<lang Pascal>
PROGRAM Ulam.pas;
{$IFDEF FPC}
{$mode objfpc}{$H+}{$J-}{R+}
{$ELSE}
{$APPTYPE CONSOLE}
{$ENDIF}
USES
Crt,
SysUtils ;
CONST
SIZE = 9 ;
TYPE
D2Arr = array of array of string ;
FUNCTION IsPrime ( n: integer ): boolean ;
VAR
i: integer;
BEGIN
IF ( n < 2 ) THEN Exit ( False ) ;
IF ( n = 2 ) THEN Exit ( True ) ;
IF ( n mod 2 = 0 ) THEN Exit ( False ) ;
FOR i := 3 TO Trunc ( Sqrt ( n ) ) DO
IF ( n mod i = 0 ) THEN Exit( False ) ;
IsPrime := True ;
END;
PROCEDURE Init2DArr ( Arr: D2Arr ) ;
VAR
j: integer;
mid: integer = SIZE div 2 ;
BEGIN
FOR j:= 1 to SIZE - mid - 1 DO
BEGIN
Arr [ mid - j ] [ mid - j ] := '.' ;
Arr [ mid - j ] [ mid + j ] := '.' ;
Arr [ mid + j ] [ mid - j ] := '.' ;
Arr [ mid + j ] [ mid + j - 1 ] := '.' ;
END;
END;
PROCEDURE Advance ( var Turn_cnt, x, y: integer ) ;
VAR
dir: array [ 0..3, 0..1 ] of shortint =
( ( 1, 0 ), ( 0, -1 ), ( -1, 0 ), ( 0, 1 ) ) ;
BEGIN
x := Abs ( x + dir [ Turn_cnt mod 4 ][ 0 ] ) ;
y := Abs ( y + dir [ Turn_cnt mod 4 ][ 1 ] ) ;
END;
PROCEDURE Add2DArr ( Arr: D2Arr ) ;
VAR
cnt: integer = 1 ;
Turn_cnt: integer = 0 ;
x: integer = SIZE div 2 ;
y: integer = SIZE div 2 ;
BEGIN
WHILE ( cnt < SIZE * SIZE ) DO
BEGIN
Advance ( Turn_cnt , x , y ) ;
Inc ( cnt ) ;
IF ( Arr [ x ] [ y ] = '.' ) THEN
BEGIN
Arr [ x ] [ y ] := '' ;
inc ( Turn_cnt ) ;
END;
IF ( IsPrime ( cnt ) ) THEN
Arr [ x ] [ y ] := IntToStr ( cnt ) ;
END;
END;
PROCEDURE Show2DArr ( Arr: D2Arr ; glyph : Boolean ) ;
VAR
x, y: integer ;
BEGIN
WriteLn ;
FOR y := Low ( Arr ) TO High ( Arr ) DO
BEGIN
FOR x := Low ( Arr [ y ] ) to High ( Arr [ y ] ) DO
IF length ( Arr [ x ] [ y ] ) > 0 THEN
IF glyph THEN Write ( '′' : 3 )
ELSE Write ( Arr [ x ] [ y ] : 3 )
ELSE Write ( ' ' : 3) ;
WriteLn;
END;
WriteLn;
END;
VAR
Arr: D2Arr;
BEGIN
SetLength ( Arr, SIZE, SIZE ) ;
Init2DArr ( Arr ) ;
Add2DArr ( Arr ) ;
Show2DArr ( Arr , False ) ;
Show2DArr ( Arr , True ) ;
END.
</lang>JPD 2021/06/14
=={{header|Perl}}==
|