La pizza è giusta?


27

Questa domanda è ispirata ed è l'inverso di questa .

Dennis ( E), Doorknob ( D), Martin ( M) e Chris ( C) hanno ordinato una pizza. La pizza rettangolare è divisa in pezzi quadrati, ognuno segnato con il mangiatore previsto.

Scrivi un programma o una funzione che ha dato una pizza rettangolare composta da 0 o più di ogni lettera determina se:

  1. Ogni sezione per ogni persona è connessa al percorso . Ciò significa che tutte le lettere uguali devono essere direttamente adiacenti l'una all'altra (nessuna connessione diagonale).

  2. Il numero di sezioni per persona è uguale per tutti.

È necessario generare un valore di verità / falsa con una nuova riga finale facoltativa che indica se la pizza fornita è corretta.

Validi test:

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

Testcase non validi:

EDM
EDMCCMDE
DDDDDDDDDDDDMCCCCCCCCCCC
DEEEEEEEEEEDMMMMMMMCCCCC
DEEEEEEEEEEMDMMCCCCCCCCC
DEEEEEEEEEEDMMMMMMMMCCCC
DDDDDDDDDDDDMMMMMMMMMMMC
DDMMEECC
DMMEECCC

Vince il codice più breve in byte.


1. Quali forme di input sono accettabili per una funzione? stringa con newline? array con una stringa per ogni riga? Matrice 2D di personaggi? Tutti i precedenti? 2. Comprendo che l'output è veritiero per giusto, falso per ingiusto o possono essere invertiti?
Level River St

52
Valori di test validi: DDDDDDDDDDDDD<- una pizza buona
Maniglia della porta

@steveverrill Per questa sfida è accettabile solo una stringa con newline. Devi restituire la verità per correttezza e la falsa per ingiusta.
orlp,

Accanto a newline, solo CDEM in input?
edc65,

@ edc65 Corretto.
orlp,

Risposte:


5

Pyth, 53 byte

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

Dimostrazione

Questo è essenzialmente un riempimento per ogni lettera, seguito da una verifica che tutte le serie risultanti abbiano le dimensioni appropriate.

Per riempire inondazioni, inizia con la ricorrenza più in alto a sinistra di ogni lettera, quindi genera tutti i vicini di posizioni trovate fino a quel momento, filtra per posizioni con la lettera giusta e si ripete fino a quando il set non smette di cambiare.


6

Lumache , 129

Stampa 1 per una pizza buona e 0 per una pizza ingiusta.

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

Versione estesa:

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

&significa che il modello deve corrispondere in tutte le posizioni sulla griglia. La prima riga controlla un numero uguale di ciascuno di E, D, M, C. utilizza l'istruzione di teletrasporto t, che è un ottimo modo per creare programmi con complessità fattoriale. Se un input ha sezioni di dimensioni non uguali con diverse unità per ciascuna delle 4 mod, il programma si bloccherà più o meno per sempre. Dopodiché, c'è un controllo per un percorso contiguo all'istanza in alto a sinistra della lettera su cui è iniziato il modello.


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

Provalo online

Questo è ridicolmente lungo perché CJam non ha (ancora) incorporato il flood-fill o il union-find. Ho implementato union-find nel programma.

Spiegazione:

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

Usando le stringhe di template, c'è una nuova riga che è significativa e contata

Prova a eseguire lo snippet in 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

Verifica la presenza di un numero uguale di C, D, E, M, quindi riempie e verifica l'eventuale presenza di lettere orfane. Non un vincitore, ma ho dovuto provare.

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

Violino


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

Spiegazione:

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
Codice interessante (hai battuto il mio!) Suggerimento: usa le funzioni freccia es6 (come nella mia risposta) per salvare qualche byte. Dopo tutto non è necessario assegnarlo a una variabile, usando una semplice dichiarazione di funzione, ad es l=>{...}. Va bene.
DankMemes,

2
Rimuovere anche le parentesi k=(o)=>per salvare altri 2 byte. Le funzioni freccia a parametro singolo non richiedono parentesi.
DankMemes,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.