Hex words: Difference between revisions
Content added Content deleted
m (relocate python) |
(Added Algol 68) |
||
Line 12: | Line 12: | ||
Also filter out all such words which contain at least '''4''' distinct letters and display the same statistics but in decreasing order of decimal equivalent together with their total count. |
Also filter out all such words which contain at least '''4''' distinct letters and display the same statistics but in decreasing order of decimal equivalent together with their total count. |
||
<br><br> |
<br><br> |
||
=={{header|ALGOL 68}}== |
|||
<lang algol68># find words that contain only hex digits a-f # |
|||
IF FILE input file; |
|||
STRING file name = "unixdict.txt"; |
|||
open( input file, file name, stand in channel ) /= 0 |
|||
THEN |
|||
# failed to open the file # |
|||
print( ( "Unable to open """ + file name + """", newline ) ) |
|||
ELSE |
|||
# file opened OK # |
|||
BOOL at eof := FALSE; |
|||
# set the EOF handler for the file # |
|||
on logical file end( input file, ( REF FILE f )BOOL: |
|||
BEGIN |
|||
# note that we reached EOF on the # |
|||
# latest read # |
|||
at eof := TRUE; |
|||
# return TRUE so processing can continue # |
|||
TRUE |
|||
END |
|||
); |
|||
INT count := 0; |
|||
INT max words = 100; # guess at the maximum number of words # |
|||
MODE HEXWORD = STRUCT( STRING word, LONG INT value, INT root, INT len ); |
|||
[ 1 : max words ]HEXWORD hw; |
|||
WHILE STRING word; |
|||
get( input file, ( word, newline ) ); |
|||
NOT at eof |
|||
DO |
|||
# check the word contains only a-f and compute its decimal value # |
|||
IF INT word len = ( UPB word + 1 ) - LWB word; |
|||
word len >= 4 |
|||
THEN |
|||
# the word is at least 4 characters long # |
|||
BOOL is hex word := word /= ""; |
|||
LONG INT int word := 0; |
|||
FOR i FROM LWB word TO UPB word |
|||
WHILE is hex word := word[ i ] >= "a" AND word[ i ] <= "f" |
|||
DO |
|||
int word *:= 16; |
|||
int word +:= ( ABS word[ i ] - ABS "a" ) + 10 |
|||
OD; |
|||
IF is hex word |
|||
THEN |
|||
# have a hex word # |
|||
count +:= 1; |
|||
# compute the digital root # |
|||
LONG INT r := int word; |
|||
WHILE r > 9 DO |
|||
LONG INT dr := r MOD 10; |
|||
WHILE ( r OVERAB 10 ) > 0 DO dr +:= r MOD 10 OD; |
|||
r := dr |
|||
OD; |
|||
word OF hw[ count ] := word; |
|||
value OF hw[ count ] := int word; |
|||
root OF hw[ count ] := SHORTEN r; |
|||
len OF hw[ count ] := word len |
|||
FI |
|||
FI |
|||
OD; |
|||
close( input file ); |
|||
# prints the HEXWORD hw # |
|||
PROC show = ( HEXWORD hw )VOID: |
|||
BEGIN |
|||
STRING pad = IF len OF hw >= 12 THEN "" ELSE ( 12 - len OF hw ) * " " FI; |
|||
print( ( word OF hw, ": ", pad, whole( value OF hw, -10 ), " [ ", whole( root OF hw, 0 ), " ]", newline ) ) |
|||
END # show # ; |
|||
# Quicksorts in-place the array of HEXWORDS a, from lb to ub on ascending value # |
|||
PROC quicksort = ( REF[]HEXWORD a, INT lb, ub )VOID: |
|||
IF ub > lb THEN |
|||
# more than one element, so must sort # |
|||
INT left := lb; |
|||
INT right := ub; |
|||
# choosing the middle element of the array as the pivot # |
|||
LONG INT pivot := value OF a[ left + ( ( right + 1 ) - left ) OVER 2 ]; |
|||
WHILE |
|||
WHILE IF left <= ub THEN value OF a[ left ] < pivot ELSE FALSE FI DO left +:= 1 OD; |
|||
WHILE IF right >= lb THEN value OF a[ right ] > pivot ELSE FALSE FI DO right -:= 1 OD; |
|||
left <= right |
|||
DO |
|||
HEXWORD t := a[ left ]; |
|||
a[ left ] := a[ right ]; |
|||
a[ right ] := t; |
|||
left +:= 1; |
|||
right -:= 1 |
|||
OD; |
|||
quicksort( a, lb, right ); |
|||
quicksort( a, left, ub ) |
|||
FI # quicksort # ; |
|||
# show the hex words in ascending order of digital root # |
|||
FOR r FROM 1 TO 9 DO |
|||
FOR i FROM 1 TO count DO |
|||
IF root OF hw[ i ] = r THEN show( hw[ i ] ) FI |
|||
OD |
|||
OD; |
|||
print( ( "Found ", whole( count, 0 ), " hex words", newline, newline ) ); |
|||
# show the words in descending value order excluding those with less than 4 unique letters # |
|||
quicksort( hw, 1, count ); |
|||
INT count 4 := 0; |
|||
FOR i FROM count BY -1 TO 1 DO |
|||
# check the word has at least four different digits # |
|||
INT a := 0, b := 0, c := 0, d := 0, e := 0, f := 0; |
|||
FOR c pos FROM LWB word OF hw[ i ] TO UPB word OF hw[ i ] DO |
|||
IF CHAR ch = ( word OF hw[ i ] )[ c pos ]; |
|||
ch = "a" |
|||
THEN a := 1 |
|||
ELIF ch = "b" |
|||
THEN b := 1 |
|||
ELIF ch = "c" |
|||
THEN c := 1 |
|||
ELIF ch = "d" |
|||
THEN d := 1 |
|||
ELIF ch = "e" |
|||
THEN e := 1 |
|||
ELSE f := 1 |
|||
FI |
|||
OD; |
|||
IF a + b + c + d + e + f >= 4 |
|||
THEN |
|||
# have a hex word with at least 4 different digits # |
|||
count 4 +:= 1; |
|||
show( hw[ i ] ) |
|||
FI |
|||
OD; |
|||
print( ( "Found ", whole( count 4, 0 ), " hex words with 4 or more distinct digits", newline ) ) |
|||
FI</lang> |
|||
{{out}} |
|||
<pre> |
|||
ababa: 703162 [ 1 ] |
|||
abbe: 43966 [ 1 ] |
|||
dada: 56026 [ 1 ] |
|||
deaf: 57007 [ 1 ] |
|||
decade: 14600926 [ 1 ] |
|||
cede: 52958 [ 2 ] |
|||
feed: 65261 [ 2 ] |
|||
abed: 44013 [ 3 ] |
|||
added: 712173 [ 3 ] |
|||
bade: 47838 [ 3 ] |
|||
beebe: 782014 [ 4 ] |
|||
decca: 912586 [ 4 ] |
|||
dade: 56030 [ 5 ] |
|||
bead: 48813 [ 6 ] |
|||
deface: 14613198 [ 6 ] |
|||
babe: 47806 [ 7 ] |
|||
fade: 64222 [ 7 ] |
|||
dead: 57005 [ 8 ] |
|||
efface: 15727310 [ 8 ] |
|||
facade: 16435934 [ 8 ] |
|||
accede: 11325150 [ 9 ] |
|||
beef: 48879 [ 9 ] |
|||
cafe: 51966 [ 9 ] |
|||
dacca: 896202 [ 9 ] |
|||
deed: 57069 [ 9 ] |
|||
face: 64206 [ 9 ] |
|||
Found 26 hex words |
|||
facade: 16435934 [ 8 ] |
|||
efface: 15727310 [ 8 ] |
|||
deface: 14613198 [ 6 ] |
|||
decade: 14600926 [ 1 ] |
|||
accede: 11325150 [ 9 ] |
|||
decca: 912586 [ 4 ] |
|||
fade: 64222 [ 7 ] |
|||
face: 64206 [ 9 ] |
|||
deaf: 57007 [ 1 ] |
|||
cafe: 51966 [ 9 ] |
|||
bead: 48813 [ 6 ] |
|||
bade: 47838 [ 3 ] |
|||
abed: 44013 [ 3 ] |
|||
Found 13 hex words with 4 or more distinct digits |
|||
</pre> |
|||
=={{header|Factor}}== |
=={{header|Factor}}== |
||
Line 82: | Line 254: | ||
13 such words found which contain 4 or more different digits. |
13 such words found which contain 4 or more different digits. |
||
</pre> |
</pre> |
||
=={{header|Julia}}== |
=={{header|Julia}}== |