Ulam spiral (for primes): Difference between revisions
Content added Content deleted
No edit summary |
|||
Line 3,386: | Line 3,386: | ||
END. |
END. |
||
</lang> |
</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}}== |
=={{header|Perl}}== |