Là pizza công bằng?


27

Câu hỏi này được lấy cảm hứng từ, và là nghịch đảo của câu hỏi này .

Dennis ( E), Doorknob ( D), Martin ( M) và Chris ( C) đã đặt mua một chiếc bánh pizza. Bánh pizza hình chữ nhật được chia thành các miếng vuông, mỗi miếng được đánh dấu bằng người ăn dự định của họ.

Viết chương trình hoặc chức năng cho một chiếc bánh pizza hình chữ nhật bao gồm 0 hoặc nhiều hơn mỗi chữ cái xác định xem:

  1. Mỗi lát cắt cho mỗi người được kết nối đường dẫn . Điều này có nghĩa là tất cả các chữ cái giống nhau phải được đặt liền kề với nhau (không có kết nối đường chéo).

  2. Số lượng lát mỗi người là như nhau cho tất cả.

Bạn phải xuất ra một giá trị trung thực / giả mạo với một dòng mới tùy chọn cho biết liệu chiếc bánh pizza đã cho có công bằng hay không.

Các mẫu thử hợp lệ:

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

Testcase không hợp lệ:

EDM
EDMCCMDE
DDDDDDDDDDDDMCCCCCCCCCCC
DEEEEEEEEEEDMMMMMMMCCCCC
DEEEEEEEEEEMDMMCCCCCCCCC
DEEEEEEEEEEDMMMMMMMMCCCC
DDDDDDDDDDDDMMMMMMMMMMMC
DDMMEECC
DMMEECCC

Mã ngắn nhất trong byte thắng.


1. Những hình thức đầu vào được chấp nhận cho một chức năng? chuỗi với dòng mới? mảng với một chuỗi cho mỗi dòng? Mảng 2D của nhân vật? Tất cả những điều trên? 2. Tôi hiểu rằng đầu ra là trung thực cho công bằng, giả mạo cho không công bằng, hoặc họ có thể được đảo ngược?
Cấp sông St

52
Các trường hợp kiểm tra hợp lệ: DDDDDDDDDDDDD<- một chiếc bánh pizza công bằng
Doorknob

@steveverrill Đối với thử thách này, chỉ một chuỗi có dòng mới là đầu vào chấp nhận được. Bạn phải trả lại sự thật cho công bằng, và giả dối cho không công bằng.
orlp

Bên cạnh dòng mới, chỉ có CDEM trong đầu vào?
edc65

@ edc65 Đúng.
orlp

Câu trả lời:


5

Bình thường, 53 byte

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

Trình diễn

Đây thực chất là một vùng lấp đầy cho mỗi chữ cái, sau đó là kiểm tra xem tất cả các bộ kết quả có kích thước phù hợp.

Để lấp đầy, nó bắt đầu bằng sự xuất hiện phía trên bên trái của mỗi chữ cái, sau đó tạo ra tất cả các hàng xóm của các vị trí được tìm thấy cho đến nay, các bộ lọc cho các vị trí có chữ cái bên phải và lặp lại cho đến khi bộ dừng thay đổi.


6

Ốc , 129

In 1 cho pizza công bằng và 0 cho pizza không công bằng.

&
={(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,~},~

Phiên bản mở rộng:

&
={ (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,~)}, ~

&có nghĩa là mẫu phải khớp tại tất cả các vị trí trên lưới. Dòng đầu tiên kiểm tra số lượng bằng nhau của mỗi E, D, M, C. nó sử dụng lệnh dịch chuyển tức thời t, đây là một cách tuyệt vời để tạo các chương trình có độ phức tạp giai thừa. Nếu một đầu vào có các lát có kích thước không bằng nhau với một số đơn vị cho mỗi 4 mod, chương trình sẽ ít nhiều bị treo mãi mãi. Sau đó, có một kiểm tra cho một đường dẫn tiếp giáp với thể hiện trên cùng bên trái của bất kỳ chữ cái nào mà mẫu bắt đầu.


6

Camam, 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*=

Dùng thử trực tuyến

Điều này thật dài một cách nực cười bởi vì CJam không (chưa) đã tích hợp sẵn lũ lụt hoặc tìm kiếm liên minh. Tôi thực hiện tìm kiếm công đoàn trong chương trình.

Giải trình:

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

Sử dụng chuỗi mẫu, có một dòng mới có ý nghĩa và được tính

Kiểm tra chạy đoạn mã trong 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

Kiểm tra số lượng bằng nhau của C, D, E, M, sau đó lấp đầy lũ và kiểm tra bất kỳ chữ cái mồ côi nào. Không phải là một người chiến thắng, nhưng tôi đã phải cố gắng.

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]/))

Vĩ cầm


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))

Giải trình:

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
Mã thú vị (bạn đánh bại tôi!) Gợi ý: sử dụng các hàm mũi tên es6 (như trong câu trả lời của tôi) để lưu một vài byte. Afaik bạn không cần gán nó cho một biến, sử dụng khai báo hàm đơn giản, ví dụ như vậy l=>{...}là ổn.
DankMeme

2
Đồng thời xóa dấu ngoặc đơn k=(o)=>để lưu thêm 2 byte. Các hàm mũi tên tham số đơn không cần dấu ngoặc đơn.
DankMeme
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.