Avokadolarımı meyve suyu yapmama yardım et


14

Bu meydan okumada, mümkün olduğunca çabuk ve tamamen meyve suyu yapmak istediğim bir avokado alanım var. Tüm avokadoları mükemmel bir şekilde nasıl meyve suyu içebileceğime yardımcı olacak bir program veya işlev yazabilir misiniz?

Giriş olarak, avokadoları mx mkare ızgara olarak alırsınız , burada m3 ile 6 arasında bir tamsayı vardır. Her kare tam olarak bir avokado içerir. Avokadoların sulu olma aşamaları vardır:

Aşama 1: Avokado hiç sıkılmadı.
Aşama 2: Avokado kısmen sıkıldı.
Aşama 3: Avokado tamamen sıkıldı.
Aşama 4: Avokado aşırı sıkma nedeniyle patladı.

Bir meyve suyu sıkma aleti kullandığınızda, meyve suyu sıkma aracının etki alanındaki avokadolar bir sonraki aşamaya geçer. Patlayan avokadoların çok fazla gücü var ve tüm avokado alanını yok edecek, bu yüzden avokadoların hiçbirinin patlamamasına dikkat edin!

İşte avokado ızgarasının bir örneği. Bu örneklerde, koordinat sistemini dilinize göre ayarlayabilmenize rağmen 0,0, sol alt köşenin koordinatını ve 2,2sağ üst köşenin koordinatını kullandım.

112
221
231

Amaç, tüm avokadoları mükemmel bir şekilde sıkmak (yani 3. aşama). Bunu başarmak için elinizde üç farklı meyve suyu sıkma aleti vardır. Her meyve suyu sıkma aracının farklı bir etki alanı vardır, ancak hepsi etkilenen avokadoların suyunu 1 arttırır.

İşte emrinde olan tüm araçlar. Sıkacakları, aracın ilk harfini, sonra da meyve suyu yapmak istediğiniz koordinatları belirterek kullanırsınız. Örneğin, Dilimleyiciyi kare üzerinde kullanmak için 5,2çıktı alırsınız S 5,2.

Dilimleyici : İki taraftaki hedef koordinatı ve avokadoyu sıkar.

112     112     112
221 --> XXX --> 332
231     231     231

Rende : Hedef koordinatı ve avokadoyu yukarı ve aşağı sular.

112     1X2     122
221 --> 2X1 --> 231 --> kaboom!
231     2X1     241

Roketatar : Hedef koordinatı ve tüm bitişik avokadoları sular.

112     1X2     122
221 --> XXX --> 332
221     2X1     231

Örnek Girişler ve Çıkışlar

323
212
323

G 1,1
S 1,1

3312
3121
1213
2133

R 0,0
R 1,1
R 2,2
R 3,3

22322
22222
22222
33233
33333

G 0,3
G 1,3
G 2,2
G 3,3
G 4,3

222332
333221
222332
333222
222333
333222

S 1,5
S 1,3
S 1,1
S 4,5
S 4,3
S 4,1
G 5,4

Bunu açıkça söylemiyor gibisiniz, ancak çözüm kesinlikle en az hamle yapmak zorunda mı?
FryAmTheEggman

1
Bu, sanal alandaki bazı yapıcı yorumları yok saydı. İşte bir: Kullanıcıların koordinat sistemlerini esnek bir şekilde seçmesine izin vermeniz gerektiğini varsayalım (örneğin, başlangıç ​​noktasının 0 dizinli veya 1 dizinli olduğu yer).
Greg Martin

3
@Pavel bunu bir cevap ya da soru olarak göndermediğiniz için çok teşekkürler.
NoOneIsHere

1
Bu soruyu gördüm ve aşağıya, VTC'ye ve spam olarak işaretlemeye hazırdım. Bunun yerine +1.
NoOneIsHere

1
@Pavel Başlığı yapmak için çok cazip davrandım ...
Absinthe

Yanıtlar:


1

Mathematica - 350 bayt

Çok kısa bir çözüm değil, ama hiç çözüm olmamasından daha iyi, değil mi?

