ピザは公正ですか?


27

この質問は触発され、逆のです、この1

デニス(E)、ドアノブ(D)、マーティン(M)、クリス(C)がピザを注文しました。長方形のピザは正方形のピースに分割され、各ピースには意図した食べる人がマークされています。

各文字の0個以上で構成される長方形のピザを与えて、次のことを決定するプログラムまたは関数を作成します。

  1. 各人物の各スライスはパス接続されています。これは、同じ文字はすべて互いに直接隣接する必要があることを意味します(斜めの接続はありません)。

  2. 1人あたりのスライス数はすべて同じです。

指定されたピザが公正かどうかを示すオプションの末尾の改行を使用して、真偽値を出力する必要があります。

有効なテストケース:

DDDDDDDDDDDDMCCCCCCCCCCC
DEEEEEEEEEEDMMMMMMMCCCCC
DEEEEEEEEEEDMMMCCCCCCCCC
DEEEEEEEEEEDMMMMMMMMCCCC
DDDDDDDDDDDDMMMMMMMMMMMC
DEMC
DD
EE
MC
MC
EEDDMMMCCC
EEEDDDMMCC

無効なテストケース:

EDM
EDMCCMDE
DDDDDDDDDDDDMCCCCCCCCCCC
DEEEEEEEEEEDMMMMMMMCCCCC
DEEEEEEEEEEMDMMCCCCCCCCC
DEEEEEEEEEEDMMMMMMMMCCCC
DDDDDDDDDDDDMMMMMMMMMMMC
DDMMEECC
DMMEECCC

バイト単位の最短コードが優先されます。


1.関数にはどのような入力形式を使用できますか?改行付きの文字列?各行に1つの文字列を含む配列?文字の2D配列?上記のすべて?2.私は、出力が公正な場合は真実であり、不正な場合は偽であることを理解しますか、それとも取り消すことができますか
レベルリバーセント

52
有効なテストケース:DDDDDDDDDDDDD<-公正なピザ
ドアノブ

@steveverrillこのチャレンジでは、改行を含む文字列のみが入力可能です。あなたは公正のために真実を、不公平のために偽を返さなければなりません。
orlp

改行のほかに、入力にはCDEMのみがありますか?
edc65

@ edc65正しい。
orlp

回答:


5

Pyth、53バイト

!f-lJs.z*4lu&G{smfqT@JY@UJ+Ld[Z1_1Klh.z_K)G]xJT)"CDEM

デモンストレーション

これは基本的に各文字の塗りつぶしであり、結果のセットがすべて適切なサイズであることを確認します。

塗りつぶすには、各文字の左上の出現から開始し、それまでに見つかった場所のすべての近隣を生成し、右の文字で場所をフィルタリングし、セットの変更が停止するまで繰り返します。


6

カタツムリ、129

公正なピザの場合は1、不公平なピザの場合は0を印刷します。

