Re: プログラムの読解力と C 言語の理解度
fj.comp.lang.cの記事<c6b04k$dev$1@caraway.media.kyoto-u.ac.jp>で
ikeda@4bn.ne.jpさんは書きました。
> どこのページで見つけたかはわかりませんが、
このあたり?
http://www.yolab.org/prv/program.html
http://en.wikipedia.org/wiki/Obfuscated_code
ちょっときれいに書きなおすと下のような感じですね。
ちゃんと読む気はおきませんが、おおざっぱに読んでみ
ました。//の後ろはその条件分岐でのtの束縛です。
主な制御は第1引数のtで、細かい制御を第2引数の_で行
っているようです。実行ファイルを引数なしに実行する
と、argcに相当する引数tが1なのでmain(2, 2, "%s")が
呼び出され、次はtが2なのでmain(-79, -13, ...)が呼
び出されるという具合です。
制御のキモは最初の?のあとのカンマ演算子で区切られ
た3つの式ですかね。2番めの式ではt < _であるあいだ、
tを1ずつ増やしながらmain()を再帰呼び出ししているわ
けです。
出力については、真中あたりに文字列のプールがあって
-72 <= t < -50のとき第2引数_が第3引数aの先頭文字と
一致するとa[31]が印字されています。文字列プール中
の/や#も制御に使っているようです。
#include <stdio.h>
main(t, _, a)
char *a;
{
return
!0 < t
? // 1 < t
t < 3
? // t == 2
main(-79, -13, a+main(-87, 1-_, main(-86, 0, a+1)+a))
: // 3 <= t
1,
t < _
? // 1 < t && t < _
main(t+1, _, a)
: // 1 < t && _ <= t
3,
main(-94, -27+t, a) && t == 2
? _ < 13
? main(2, _+1, "%s %d %d\n")
: 9
: 16
: // t <= 1
t < 0
? // t < 0
t < -72
? // t < -72
main(_, t, "@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+"
",/*{*+,/w{%+,/w#q#n+,/#{l,+,/n{n"
"+,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d"
"*'3,}{w+K w'K:'+}e#';dq#'l q#'+d"
"'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/"
"#;#q#n'){)#}w'){){nl]'/+#n';d}rw"
"' i;# ){nl]!/n{n#'; r{#w'r nc{nl"
"]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n"
"'wk nw' iwk{KK{nl]!/w{%'l##w#' i"
"; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'"
"c ;;{nl'-{}rw]'/+,}##'*}#nc,',#n"
"w]'/+kd'+e}+;#'rdq#w! nr'/ ') }+"
"}{rl#'{n' ')# }'+}##(!!/")
: // -72 <= t < 0
t < -50
? // -72 <= t < -50
_ == *a
? putchar(a[31])
: main(-65, _, a+1)
: // -50 <= t < 0
main((*a == '/')+t, _, a+1)
: // 0 <= t <= 1
0 < t
? // t == 1
main(2, 2, "%s")
: // t == 0
*a == '/' || main(0, main(-61, *a,
"!ek;dc i@bK'(q)-[w]*%n+r3#l,{}:\n"
"uwloca-O;m .vpbks,fxntdCeghiry"), a+1);
}
--
太田純(Junn Ohta) (株)リコー/新横浜事業所
ohta@sdg.mdd.ricoh.co.jp
Fnews-brouse 1.9(20180406) -- by Mizuno, MWE <mwe@ccsf.jp>
GnuPG Key ID = ECC8A735
GnuPG Key fingerprint = 9BE6 B9E9 55A5 A499 CD51 946E 9BDC 7870 ECC8 A735