C(203文字、入力ループなし:funcのみ)
#include <stdio.h>
#define P (int*a,int n){
#define F for(i=0;i<n;i++){
int i,j,v;s P F if(a[i]>a[i+1])return 0;}return 1;}void h P F v=a[i];a[i]=a[j=rand()%n];a[j]=v;}}void b P while(!s(a,n-1))h(a,n);}
これは次と同じです。ここでは、stdinから配列を読み取り、ソートされた配列を書き出します。Qはプログラム全体ではなく機能を要求したので...
C(296文字)
#include <stdio.h>
#define P (int*a,int n){
#define F for(i=0;i<n;i++){
int i,j,n,v,x[999];s P F if(a[i]>a[i+1])return 0;}return 1;}void h P F j=rand()%n;v=a[i];a[i]=a[j];a[j]=v;}}void b P while(!s(a,n-1))h(a,n);}main(){while(scanf("%d",&v)==1)x[n++]=v;if(!s(x,n))b(x,n);F printf("%d\n",x[i]);}}
コンパイルにより警告が発生する場合があります(暗黙の宣言)。999要素のハードエンコードされた配列サイズ制限。壊れやすい。
配列が並べ替えられているかどうかを事前に確認する必要がない場合は、284で行うことができます。
C(251文字、284でした)
#include <stdio.h>
#define F for(i=0;i<n;i++){
int i,j,n,v,a[999];s(int n){F if(a[i]>a[i+1])return 0;}return 1;}void h(){F v=a[i];a[i]=a[j=rand()%n];a[j]=v;}}void b(){while(!s(n-1))h();}main(){while(scanf("%d",&a[n++])>0);b();F printf("%d\n",a[i]);}}
(関数引数の代わりにグローバルを使用)。