First perfect square in base n with n unique digits: Difference between revisions
Content added Content deleted
(Added XPL0 example.) |
(Added Algol 68) |
||
Line 56: | Line 56: | ||
Base 15: 1012B857^2 = 102597BACE836D4 |
Base 15: 1012B857^2 = 102597BACE836D4 |
||
Base 16: 404A9D9B^2 = 1025648CFEA37BD9 |
Base 16: 404A9D9B^2 = 1025648CFEA37BD9 |
||
</pre> |
|||
=={{header|ALGOL 68}}== |
|||
Assumes LONG INT is at least 64 bits as in e.g., Algol 68G |
|||
<syntaxhighlight lang="algol68"> |
|||
BEGIN # find the first perfect square in base n with n unique digits n=1..16 # |
|||
[ 0 : 15 ]BITS dmask; # masks for recording the digits in a BITS string # |
|||
dmask[ 0 ] := 16r1; |
|||
FOR i TO UPB dmask DO dmask[ i ] := BIN ( 2 * ABS dmask[ i - 1 ] ) OD; |
|||
# base digits # |
|||
STRING digits = "0123456789abcdefghijklmnopqrstuvwxyz"; |
|||
# returns a string representation of n in base b # |
|||
# the result is balank padded on the left to at least w digits # |
|||
PROC to base = ( LONG INT n, INT b, w )STRING: |
|||
BEGIN |
|||
STRING result := ""; |
|||
LONG INT v := ABS n; |
|||
WHILE v > 0 DO |
|||
digits[ SHORTEN ( v MOD b ) + 1 ] +=: result; |
|||
v OVERAB b |
|||
OD; |
|||
IF INT len = ( UPB result - LWB result ) + 1; |
|||
len < w |
|||
THEN |
|||
( ( w - len ) * " " ) + result |
|||
ELSE result |
|||
FI |
|||
END # to base # ; |
|||
BITS all digits := dmask[ 0 ]; |
|||
FOR b FROM 2 TO 16 DO |
|||
# if the square is to have n digits, the root must be at least # |
|||
# the root of 1 followed by b - 1 zeros in base b # |
|||
all digits := all digits OR dmask[ b - 1 ]; |
|||
LONG INT root := 1; |
|||
FOR i TO b - 1 DO |
|||
root *:= b |
|||
OD; |
|||
root := ENTIER long sqrt( root ); |
|||
BOOL found := FALSE; |
|||
WHILE NOT found DO |
|||
LONG INT square = root * root; |
|||
LONG INT v := square; |
|||
BITS present := 16r0; |
|||
WHILE v > 0 DO |
|||
present := present OR dmask[ SHORTEN ( v MOD b ) ]; |
|||
v OVERAB b |
|||
OD; |
|||
IF found := present = all digits THEN |
|||
print( ( "Base: ", whole( b, -2 ) |
|||
, ":", to base( root, b, 20 ), "^2 = ", to base( square, b, 0 ) |
|||
, newline |
|||
) |
|||
) |
|||
FI; |
|||
root +:= 1 |
|||
OD |
|||
OD |
|||
END |
|||
</syntaxhighlight> |
|||
{{out}} |
|||
<pre> |
|||
Base: 2: 10^2 = 100 |
|||
Base: 3: 22^2 = 2101 |
|||
Base: 4: 33^2 = 3201 |
|||
Base: 5: 243^2 = 132304 |
|||
Base: 6: 523^2 = 452013 |
|||
Base: 7: 1431^2 = 2450361 |
|||
Base: 8: 3344^2 = 13675420 |
|||
Base: 9: 11642^2 = 136802574 |
|||
Base: 10: 32043^2 = 1026753849 |
|||
Base: 11: 111453^2 = 1240a536789 |
|||
Base: 12: 3966b9^2 = 124a7b538609 |
|||
Base: 13: 3828943^2 = 10254773ca86b9 |
|||
Base: 14: 3a9db7c^2 = 10269b8c57d3a4 |
|||
Base: 15: 1012b857^2 = 102597bace836d4 |
|||
Base: 16: 404a9d9b^2 = 1025648cfea37bd9 |
|||
</pre> |
</pre> |
||