[先制 hello, world]
https://codeiq.jp/q/2074
とりあえず Pascal (fpc) での解説を。”負けにくい事” を最初に考える事にしました。そうなると、preemptive "hello, world" という文字は可能な限り取り除く必要があります。考え付いたのは以下の三種類。
[IBM->HAL 方式]
{攻撃/防御コード}BEGIN FOR PCHAR(@ARGC)^IN'qsffnqujwf!#ifmmp-!xpsme#'DO WRITE(CHAR(ARGC-1))END.
これは以前、細川さんが「第7回デスマコロシアム」で書かれたコードを応用したものです (Delphi では通らないコードです)。
http://delphimaniacs.blogspot.jp/2014/12/codeiq-pascal.html
但し、お題に 半角SP (0×20) と w (0×78) が含まれるため、最大でも 7 文字しかスライドできません。あと長い。
[すべて大文字で記述]
{攻撃/防御コード}BEGIN WRITE(LOWERCASE('PREEMPTIVE "HELLO, WORLD"'))END.
シンプルに。Pascal の予約語等の識別子は大文字小文字を区別しませんので。
メリットとしてはその短さです。コードが短ければ短いほどヒットする確率は低くなりますし、その分攻撃コードを増やす事が出来ます。
[すべてコントロールコードで記述]
{攻撃/防御コード}BEGIN WRITE(^0^2^%^%^-^0^4^)^6^%^`#$22^(^%^,^,^/#$2C^`^7^/^2^,^$#$22)END.
僕が最終的に選択したのはコレです。メリットとしては文字種が意表をついたものである点と、文字種が比較的少なくて済む点があります。コントロールコードの文字列は以下のような関数で変換する事が出来ます。
function StringToControlCode(s: string; IsHexadecimal: Boolean = False): string; const FMTSTR: array [Boolean] of string = ('#%d', '#$%x'); SLIDEVALUE: array [Boolean] of Int16 = (-$40, $40); var C: Char; B: UInt16; begin for C in S do begin B := Ord(C); case B of $00..$21, $3B..$3E, $60..$7F: result := result + Format('^%s', [Char(B + SLIDEVALUE[B < $60])]); else result := result + Format(FMTSTR[IsHexadecimal], [ B ]); end; end; end;
解りやすく書くと…
function StringToControlCode(s: string; IsHexadecimal: Boolean = False): string; var C: Char; begin for C in S do begin case Ord(C) of $00..$21, $3B..$3E: result := result + Format('^%s', [Char(Ord(C) + $40)]); $60..$7F: result := result + Format('^%s', [Char(Ord(C) - $40)]); else if IsHexadecimal then result := result + Format('#%d', [Ord(C)]) else result := result + Format('#$%x', [Ord(C)]); end; end; end;
こうなります。
最終的な順位は19位でしたが、真ん中よりちょっと上を目標としていましたのでまずまずの結果でした。
http://nabetani.sakura.ne.jp/codeiq/prehewo/all.html
See Also:
[Delphi で ^ は "べき乗" の演算子ではないけれど?]
http://ht-deko.com/ft1210.html#121019_01
|