Order two numerical lists: Difference between revisions

m
No edit summary
 
(41 intermediate revisions by 27 users not shown)
Line 1:
{{task|Sorting Algorithms}}
{{Category:Sorting}}
{{Sorting Algorithm}}
 
Write a function that orders two lists or arrays filled with numbers.
Line 10 ⟶ 12:
 
<small>Note: further clarification of lexicographical ordering is expounded on the talk page [[Talk:Order_two_numerical_lists#Lexicographic_order|here]] and [[Talk:Order_two_numerical_lists#Is_the_task_statement_consistent.3F|here]].</small>
<br><br>
 
=={{header|11l}}==
{{trans|Python}}
 
<syntaxhighlight lang="11l">[1,2,1,3,2] < [1,2,0,4,4,0,0,0]</syntaxhighlight>
 
=={{header|AArch64 Assembly}}==
{{works with|as|Raspberry Pi 3B version Buster 64 bits}}
<syntaxhighlight lang="aarch64 assembly">
/* ARM assembly AARCH64 Raspberry PI 3B */
/* program orderlist64.s */
 
/*******************************************/
/* Constantes file */
/*******************************************/
/* for this file see task include a file in language AArch64 assembly*/
.include "../includeConstantesARM64.inc"
 
/*********************************/
/* Initialized data */
/*********************************/
.data
szMessResult1: .asciz "List1 < List2 \n" // message result
szMessResult2: .asciz "List1 => List2 \n" // message result
szCarriageReturn: .asciz "\n"
qTabList1: .quad 1,2,3,4,5
.equ NBELEMENTS1, (. - qTabList1) /8
qTabList2: .quad 1,2,1,5,2,2
.equ NBELEMENTS2, (. - qTabList2) /8
qTabList3: .quad 1,2,3,4,5
.equ NBELEMENTS3, (. - qTabList3) /8
qTabList4: .quad 1,2,3,4,5,6
.equ NBELEMENTS4, (. - qTabList4) /8
/*********************************/
/* UnInitialized data */
/*********************************/
.bss
/*********************************/
/* code section */
/*********************************/
.text
.global main
main: // entry of program
ldr x0,qAdriTabList1
mov x1,NBELEMENTS1
ldr x2,qAdriTabList2
mov x3,NBELEMENTS2
bl listeOrder
cmp x0,0 // false ?
beq 1f // yes
ldr x0,qAdrszMessResult1 // list 1 < list 2
bl affichageMess // display message
b 2f
1:
ldr x0,qAdrszMessResult2
bl affichageMess // display message
2:
ldr x0,qAdriTabList1
mov x1,NBELEMENTS1
ldr x2,qAdriTabList3
mov x3,NBELEMENTS3
bl listeOrder
cmp x0,0 // false ?
beq 3f // yes
ldr x0,qAdrszMessResult1 // list 1 < list 2
bl affichageMess // display message
b 4f
3:
ldr x0,qAdrszMessResult2
bl affichageMess // display message
4:
ldr x0,qAdriTabList1
mov x1,NBELEMENTS1
ldr x2,qAdriTabList4
mov x3,NBELEMENTS4
bl listeOrder
cmp x0,0 // false ?
beq 5f // yes
ldr x0,qAdrszMessResult1 // list 1 < list 2
bl affichageMess // display message
b 6f
5:
ldr x0,qAdrszMessResult2
bl affichageMess // display message
6:
100: // standard end of the program
mov x0,0 // return code
mov x8,EXIT // request to exit program
svc 0 // perform the system call
qAdriTabList1: .quad qTabList1
qAdriTabList2: .quad qTabList2
qAdriTabList3: .quad qTabList3
qAdriTabList4: .quad qTabList4
qAdrszMessResult1: .quad szMessResult1
qAdrszMessResult2: .quad szMessResult2
qAdrszCarriageReturn: .quad szCarriageReturn
/******************************************************************/
/* liste order */
/******************************************************************/
/* x0 contains the address of list 1 */
/* x1 contains list 1 size */
/* x2 contains the address of list 2 */
/* x3 contains list 2 size */
/* x0 returns 1 if list1 < list2 */
/* x0 returns 0 else */
listeOrder:
stp x1,lr,[sp,-16]! // save registers
stp x2,x3,[sp,-16]! // save registers
cbz x1,99f // list 1 size = zero ?
cbz x3,98f // list 2 size = zero ?
 
mov x4,#0 // index list 1
mov x5,#0 // index list 2
1:
ldr x6,[x0,x4,lsl #3] // load list 1 element
ldr x8,[x2,x5,lsl #3] // load list 2 element
cmp x6,x8 // compar
bgt 4f
beq 2f // list 1 = list 2
add x4,x4,1 // increment index 1
cmp x4,x1 // end list ?
bge 5f
b 1b // else loop
2:
add x4,x4,1 // increment index 1
cmp x4,x1 // end list ?
bge 3f // yes -> verif size
add x5,x5,1 // else increment index 2
cmp x5,x3 // end list 2 ?
bge 4f
b 1b // else loop
3:
cmp x1,x3 // compar size
bge 4f // list 2 < list 1
blt 5f // list 1 < list 2
b 100f
4:
mov x0,#0 // list 1 > list 2
b 100f
5:
mov x0,#1 // list 1 < list 2
b 100f
98: // error
mov x0,-2
b 100f
99: // error
mov x0,-1
100:
ldp x2,x3,[sp],16 // restaur 2 registers
ldp x1,lr,[sp],16 // restaur 2 registers
ret // return to address lr x30
/********************************************************/
/* File Include fonctions */
/********************************************************/
/* for this file see task include a file in language AArch64 assembly */
.include "../includeARM64.inc"
 
</syntaxhighlight>
 
=={{header|ACL2}}==
Line 19 ⟶ 182:
ACL2 !>(lexorder '(1 2 4) '(1 2 3))
NIL</pre>
 
=={{header|Action!}}==
<syntaxhighlight lang="action!">INT FUNC Compare(INT ARRAY x INT xLen INT ARRAY y INT yLen)
INT i,len
 
len=xLen
IF len>yLen THEN
len=yLen
FI
FOR i=0 TO len-1
DO
IF x(i)>y(i) THEN
RETURN (1)
ELSEIF x(i)<y(i) THEN
RETURN (-1)
FI
OD
IF xLen>yLen THEN
RETURN (1)
ELSEIF xLen<yLen THEN
RETURN (-1)
FI
RETURN (0)
 
BYTE FUNC Less(INT ARRAY x INT xLen INT ARRAY y INT yLen)
IF Compare(x,xLen,y,yLen)<0 THEN
RETURN (1)
FI
RETURN (0)
 
PROC PrintArray(INT ARRAY x INT len)
INT i
 
Put('[)
FOR i=0 TO len-1
DO
PrintI(x(i))
IF i<len-1 THEN
Put(' )
FI
OD
Put('])
RETURN
 
PROC Test(INT ARRAY x INT xLen INT ARRAY y INT yLen)
PrintArray(x,xLen)
IF Less(x,xLen,y,yLen) THEN
Print(" < ")
ELSE
Print(" >= ")
FI
PrintArray(y,yLen) PutE()
RETURN
 
PROC Main()
INT ARRAY a=[1 2 1 5 2]
INT ARRAY b=[1 2 1 5 2 2]
INT ARRAY c=[1 2 3 4 5]
INT ARRAY d=[1 2 3 4 5]
Test(a,5,b,6)
Test(b,6,a,5)
Test(b,6,c,5)
Test(c,5,b,6)
Test(c,5,d,5)
RETURN</syntaxhighlight>
{{out}}
[https://gitlab.com/amarok8bit/action-rosetta-code/-/raw/master/images/Order_two_numerical_lists.png Screenshot from Atari 8-bit computer]
<pre>
[1 2 1 5 2] < [1 2 1 5 2 2]
[1 2 1 5 2 2] >= [1 2 1 5 2]
[1 2 1 5 2 2] < [1 2 3 4 5]
[1 2 3 4 5] >= [1 2 1 5 2 2]
[1 2 3 4 5] >= [1 2 3 4 5]
</pre>
 
=={{header|Ada}}==
Line 24 ⟶ 262:
This also includes arrays of user defined types, using the type definition order from smallest to largest.
Demonstrated in the program below:
<syntaxhighlight lang="ada">
<lang Ada>
with Ada.Text_IO; use Ada.Text_IO;
procedure Order is
Line 47 ⟶ 285:
Put_Line (Boolean'Image (List6 > List7)); -- True
end Order;
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 57 ⟶ 295:
</pre>
 
=={{header|ALGOL 68}}==
<syntaxhighlight lang="algol68">BEGIN # compare lists (rows) of integers #
# returns TRUE if there is an element in a that is < the corresponding #
# element in b and all previous elements are equal; FALSE otherwise #
OP < = ( []INT a, b )BOOL:
IF INT a pos := LWB a;
INT b pos := LWB b;
BOOL equal := TRUE;
WHILE a pos <= UPB a AND b pos <= UPB b AND equal DO
equal := a[ a pos ] = b[ b pos ];
IF equal THEN
a pos +:= 1;
b pos +:= 1
FI
OD;
NOT equal
THEN
# there is an element in a and b that is not equal #
a[ a pos ] < b[ b pos ]
ELSE
# all elements are equal or one list is shorter #
# a is < b if a has fewer elements #
a pos > UPB a AND b pos <= UPB b
FI # < # ;
 
# tests a < b has the expected result #
PROC test = ( STRING a name, []INT a, STRING b name, []INT b, BOOL expected )VOID:
BEGIN
BOOL result = a < b;
print( ( a name, IF result THEN " < " ELSE " >= " FI, b name
, IF result = expected THEN "" ELSE ", NOT as expected" FI
, newline
)
)
END # test # ;
 
# test cases as in the BBC basic sample #
[]INT list1 = ( 1, 2, 1, 5, 2 );
[]INT list2 = ( 1, 2, 1, 5, 2, 2 );
[]INT list3 = ( 1, 2, 3, 4, 5 );
[]INT list4 = ( 1, 2, 3, 4, 5 );
test( "list1", list1, "list2", list2, TRUE );
test( "list2", list2, "list3", list3, TRUE );
test( "list3", list3, "list4", list4, FALSE );
 
# additional test cases #
[]INT list5 = ( 9, 0, 2, 1, 0 );
[]INT list6 = ( 4, 0, 7, 7 );
[]INT list7 = ( 4, 0, 7 );
[]INT list8 = ( );
test( "list5", list5, "list6", list6, FALSE );
test( "list6", list6, "list7", list7, FALSE );
test( "list7", list7, "list8", list8, FALSE );
test( "list8", list8, "list7", list7, TRUE )
 
END</syntaxhighlight>
{{out}}
<pre>
list1 < list2
list2 < list3
list3 >= list4
list5 >= list6
list6 >= list7
list7 >= list8
list8 < list7
</pre>
 
=={{header|ALGOL W}}==
{{Trans|ALGOL 68}}
<syntaxhighlight lang="algolw">begin % compare lists (rows) of integers %
% returns TRUE if there is an element in a that is < the corresponding %
% element in b and all previous elements are equal, FALSE otherwise %
% the bounds of a and b should aLb :: aUb and bLb :: bUb %
logical procedure iLT ( integer array a ( * )
; integer value aLb, aUb
; integer array b ( * )
; integer value bLb, bUb
) ;
begin
integer aPos, bPos;
logical equal;
aPos := aLb;
bPos := bLb;
equal := true;
while aPos <= aUb and bPos <= bUb and equal do begin
equal := a( aPos ) = b( bPos );
if equal then begin
aPos := aPOs + 1;
bPos := bPos + 1
end if_equal
end while_more_elements_and_equal ;
if not equal
then % there is an element in a and b that is not equal %
a( aPos ) < b( bPos )
else % all elements are equal or one list is shorter %
% a is < b if a has fewer elements %
aPos > aUb and bPos <= bUb
end iLT ;
% tests a < b has the expected result %
procedure test ( string(5) value aName
; integer array a ( * )
; integer value aLb, aUb
; string(5) value bName
; integer array b ( * )
; integer value bLb, bUb
; logical value expected
) ;
begin
logical isLt;
isLt := iLT( a, aLb, aUb, b, bLb, bUb );
write( aName, if isLt then " < " else " >= ", bName
, if isLt = expected then "" else ", NOT as expected"
)
end test ;
 
integer array list1, list3, list4 ( 1 :: 5 );
integer array list2 ( 1 :: 6 );
integer array list5 ( 1 :: 5 );
integer array list6 ( 1 :: 4 );
integer array list7 ( 1 :: 3 );
integer array list8 ( 1 :: 1 );
integer aPos;
% test cases as in the BBC basic sample %
aPos := 1; for i := 1, 2, 1, 5, 2 do begin list1( aPos ) := i; aPos := aPos + 1 end;
aPos := 1; for i := 1, 2, 1, 5, 2, 2 do begin list2( aPos ) := i; aPos := aPos + 1 end;
aPos := 1; for i := 1, 2, 3, 4, 5 do begin list3( aPos ) := i; aPos := aPos + 1 end;
aPos := 1; for i := 1, 2, 3, 4, 5 do begin list4( aPos ) := i; aPos := aPos + 1 end;
test( "list1", list1, 1, 5, "list2", list2, 1, 6, true );
test( "list2", list2, 1, 6, "list3", list3, 1, 5, true );
test( "list3", list3, 1, 5, "list4", list4, 1, 5, false );
% additional test cases %
aPos := 1; for i := 9, 0, 2, 1, 0 do begin list5( aPos ) := i; aPos := aPos + 1 end;
aPos := 1; for i := 4, 0, 7, 7 do begin list6( aPos ) := i; aPos := aPos + 1 end;
aPos := 1; for i := 4, 0, 7 do begin list7( aPos ) := i; aPos := aPos + 1 end;
test( "list5", list5, 1, 5, "list6", list6, 1, 4, false );
test( "list6", list6, 1, 4, "list7", list7, 1, 3, false );
test( "list7", list7, 1, 3, "list8", list8, 1, 0, false );
test( "list8", list8, 1, 0, "list7", list7, 1, 3, true )
end.</syntaxhighlight>
{{out}}
<pre>
list1 < list2
list2 < list3
list3 >= list4
list5 >= list6
list6 >= list7
list7 >= list8
list8 < list7
</pre>
 
=={{header|Aime}}==
<syntaxhighlight lang="aime">ordl(list a, b)
<lang aime></lang>
{
integer i, l, o;
 
l = min(~a, ~b);
i = 0;
while (i < l) {
if (a[i] != b[i]) {
o = a[i] < b[i];
break;
}
 
i += 1;
}
 
i < l ? o : ~a <= ~b;
}
 
main(void)
{
o_(ordl(list(1, 2), list(1, 2)), "\n");
o_(ordl(list(1e2, 2), list(1e2, 2, 3)), "\n");
o_(ordl(list(1, 2, 3), list(1, 2)), "\n");
o_(ordl(list(.5, 4), list(.5, 2)), "\n");
o_(ordl(list(1, 4, 2, 3), list(1, 4, 2.1, 3)), "\n");
 
0;
}</syntaxhighlight>
 
=={{header|AppleScript}}==
Line 67 ⟶ 480:
 
<= is not defined over lists in AppleScript
<langsyntaxhighlight AppleScriptlang="applescript">-- <= for lists
-- compare :: [a] -> [a] -> Bool
on compare(xs, ys)
Line 110 ⟶ 523:
missing value
end if
end uncons</langsyntaxhighlight>
 
{{Out}}
<syntaxhighlight lang AppleScript="applescript">{false, true}</langsyntaxhighlight>
 
----
Here's an iterative implementation:
 
<syntaxhighlight lang="applescript">on listAComesBeforeListB(a, b)
set aLength to (count a)
set bLength to (count b)
set i to 0
repeat
set i to i + 1
if (i > bLength) then
return false
else if (i > aLength) then
return true
else
set aVal to item i of a
set bVal to item i of b
if (aVal = bVal) then
else
return (bVal > aVal)
end if
end if
end repeat
end listAComesBeforeListB
 
-- Test code:
set a to {}
repeat (random number 10) times
set end of a to random number 10
end repeat
set b to {}
repeat (random number 10) times
set end of b to random number 10
end repeat
 
return {a:a, b:b, | a < b |: listAComesBeforeListB(a, b)},</syntaxhighlight>
 
{{Out}}
Examples:
<syntaxhighlight lang="applescript">{a:{3, 5, 6, 5, 2, 1, 4}, b:{5, 8, 9, 2, 0, 1, 9, 0, 4, 10}, | a < b |:true}
{a:{10, 9, 5, 8, 8, 4, 3}, b:{5, 10, 8, 9, 10, 8, 7, 8}, | a < b |:false}
{a:{0, 10}, b:{0, 10}, | a < b |:false}
{a:{0, 10}, b:{0, 10, 5}, | a < b |:true}</syntaxhighlight>
 
=={{header|ARM Assembly}}==
{{works with|as|Raspberry Pi}}
<syntaxhighlight lang="arm assembly">
/* ARM assembly Raspberry PI */
/* program orderlist.s */
 
/* Constantes */
.equ STDOUT, 1 @ Linux output console
.equ EXIT, 1 @ Linux syscall
.equ WRITE, 4 @ Linux syscall
 
/*********************************/
/* Initialized data */
/*********************************/
.data
szMessResult1: .asciz "List1 < List2 \n" @ message result
szMessResult2: .asciz "List1 => List2 \n" @ message result
szCarriageReturn: .asciz "\n"
 
iTabList1: .int 1,2,3,4,5
.equ NBELEMENTS1, (. - iTabList1) /4
iTabList2: .int 1,2,1,5,2,2
.equ NBELEMENTS2, (. - iTabList2) /4
iTabList3: .int 1,2,3,4,5
.equ NBELEMENTS3, (. - iTabList3) /4
iTabList4: .int 1,2,3,4,5,6
.equ NBELEMENTS4, (. - iTabList4) /4
/*********************************/
/* UnInitialized data */
/*********************************/
.bss
/*********************************/
/* code section */
/*********************************/
.text
.global main
main: @ entry of program
ldr r0,iAdriTabList1
mov r1,#NBELEMENTS1
ldr r2,iAdriTabList2
mov r3,#NBELEMENTS2
bl listeOrder
cmp r0,#0 @ false ?
beq 1f @ yes
ldr r0,iAdrszMessResult1 @ list 1 < list 2
bl affichageMess @ display message
b 2f
1:
ldr r0,iAdrszMessResult2
bl affichageMess @ display message
 
2:
ldr r0,iAdriTabList1
mov r1,#NBELEMENTS1
ldr r2,iAdriTabList3
mov r3,#NBELEMENTS3
bl listeOrder
cmp r0,#0 @ false ?
beq 3f @ yes
ldr r0,iAdrszMessResult1 @ list 1 < list 2
bl affichageMess @ display message
b 4f
3:
ldr r0,iAdrszMessResult2
bl affichageMess @ display message
4:
ldr r0,iAdriTabList1
mov r1,#NBELEMENTS1
ldr r2,iAdriTabList4
mov r3,#NBELEMENTS4
bl listeOrder
cmp r0,#0 @ false ?
beq 5f @ yes
ldr r0,iAdrszMessResult1 @ list 1 < list 2
bl affichageMess @ display message
b 6f
5:
ldr r0,iAdrszMessResult2
bl affichageMess @ display message
6:
100: @ standard end of the program
mov r0, #0 @ return code
mov r7, #EXIT @ request to exit program
svc #0 @ perform the system call
iAdriTabList1: .int iTabList1
iAdriTabList2: .int iTabList2
iAdriTabList3: .int iTabList3
iAdriTabList4: .int iTabList4
iAdrszMessResult1: .int szMessResult1
iAdrszMessResult2: .int szMessResult2
iAdrszCarriageReturn: .int szCarriageReturn
/******************************************************************/
/* display text with size calculation */
/******************************************************************/
/* r0 contains the address of list 1 */
/* r1 contains list 1 size */
/* r2 contains the address of list 2 */
/* r3 contains list 2 size */
/* r0 returns 1 if list1 < list2 */
/* r0 returns 0 else */
listeOrder:
push {r1-r7,lr} @ save registres
cmp r1,#0 @ list 1 size = zero ?
moveq r0,#-1 @ yes -> error
beq 100f
cmp r3,#0 @ list 2 size = zero ?
moveq r0,#-2 @ yes -> error
beq 100f
mov r4,#0 @ index list 1
mov r5,#0 @ index list 2
1:
ldr r6,[r0,r4,lsl #2] @ load list 1 element
ldr r7,[r2,r5,lsl #2] @ load list 2 element
cmp r6,r7 @ compar
movgt r0,#0 @ list 1 > list 2 ?
bgt 100f
beq 2f @ list 1 = list 2
add r4,#1 @ increment index 1
cmp r4,r1 @ end list ?
movge r0,#1 @ yes -> ok list 1 < list 2
bge 100f
b 1b @ else loop
2:
add r4,#1 @ increment index 1
cmp r4,r1 @ end list ?
bge 3f @ yes -> verif size
add r5,#1 @ else increment index 2
cmp r5,r3 @ end list 2 ?
movge r0,#0 @ yes -> list 2 < list 1
bge 100f
b 1b @ else loop
3:
cmp r1,r3 @ compar size
movge r0,#0 @ list 2 < list 1
movlt r0,#1 @ list 1 < list 2
100:
pop {r1-r7,lr} @ restaur registers
bx lr @ return
/******************************************************************/
/* display text with size calculation */
/******************************************************************/
/* r0 contains the address of the message */
affichageMess:
push {r0,r1,r2,r7,lr} @ save registres
mov r2,#0 @ counter length
1: @ loop length calculation
ldrb r1,[r0,r2] @ read octet start position + index
cmp r1,#0 @ if 0 its over
addne r2,r2,#1 @ else add 1 in the length
bne 1b @ and loop
@ so here r2 contains the length of the message
mov r1,r0 @ address message in r1
mov r0,#STDOUT @ code to write to the standard output Linux
mov r7, #WRITE @ code call system "write"
svc #0 @ call systeme
pop {r0,r1,r2,r7,lr} @ restaur registers */
bx lr @ return
</syntaxhighlight>
 
=={{header|Arturo}}==
 
<syntaxhighlight lang="rebol">compareLists: function [a,b][
loop 0..min @[size a, size b] 'i [
if a\[i] < b\[i] -> return true
if a\[i] > b\[i] -> return false
]
return less? size a size b
]
 
alias.infix '<=> 'compareLists
 
do [
print [1 2 1 3 2] <=> [1 2 0 4 4 0 0 0]
]</syntaxhighlight>
 
{{out}}
 
<pre>false</pre>
 
=={{header|AutoHotkey}}==
{{works with|AutoHotkey_L}}
The function is overkill as we can just compare the list's ObjMaxIndex()
<langsyntaxhighlight AHKlang="ahk">List1 := [1,2,1,3,2]
List2 := [1,2,0,4,4,0,0,0]
MsgBox % order(List1, List2)
Line 124 ⟶ 759:
order(L1, L2){
return L1.MaxIndex() < L2.MaxIndex()
}</langsyntaxhighlight>
 
=={{header|AWK}}==
<syntaxhighlight lang="awk">
<lang AWK>
# syntax: GAWK -f ORDER_TWO_NUMERICAL_LISTS.AWK
BEGIN {
Line 152 ⟶ 787:
return(ans)
}
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 159 ⟶ 794:
list3>=list4
</pre>
 
 
=={{header|BASIC256}}==
{{trans|FreeBASIC}}
<syntaxhighlight lang="basic256">
arraybase 1
dim list1(5): dim list2(6): dim list3(5): dim list4(5)
list1 = {1, 2, 1, 5, 2}
list2 = {1, 2, 1, 5, 2, 2}
list3 = {1, 2, 3, 4, 5}
list4 = {1, 2, 3, 4, 5}
 
if Orden(list1[], list2[]) then print "list1 < list2" else print "list 1>= list2"
if Orden(list2[], list3[]) then print "list2 < list3" else print "list2 >= list3"
if Orden(list3[], list4[]) then print "list3 < list4" else print "list3 >= list4"
end
 
function Orden(listA[], listB[])
i = 0
l1 = listA[?]
l2 = listB[?]
while (listA[i] = listB[i]) and i < l1 and i < l2
i = i + 1
end while
if listA[?] < listB[?] then return True
if listA[?] > listB[?] then return False
return l1 < l2
end function
</syntaxhighlight>
{{out}}
<pre>
Igual que la entrada de BBC BASIC.
</pre>
 
 
=={{header|BBC BASIC}}==
'Ordered before' means 'less than' (see [[Talk:Order_two_numerical_lists|talk page]]).
<langsyntaxhighlight lang="bbcbasic"> DIM list1(4) : list1() = 1, 2, 1, 5, 2
DIM list2(5) : list2() = 1, 2, 1, 5, 2, 2
DIM list3(4) : list3() = 1, 2, 3, 4, 5
Line 180 ⟶ 849:
IF list1(i%) < list2(i%) THEN = TRUE
IF list1(i%) > list2(i%) THEN = FALSE
= l1% < l2%</langsyntaxhighlight>
{{out}}
<pre>
Line 195 ⟶ 864:
In that case the function outputs FALSE.
Notice that if the arguments are the same, evaluation of the sum produces the product of one of the terms and a factor two. This complicates the pattern a bit.
<langsyntaxhighlight lang="bracmat">( 1 2 3 4 5:?List1
& 1 2 1 5 2 2:?List2
& 1 2 1 5 2:?List3
Line 218 ⟶ 887:
& gt$(!List5,!List6)
& gt$(!List6,!List7)
);</langsyntaxhighlight>
{{out}}
<pre>TRUE
Line 228 ⟶ 897:
 
=={{header|C}}==
<langsyntaxhighlight lang="c">int list_cmp(int *a, int la, int *b, int lb)
{
int i, l = la;
Line 238 ⟶ 907:
if (la == lb) return 0;
return la > lb ? 1 : -1;
}</langsyntaxhighlight>
This funciton returns one of three states, not a boolean. One can define boolean comparisons, such as <code>list_less_or_eq</code>, based on it:<langsyntaxhighlight lang="c">#define list_less_or_eq(a,b,c,d) (list_cmp(a,b,c,d) != 1)</langsyntaxhighlight>
 
=={{header|C sharp|C#}}==
<langsyntaxhighlight lang="csharp">namespace RosettaCode.OrderTwoNumericalLists
{
using System;
Line 284 ⟶ 953:
}
}
}</langsyntaxhighlight>
{{out}}
<pre>False</pre>
Line 290 ⟶ 959:
=={{header|C++}}==
The built-in comparison operators already do this:
<langsyntaxhighlight lang="cpp">#include <iostream>
#include <vector>
 
Line 312 ⟶ 981:
std::cout << std::boolalpha << (a < b) << std::endl; // prints "false"
return 0;
}</langsyntaxhighlight>
 
=={{header|clojure}}==
 
<langsyntaxhighlight lang="clojure">
(defn lex? [a b]
(compare a b))
</syntaxhighlight>
</lang>
 
=={{header|Common Lisp}}==
<langsyntaxhighlight Lisplang="lisp">(defun list< (a b)
(cond ((not b) nil)
((not a) t)
((= (first a) (first b))
(list< (rest a) (rest b)))
(t (< (first a) (first b)))))</langsyntaxhighlight>
 
Alternate version
 
<langsyntaxhighlight Lisplang="lisp">(defun list< (a b)
(let ((x (find-if-not #'zerop (mapcar #'- a b))))
(if x (minusp x) (< (length a) (length b)))))</langsyntaxhighlight>
 
=={{header|D}}==
The built-in comparison operators already do this:
<langsyntaxhighlight lang="d">void main() {
assert([1,2,1,3,2] >= [1,2,0,4,4,0,0,0]);
}</langsyntaxhighlight>
=={{header|Delphi}}==
{{libheader| System.SysUtils}}
{{libheader| System.Generics.Defaults}}
{{Trans|Java}}
This is not a full translate of [https://rosettacode.org/wiki/Order_two_numerical_lists#Java Java], just adaptation and aplication of method previus introduced.
<syntaxhighlight lang="delphi">
program Order_two_numerical_lists;
 
{$APPTYPE CONSOLE}
 
uses
System.SysUtils,
System.Generics.Defaults;
 
type
TArray = record
class function LessOrEqual<T>(first, second: TArray<T>): Boolean; static;
end;
 
class function TArray.LessOrEqual<T>(first, second: TArray<T>): Boolean;
begin
if Length(first) = 0 then
exit(true);
if Length(second) = 0 then
exit(false);
var comp := TComparer<T>.Default.Compare(first[0], second[0]);
if comp = 0 then
exit(LessOrEqual(copy(first, 1, length(first)), copy(second, 1, length(second))));
Result := comp < 0;
end;
 
begin
writeln(TArray.LessOrEqual<Integer>([1, 2, 3], [2, 3, 4]));
writeln(TArray.LessOrEqual<Integer>([2, 3, 4], [1, 2, 3]));
writeln(TArray.LessOrEqual<Integer>([1, 2], [1, 2, 3]));
writeln(TArray.LessOrEqual<Integer>([1, 2, 3], [1, 2]));
writeln(TArray.LessOrEqual<Char>(['a', 'c', 'b'], ['a', 'b', 'b']));
writeln(TArray.LessOrEqual<string>(['this', 'is', 'a', 'test'], ['this', 'is',
'not', 'a', 'test']));
readln;
end.</syntaxhighlight>
{{out}}
<pre>TRUE
FALSE
TRUE
FALSE
FALSE
TRUE</pre>
 
=={{header|EasyLang}}==
{{trans|C}}
<syntaxhighlight>
func listcmp a[] b[] .
for i to lower len a[] len b[]
if a[i] < b[i]
return -1
elif a[i] > b[i]
return 1
.
.
if len a[] < len b[]
return -1
elif len a[] > len b[]
return 1
.
return 0
.
print listcmp [ 2 4 5 ] [ 2 3 1 ]
print listcmp [ 2 3 1 ] [ 2 3 1 ]
print listcmp [ 2 3 1 ] [ 2 3 1 3 ]
</syntaxhighlight>
 
=={{header|Ela}}==
 
<langsyntaxhighlight lang="ela">[] <. _ = true
_ <. [] = false
(x::xs) <. (y::ys) | x == y = xs <. ys
| else = x < y
 
[1,2,1,3,2] <. [1,2,0,4,4,0,0,0]</langsyntaxhighlight>
 
=={{header|Elixir}}==
The built-in comparison functions already do this (not only for lists of numbers, but for any arbitrary data type).
<langsyntaxhighlight lang="elixir">iex(1)> [1,2,3] < [1,2,3,4]
true
iex(2)> [1,2,3] < [1,2,4]
true</langsyntaxhighlight>
 
=={{header|Erlang}}==
Builtin. Example use from Erlang shell:
<syntaxhighlight lang="erlang">
<lang Erlang>
5> [1,2,3] < [1,2,3,4].
true
6> [1,2,3] < [1,2,4].
true
</syntaxhighlight>
</lang>
 
=={{header|F_Sharp|F#}}==
By using the Collection.Seq Module the static method Seq.compareWith fits our needs.
<langsyntaxhighlight lang="fsharp">let inline cmp x y = if x < y then -1 else if x = y then 0 else 1
let before (s1 : seq<'a>) (s2 : seq<'a>) = (Seq.compareWith cmp s1 s2) < 0
 
Line 385 ⟶ 1,125:
([0; 0], [1]);
]
|> List.iter (fun (x, y) -> printf "%A %s %A\n" x (if before x y then "< " else ">=") y)</langsyntaxhighlight>
{{out}}
<pre>[0] >= []
Line 405 ⟶ 1,145:
IN: scratchpad '''{ 2 3 } { 2 5 } before? .'''
t
 
 
=={{header|FreeBASIC}}==
{{trans|BBC BASIC}}
<syntaxhighlight lang="freebasic">Dim Shared list1(4) As Integer = {1, 2, 1, 5, 2}
Dim Shared list2(5) As Integer = {1, 2, 1, 5, 2, 2}
Dim Shared list3(4) As Integer = {1, 2, 3, 4, 5}
Dim Shared list4(4) As Integer = {1, 2, 3, 4, 5}
 
Function Orden(listA() As Integer, listB() As Integer) As Boolean
Dim As Integer i = 0, l1, l2
l1 = Ubound(listA, 1)
l2 = Ubound(listB, 1)
While listA(i) = listB(i) And i < l1 And i < l2
i += 1
Wend
If listA(i) < listB(i) Then Return True
If listA(i) > listB(i) Then Return False
Return l1 < l2
End Function
 
If Orden(list1(), list2()) Then Print "list1<list2" Else Print "list1>=list2"
If Orden(list2(), list3()) Then Print "list2<list3" Else Print "list2>=list3"
If Orden(list3(), list4()) Then Print "list3<list4" Else Print "list3>=list4"
 
Sleep</syntaxhighlight>
{{out}}
<pre>
Igual que la entrada de BBC BASIC.
</pre>
 
 
=={{header|Go}}==
<langsyntaxhighlight lang="go">package main
 
import "fmt"
Line 479 ⟶ 1,250:
}
return b
}</langsyntaxhighlight>
{{out}}
<pre>
Line 511 ⟶ 1,282:
=={{header|Groovy}}==
Solution:
<langsyntaxhighlight lang="groovy">class CList extends ArrayList implements Comparable {
CList() { }
CList(Collection c) { super(c) }
Line 520 ⟶ 1,291:
comp ? comp[0] <=> comp[1] : this.size() <=> that.size()
}
}</langsyntaxhighlight>
 
Test:
<langsyntaxhighlight lang="groovy">CList a, b; (a, b) = [[], []]; assert ! (a < b)
b = [1] as CList; assert (a < b)
a = [1] as CList; assert ! (a < b)
Line 531 ⟶ 1,302:
b = [2, -1, 0] as CList; assert ! (a < b)
b = [2, -1, 0, -17] as CList; assert (a < b)
a = [2, 8, 0] as CList; assert ! (a < b)</langsyntaxhighlight>
 
=={{header|Haskell}}==
The built-in comparison operators already do this:
<langsyntaxhighlight lang="haskell">Prelude> [1,2,1,3,2] < [1,2,0,4,4,0,0,0]
False</langsyntaxhighlight>
 
=={{header|Icon}} and {{header|Unicon}}==
List_llt is written in the style of all Icon/Unicon relational operators returning its right argument if successful and signaling failure otherwise.
 
<langsyntaxhighlight Iconlang="icon">procedure main()
write( if list_llt([1,2,1,3,2],[1,2,0,4,4,0,0,0]) then "true" else "false" )
end
Line 551 ⟶ 1,322:
else if L1[i] >> L2[i] then fail
if *L1 < *L2 then return L2
end</langsyntaxhighlight>
 
=={{header|J}}==
 
This is not aJ's built-in incomparator Joperates element-wise.
To compare general sequences you can either box them and use sort.
Or for numeric sequences append minus infinity and sort.
However numeric scalars sort ahead of vectors, i.e. are different from length one lists.
 
<syntaxhighlight lang="j">before=: -.@(-: /:~)@,&<~</syntaxhighlight>
 
<syntaxhighlight lang="j">cmp=: {.@\:@,:&(,&__)</syntaxhighlight>
 
Below demonstrates non-decreasing order cmp treats length one vector same as scalar
<lang j>before=: -.@(-: /:~)@,&<~</lang>
 
<syntaxhighlight lang="j">
Example use:
cmp&.>"{~ ('';0;(,0);1;(,1);1 1)
┌─┬─┬─┬─┬─┬─┐
│0│1│1│1│1│1│
├─┼─┼─┼─┼─┼─┤
│0│0│0│1│1│1│
├─┼─┼─┼─┼─┼─┤
│0│0│0│1│1│1│
├─┼─┼─┼─┼─┼─┤
│0│0│0│0│0│1│
├─┼─┼─┼─┼─┼─┤
│0│0│0│0│0│1│
├─┼─┼─┼─┼─┼─┤
│0│0│0│0│0│0│
└─┴─┴─┴─┴─┴─┘
 
before&.>"{~ (0;1;'';(,0);(,1);1 1)
<lang j> (,0) before ''
┌─┬─┬─┬─┬─┬─┐
0
│0│1│1│1│1│1│
'' before ''
├─┼─┼─┼─┼─┼─┤
0
│0│0│1│1│1│1│
'' before ,0
├─┼─┼─┼─┼─┼─┤
1
│0│0│0│1│1│1│
(,_1) before ,0
├─┼─┼─┼─┼─┼─┤
1
│0│0│0│0│1│1│
(,0) before ,0
├─┼─┼─┼─┼─┼─┤
0
│0│0│0│0│0│1│
(,0) before ,_1
├─┼─┼─┼─┼─┼─┤
0
│0│0│0│0│0│0│
(,0) before 0 _1
└─┴─┴─┴─┴─┴─┘</syntaxhighlight>
1
(,0) before 0 0
1
(,0) before 0 1
1
0 _1 before ,0
0
0 0 before ,0
0
0 0 before ,1
1
(,'b') before ''
0
'' before ''
0
'' before ,'b'
1
(,'a') before ,'b'
1
(,'b') before ,'b'
0
(,'b') before ,'a'
0
(,'b') before 'ba'
1
(,'b') before 'bb'
1
(,'b') before 'bc'
1
'ba' before ,'b'
0
'bb' before ,'b'
0
'bb' before ,'c'
1</lang>
 
=={{header|Java}}==
Line 615 ⟶ 1,372:
{{trans|Common Lisp}}
There are a few methods here. The method named "ordered" which works on arrays is a translation of [[#Common Lisp|Common Lisp]]. The other two are loose translations of [[#Tcl|Tcl]] (some tweaks were needed to get the length checks to work out) and are probably better options.
<langsyntaxhighlight lang="java5">import java.util.Arrays;
import java.util.List;
 
Line 648 ⟶ 1,405:
return i == first.length;
}
}</langsyntaxhighlight>
 
=={{header|JavaScript}}==
Line 656 ⟶ 1,413:
<= is already defined for numeric lists in JavaScript
 
<langsyntaxhighlight JavaScriptlang="javascript">(() => {
'use strict';
 
Line 673 ⟶ 1,430:
// --> [false, true]
})()
</syntaxhighlight>
</lang>
 
{{Out}}
<syntaxhighlight lang JavaScript="javascript">[false, true]</langsyntaxhighlight>
 
=={{header|Joy}}==
<syntaxhighlight lang="joy">
<lang Joy>
DEFINE order ==
[equal] [false]
[[[[size] dip size <=] [[<=] mapr2 true [and] fold]] [i] map i and]
ifte.
</syntaxhighlight>
</lang>
 
Using it:
Line 697 ⟶ 1,454:
 
=={{header|jq}}==
jq's builtin comparison operators use lexicographic ordering for arrays in general, not just arrays of integers.<langsyntaxhighlight lang="jq">
[1,2,3] < [1,2,3,4] # => true
[1,2,3] < [1,2,4] # => true
[1,2,3] < [1,2,3] # => false</langsyntaxhighlight>
 
=={{header|Julia}}==
{{works with|Julia|0.6}}
 
<langsyntaxhighlight lang="julia">function islexless(a::AbstractArray{<:Real}, b::AbstractArray{<:Real})
for (x, y) in zip(a, b)
if x == y continue end
Line 717 ⟶ 1,474:
println("List not sorted:\n - ", join(tests, "\n - "))
sort!(tests; lt=islexless)
println("List sorted:\n - ", join(tests, "\n - "))</langsyntaxhighlight>
 
{{out}}
Line 736 ⟶ 1,493:
- [3.14159, 2.71828, 1.61803, 0.915966]
- [2015, 5]</pre>
 
=={{header|Klingphix}}==
<syntaxhighlight lang="klingphix">include ..\Utilitys.tlhy
 
( 1 2 3 ) ( 1 2 3 4 ) less ?
( 1 2 3 4 ) ( 1 2 3 ) less ?
( 1 2 4 ) ( 1 2 3 ) less ?
( 1 2 3 ) ( 1 2 3 ) less ?
( 1 2 3 ) ( 1 2 4 ) less ?
 
"End " input</syntaxhighlight>
 
=={{header|Kotlin}}==
<langsyntaxhighlight lang="scala">// version 1.0.6
 
operator fun <T> List<T>.compareTo(other: List<T>): Int
Line 765 ⟶ 1,533:
println()
for (i in 0 until lists.size - 1) println("list${i + 1} > list${i + 2} = ${lists[i] > lists[i + 1]}")
}</langsyntaxhighlight>
 
{{out}}
Line 791 ⟶ 1,559:
=={{header|Lasso}}==
This is built into the Lasso comparison operators
<langsyntaxhighlight Lassolang="lasso">local(
first = array(1,2,1,3,2),
second = array(1,2,0,4,4,0,0,0),
Line 801 ⟶ 1,569:
second = array(1,2,0,4,4,0,0,0),
)
#first < #second</langsyntaxhighlight>
{{out}}
<pre>false
Line 809 ⟶ 1,577:
Uses standard '=' notation
 
<langsyntaxhighlight lang="logo">print [1 2] = [1 2]
print [1 2] = [1 2 3]
print [1 3] = [1 2]
Line 816 ⟶ 1,584:
make "list1 [1 2 3 4 5 6]
make "list2 [1 2 3 4 5 7]
print :list1 = :list2</langsyntaxhighlight>
 
{{out}}
<langsyntaxhighlight lang="logo">true
false
false
false
false</langsyntaxhighlight>
 
=={{header|Lua}}==
Line 829 ⟶ 1,597:
In Lua tables with numerical indices are used as lists or arrays and they do not support comparison out-of-the-box, so a function is needed to implement the comparison:
<langsyntaxhighlight lang="lua">function arraycompare(a, b)
for i = 1, #a do
if b[i] == nil then
Line 839 ⟶ 1,607:
end
return true
end</langsyntaxhighlight>
 
Here is some demonstration code:
 
<langsyntaxhighlight lang="lua">function randomarray()
local t = {}
for i = 1, math.random(1, 10) do
Line 862 ⟶ 1,630:
arraycompare(a, b) and "<=" or ">",
table.concat(b, ', ')))
end</langsyntaxhighlight>
 
{{out}} (time used as random seed: 1413127434):
Line 878 ⟶ 1,646:
</pre>
 
=={{header|MathematicaMaple}}==
<syntaxhighlight lang="maple">orderLists := proc(num1,num2)
<lang Mathematica>
local len1, len2,i:
order[List1_, List2_] := With[{
len1,len2 := numelems(num1),numelems(num2):
for i to min(len1,len2) do
if num1[i] <> num2[i] then
return evalb(num1[i]<num2[i]):
end if:
end do:
return evalb(len1 < len2):
end proc:</syntaxhighlight>
 
=={{header|Mathematica}}/{{header|Wolfram Language}}==
<syntaxhighlight lang="mathematica">order[List1_, List2_] := With[{
L1 = List1[[1 ;; Min @@ Length /@ {List1, List2}]],
L2 = List2[[1 ;; Min @@ Length /@ {List1, List2}]]
Line 887 ⟶ 1,666:
Length[List1] < Length[List2],
Thread[Order[L1, L2]] == 1
]]</langsyntaxhighlight>
 
<pre>Example use:
order[ {1, 2, 1, 3, 2}, {1, 2, 0, 4, 4, 0, 0, 0} ]
->False
 
order[ {1, 2}, {1, 2, 4, 4, 0, 0} ]
->True</pre>
 
=={{header|Maxima}}==
<langsyntaxhighlight lang="maxima">"<<"(a,b):=block([n:min(length(a),length(b))],
catch(for i thru n do (if a[i]#b[i] then throw(is(a[i]<b[i]))),
throw(is(length(a)<length(b)))))$
Line 909 ⟶ 1,687:
 
[1,2] << [1,2];
false</langsyntaxhighlight>
 
=={{header|Mercury}}==
Line 915 ⟶ 1,693:
For a particular numerical type, you can get away with
 
<langsyntaxhighlight Mercurylang="mercury">:- pred lt(list(int)::in, list(int)::in) is semidet.
lt([], [_|_]).
lt([H1|T1], [H2|T2]) :- H1 =< H2, T1 `lt` T2.</langsyntaxhighlight>
 
For a list of any numerical type, one way would be to use a typeclass:
 
<langsyntaxhighlight Mercurylang="mercury">:- pred lt(list(T)::in, list(T)::in) is semidet <= comparable(T).
lt([], [_|_]).
lt([H1|T1], [H2|T2]) :- H1 =< H2, T1 `lt` T2.</langsyntaxhighlight>
 
... which you would have to create:
 
<langsyntaxhighlight Mercurylang="mercury">:- module comparable.
:- interface.
:- import_module int, float, integer, list.
Line 953 ⟶ 1,731:
 
% pred lt
% pred lte</langsyntaxhighlight>
 
Which would be used in this way - note the typeclass and the comparison operator.
 
<langsyntaxhighlight Mercurylang="mercury">:- pred test(list(T), list(T), io, io) <= comparable(T).
:- mode test(in, in, di, uo) is det.
test(A, B) -->
io.write(A), io.write_string(" < "), io.write(B),
io.write_string(" : "), io.write_string(S), io.nl,
{ A < B -> S = "yes" ; S = "no" }.</langsyntaxhighlight>
 
=={{header|Miranda}}==
<syntaxhighlight lang="miranda">main :: [sys_message]
main = [Stdout (lay (map show [
order [1,2,1,3,2] [1,2,0,4,4,0,0,0],
order [1,2,0,4,4,0,0,0] [1,2,1,3,2]]))]
 
order :: [*]->[*]->bool
order as [] = True
order [] as = False
order (a:as) (b:bs) = a < b, if a ~= b
= order as bs, otherwise</syntaxhighlight>
{{out}}
<pre>False
True</pre>
 
=={{header|Nim}}==
<langsyntaxhighlight lang="nim">proc `<`[T](a, b: openarray[T]): bool =
for i in 0 .. min(a.len, b.len):
if a[i] < b[i]: return true
Line 971 ⟶ 1,764:
return a.len < b.len
 
echo([1,2,1,3,2] < [1,2,0,4,4,0,0,0])</langsyntaxhighlight>
{{out}}
<pre>false</pre>
Line 978 ⟶ 1,771:
 
The built-in comparison operators already do this for lists (although this is not documented):
<langsyntaxhighlight lang="ocaml"># [1;2;1;3;2] < [1;2;0;4;4;0;0;0];;
- : bool = false</langsyntaxhighlight>
 
(Warning: However, the built-in comparison operators do not do this for arrays:
<langsyntaxhighlight lang="ocaml"># [|1;2;1;3;2|] < [|1;2;0;4;4;0;0;0|];;
- : bool = true</langsyntaxhighlight>
)
 
But we could write it explicitly this way:
 
<langsyntaxhighlight lang="ocaml">let rec ordered_lists = function
| x1::tl1, x2::tl2 ->
(match compare x1 x2 with
Line 995 ⟶ 1,788:
| _ -> true)
| [], _ -> true
| _ -> false</langsyntaxhighlight>
 
Here is a small script to test this function:
 
<langsyntaxhighlight lang="ocaml">(* copy-paste the code of ordered_lists here *)
 
let make_num_list p n =
Line 1,018 ⟶ 1,811:
print_num_list lst1;
print_num_list lst2;
Printf.printf "ordered: %B\n" (ordered_lists (lst1, lst2))</langsyntaxhighlight>
 
Sample execution:
Line 1,028 ⟶ 1,821:
Also notice that the function <code>ordered_lists</code> will work with anything the function <code>Pervasives.compare</code> is able to compare (most OCaml types and structures made from the base types). In the prototype of this function below <code>'a list</code> means a list of anything:
 
<langsyntaxhighlight lang="ocaml">val ordered_lists : 'a list * 'a list -> bool</langsyntaxhighlight>
 
=={{header|Oforth}}==
Line 1,039 ⟶ 1,832:
1 ok
</pre>
 
=={{header|Ol}}==
This sample very similar to Scheme, but implements proper tail recursion. So can test unlimited length lists.
<syntaxhighlight lang="scheme">
(define (lexorder a b)
(cond
((null? b) #false)
((null? a) #true)
((< (car a) (car b)) #true)
((> (car a) (car b)) #false)
(else
(lexorder (cdr a) (cdr b)))))
 
(print (lexorder '(1 2 3) '(1 2 3 4))) ; => true
(print (lexorder '(1 2 4) '(1 2 3))) ; => false
(print (lexorder '(1 2 3) '(1 2))) ; => false
(print (lexorder '(1 2 3) '(1 2 3))) ; => false
(print (lexorder '(1 2 3) '(1 2 8))) ; => true
</syntaxhighlight>
 
=={{header|PARI/GP}}==
<syntaxhighlight lang ="parigp">lex(u,v)<1</langsyntaxhighlight>
 
=={{header|Perl}}==
<langsyntaxhighlight Perllang="perl">use strict;
use warnings;
 
Line 1,081 ⟶ 1,893:
my $before = orderlists([@$first], [@$second]) ? 'true' : 'false';
print "(@$first) comes before (@$second) : $before\n";
}</langsyntaxhighlight>
{{out}}
<pre>
Line 1,091 ⟶ 1,903:
</pre>
 
=={{header|Perl 6Phix}}==
ThereHandled isnatively, alreadyeg ("?" is athe built-inshorthand comparisonprint operator.)
<!--<syntaxhighlight lang="phix">(phixonline)-->
<lang perl6>my @a = <1 2 4>;
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
my @b = <1 2 4>;
<span style="color: #0000FF;">?{</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">3</span><span style="color: #0000FF;">}<{</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">3</span><span style="color: #0000FF;">,</span><span style="color: #000000;">4</span><span style="color: #0000FF;">}</span> <span style="color: #000080;font-style:italic;">-- 1 (true under p2js)</span>
say @a," before ",@b," = ", @a before @b;
<span style="color: #0000FF;">?{</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">3</span><span style="color: #0000FF;">,</span><span style="color: #000000;">4</span><span style="color: #0000FF;">}<{</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">3</span><span style="color: #0000FF;">}</span> <span style="color: #000080;font-style:italic;">-- 0 (false "")</span>
<span style="color: #0000FF;">?{</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">4</span><span style="color: #0000FF;">}<{</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">3</span><span style="color: #0000FF;">}</span> <span style="color: #000080;font-style:italic;">-- 0 (false "")</span>
<span style="color: #0000FF;">?{</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">3</span><span style="color: #0000FF;">}<{</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">3</span><span style="color: #0000FF;">}</span> <span style="color: #000080;font-style:italic;">-- 0 (false "")</span>
<span style="color: #0000FF;">?{</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">3</span><span style="color: #0000FF;">}<{</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">4</span><span style="color: #0000FF;">}</span> <span style="color: #000080;font-style:italic;">-- 1 (true "")</span>
<!--</syntaxhighlight>-->
Elements can be any mix of integers, floating point numbers, strings, or nested subsequences, with atoms ordered before sequences.<br>
If you want -1/0/+1 (instead of the true(1)/false(0) shown above), use the builtin compare() function, and that will match under p2js.
 
=={{header|Phixmonti}}==
@a = <1 2 4>;
{{trans|Phix}}
@b = <1 2>;
<syntaxhighlight lang="phixmonti">include Utilitys.pmt
say @a," before ",@b," = ", @a before @b;
 
def ? print nl enddef
@a = <1 2>;
@b = <1 2 4>;
say @a," before ",@b," = ", @a before @b;
 
( 1 2 3 ) ( 1 2 3 4 ) < ?
for 1..10 {
( 1 2 3 my4 @a) =( flat1 (^100).roll((2.. 3 ).pick); < ?
( 1 2 4 ) ( 1 2 3 ) < ?
my @b = flat @a.map: { Bool.pick ?? $_ !! (^100).roll((0..2).pick) }
( 1 2 3 say) @a,"( before1 ",@b,"2 =3 ",) @a< before @b;?
( 1 2 3 ) ( 1 2 4 ) < ?</syntaxhighlight>
}</lang>
{{out}}
<pre>1 2 4 before 1 2 4 = False
1 2 4 before 1 2 = False
1 2 before 1 2 4 = True
63 52 before 0 52 = False
17 75 24 before 31 75 24 = True
43 32 before 43 32 = False
73 84 before 2 84 = False
73 92 before 40 24 46 = False
16 24 before 41 24 = True
9 12 22 before 9 12 32 67 = True
81 23 before 81 23 = False
55 53 1 before 55 62 83 = True
20 40 51 before 20 17 78 34 = False</pre>
 
=={{header|PhixPicat}}==
Picat has a built-in general comparison operator <code>@<</code>, which compares terms in lexicographic order (numeric lists as well as atoms, strings, variables, and structures).
Handled natively, eg ("?" is the shorthand print operator)
<syntaxhighlight lang="picat">go =>
<lang Phix>?{1,2,3}<{1,2,3,4} -- 1
Tests = [
?{1,2,3,4}<{1,2,3} -- 0
?{ [[1,2,4}<{3], [1,2,3} -- 0]],
?{ [[1,2,3}<{], [1,2,3} -- 0,4]],
?{ [[1,2,3}<{1,2],4} -- [1</lang>,2,3]],
[[1,2,4], [1,2,3]],
Elements can be any mix of integers, floating point numbers, strings, or nested subsequences, with atoms ordered before sequences.<br>
[1..10 , 1..8],
If you want -1/0/+1 (instead of the true(1)/false(0) shown above), use the builtin compare() function.
[[] , []],
[[] , [1]],
[[1] , [] ],
[[-1,2,3,6,5],[-1,2,3,5,6]],
[[-1,2,3,-5,6],[-1,2,3,-6,5]]
],
foreach([L1,L2] in Tests)
printf("%w @< %w: %w\n",L1,L2,cond(L1 @< L2,true,false))
end,
nl.</syntaxhighlight>
 
In the Picat shell, the result is yes/no rather than true/false:
<pre>
Picat> [1,2,3] @< [1,2,3]
 
no
 
Picat> [1,2,3] @< [1,2,3,4]
yes</pre>
 
=={{header|PicoLisp}}==
The built-in comparison functions already do this (not only for lists of numbers, but for any arbitrary data type).
<langsyntaxhighlight PicoLisplang="picolisp">: (> (1 2 0 4 4 0 0 0) (1 2 1 3 2))
-> NIL</langsyntaxhighlight>
 
=={{header|Pike}}==
<langsyntaxhighlight Pikelang="pike">int(0..1) order_array(array a, array b)
{
if (!sizeof(a)) return true;
Line 1,148 ⟶ 1,971:
return order_array(a[1..], b[1..]);
return a[0] < b[0];
}</langsyntaxhighlight>
Pikes <code>Array.sort_array()</code> function can sort an array of arrays using the <code><</code> operator, but it will sort longer arrays before shorter ones. Therefore the above function is still needed if the intent is to use the comparison for a sort operation.
 
If the numbers are in 32bit signed integer range, the following works too:
<langsyntaxhighlight Pikelang="pike">(string)a < (string)b;</langsyntaxhighlight>
 
=={{header|PL/I}}==
<langsyntaxhighlight PLlang="pl/Ii">lists: procedure options (main); /* 8 June 2014 */
 
declare a(10) fixed initial (1, 2, 3, 4, 5, 8, 9, 10, 16, 17),
Line 1,176 ⟶ 1,999:
end compare;
 
end lists;</langsyntaxhighlight>
Results:
<pre>
Line 1,185 ⟶ 2,008:
 
=={{header|PowerShell}}==
<syntaxhighlight lang="powershell">
<lang PowerShell>
function order($as,$bs) {
if($as -and $bs) {
Line 1,195 ⟶ 2,018:
}
"$(order @(1,2,1,3,2) @(1,2,0,4,4,0,0,0))"
</syntaxhighlight>
</lang>
<b>Output:</b>
<pre>
Line 1,202 ⟶ 2,025:
 
===Non-Recursive Version===
<syntaxhighlight lang="powershell">
<lang PowerShell>
function Test-Order ([int[]]$ReferenceArray, [int[]]$DifferenceArray)
{
Line 1,219 ⟶ 2,042:
return ($ReferenceArray.Count -lt $DifferenceArray.Count) -or (Compare-Object $ReferenceArray $DifferenceArray) -eq $null
}
</syntaxhighlight>
</lang>
<syntaxhighlight lang="powershell">
<lang PowerShell>
Test-Order -ReferenceArray 1, 2, 1, 3, 2 -DifferenceArray 1, 2, 0, 4, 4, 0, 0, 0
Test-Order -ReferenceArray 1, 2, 1, 3, 2 -DifferenceArray 1, 2, 2, 4, 4, 0, 0, 0
Line 1,226 ⟶ 2,049:
Test-Order -ReferenceArray 1, 2 -DifferenceArray 1, 2, 3
Test-Order -ReferenceArray 1, 2 -DifferenceArray 1, 2
</syntaxhighlight>
</lang>
{{Out}}
<pre>
Line 1,237 ⟶ 2,060:
 
=={{header|PureBasic}}==
<langsyntaxhighlight lang="purebasic">DataSection
Array_1:
Data.i 5 ;element count
Line 1,307 ⟶ 2,130:
CloseConsole()
EndIf
</langsyntaxhighlight>
{{out}}
<pre>False
Line 1,317 ⟶ 2,140:
=={{header|Python}}==
The built-in comparison operators already do this:
<langsyntaxhighlight lang="python">>>> [1,2,1,3,2] < [1,2,0,4,4,0,0,0]
False</langsyntaxhighlight>
 
=={{header|Quackery}}==
 
<syntaxhighlight lang="quackery"> [ [ over [] = iff false done
dup [] = iff true done
behead rot behead rot
2dup = iff
[ 2drop swap ] again
> ]
unrot 2drop ] is []< ( [ [ --> b )
 
' [ [ ] [ 1 ] [ 1 1 1 ] [ 1 2 ] [ 1 2 1 ] [ 2 ] [ 2 1 ] [ 2 1 1 ] ]
 
shuffle sortwith []< echo</syntaxhighlight>
 
{{out}}
 
<pre>[ [ ] [ 1 ] [ 1 1 1 ] [ 1 2 ] [ 1 2 1 ] [ 2 ] [ 2 1 ] [ 2 1 1 ] ]</pre>
 
 
=={{header|Racket}}==
<langsyntaxhighlight Racketlang="racket">#lang racket
 
(define (lex<? a b)
Line 1,330 ⟶ 2,172:
 
(lex<? '(1 2 3 4 5) '(1 2 3 4 4)) ; -> #f
</syntaxhighlight>
</lang>
 
=={{header|Raku}}==
(formerly Perl 6)
There is already a built-in comparison operator.
<syntaxhighlight lang="raku" line>my @a = <1 2 4>;
my @b = <1 2 4>;
say @a," before ",@b," = ", @a before @b;
 
@a = <1 2 4>;
@b = <1 2>;
say @a," before ",@b," = ", @a before @b;
 
@a = <1 2>;
@b = <1 2 4>;
say @a," before ",@b," = ", @a before @b;
 
for 1..10 {
my @a = flat (^100).roll((2..3).pick);
my @b = flat @a.map: { Bool.pick ?? $_ !! (^100).roll((0..2).pick) }
say @a," before ",@b," = ", @a before @b;
}</syntaxhighlight>
{{out}}
<pre>1 2 4 before 1 2 4 = False
1 2 4 before 1 2 = False
1 2 before 1 2 4 = True
63 52 before 0 52 = False
17 75 24 before 31 75 24 = True
43 32 before 43 32 = False
73 84 before 2 84 = False
73 92 before 40 24 46 = False
16 24 before 41 24 = True
9 12 22 before 9 12 32 67 = True
81 23 before 81 23 = False
55 53 1 before 55 62 83 = True
20 40 51 before 20 17 78 34 = False</pre>
 
=={{header|Rascal}}==
The built-in comparison operator already does this:
<langsyntaxhighlight lang="rascal">rascal>[2,1,3] < [5,2,1,3]
bool: true</langsyntaxhighlight>
 
=={{header|REXX}}==
This R<tt>EXX</tt>REXX example uses the same lists as &nbsp; &nbsp; <tt> ''BBC BASIC''. </tt>
<br>This example will also work with non-numeric strings.
<lang rexx>/*REXX pgm determines if a list < previous list, & returns true | false*/
@. =
@.1 = 1 2 1 5 2
@.2 = 1 2 1 5 2 2
@.3 = 1 2 3 4 5
@.4 = 1 2 3 4 5 /* [↓] compare list to previous.*/
do j=2 while @.j\==''; p=j-1 /*P is the previous.*/
answer=FNorder(@.p, @.j) /*obtain the answer.*/
if answer=='true' then is= ' < ' /*convert from true */
else is= ' ≥ ' /*convert from false*/
say right('['@.p"]", 40) is '['@.j"]"; say
end /*i*/ /* [↑] display (+ a blank line)*/
exit /*stick a fork in it, we're done.*/
/*──────────────────────────────────FNORDER subroutine──────────────────*/
FNorder: procedure; parse arg x,y; wx=words(x); wy=words(y)
 
This example will also work with non-numeric strings.
do k=1 for min(wx,wy)
<syntaxhighlight lang="rexx">/*REXX program determines if a list < previous list, and returns true or false. */
a=word(x,k); b=word(y,k)
@.=; @.1 = 1 2 1 5 if a<b then return 'true'2
@.2 = 1 2 1 5 2 else if a>b then return 'false'2
@.3 = 1 2 3 4 end /*k*/5
@.4 = 1 2 3 4 5
if wx<wy then return 'true'
/* [↓] compare a list to previous list*/
return 'false'</lang>
do j=2 while @.j\==''; p= j - 1 /*P: points to previous value in list.*/
{{out}}
if FNorder(@.p, @.j)=='true' then is= " < " /*use a more familiar glyph.*/
else is= " ≥ " /* " " " " " */
say
say right('['@.p"]", 40) is '['@.j"]"
end /*i*/
exit /*stick a fork in it, we're all done. */
/*──────────────────────────────────────────────────────────────────────────────────────*/
FNorder: procedure; parse arg x,y
wx= words(x); wy= words(y)
do k=1 for min(wx, wy)
a= word(x, k) /*get a value from X. */
b= word(y, k) /* " " " " Y. */
if a<b then return 'true'
else if a>b then return 'false'
end /*k*/
if wx<wy then return 'true' /*handle case of equal (so far). */
return 'false' /* " " " " " " */</syntaxhighlight>
{{out|output|:}}
<pre>
[1 2 1 5 2] < [1 2 1 5 2 2]
Line 1,373 ⟶ 2,252:
 
=={{header|Ring}}==
<langsyntaxhighlight lang="ring">
list1 = "1, 2, 1, 5, 2"
list2 = "5, 2, 1, 5, 2, 2"
Line 1,393 ⟶ 2,272:
func order alist, blist
return strcmp(alist, blist)
</syntaxhighlight>
</lang>
Output:
<pre>
Line 1,399 ⟶ 2,278:
list2>list3
list3=list4
</pre>
 
=={{header|RPL}}==
{{works with|HP|28}}
{| class="wikitable" ≪
! RPL code
! Comment
|-
|
≪ → a b
≪ a SIZE b SIZE MIN LAST <
1 ROT '''FOR''' j
'''IF''' b j GET a j GET - '''THEN'''
LAST 0 > SWAP DROP
a SIZE 'j' STO
'''END'''
'''NEXT'''
≫ ≫ ‘<span style="color:blue">GR8R?</span>’ STO
|
<span style="color:blue">GR8R?</span> ''( [reals] [reals] → boolean ) ''
m = min(size(a),size(b)) ; res = (size(a)<size(b))
loop for j=1 to m
if b[j]-a[j] ≠ 0
res = (b[j]-a[j]>0)
break
end if
end loop, return res
.
|}
[1 2 1 5 2] [1 2 1 5 2 2] <span style="color:blue">GR8R?</span>
[1 2 1 5 2 2] [1 2 1 5 2] <span style="color:blue">GR8R?</span>
[1 2 1 5 2 2] [1 2 3 4 5] <span style="color:blue">GR8R?</span>
[1 2 3 4 5] [1 2 1 5 2 2] <span style="color:blue">GR8R?</span>
[1 2 3 4 5] [1 2 3 4 5] <span style="color:blue">GR8R?</span>
{{out}}
<pre>
5: 1
4: 0
3: 1
2: 0
1: 0
</pre>
 
=={{header|Ruby}}==
The built-in <code><=></code> operator already does this:
<langsyntaxhighlight lang="ruby">>> ([1,2,1,3,2] <=> [1,2,0,4,4,0,0,0]) < 0
=> false</langsyntaxhighlight>
 
=={{header|Rust}}==
<code>Vec<T></code> implements <code>Ord</code> when <code>T</code> does, so we can just compare them with <code><</code>. (Same with arrays and slices).
<syntaxhighlight lang="rust">vec![1, 2, 1, 3, 2] < vec![1, 2, 0, 4, 4, 0, 0, 0]</syntaxhighlight>
 
=={{header|Scala}}==
<langsyntaxhighlight Scalalang="scala">def lessThan1(a: List[Int], b: List[Int]): Boolean =
if (b.isEmpty) false
else if (a.isEmpty) true
else if (a.head != b.head) a.head < b.head
else lessThan1(a.tail, b.tail)</langsyntaxhighlight><syntaxhighlight lang Scala="scala">def lessThan2(a: List[Int], b: List[Int]): Boolean = (a, b) match {
case (_, Nil) => false
case (Nil, _) => true
case (a :: _, b :: _) if a != b => a < b
case _ => lessThan2(a.tail, b.tail)
}</langsyntaxhighlight><syntaxhighlight lang Scala="scala">def lessThan3(a: List[Int], b: List[Int]): Boolean =
a.zipAll(b, Integer.MIN_VALUE, Integer.MIN_VALUE)
.find{case (a, b) => a != b}
.map{case (a, b) => a < b}
.getOrElse(false)</langsyntaxhighlight><syntaxhighlight lang Scala="scala">val tests = List(
(List(1, 2, 3), List(1, 2, 3)) -> false,
(List(3, 2, 1), List(3, 2, 1)) -> false,
Line 1,433 ⟶ 2,357:
assert(lessThan2(a, b) == c, test)
assert(lessThan3(a, b) == c, test)
}</langsyntaxhighlight>
 
=={{header|Scheme}}==
<langsyntaxhighlight lang="scheme">(define (lex<? a b)
(cond ((null? b) #f)
((null? a) #t)
((= (car a) (car b)) (lex<? (cdr a) (cdr b)))
(else (< (car a) (car b)))))</langsyntaxhighlight>
 
=={{header|Seed7}}==
The operator corresponding to the ordering described in this example is less than.
 
<langsyntaxhighlight lang="seed7">$ include "seed7_05.s7i";
 
const proc: main is func
Line 1,457 ⟶ 2,381:
writeln([] (1) < 0 times 0); # Any nonempty list is not less than the empty list --> FALSE
writeln(0 times 0 < 0 times 0); # The empty list is not less than the empty list --> FALSE
end func;</langsyntaxhighlight>
 
{{out}}
Line 1,473 ⟶ 2,397:
=={{header|Sidef}}==
Built-in, via the comparison operator (`<=>`):
<langsyntaxhighlight lang="ruby">func ordered(a, b) {
(a <=> b) < 0
}
Line 1,486 ⟶ 2,410:
var before = ordered(a, b)
say "#{a} comes before #{b} : #{before}"
}</langsyntaxhighlight>
{{out}}
<pre>
Line 1,495 ⟶ 2,419:
 
=={{header|Standard ML}}==
<langsyntaxhighlight lang="sml">- List.collate Int.compare ([1,2,1,3,2], [1,2,0,4,4,0,0,0]) = LESS;
val it = false : bool</langsyntaxhighlight>
 
=={{header|Swift}}==
<langsyntaxhighlight lang="swift">let a = [1,2,1,3,2]
let b = [1,2,0,4,4,0,0,0]
println(lexicographicalCompare(a, b)) // this is "less than"</langsyntaxhighlight>
{{out}}
<pre>
Line 1,508 ⟶ 2,432:
 
=={{header|Tcl}}==
<langsyntaxhighlight lang="tcl">proc numlist< {A B} {
foreach a $A b $B {
if {$a<$b} {
Line 1,517 ⟶ 2,441:
}
return 0
}</langsyntaxhighlight>
 
=={{header|TUSCRIPT}}==
<langsyntaxhighlight lang="tuscript">
$$ MODE TUSCRIPT
MODE DATA
Line 1,545 ⟶ 2,469:
list1=VALUE(list2)
ENDLOOP
</syntaxhighlight>
</lang>
{{out}}
<pre style='height:30ex;overflow:scroll'>
Line 1,559 ⟶ 2,483:
true: 1'2 < 1'2'4
</pre>
 
=={{header|VBA}}==
<syntaxhighlight lang="vb">Private Function order(list1 As Variant, list2 As Variant) As Boolean
i = 1
Do While list1(i) <= list2(i)
i = i + 1
If i > UBound(list1) Then
order = True
Exit Function
End If
If i > UBound(list2) Then
order = False
Exit Function
End If
Loop
order = False
End Function
Public Sub main()
Debug.Print order([{1, 2, 3, 4}], [{1,2,0,1,2}])
Debug.Print order([{1, 2, 3, 4}], [{1,2,3}])
Debug.Print order([{1, 2, 3}], [{1,2,3,4}])
End Sub</syntaxhighlight>{{out}}
<pre>Onwaar
Onwaar
Waar</pre>
 
=={{header|VBScript}}==
<syntaxhighlight lang="vb">
<lang vb>
Function order_list(arr1,arr2)
order_list = "FAIL"
Line 1,595 ⟶ 2,544:
WScript.StdOut.WriteLine order_list(Array(0,0),Array(1))
WScript.StdOut.WriteLine order_list(Array(1,2,1,3,2),Array(1,2,0,4,4,0,0,0))
</syntaxhighlight>
</lang>
 
{{Out}}
Line 1,613 ⟶ 2,562:
=={{header|Wart}}==
We'll simply overload <code>&lt;</code> for lists.
<langsyntaxhighlight lang="python">def (a < b) :case (or list?.a list?.b)
if not.b
nil
Line 1,621 ⟶ 2,570:
(cdr.a < cdr.b)
:else
(car.a < car.b)</langsyntaxhighlight>
 
{{out}}
Line 1,633 ⟶ 2,582:
(< '(1 2 4) '(1 2 3 4))
=> nil</pre>
 
=={{header|Wren}}==
<syntaxhighlight lang="wren">var orderLists = Fn.new { |l1, l2|
var len = (l1.count <= l2.count) ? l1.count : l2.count
for (i in 0...len) {
if (l1[i] < l2[i]) return true
if (l1[i] > l2[i]) return false
}
return (l1.count < l2.count)
}
 
var lists = [
[1, 2, 3, 4, 5],
[1, 2, 1, 5, 2, 2],
[1, 2, 1, 5, 2],
[1, 2, 1, 5, 2],
[1, 2, 1, 3, 2],
[1, 2, 0, 4, 4, 0, 0, 0],
[1, 2, 0, 4, 4, 1, 0, 0],
[1, 2, 0, 4, 4, 1, 0, 1]
]
 
for (i in 0...lists.count) System.print("list[%(i)] : %(lists[i])")
System.print()
for (i in 0...lists.count-1) {
var res = orderLists.call(lists[i], lists[i+1])
System.print("list[%(i)] < list[%(i+1)] -> %(res)")
}</syntaxhighlight>
 
{{out}}
<pre>
list[0] : [1, 2, 3, 4, 5]
list[1] : [1, 2, 1, 5, 2, 2]
list[2] : [1, 2, 1, 5, 2]
list[3] : [1, 2, 1, 5, 2]
list[4] : [1, 2, 1, 3, 2]
list[5] : [1, 2, 0, 4, 4, 0, 0, 0]
list[6] : [1, 2, 0, 4, 4, 1, 0, 0]
list[7] : [1, 2, 0, 4, 4, 1, 0, 1]
 
list[0] < list[1] -> false
list[1] < list[2] -> false
list[2] < list[3] -> false
list[3] < list[4] -> false
list[4] < list[5] -> false
list[5] < list[6] -> true
list[6] < list[7] -> true
</pre>
 
=={{header|XPL0}}==
{{trans|ALGOL W}}
<syntaxhighlight lang "XPL0"> \Compare lists (rows) of integers.
\Returns TRUE if there is an element in A that is < the corresponding
\ element in B and all previous elements are equal, FALSE otherwise.
\The bounds of A and B should ALB :: AUB and BLB :: BUB.
function ILT ( A, ALB, AUB, B, BLB, BUB );
integer A, ALB, AUB, B, BLB, BUB;
integer APos, BPos, Equal;
begin
APos := ALB;
BPos := BLB;
Equal := true;
while APos <= AUB and BPos <= BUB and Equal do begin
Equal := A( APos ) = B( BPos );
if Equal then begin
APos := APos + 1;
BPos := BPos + 1
end \if_Equal
end; \while_more_elements_and_Equal
if not Equal
then \there is an element in A and B that is not Equal
return A( APos ) < B( BPos )
else \all elements are Equal or one list is shorter
\A is < B if A has fewer elements
return APos > AUB and BPos <= BUB
end; \ILT
 
\Tests A < B has the expected result
procedure Test ( AName, A, ALB, AUB, BName, B, BLB, BUB, Expected );
integer AName, A, ALB, AUB, BName, B, BLB, BUB, Expected;
integer IsLt;
begin
IsLt := ILT( A, ALB, AUB, B, BLB, BUB );
Text(0, AName);
Text(0, if IsLt then " < " else " >= ");
Text(0, BName);
Text(0, if IsLt = Expected then " " else ", NOT as expected");
CrLf(0);
end; \test
 
integer List1, List2, List3, List4, List5, List6, List7, List8;
begin
\test cases as in the BBC basic sample
List1 := [0, 1, 2, 1, 5, 2];
List2 := [0, 1, 2, 1, 5, 2, 2];
List3 := [0, 1, 2, 3, 4, 5];
List4 := [0, 1, 2, 3, 4, 5];
Test( "List1", List1, 1, 5, "List2", List2, 1, 6, true );
Test( "List2", List2, 1, 6, "List3", List3, 1, 5, true );
Test( "List3", List3, 1, 5, "List4", List4, 1, 5, false );
\additional test cases
List5 := [0, 9, 0, 2, 1, 0];
List6 := [0, 4, 0, 7, 7];
List7 := [0, 4, 0, 7];
List8 := [0, 0];
Test( "List5", List5, 1, 5, "List6", List6, 1, 4, false );
Test( "List6", List6, 1, 4, "List7", List7, 1, 3, false );
Test( "List7", List7, 1, 3, "List8", List8, 1, 0, false );
Test( "List8", List8, 1, 0, "List7", List7, 1, 3, true )
end</syntaxhighlight>
{{out}}
<pre>
List1 < List2
List2 < List3
List3 >= List4
List5 >= List6
List6 >= List7
List7 >= List8
List8 < List7
</pre>
 
=={{header|Yabasic}}==
{{trans|FreeBASIC}}
<syntaxhighlight lang="yabasic">
read num : dim list1(4)
read num : dim list2(5)
read num : dim list3(4)
read num : dim list4(4)
 
if Orden(list1(), list2()) then print "list1 < list2" else print "list1 >= list2" : fi
if Orden(list2(), list3()) then print "list2 < list3" else print "list2 >= list3" : fi
if Orden(list3(), list4()) then print "list3 < list4" else print "list3 >= list4" : fi
end
 
sub Orden(listA(), listB())
i = 0
l1 = arraysize(listA(), 1)
l2 = arraysize(listB(), 1)
while listA(i) = listB(i) and i < l1 and i < l2
i = i + 1
wend
if listA(i) < listB(i) then return True : fi
if listA(i) > listB(i) then return False : fi
return l1 < l2
end sub
 
data 1, 2, 1, 5, 2
data 1, 2, 1, 5, 2, 2
data 1, 2, 3, 4, 5
data 1, 2, 3, 4, 5
</syntaxhighlight>
{{out}}
<pre>
Igual que la entrada de BBC BASIC.
</pre>
 
=={{header|zkl}}==
<langsyntaxhighlight lang="zkl">fcn listLT(a,b){
a.walker().zip(b).filter1(fcn([(a,b)]){ a<b }) : // lazy
if(_) return(True);;
a.len()<b.len()
}</langsyntaxhighlight>
{{out}}
<pre>
2,053

edits