&
={(t\Dt\Et\Ct\M),!(t.}{(o\D)+l^D,=~u{^D=(r^D,~},~|o\E`+l^E,=~u{^E=(r^E,~},~|o\C`+l^C,=~u{^C=(r^C,~},~|o\M`+l^M,=~u{^M=(r^M,~},~

拡張バージョン:

&
={ (t\Dt\Et\Ct\M), !(t.)}   {
(o\D)+ l^D,=~ u{^D=(r^D,~)}, ~ |
(o\E)+ l^E,=~ u{^E=(r^E,~)}, ~ |
(o\C)+ l^C,=~ u{^C=(r^C,~)}, ~ |
(o\M)+ l^M,=~ u{^M=(r^M,~)}, ~

&は、グリッド上のすべての場所でパターンが一致する必要があることを意味します。最初の行は、E、D、M、Cのそれぞれの等しい数をチェックします。テレポート命令を使用します。これは、t要因の複雑さを持つプログラムを作成する素晴らしい方法です。入力のサイズが4つのmodごとに数単位の不均等なスライスである場合、プログラムは多かれ少なかれ永久にハングします。その後、パターンが開始された文字の左上インスタンスへの連続パスのチェックがあります。


6

CJam、93

qN/_z,:W;s:A,,:B_{{{_B=_@-}g}%$}:F;{a+_Af=)#{F~B\@t:B}|;}:U;W>{_W-U}/{W%},{_(U}/BFe`0f=_1<4*=

オンラインで試す

CJamには組み込みのフラッドフィルまたはユニオン検索がないため、これはとてつもなく長いです。プログラムにunion-findを実装しました。

説明:

qN/_         read input, split into lines and duplicate
z,:W;        transpose, get length (original width) and store in W
s:A          convert to string (without newlines) and store in A
,,           make an array [0..n-1] (n = pizza size)
:B_          store in B (initial structure) and duplicate (will be used in 2 loops)
{…}:F;       define function F ("Find" for multiple indices and sort)
  {…}%       for each value (x)
    {…}g     do…while
      _B=    duplicate x and get B[x]
      _@-    leave a B[x] on the stack and calculate B[x] - x
              if non-zero, repeat the loop with B[x]
  $          sort the results
{…}:U;       define function U ("Union" for 2 indices)
  a+         make an array of the 2 indices
  _Af=       get the corresponding letters from A
  )#         check if the letters are different
  {…}|       if not, execute…
    F~       call F on the array and dump the 2 results on the stack
    B\@t     join the sets - B[bigger index] = smaller index
    :B       store back in B
  ;          pop the last value (either array if indices or B)
W>           remove the first row of indices
{…}/         for each index
  _W-        duplicate and subtract W ("go up")
  U          call U to join sets if they match
{W%},        remove the first column of indices
{…}/         for each index
  _(         duplicate and decrement ("go left")
  U          call U to join sets if they match
BF           call F on B, to get the final sets and sort
e`           RLE encoding
0f=          keep only the repetition counts
_1<4*=       check if it's the first value (if any) repeated 4 times

4

JavaScript(ES6)、153 166

テンプレート文字列を使用すると、重要でカウントされる改行があります

FireFoxでスニペットの実行をテストします。

f=z=>![...'CDEM'].some(c=>((l=p=>z[p]==c&&[-1,1,w,-w].map(o=>l(p+o),z[p]='',++k))(z.indexOf(c),h=k,k=0),~h&&h-k),w=~z.search`
`,z=[...z],k=-1)&z.join``-1

// Ungolfed
U=z=>{
  w = ~z.search`\n`
  z = [...z]
  fill = p=>(
    c = z[p],
    z[p] = '',
    [-1,1,w,-w].forEach(o=>z[o+=p] == c && fill(o)),
    ++k
  )
  h = -1
  r = ['C','D','E','M'].every( c =>(
    k = 0,
    y = z.indexOf(c),
    y >= 0 && fill(y),
    v = h >= 0 ? h == k : true,
    h = k,
    v
  ))
  return r & 1-z.join``
}  

// Test
out=x=>O.innerHTML+=x+'\n';

// Valid test cases
valid=[`DDDDDDDDDDDDMCCCCCCCCCCC
DEEEEEEEEEEDMMMMMMMCCCCC
DEEEEEEEEEEDMMMCCCCCCCCC
DEEEEEEEEEEDMMMMMMMMCCCC
DDDDDDDDDDDDMMMMMMMMMMMC`,
`DEMC`,
`DD
EE
MC
MC`,
`EEDDMMMCCC
EEEDDDMMCC`];
out('Valid')
valid.forEach(t=>out(t+'\n'+f(t)+'\n'));
invalid=[`EDM`,
`EDMCCMDE`,
`DDDDDDDDDDDDDD`,         
`DDDDDDDDDDDDMCCCCCCCCCCC
DEEEEEEEEEEDMMMMMMMCCCCC
DEEEEEEEEEEMDMMCCCCCCCCC
DEEEEEEEEEEDMMMMMMMMCCCC
DDDDDDDDDDDDMMMMMMMMMMMC`,
`DDMMEECC
DMMEECCC`
];
out('Invalid')
invalid.forEach(t=>out(t+'\n'+f(t)+'\n'))
<pre id=O></pre>


2

Javascript ES6、360

等しい数のC、D、E、Mをチェックし、次に塗りつぶし、孤立した文字がないかチェックします。勝者ではありませんが、試してみました。

i=>(I=i.split`
`.map(e=>e.split``),c=(i[m='match'](/C/g)||[])[l='length'],a=(x,y,z)=>{if(I[x][y]!=z)return;I[x][y]=0;x>0&&a(x-1,y,z);x<I[l]-1&&a(x+1,y,z);y>0&&a(x,y-1,z);y<I[0][l]-1&&a(x,y+1,z)},![...'CDEM'].some(k=>{if((i[m](eval(`/${k}/g`))||[])[l]!=c)return 1;I.some((w,x)=>(g=-1<(y=w.indexOf(k)),g&&a(x,y,k),g));})&&!I.map(e=>e.join``).join``[m](/[CDEM]/))

フィドル


2

JavaScriptのES6、328 318 316 269 178

l=>(d=[0,0,0,0],s=[...l.split`
`.join``].map(i=>(d["EDMC".search(i)]++,i)),!l||d.every(i=>i==d[0])&&(s.every((r,i)=>[1,-1,X=l.split`
`[0].length,-X].some(o=>s[o+i]==r))||d[0]<2))

説明:

l => (
  d = [0,0,0,0],          // array containing each letter count
  s = [...l.split`                    
`.join``]                 // removes newlines from input and converts it into array
  .map(i => (             // loops through the array
    d["EDMC".search(i)]++ // increases letter count
    ,i)),                 // returns unchanged value in order to preserve original array
  !l                      // input is empty
  || d.every(i=>i==d[0])  // each letter count is equal
  && (
    s.every((r, i) =>     // there is no orphaned letters 
      [1,-1,X=l.split`
`[0].length,-X]           // letters on respectively: right, left, bottom, top
      .some               // at least one of them
        (o=>s[o+i]==r))   // equals original letter
    || d[0] < 2           // count of each letter equals 1
  )
)

1
興味深いコード(あなたは私のものを打ち負かしました!)わかりやすいように、プレーンな関数宣言を使用して変数に変数を割り当てる必要はありませんl=>{...}
DankMemes

2
また、括弧を削除して、k=(o)=>さらに2バイト節約します。単一パラメーターの矢印関数には括弧は必要ありません。
DankMemes
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.