68 lines
1.2 KiB
Text
68 lines
1.2 KiB
Text
BYTE FUNC Palindrome(CHAR ARRAY s)
|
|
BYTE l,r
|
|
|
|
l=1 r=s(0)
|
|
WHILE l<r
|
|
DO
|
|
IF s(l)#s(r) THEN RETURN (0) FI
|
|
l==+1 r==-1
|
|
OD
|
|
RETURN (1)
|
|
|
|
BYTE FUNC IsIgnored(BYTE c)
|
|
IF (c>=' AND c<='/) OR
|
|
(c>=': AND c<='@) OR
|
|
(c>='[ AND c<='_) THEN
|
|
RETURN (1)
|
|
FI
|
|
RETURN (0)
|
|
|
|
BYTE FUNC ToUpper(BYTE c)
|
|
IF c>='a AND c<='z THEN
|
|
RETURN (c-'a+'A)
|
|
FI
|
|
RETURN (c)
|
|
|
|
BYTE FUNC InexactPalindrome(CHAR ARRAY s)
|
|
BYTE l,r,lc,rc
|
|
|
|
l=1 r=s(0)
|
|
WHILE l<r
|
|
DO
|
|
WHILE IsIgnored(s(l))
|
|
DO
|
|
l==+1
|
|
IF l>=r THEN RETURN (1) FI
|
|
OD
|
|
WHILE IsIgnored(s(r))
|
|
DO
|
|
r==-1
|
|
IF l>=r THEN RETURN (1) FI
|
|
OD
|
|
|
|
lc=ToUpper(s(l))
|
|
rc=ToUpper(s(r))
|
|
|
|
IF lc#rc THEN RETURN (0) FI
|
|
l==+1 r==-1
|
|
OD
|
|
RETURN (1)
|
|
|
|
PROC Test(CHAR ARRAY s)
|
|
IF Palindrome(s) THEN
|
|
PrintF("'%S' is a palindrome%E%E",s)
|
|
ELSEIF InexactPalindrome(s) THEN
|
|
PrintF("'%S' is an inexact palindrome%E%E",s)
|
|
ELSE
|
|
PrintF("'%S' is not a palindrome%E%E",s)
|
|
FI
|
|
RETURN
|
|
|
|
PROC Main()
|
|
Test("rotavator")
|
|
Test("13231+464+989=989+464+13231")
|
|
Test("Was it a car or a cat I saw?")
|
|
Test("Did Hannah see bees? Hannah did.")
|
|
Test("This sentence is not a palindrome.")
|
|
Test("123 456 789 897 654 321")
|
|
RETURN
|