ジョリー・ギャリーマンデリング

バックグラウンド

米国は、ある投票結果を予測するために選挙区を意図的に操作する、ゲーリーマンダリングの独特の愛を持っています。ちょうど最近、ギャリーマンダーケース最高裁判所に提起された。
Gerrymanderingは、特にレースに関連する場合、違法とされ、地区ラインを再描画する必要があります。

地方自治体の長方形の地図(2次元配列)が与えられると、あなたの党が最も多くの表現を得るのを助けるために地区線を描画します。つまり、あなたは気になるでしょう。各自治体には、
01 という2つの関係者があります。マップは 0
または 1 の四角で構成されます。マップの例を次に示します。

チャレンジ

1
当事者が少なくとも入力によって指定された地区の数を取得するように、マップを地区にグループ化します。

入力

The 入力 will consist of a map, the number of districts to draw,
and the minimum number of districts the 1 party needs
to win (the minimum score).

出力

The 出力 will be a map of the districts. Each district will be
uniquely comprised of a capitalized letter of the alphabet. Yes,
this means that there will not be more than 26 districts.

If there is no possible 出力 where the 入力ted party wins enough
districts, either:

  1. 印刷しました “試しました…”
  2. 選挙結果によって党が修復不能に怪我をしたために致命的なエラーが発生しました
  3. または両方

ルール(非常に重要)

  1. All districts must be contiguous
  2. Districts may not have other districts in them
  3. Each district must have at least four nodes in it. The 入力 will
    be consistent with the rules, meaning that there will be at least
    number_of_districts * 4 nodes in the map
  4. The score of each party is the number of districts it has a
    majority in
  5. If a district has the same number of 0s and
    1s, then neither party benefits from it
  6. Normal no-cheating rules
  7. This is ,
    so shortest code in bytes wins.

テストケース

1. 入力       1. 出力       2. 入力       2. 出力     3. 入力      3. 出力
districts: 5   Image and map   districts: 3   Image below   districts: 3  fatal error
min wins: 3                    min wins: 3                  min wins: 3
map:                           map:                         map:
00000110000    AAAAAAAAAAA     101101                       101101
10000010000    AAAAAAAAAAA     100000                       100000
10010000011    AAAAAAAAAAA     011011                       011011
11001110000    BBBBBBBAAAA     111111                       100111
00111111000    BBBBBBBAAAA     
01111111000    CCCCCDDDAAA     
01111111001    CCCCCDDDAAA     
01000111100    EEEEEDDDDDD     
00000001000    EEEEEDDDDDD     

もちろん、あなたのプログラムは、これらのテストケースだけでなく、任意の有効なテストケースでも動作するはずです。

ベストアンサー

R, 938 896 858 952
bytes

function(N,M,m){U="We tried...
"
L=length
A=matrix
W=which
K=sum
S=sample
G=unique
H=function(s,p=s-1){Y=S(c(s-j,s+j,p*(p%%j>0),(s+1)*(s%%j>0)))
Y[Y>0&Y<=k]}
C=function(v,z=W(r==v))K(z%%j<2,z-j<0,(z+j)>k)
m=A(strsplit(m,"")[[1]],1)
i=W(m<0)[1]-1
m=((t(A(m,i+1))[,1:i]>0)-.5)*2
if((K(m)<1)|K(m>0)<(3*M))cat(U) else{j=max(1,nrow(m))
k=i*j;w=g=T
while(w<9&g){Z=R=N;Q=M;b=0
r=A(0,j,i)
while(b<9&g){s=W(r<1)
s=s[S(L(s))][1:min(L(s),R)]
r[s]=1:L(s);a=0
while(K(r<1)>0&a<(k^2)){a=a+1
s=S(W(r>0&r<=R),1);p=r[s]
Y=H(s)
Y=Y[r[Y]<1]
if(L(Y)){Y=Y[order(m[Y])]
if(K(m[r==p]>1))r[Y[1]]=p else r[Y[L(Y)]]=p}}
if(a<(k^2)){for(v in 1:R){if(K(m[r==v])>0){r[r==v]=max(k,max(r))+1
Q=Q-1;Z=Z-1}}
if(Q<1){g=F
for(v in 1:R)r[r==v]=max(k,max(r))+1
for(v in G(c(r)))g=g|(K(r==v)<4)|(L(G(r[H(W(r==v))]))+C(v))<3}}
b=b+1;r[r<=R]=0;R=Z}
w=w+1}
if(g)cat(U) else{u=G(c(r))
for(v in 1:L(u))r[r==u[v]]=v
cat(paste(apply(A(LETTERS[r],j,i),1,paste,collapse=""),collapse="
"))}}}

Try it
online!

A massive >900 >800 (nope!) >900 bytes
solution. The code works as follows. Let N be the number of
electoral districts and M the minimum number of district where 1
wishes to have a majority.

まず、コードはN個の地区を異なるグループにランダムに割り当てます。次に、無作為に選択されたグループに地区を追加して、その地区が既にそのグループに属する地区の隣にあることを保証する。拡張プロセスでは、地区グループがまだ1大多数ではない場合は、大多数の地区が優先されます。グループがすでにある1大多数である場合、それは0地区に優先権を与える。すべての地区が割り当てられるまで続きます。

1党の過半数が存在するすべてのグループが保存され、その地区がロックされます。大多数のM個のグループが少なくとも1つある場合、すべてが良好であり、結果を印刷できます。各グループに少なくとも4つの地区があるかどうかを確認できます。
4つの地区のカットオフが満たされれば、結果を喜んで印刷することができます。それ以外の場合、コードはロックされていない地区を利用可能なグループ、つまりN
– #stored-groupsに再割り当てしようとします。

コードは数回(9回)試行されます。失敗した場合は、すべてをリセットして再開します。これは、他の9回は、
“やってみました…”とあきらめて印刷します。

コードが最初に成功しない場合は、もう一度やり直してください。私は1分以内にTIOで実行できるように繰り返しの数を調整しました。しかし、解決策がある場合、このコードは(最終的に)それを見つけることができます。アルゴリズムのランダム性の部分は、解がある場合にそれを見つけることができる非ゼロの確率を与える。限られた数の試行だけが成功の唯一の制限要因です。

編集:地区グループには、指定された広場の端に地区がない限り、地区グループがまったく別の場所に囲まれないというコントロールを追加しました。私は最初にそれを逃したと思う。

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です