Pomóż mi wycisnąć moje awokado

14

W tym wyzwaniu mam pole z awokado, które chciałbym soczyć tak szybko i całkowicie, jak to możliwe. Czy potrafisz napisać program lub funkcję, która pomoże mi w perfekcyjnym wyciśnięciu awokado?

Jako dane wejściowe otrzymasz awokado jako siatkę mx mkwadrat, gdzie mliczba całkowita wynosi od 3 do 6. Każdy kwadrat zawiera dokładnie jedno awokado. Awokado ma kilka etapów soczystości:

Etap 1: Awokado w ogóle nie zostało wyciśnięte.
Etap 2: Awokado zostało częściowo wyciśnięte.
Etap 3: Awokado zostało całkowicie wyciśnięte.
Etap 4: Awokado wybuchło z powodu nadmiernego wyciskania soku.

Gdy używasz narzędzia do wyciskania soku, awokado w obszarze działania tego narzędzia do wyciskania soków przechodzi do następnego etapu. Wybuchające awokado mają dużą siłę i zniszczą całe pole awokado, więc upewnij się, że żadne z awokado nie wybuchnie!

Oto przykład siatki awokado. W tych przykładach użyłem współrzędnych 0,0dla lewego dolnego rogu i współrzędnych 2,2dla prawego górnego rogu, chociaż możesz dopasować układ współrzędnych do swojego języka.

112
221
231

Celem jest, aby wszystkie awokado były idealnie wyciśnięte (tj. Etap 3). Aby to osiągnąć, masz trzy różne narzędzia do wyciskania soku. Każde narzędzie wyciskające sok ma inny obszar działania, ale wszystkie zwiększają soki dotkniętych awokado o 1.

Oto wszystkie narzędzia, które masz do dyspozycji. Korzystasz z sokowirówek, określając pierwszą literę narzędzia, a następnie współrzędne, które chcesz wycisnąć. Na przykład, aby użyć krajalnicy do kwadratu 5,2, wypisz dane wyjściowe S 5,2.

Krajalnica : wyciska współrzędne celu i awokado po obu stronach.

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

Tarka : wyciska współrzędne celu i awokado powyżej i poniżej.

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

Wyrzutnia rakiet : wyciska współrzędne celu i wszystkie sąsiadujące awokado.

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

Przykładowe wejścia i wyjścia

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
Absynt
źródło
Wydaje się, że nie mówisz tego wprost, ale czy rozwiązanie musi zdecydowanie wykonać jak najmniej ruchów?
FryAmTheEggman
1
To zignorowało niektóre konstruktywne komentarze z piaskownicy. Oto jedna: Przypuszczam, że powinieneś elastycznie pozwolić użytkownikowi wybrać swój układ współrzędnych (np. Gdzie jest początek, 0-indeksowany lub 1-indeksowany).
Greg Martin
3
@Pavel bardzo dziękuję za nie opublikowanie tego jako odpowiedzi lub pytania.
NoOneIsHere
1
Widziałem to pytanie i byłem gotowy na głosowanie, VTC i oflagowanie jako spam. Zamiast tego +1.
NoOneIsHere
1
@Pavel Byłem tak kuszony, aby tytuł ...
absynt

Odpowiedzi:

1

Mathematica - 350 bajtów

Niezbyt krótkie rozwiązanie, ale lepsze niż żadne rozwiązanie, prawda?

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"]&

Bardziej czytelna wersja (z dodatkowymi spacjami, wcięciami i innymi):

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"] &

Dane wejściowe to tablica (np. {{3,2,3},{2,2,2},{3,2,3}}), Dane wyjściowe to ciąg znaków (z końcowym znakiem nowej linii - jeśli jest to niedopuszczalne, zamknij funkcję StringDrop[...,-1]na dodatkowe 15 bajtów). Użyłem układu współrzędnych, który mówi, że (1,1) to lewy górny róg, (n, n) to dolny prawy róg (gdzie n jest wymiarem macierzy). Czasami, jeśli rozwiązanie wymaga wielokrotnego wykonania tej samej operacji, dane wyjściowe zawierają rzeczy takie jak 3 G 2,2(dla „trzykrotnie użyj tarki w (2,2)”) - mam nadzieję, że nie powiedziałeś, co robić w tym przypadku W porządku.

Wyjaśnienie:

  • 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}]tworzy tablicę ze zmiennymi G [i, j] w każdym miejscu, na które wpływ ma użycie tarki w (i, j) i podobnie dla S [i, j] i R [i, j]. Zmienne te reprezentują liczbę przypadków użycia narzędzia w tej pozycji.
  • .../.(G|S|R)[___,0|n+1,___]->0 usuwa efekty używania narzędzi w pozycjach poza polem awokado.
  • ...==3-# porównuje to do różnicy między wejściem a polem idealnie wyciśniętych awokado.
  • ...&&And@@t[#[i,j]>=0&]mówi, że zmienne G [i, j], S [i, j], R [i, j] muszą być nieujemne (nie można odblokować awokado!), używając skrótu t[x_]:=Flatten@Table[x/@{G,S,R},{i,n},{j,n}].
  • First@Solve[...,t[#[i,j]&],Integers] znajduje pierwsze całkowite rozwiązanie naszych równań w kategoriach zmiennych G [i, j], S [i, j], R [i, j].
  • /.{(x_->m_):>ToString[m x]} ukrywa zmienne, które są równe zeru, jednocześnie umieszczając rozwiązanie w ładnej formie łańcucha.
  • StringReplace[...,{"["->" ","]"->"\n",", "->","}]zamienia ciągi jak "2 G[1, 4]"w ciągi podobne "2 G 1,4"i dodaje nowy wiersz na końcu.
  • ""<>Cases[...,Except@"0"]usuwa wszystkie resztki "0"i łączy wszystkie ciągi razem.
Nie drzewo
źródło