Use lambdas (não portável)
Ao invés de
f(int*a,int*b){return*a>*b?1:-1;}
...
qsort(a,b,4,f);
ou (somente GCC)
qsort(a,b,4,({int L(int*a,int*b){a=*a>*b?1:-1;}L;}));
ou (llvm com suporte a blocos)
qsort_b(a,b,4,^(const void*a,const void*b){return*(int*)a>*(int*)b?1:-1;});
tente algo como
qsort(a,b,4,"\x8b\7+\6\xc3");
... onde a cadeia de caracteres citada contém as instruções de linguagem de máquina da função "lambda" (em conformidade com todos os requisitos da ABI da plataforma).
Isso funciona em ambientes nos quais as constantes de sequência são marcadas como executáveis. Por padrão, isso é verdade no Linux e OSX, mas não no Windows.
Uma maneira boba de aprender a escrever suas próprias funções "lambda" é escrever a função em C, compilá-la, inspecioná-la com algo parecido objdump -D
e copiar o código hexadecimal correspondente em uma string. Por exemplo,
int f(int*a, int*b){return *a-*b;}
... quando compilado gcc -Os -c
para um destino Linux x86_64 gera algo como
0: 8b 07 mov (%rdi),%eax
2: 2b 06 sub (%rsi),%eax
4: c3 retq
GNU CC goto
:
Você pode chamar essas "funções lambda" diretamente, mas se o código que você está chamando não aceita parâmetros e não retorna, você pode usar goto
para salvar alguns bytes. Então, ao invés de
((int(*)())L"ﻫ")();
ou (se o seu ambiente não tiver glifos em árabe)
((int(*)())L"\xfeeb")();
Experimentar
goto*&L"ﻫ";
ou
goto*&L"\xfeeb";
Neste exemplo, eb fe
é a linguagem de máquina x86 para algo como for(;;);
e é um exemplo simples de algo que não aceita parâmetros e não retorna :-)
Acontece que você pode goto
codificar que retorna para um pai que está chamando.
#include<stdio.h>
int f(int a){
if(!a)return 1;
goto*&L"\xc3c031"; // return 0;
return 2; // never gets here
}
int main(){
printf("f(0)=%d f(1)=%d\n",f(0),f(1));
}
O exemplo acima (pode ser compilado e executado no Linux com gcc -O
) é sensível ao layout da pilha.
EDIT: Dependendo da sua cadeia de ferramentas, talvez você precise usar o -zexecstack
sinalizador de compilação.
Se não for imediatamente aparente, essa resposta foi escrita principalmente para os risos. Não me responsabilizo por um golfe melhor ou pior ou por resultados psicológicos adversos ao ler isso.