t[x_]:=Flatten@Table[x/@{G,S,R},{i,n},{j,n}];""<>Cases[StringReplace[(First@Solve[(Table[G[i,j]+G[i-1,j]+G[i+1,j]+S[i,j]+S[i,j-1]+S[i,j+1]+R[i,j]+R[i-1,j]+R[i+1,j]+R[i,j-1]+R[i,j+1],{i,n=Length@#},{j,n}]/.(G|S|R)[___,0|n+1,___]->0)==3-#&&And@@t[#[i,j]>=0&],t[#[i,j]&],Integers])/.{(x_->m_):>ToString[m x]},{"["->" ","]"->"\n",", "->","}],Except@"0"]&

Daha okunabilir bir versiyon (ekstra boşluklar, girintiler ve diğer şeyler ile):

t[x_] := Flatten@Table[x /@ {G, S, R}, {i, n}, {j, n}]; 
"" <> Cases[
   StringReplace[(First@
       Solve[(Table[
             G[i, j] + G[i - 1, j] + G[i + 1, j] + S[i, j] + 
              S[i, j - 1] + S[i, j + 1] + R[i, j] + R[i - 1, j] + 
              R[i + 1, j] + R[i, j - 1] + R[i, j + 1], {i, 
              n = Length@#}, {j, n}] /. (G | S | R)[___, 
              0 | n + 1, ___] -> 0) == 3 - # && 
         And @@ t[#[i, j] >= 0 &], t[#[i, j] &], 
        Integers]) /. {(x_ -> m_) :> ToString[m x]}, {"[" -> " ", 
     "]" -> "\n", ", " -> ","}], Except@"0"] &

Girdi bir dizidir (örn. {{3,2,3},{2,2,2},{3,2,3}}), Bir dizedir (sondaki yeni satırla - bu kabul edilemezse, işlevi StringDrop[...,-1]15 baytlık fazladan içine alın ). (1,1) sol üst köşede (n, n) sağ altta (burada n matrisin boyutu) yazan koordinat sistemini kullandım. Bazen, çözüm aynı işlemi birden çok kez yapmayı gerektiriyorsa, çıktı 3 G 2,2("rende üç kez (2,2) 'de kullanın") için - bu durumda ne yapacağınızı söylemediğiniz için, bu iyi.

Açıklama:

  • Table[G[i,j]+G[i-1,j]+G[i+1,j]+S[i,j]+S[i,j-1]+S[i,j+1]+R[i,j]+R[i-1,j]+R[i+1,j]+R[i,j-1]+R[i,j+1],{i,n=Length@#},{j,n}](i, j) 'de rende kullanarak etkilenen her yerde G [i, j] değişkenleriyle ve benzer şekilde S [i, j] ve R [i, j] için bir dizi oluşturur. Bu değişkenler, aracın bu konumda kaç kez kullanıldığını gösterir.
  • .../.(G|S|R)[___,0|n+1,___]->0 avokado alanının dışındaki konumlarda alet kullanmanın etkilerini ortadan kaldırır.
  • ...==3-# bunu girdi ve mükemmel meyve suyu avokado alanı arasındaki farkla karşılaştırır.
  • ...&&And@@t[#[i,j]>=0&]G [i, j], S [i, j], R [i, j] değişkenlerinin stenografi kullanarak negatif olmaması gerekir (avokadoların suyunu çıkaramazsınız!) t[x_]:=Flatten@Table[x/@{G,S,R},{i,n},{j,n}].
  • First@Solve[...,t[#[i,j]&],Integers] denklemlerimize G [i, j], S [i, j], R [i, j] değişkenleri açısından ilk tamsayı çözümünü bulur.
  • /.{(x_->m_):>ToString[m x]} sıfıra eşit olan değişkenleri gizlerken, çözümü güzel bir dize formuna da koyar.
  • StringReplace[...,{"["->" ","]"->"\n",", "->","}]dizeleri olduğu gibi dizelere "2 G[1, 4]"dönüştürür "2 G 1,4"ve sonuna bir satırsonu ekler.
  • ""<>Cases[...,Except@"0"]tüm kalanları kaldırır "0"ve tüm dizeleri birleştirir.
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.