Pizza adil mi?


27

Bu soru esinlenerek ve tersidir edilir bu bir .

Dennis ( E), Doorknob ( D), Martin ( M) ve Chris ( C) bir pizza sipariş etti. Dikdörtgen pizzalar, her biri kendi yiyicileri ile işaretlenmiş kare parçalara bölünmüştür.

Her harfin 0 veya daha fazlasını içeren dikdörtgen bir pizza verilen bir program veya fonksiyon yazın ;

  1. Her kişi için her dilim yola bağlıdır . Bu, aynı olan tüm harflerin doğrudan birbirine bitişik olması gerektiği anlamına gelir (çapraz bağlantı yok).

  2. Kişi başına düşen dilim sayısı herkes için aynıdır.

Verilen pizzanın adil olup olmadığını belirten isteğe bağlı izleyen bir yeni satırla bir gerçeği / sahte değeri vermelisiniz.

Geçerli test durumları:

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

Geçersiz test durumları:

EDM
EDMCCMDE
DDDDDDDDDDDDMCCCCCCCCCCC
DEEEEEEEEEEDMMMMMMMCCCCC
DEEEEEEEEEEMDMMCCCCCCCCC
DEEEEEEEEEEDMMMMMMMMCCCC
DDDDDDDDDDDDMMMMMMMMMMMC
DDMMEECC
DMMEECCC

Bayt cinsinden en kısa kod kazanır.


1. Bir fonksiyon için hangi girdi formları kabul edilebilir? newlines ile dize? Her satır için bir dize ile dizi? 2D karakter dizisi? Yukarıdakilerin hepsi? 2. Çıktının adil için haksız, haksız yere sahtekarlık veya tersine çevrilebileceğini anlıyorum
Seviye River St

52
Geçerli test durumları: DDDDDDDDDDDDD<- adil bir pizza
Doorknob

@steveverrill Bu meydan okuma için yalnızca yeni satırlı bir dize kabul edilebilir bir girdidir. Adil olmak için haksızlığa, haksız yere sahte olmak zorundasın.
orlp

Yeni satırların yanı sıra, girişte yalnızca CDEM?
edc65

@ edc65 Doğru.
orlp

Yanıtlar:


5

Pyth, 53 bayt

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

gösteri

Bu, esasen her harf için bir sel dolgusu, ardından elde edilen tüm setlerin uygun boyutta olup olmadıklarını kontrol eder.

Sel doldurmak için, her bir harfin en sol üstte ortaya çıkışıyla başlar, sonra şimdiye kadar bulunan konumların tüm komşularını oluşturur, sağ harfli konumlar için filtreler ve küme değişimini durdurana kadar tekrarlar.


6

Salyangozlar , 129

Adil bir pizza için 1 ve adil olmayan bir pizza için 0 yazdırır.

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

Genişletilmiş sü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,~)}, ~

&Desenin ızgaradaki tüm konumlarda eşleşmesi gerektiği anlamına gelir. İlk satır, eşit sayıda E, D, M, C için kontrol eder. Teleport komutunu kullanır t, bu da faktoring karmaşıklığı olan programları yapmak için harika bir yoldur. Bir giriş, 4 modun her biri için birkaç birimde eşit boyutta olmayan dilimlere sahipse, program sonsuza dek askıda kalacaktır. Bundan sonra, modelin başladığı harfin sol üst örneğine bitişik bir yol olup olmadığı kontrol edilir.


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

Çevrimiçi deneyin

Bu gülünç derecede uzun, çünkü CJam (henüz) yerleşik taşma dolgusu veya birlik bulmuyor. Programda sendika bulma uygulamasını gerçekleştirdim .

Açıklama:

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

Şablon dizgilerini kullanarak, anlamlı ve sayılan yeni bir satır var.

Snippet'in FireFox'ta çalıştığını test edin.

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

Eşit C, D, E, M sayılarını kontrol eder, sonra taşkın doldurur ve artık harfleri kontrol eder. Kazanan değil ama denemek zorundaydı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]/))

Keman


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

Açıklama:

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
İlginç kod (benimkini yendin!) Öneri: bir kaç bayt kaydetmek için es6 ok fonksiyonlarını kullanın (cevabımdaki gibi). Afaik'i bir değişkene atamanıza gerek yoktur, örneğin düz bir işlev bildirimi kullanarak l=>{...}iyidir.
DankMemes

2
Ayrıca k=(o)=>2 bayt daha kazanmak için parantezleri çıkarın . Tekli parametre oku işlevleri parantez gerektirmez.
DankMemes
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.