格子点の列挙
Perl がなかったので。力技。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | use strict;
my $PI = atan2(1, 1) * 4;
my $MAXR = int(sqrt(1000 / $PI) + sqrt(2) + 0.5);
my @res = ();
for (my $i = 0; $i <= $MAXR; $i++) {
for (my $j = 0; $j <= $MAXR; $j++) {
my $r = sqrt($i * $i + $j * $j);
push(@res, [$i, $j, $r, atan2($j, $i)]);
($i != 0) && push(@res, [-$i, $j, $r, atan2($j, -$i)]);
($j != 0) && push(@res, [$i, -$j, $r, atan2(-$j, $i) + 2 * $PI]);
($i * $j != 0) && push(@res, [-$i, -$j, $r, atan2(-$j, -$i) + 2 * $PI]);
}
}
foreach my $p (sort {($a->[2] <=> $b->[2]) || ($a->[3] <=> $b->[3])} @res) {
printf("%3d, %3d\n", splice(@{$p}, 0, 2));
}
|
Posted feedbacks - awk
ソート部分は単純なものを採用。 今はR,昔は awk を使っていたもので,R のプログラムと同様。でも,R は遙かに楽だなあ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | BEGIN {
n = 0
for (i = -18; i <= 18; i++) {
for (j = -18; j <= 18; j++) {
x[n] = i
y[n] = j
d[n++] = sqrt(i^2+j^2)
}
}
for (i = 0; i < n-1; i++) {
mini = d[i]
minp = i
for (j = i+1; j < n; j++) {
if (d[j] < mini) {
mini = d[j]
minp = j
}
}
if (i != minp) {
d[minp] = d[i]
d[i] = mini
t = x[i]
x[i] = x[minp]
x[minp] = t
t = y[i]
y[i] = y[minp]
y[minp] = t
}
}
printf "%4s %3s %3s %10s\n", "No.", "x", "y", "r"
for (i = 0; i < 1000; i++) {
printf "%4i: %3i %3i %10.6f\n", i+1, x[i], y[i], d[i]
}
}
|




かも
#3421()
Rating0/2=0.00
同じ距離の点はどういう順番でも構いませんが、可能であればX軸に一番近い第一象限の点から原点を中心として反時計回りの順に列挙してください。 列挙の方法は、1行に一つの点の、X,Y座標を出力することとします。
サンプル出力
最低でも1000件まで列挙できることを確認してください。 また「反時計回り」の条件も満たしている場合は、1000番目の頂点が何かも併せて答えてください。
このお題はかもさんの投稿を元にしています。ご協力ありがとうございました。
1 reply [ reply ]