Utilisez lambdas (unportable)
Au lieu de
f(int*a,int*b){return*a>*b?1:-1;}
...
qsort(a,b,4,f);
ou (gcc seulement)
qsort(a,b,4,({int L(int*a,int*b){a=*a>*b?1:-1;}L;}));
ou (llvm avec le support de blocs)
qsort_b(a,b,4,^(const void*a,const void*b){return*(int*)a>*(int*)b?1:-1;});
essayez quelque chose comme
qsort(a,b,4,"\x8b\7+\6\xc3");
... où la chaîne entre guillemets contient les instructions en langage machine de votre fonction "lambda" (conformes à toutes les exigences de la plate-forme ABI).
Cela fonctionne dans les environnements dans lesquels les constantes de chaîne sont marquées comme étant exécutables. Par défaut, cela est vrai sous Linux et OSX mais pas sous Windows.
Une façon idiote d'apprendre à écrire vos propres fonctions "lambda" consiste à écrire la fonction en C, à la compiler, à l'inspecter avec quelque chose de similaire objdump -D
et à copier le code hexadécimal correspondant dans une chaîne. Par exemple,
int f(int*a, int*b){return *a-*b;}
... lorsque compilé avec gcc -Os -c
pour une cible Linux x86_64 génère quelque chose comme
0: 8b 07 mov (%rdi),%eax
2: 2b 06 sub (%rsi),%eax
4: c3 retq
GNU CC goto
:
Vous pouvez appeler ces "fonctions lambda" directement, mais si le code que vous appelez ne prend pas de paramètres et ne retourne pas, vous pouvez utiliser goto
pour enregistrer quelques octets. Donc au lieu de
((int(*)())L"ﻫ")();
ou (si votre environnement n'a pas de glyphes arabes)
((int(*)())L"\xfeeb")();
Essayer
goto*&L"ﻫ";
ou
goto*&L"\xfeeb";
Dans cet exemple, eb fe
est le langage machine x86 pour quelque chose comme for(;;);
et est un exemple simple de quelque chose qui ne prend pas de paramètres et ne retournera pas :-)
Il s'avère que vous pouvez goto
coder pour retourner à un parent appelant.
#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));
}
L'exemple ci-dessus (pouvant être compilé et exécuté sous Linux avec gcc -O
) est sensible à la disposition de la pile.
EDIT: En fonction de votre chaîne d’outils, vous devrez peut-être utiliser le -zexecstack
drapeau de compilation.
Si ce n'est pas immédiatement évident, cette réponse a été principalement écrite pour les enfants. En lisant ceci, je n’assume aucune responsabilité pour le golf, meilleur ou pire, ni pour les résultats psychologiques défavorables.