せっかく回答いただいたので、もう少し見やすくするべく別エントリに。
問題はここ
SKさん
N = 8p+r(0 = < r < 8)とします。r=mod(N,8)とも書けます。
0 < i < = p(8-r)のとき、
b(i)=1+{(i-1)-mod(i-1,p)}/p
p(8-r) < i < = Nのとき、
b(i)=1+[(i-1)+(8-r)-mod{(i-1)+(8-r),p+1}]/(p+1)
perl好き友人(この人に話したときには、N=18最大値、という前提だった)
sub brackets {
my ($i) = shift;
my @ia = qw(1 2 3 4 5 6 7 8 8 7 6 5 4 3 2 1 8 7);
my $in = 1;
my @ib = sort {$a <=> $b} @ia[0 .. ($i - 1)];
foreach (@ib) {
print $_ . " - " . $in++ . "\n";
}
}
perl好き友人その2(同上)
## 出走数と馬番から枠番号を求めるスクリプト
# 頭数は18まで、枠番号は8までで、
# 9頭以上の場合は枠番の大きいほうから2頭ずつ、
# 17頭以上では3頭ずつ埋めていく。
for my $all(2..18) {
print qq!*$all:\n!;
for my $no(1..$all) {
my $bra = &brackets($all, $no);
print qq!#$bra : $no\n!;
}
print qq!\n!;
}
# 出走数、馬番を引数にして、枠番を返す
sub brackets {
# 出走数
my $all = shift;
# 馬番
my $no = shift;
# 枠に含まれる最大数
my $plus = int(($all+7) / 8);
# 番号の大きいほうから($plus)ずつ枠を詰めた場合
my $tmp1 = 8-int(($all-$no)/$plus);
# 番号の小さい方から($plus-1)ずつ枠を詰めた場合
my $tmp0 = $no;
$tmp0 = int(($no+1)/($plus-1)) if ($plus>2);
# 小さい方が正しい枠番
$tmp1 = $tmp0 if ($tmp1 > $tmp0);
# 枠番を返す
return $tmp1;
}
ついでに自分のも。
object[] brackets; //馬番配列
clist = new Color[]{Color.White,Color.Gray,Color.Red,
Color.Blue,Color.Yellow,Color.Green,Color.Orange,Color.Pink};
//枠色配列。1-8の数値と対応、ちょっと事情で色になってるけど結局同じこと。
int mod,div,no;
no = 10; //出走馬の数。これは引数になるべきやね。でもまあその辺は適当に。
Stack stk = new Stack(no); //一時スタック
mod = no % 8;
div = no / 8;
for (int i = 7; i > = 0; i--) //全枠でループ
{
for (int j = 0; j < div; j++) //複数ゲートを埋める
{
stk.Push(clist[i]);
}
if(div == 0) //全枠に満たない場合
{
if(mod > i ) //内から埋める
{
stk.Push(clist[i]);
}
}
else //枠が埋まってる場合
{
if(7-mod < i ) //外から埋める
{
stk.Push(clist[i]);
}
}
}
brackets = stk.ToArray();
やはり、8頭立て以下の場合とそれ以上をきれいに扱うというのが結構面倒な模様。
でもみんないろいろ考えるね。
まあ、私の脳年齢が48歳なせいか、一番泥臭い。
私のN<8に対応してませんでした。。。不完全な答でスミマセン。
あー、むしろこちらこそ申し訳ないです。再投稿でも削除でもどちらでもお受けするですよ。
思ったよりやり方はいろいろあるみたいで、私は楽しいです。