Ярмарка пиццы?


27

Этот вопрос вдохновлен и является обратным этому .

Деннис ( E), Дверная ручка ( D), Мартин ( M) и Крис ( C) заказали пиццу. Прямоугольная пицца разделена на квадратные кусочки, каждый из которых обозначен своим предполагаемым едоком.

Напишите программу или функцию, которая для прямоугольной пиццы, состоящей из 0 или более букв, определяет:

  1. Каждый срез для каждого человека связан с путем . Это означает, что все одинаковые буквы должны быть непосредственно смежными друг с другом (без диагональных связей).

  2. Количество ломтиков на человека одинаково для всех.

Вы должны вывести истинное / ложное значение с дополнительным завершающим переводом строки, который указывает, является ли данная пицца справедливой.

Допустимые тестовые случаи:

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

Неверные тестовые случаи:

EDM
EDMCCMDE
DDDDDDDDDDDDMCCCCCCCCCCC
DEEEEEEEEEEDMMMMMMMCCCCC
DEEEEEEEEEEMDMMCCCCCCCCC
DEEEEEEEEEEDMMMMMMMMCCCC
DDDDDDDDDDDDMMMMMMMMMMMC
DDMMEECC
DMMEECCC

Самый короткий код в байтах побеждает.


1. Какие формы ввода приемлемы для функции? строка с переводом строки? массив с одной строкой для каждой строки? 2D массив символов? Все вышеперечисленное? 2. Я понимаю, что результаты правдивы для честных, ложные для несправедливых, или они могут быть обращены вспять?
Уровень Река St

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 модов, программа будет зависать более или менее навсегда. После этого выполняется проверка непрерывного пути к верхнему левому экземпляру любой буквы, с которой начинается шаблон.


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
Интересный код (вы победили мой!) Предложение: используйте функции стрелок es6 (как в моем ответе), чтобы сохранить несколько байтов. Afaik вам не нужно присваивать его переменной, используя простое объявление функции, например, l=>{...}это нормально.
DankMemes

2
Также удалите скобки, k=(o)=>чтобы сохранить еще 2 байта. Функции стрелок с одним параметром не нуждаются в скобках.
DankMemes
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.