Longest common prefix: Difference between revisions

Content added Content deleted
(Added solution for Action!)
Line 65: Line 65:
[prefix, suffix] ->
[prefix, suffix] ->
[foo, foobar] -> foo
[foo, foobar] -> foo
</pre>

=={{header|Action!}}==
<lang Action!>DEFINE PTR="CARD"

BYTE Func Equals(CHAR ARRAY a,b)
BYTE i

IF a(0)#b(0) THEN
RETURN (0)
FI

FOR i=1 TO a(0)
DO
IF a(i)#b(i) THEN
RETURN (0)
FI
OD
RETURN (1)

BYTE FUNC CommonLength(PTR ARRAY texts BYTE count)
CHAR ARRAY t
BYTE i,len

IF count=0 THEN
RETURN (0)
FI

len=255
FOR i=0 TO count-1
DO
t=texts(i)
IF t(0)<len THEN
len=t(0)
FI
OD
RETURN (len)

PROC Prefix(PTR ARRAY texts BYTE count CHAR ARRAY res)
CHAR ARRAY t(100)
BYTE i,len,found

IF count=1 THEN
SCopy(res,texts(0))
RETURN
FI

len=CommonLength(texts,count)
WHILE len>0
DO
SCopyS(res,texts(0),1,len)
found=1
FOR i=1 TO count-1
DO
SCopyS(t,texts(i),1,len)
IF Equals(res,t)#1 THEN
found=0 EXIT
FI
OD
IF found THEN
RETURN
FI
len==-1
OD
res(0)=0
RETURN

PROC Test(PTR ARRAY texts BYTE count)
BYTE i
CHAR ARRAY res(100)

Prefix(texts,count,res)
Print("lcp(")
IF count>0 THEN
FOR i=0 TO count-1
DO
PrintF("""%S""",texts(i))
IF i<count-1 THEN
Print(",")
FI
OD
FI
PrintF(")=""%S""%E",res)
RETURN

PROC Main()
CHAR ARRAY
t1="interspecies", t2="interstellar", t3="interstate",
t4="throne", t5="throne", t6="dungeon", t7="",
t8="prefix", t9="suffix", t10="foo", t11="foobar"
PTR ARRAY texts(20)

texts(0)=t1 texts(1)=t2 texts(2)=t3
Test(texts,3)

texts(0)=t4 texts(1)=t5
Test(texts,2)

texts(0)=t4 texts(1)=t6
Test(texts,2)

texts(0)=t4 texts(1)=t7 texts(2)=t5
Test(texts,3)

texts(0)=t7
Test(texts,1)

Test(texts,0)

texts(0)=t8 texts(1)=t9
Test(texts,2)

texts(0)=t10 texts(1)=t11
Test(texts,2)
RETURN</lang>
{{out}}
[https://gitlab.com/amarok8bit/action-rosetta-code/-/raw/master/images/Longest_common_prefix.png Screenshot from Atari 8-bit computer]
<pre>
lcp("interspecies","interstellar","interstate")="inters"
lcp("throne","throne")="throne"
lcp("throne","dungeon")=""
lcp("throne","","throne")=""
lcp("")=""
lcp()=""
lcp("prefix","suffix")=""
lcp("foo","foobar")="foo"
</pre>
</pre>