ARMマシンコード、26バイト
16進ダンプ(リトルエンディアン):
6810 4601 f852 cb04 4560 bfc8 4660 4561 bfb8 4661 3b01 d8f5 4770
これは関数であり、システムコールやライブラリに依存しません。エンコードは、Thumb-2、32ビットARM用の可変(2または4バイト)エンコードです。ご想像のとおり、ここで最初と最後の要素を並べ替えて選択する簡単な方法はありません。全体として、ここで行われているような空想は実際には何もありません。参照実装とほぼ同じです。
ゴルフされていないアセンブリ(GNU構文):
.syntax unified
.text
.global minmax
.thumb_func
minmax:
@Input: @r0 and r1 are dummy parameters (they don't do anything)
@r2 - Pointer to list of integers (int*)
@r3 - Number of integers to sort (size_t)
@Output:
@Minimum of the list in r0 (int)
@Maximum in r1 (int)
ldr r0,[r2] @min=r2[0]
mov r1,r0 @max=min
loop:
@ip is intra-procedure call register, a.k.a. r12
ldr ip,[r2],#4 @ip=*r2++
cmp r0,ip
it gt @if (r0>ip)
movgt r0,ip @r0=ip
cmp r1,ip
it lt @if (r1<ip)
movlt r1,ip @r1=ip
subs r3,r3,#1
bhi loop @while (--r3>0)
bx lr @Return
Raspberry Pi 3でテスト済み。テストスクリプト(C99、argvによる入力)は次のとおりです。
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
//First 2 arguments are dummies.
uint64_t minmax(int,int,int* array,size_t size);
int main(int argc,char** argv) {
int i;
int array[argc-1];
for (i=1;i<argc;i++) {
array[i-1]=atoi(argv[i]);
}
uint64_t result = minmax(0,0,array,argc-1);
printf("Minimum is %d, maximum is %d.\n",(unsigned)result,(unsigned)(result>>32));
}