Best shuffle: Difference between revisions
Content added Content deleted
SqrtNegInf (talk | contribs) m (→{{header|Perl}}: future-proof for 5.36, use new bitwise string operator) |
VincentARM (talk | contribs) (add task to arm assembly raspberry pi) |
||
Line 229: | Line 229: | ||
up, pu, (0) |
up, pu, (0) |
||
a, a, (1) |
a, a, (1) |
||
</pre> |
|||
=={{header|ARM Assembly}}== |
|||
{{works with|as|Raspberry Pi <br> or android 32 bits with application Termux}} |
|||
<syntaxhighlight lang ARM Assembly> |
|||
/* ARM assembly Raspberry PI */ |
|||
/* program shuffleperf.s */ |
|||
/************************************/ |
|||
/* Constantes */ |
|||
/************************************/ |
|||
/* for this file see task include a file in language ARM assembly*/ |
|||
.include "../constantes.inc" |
|||
/************************************/ |
|||
/* Initialized data */ |
|||
/************************************/ |
|||
.data |
|||
szMessString: .asciz "String :\n" |
|||
szString1: .asciz "abracadabra" |
|||
.equ LGSTRING1, . - szString1 - 1 |
|||
szString2: .asciz "seesaw" |
|||
.equ LGSTRING2, . - szString2 - 1 |
|||
szString3: .asciz "elk" |
|||
.equ LGSTRING3, . - szString3 - 1 |
|||
szString4: .asciz "grrrrrr" |
|||
.equ LGSTRING4, . - szString4 - 1 |
|||
szString5: .asciz "up" |
|||
.equ LGSTRING5, . - szString5 - 1 |
|||
szString6: .asciz "a" |
|||
.equ LGSTRING6, . - szString6 - 1 |
|||
szCarriageReturn: .asciz "\n" |
|||
.align 4 |
|||
iGraine: .int 1234567 |
|||
/************************************/ |
|||
/* UnInitialized data */ |
|||
/************************************/ |
|||
.bss |
|||
sZoneConv: .skip 24 |
|||
sBuffer: .skip 80 |
|||
/************************************/ |
|||
/* code section */ |
|||
/************************************/ |
|||
.text |
|||
.global main |
|||
main: |
|||
ldr r0,iAdrszString1 @ string address |
|||
mov r1,#LGSTRING1 @ string length |
|||
ldr r2,iAdrsBuffer @ result address |
|||
bl testshuffle @ call test |
|||
ldr r0,iAdrszString2 |
|||
mov r1,#LGSTRING2 |
|||
ldr r2,iAdrsBuffer |
|||
bl testshuffle |
|||
ldr r0,iAdrszString3 |
|||
mov r1,#LGSTRING3 |
|||
ldr r2,iAdrsBuffer |
|||
bl testshuffle |
|||
ldr r0,iAdrszString4 |
|||
mov r1,#LGSTRING4 |
|||
ldr r2,iAdrsBuffer |
|||
bl testshuffle |
|||
ldr r0,iAdrszString5 |
|||
mov r1,#LGSTRING5 |
|||
ldr r2,iAdrsBuffer |
|||
bl testshuffle |
|||
ldr r0,iAdrszString6 |
|||
mov r1,#LGSTRING6 |
|||
ldr r2,iAdrsBuffer |
|||
bl testshuffle |
|||
100: @ standard end of the program |
|||
mov r0, #0 @ return code |
|||
mov r7, #EXIT @ request to exit program |
|||
svc 0 @ perform system call |
|||
iAdrszMessString: .int szMessString |
|||
iAdrsBuffer: .int sBuffer |
|||
iAdrszString1: .int szString1 |
|||
iAdrszString2: .int szString2 |
|||
iAdrszString3: .int szString3 |
|||
iAdrszString4: .int szString4 |
|||
iAdrszString5: .int szString5 |
|||
iAdrszString6: .int szString6 |
|||
iAdrszCarriageReturn: .int szCarriageReturn |
|||
/******************************************************************/ |
|||
/* test shuffle strings */ |
|||
/******************************************************************/ |
|||
/* r0 contains the address of the string */ |
|||
/* r1 contains string length */ |
|||
/* r2 contains result area */ |
|||
testshuffle: |
|||
push {r1-r6,lr} @ save registers |
|||
mov r3,r0 @ display string |
|||
bl affichageMess |
|||
ldr r0,iAdrszCarriageReturn |
|||
bl affichageMess |
|||
mov r0,r3 |
|||
bl shufflestrings |
|||
mov r0,r2 @ display result string |
|||
bl affichageMess |
|||
ldr r0,iAdrszCarriageReturn |
|||
bl affichageMess |
|||
mov r4,#0 @ string index |
|||
mov r0,#0 @ score |
|||
1: @ compute score loop |
|||
ldrb r6,[r3,r4] |
|||
ldrb r5,[r2,r4] |
|||
cmp r6,r5 |
|||
addeq r0,r0,#1 @ equal -> increment score |
|||
add r4,r4,#1 |
|||
cmp r4,r1 |
|||
blt 1b |
|||
ldr r1,iAdrsZoneConv |
|||
bl conversion10 @ conversion score in decimal |
|||
ldr r0,iAdrsZoneConv |
|||
bl affichageMess |
|||
ldr r0,iAdrszCarriageReturn |
|||
bl affichageMess |
|||
ldr r0,iAdrszCarriageReturn |
|||
bl affichageMess |
|||
100: |
|||
pop {r1-r6,pc} @ restaur registers |
|||
iAdrsZoneConv: .int sZoneConv |
|||
/******************************************************************/ |
|||
/* shuffle strings algorithme Fisher-Yates */ |
|||
/******************************************************************/ |
|||
/* r0 contains the address of the string */ |
|||
/* r1 contains string length */ |
|||
/* r2 contains address result string */ |
|||
shufflestrings: |
|||
push {r1-r4,lr} @ save registers |
|||
mov r3,#0 |
|||
1: @ loop copy string in result |
|||
ldrb r4,[r0,r3] |
|||
strb r4,[r2,r3] |
|||
add r3,r3,#1 |
|||
cmp r3,r1 |
|||
ble 1b |
|||
sub r1,r1,#1 @ last element |
|||
2: |
|||
mov r0,r1 @ limit random number |
|||
bl genereraleas @ call random |
|||
ldrb r4,[r2,r1] @ load byte string index loop |
|||
ldrb r3,[r2,r0] @ load byte string random index |
|||
strb r3,[r2,r1] @ and exchange |
|||
strb r4,[r2,r0] |
|||
subs r1,r1,#1 |
|||
cmp r1,#1 |
|||
bge 2b |
|||
100: |
|||
pop {r1-r4,pc} @ restaur registers |
|||
/***************************************************/ |
|||
/* Generation random number */ |
|||
/***************************************************/ |
|||
/* r0 contains limit */ |
|||
genereraleas: |
|||
push {r1-r4,lr} @ save registers |
|||
ldr r4,iAdriGraine |
|||
ldr r2,[r4] |
|||
ldr r3,iNbDep1 |
|||
mul r2,r3,r2 |
|||
ldr r3,iNbDep1 |
|||
add r2,r2,r3 |
|||
str r2,[r4] @ maj de la graine pour l appel suivant |
|||
cmp r0,#0 |
|||
beq 100f |
|||
mov r1,r0 @ divisor |
|||
mov r0,r2 @ dividende |
|||
bl division |
|||
mov r0,r3 @ résult = remainder |
|||
100: @ end function |
|||
pop {r1-r4,pc} @ restaur registers |
|||
iAdriGraine: .int iGraine |
|||
iNbDep1: .int 0x343FD |
|||
iNbDep2: .int 0x269EC3 |
|||
/***************************************************/ |
|||
/* ROUTINES INCLUDE */ |
|||
/***************************************************/ |
|||
/* for this file see task include a file in language ARM assembly*/ |
|||
.include "../affichage.inc" |
|||
</syntaxhighlight> |
|||
{{Out}} |
|||
<pre> |
|||
Program 32 bits start. |
|||
abracadabra |
|||
braaraacdab |
|||
2 |
|||
seesaw |
|||
wsaese |
|||
0 |
|||
elk |
|||
kel |
|||
0 |
|||
grrrrrr |
|||
rrrrrgr |
|||
5 |
|||
up |
|||
pu |
|||
0 |
|||
a |
|||
a |
|||
1 |
|||
</pre> |
</pre> |
||
=={{header|Arturo}}== |
=={{header|Arturo}}== |