インデントの最高の悪用
xxxxxxxxxx
#include<stdio.h>
/*
O
b
f u s
c
a
t
e
d
*/
int m
(
int
c )
{
int
x
=
3
+
(
c
-
1
)
*
9
+
(
c
-
1
)
*
27
+
(
c
-
1
)
*
(
(
993
-
'!'
*
c
) /
320
)
+ (
c
-
'9'
+
'8'
)
*
c
+
(
c
-
1
)
*
243
/
9; return c
-
32
?
c
- 9 ?
c
- 10
?
x
% x : 3
: 2
:
1
;
}
int
a ,
b ,
c
,
d
,
e
,
v,
f
;
int
main
/* n
(
c
)
{ return
c
++
-
32
?
c
-
9
?
c
-
10
?
0
:
3 :
2
: 1
;
}
x
( )
{
int
a
,
b ,
c
,
d
,
e
,
v
;
while
(
(
v
=
putchar (
d )
)
!= EOF
)
{ if
(
(
a
=
m */
( ) {
while
(
(
e
= d
= c
=
b
=
v
=
getchar
(
)
)
-
EOF
)
{ for
( ;
d
<
0
;
d
++
)
{ f
=
f
/
getchar
(
)
; a
<<=
f
;
(
v
*
v
* v
-
v
||
e
*
e *
e
-
e
)
&& (
e
-
2
||
( d
&
f
)
-
4 ||
( a
>> v
!= (
e -
1 ?
f
:
0
) )
) ;
} if
(
( v %
v
+
f *
--f
+
v
) &&
( v
<
f ? v /
v
-
992 *
b
:
v
*
v ) &&
/*
o
( c
)
{
return
c -
32
?
c
-
9 ?
c - 10
?
0 : 3 : 2
:
1
; }
y
(
)
{
int a ,
f
,
b ,
c
,
d
, e
,
v
;
while
(
( v = getchar
(
)
) !=
EOF
)
{
if
( ( a
=
m
( c
)
;
*/
( a
=
m
(
b
+ ++
f
*
3888
)
) &&
( b
=
m ( getchar ( ) )
- f
/
243 )
&&
(
c
=
m ( getchar
(
)
) +
f
)
&&
(
f
==
1
?
124
- ( ( c
<
8
&& (
(
c
&
b
) != e
||
(
c >>
d
)
!=
3888 )
)
)
:
1
) &&
(
d
=
m
(
getchar ( ) + f
)
)
&& (
e
=
m
(
getchar ( )
)
)
) putchar (
f
+
a
- 1
+
(
b
-
1
) * ( (
993
-
'!' )
/
(
'('
*
8 ) )
+
(
c -
f
-
'9'
+ '8'
)
*
9
-
4 +
(
d
-
1
) *
243
/
9
+
f +
11
+
(
e -
1
)
* 3888 /
'0'
-
7
)
; }
return
(
f
&&
getchar
(
)
)
; }
引用元:https://www.ioccc.org/2004/sds.c
審査員・作者による説明:https://github.com/ioccc-src/winner/blob/main/2004/sds.hint
テキストに空白を挿入してメッセージをステガノグラフィー(埋め込み)する。
元のコードはデコーダになっている。エンコーダは、元のコードに埋め込まれている。
$ gcc -o sds sds.c
$ ./sds < sds.c
#include<stdio.h>
FILE*a;char b,c,e,f,g,h,*k=" \t\n",f;main(int argc,char *argv[]){a=fopen(argv[
1],"r");for(;;){c=getchar();if(c==EOF&&e==EOF)exit(0);else if(c==EOF)c=32;if(b
!='\\'&&b!='\''&&c=='"')f=1-f;if(!f&&(!(c-32)||!(c-9)||!(c-10))&&(e=getc(a))!=
EOF){printf("%c%c%c%c%c",k[e%3],k[(e-e%3)/3%3],k[((e-e%3)/3-((e-e%3)/3%3))/3%3
],k[(((e-e%3)/3-((e-e%3)/3%3))/3-(((e-e%3)/3-((e-e%3)/3%3))/3%3))/3%3],k[((((e
-e%3)/3-((e-e%3)/3%3))/3-(((e-e%3)/3-((e-e%3)/3%3))/3%3))/3-((((e-e%3)/3-((e-e
%3)/3%3))/3-(((e-e%3)/3-((e-e%3)/3%3))/3%3))/3%3))/3]);}else putchar(c);b=c;}}
これをコンパイルするとエンコーダが得られる。
$ ./sds < sds.c > encoder.c
$ gcc -o encoder encoder.c
“a b c d e f”という文字列に”Hello”というメッセージを仕込み、それをデコードする例。
$ cat example.txt
Hello
$ echo -n a b c d e f | ./encoder example.txt > encoded.txt
$ od -c encoded.txt
0000000 a \n \n b \n \n \t c
0000020 \t \t d \t \t e \t \t \t f
0000040
$ ./sds < encoded.txt
Hello
元のコードは、エンコーダのコードがスペースとタブと改行を使って埋め込まれているので、ぐちゃぐちゃになっている。 シンプルな一品。