RosettaCodeData/Task/Palindrome-detection/Action-/palindrome-detection.action
2023-07-01 13:44:08 -04:00

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