피자는 공정합니까?


27

이 질문에 의해 영감을, 그리고 역이다 이것 .

Dennis ( E), Doorknob ( D), Martin ( M) 및 Chris ( 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. 함수에 어떤 형식의 입력이 허용됩니까? 줄 바꿈이있는 문자열? 각 줄에 대해 하나의 문자열을 가진 배열? 문자의 2D 배열? 무엇보다도? 2. 결과물이 공정성에 대해서는 진실하고, 불공정에 대해서는 거짓이거나, 반대로 되돌릴 수 있음을 이해합니다.
Level River St

52
유효한 테스트 사례 : DDDDDDDDDDDDD<-공정한 피자
Doorknob

@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은 아직 홍수 채우기 나 노조 찾기 기능이 없기 때문에 이것은 엄청나게 길다. 프로그램에서 유니온 찾기 를 구현했습니다 .

설명:

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

자바 스크립트 (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

자바 스크립트 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

자바 스크립트 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.