Perl、235 211 225 211 207 196 179 177 175 168 160 156 146 文字
<>=~/-\d+/;for$y(@a=-$'..$'){print+(map$_|$y?!($t=8*($y>0)+atan2(-$y,$_)/atan2 1,1)&-$&/45==8|$t>=$`/45&$t<=-$&/45?qw(- / | \\)[$t%4]:$":o,@a),$/}
say 機能を使用する Perl、161 149 139 文字
$ echo -n '<>=~/-\d+/;for$y(@a=-$'"'"'..$'"'"'){say map$_|$y?!($t=8*($y>0)+atan2(-$y,$_)/atan2 1,1)&-$&/45==8|$t>=$`/45&$t<=-$&/45?qw(- / | \\)[$t%4]:$":o,@a}' | wc -c
139
$ perl -E '<>=~/-\d+/;for$y(@a=-$'"'"'..$'"'"'){say map$_|$y?!($t=8*($y>0)+atan2(-$y,$_)/atan2 1,1)&-$&/45==8|$t>=$`/45&$t<=-$&/45?qw(- / | \\)[$t%4]:$":o,@a}'
Perl 末尾の改行なし、153 143 文字
<>=~/-\d+/;for$y(@a=-$'..$'){print$/,map$_|$y?!($t=8*($y>0)+atan2(-$y,$_)/atan2 1,1)&-$&/45==8|$t>=$`/45&$t<=-$&/45?qw(- / | \\)[$t%4]:$":o,@a}
元のバージョンのコメント:
$_=<>;m/(\d+)-(\d+) (\d+)/;$e=$1/45;$f=$2/45; # parse angles and radius, angles are 0-8
for$y(-$3..$3){ # loop for each row and col
for$x(-$3..$3){
$t=atan2(-$y,$x)/atan2 1,1; # angle of this point
$t+=8if($t<0); # normalize negative angles
@w=split//,"-/|\\"x2; # array of ASCII symbols for enclosing lines
$s.=!$x&&!$y?"o":$t==$e||$t==$f?$w[$t]:$t>$e&&$t<$f?"x":$";
# if it's origin -> "o", if it's enclosing line, get symbol from array
# if it's between enclosing angles "x", otherwise space
}
$s.=$/;
}
print$s;
編集 1:インライン サブ演算子、関係演算子、等価演算子は 0 または 1 を返します。
編集 2:コメント付きの追加バージョン。
編集 3: 360º の囲み線を修正しました。チャーカウントが大幅に増加しました。
編集 4:ルールを曲げて短いバージョンを追加しました。
編集 5: 360 度の囲み線のよりスマートな修正。また、塗りつぶしとして数値を使用します。どちらのことも明らかでした。まあ、私はもっと眠るべきです:/
編集6:m
マッチ演算子から不要なものを削除しました。一部のセミコロンを削除しました。
編集 7:よりスマートな正規表現。200文字以内!
EDIT 8:多くの小さな改善:
- 内部 for ループ -> マップ (1 文字)
- 文字列からのシンボル配列
split
-> qw (3 文字)
- インライン化されたシンボル配列 (6 文字、以前の改善と合わせて 9 文字!)
- 論理 or -> ビット単位 or (1 文字)
- 正規表現の改善 (1 文字)
- ジェイコブの答えに触発された、負の角度をテストするために算術を使用します (5 文字)
編集 9:条件演算子を少し並べ替えると、2 文字節約できます。
編集 10:文字にはベアワードを使用します。
編集 11: Lowjacker の回答に触発されて、ループ内に印刷を移動しました。
EDIT 12:を使用してバージョンを追加しましsay
た。
EDIT 13:グウェルの回答と同様に、塗りつぶし文字に角度文字を再利用します。ただし、出力は Gwell のものほど良くありません。5 文字追加する必要があります :) また、.. 演算子には括弧は必要ありません。
編集 14:正規表現を <> に直接適用します。btaの回答に対するエイドリアンの提案に従って、範囲演算子を変数に割り当てます。最後の改行なしでバージョンを追加します。更新されsay
たバージョン。
編集 15:より多くのインライン化。map{block}@a -> map expr,@a.