Gra planszowa Terra Mystica ma kilka bardzo interesujących mechanizmów dla jednego z podstawowych zasobów, mocy. Zamiast zdobywać i wydawać jednostki mocy z banku, każdy gracz rozpoczyna grę z dokładnie 12 jednostkami mocy, które są rozmieszczone na trzech „misach”, oznaczonych jako I, II i III. Pozyskiwanie i wydawanie mocy następnie przesuwa moc między tymi miskami:
- Aby wydać jednostkę mocy, przenieś ją z misy III do misy I (pod warunkiem, że masz jednostkę w misce III).
- Kiedy zyskasz jednostkę mocy, jeśli w misce I znajduje się jednostka, przenieś ją do misy II. Jeśli w misce I nie ma żadnych jednostek, ale w misce II jest jednostka, przenieś ją do misy III. Jeśli wszystkie jednostki są już w misce III, nic się nie dzieje.
- Gdy zyskujesz lub wydajesz wiele jednostek naraz, są one przetwarzane pojedynczo.
Oto przykład. Powiedzmy, że gracz zaczyna od następującej dystrybucji mocy (podanej w kolejności I | II | III
):
5 | 7 | 0
Ich moc zmienia się w następujący sposób, jeśli zdobędzie i wyda moc kilka razy:
5 | 7 | 0
Gain 3 ==> 2 | 10 | 0
Gain 6 ==> 0 | 8 | 4 (move 2 power from I to II,
then the remaining 4 from II to III)
Gain 7 ==> 0 | 1 | 11
Spend 4 ==> 4 | 1 | 7
Gain 1 ==> 3 | 2 | 7
Spend 7 ==> 10 | 2 | 0
Gain 12 ==> 0 | 10 | 2 (move 10 power from I to II,
then the remaining 2 from II to III)
Gain 12 ==> 0 | 0 | 12 (the two excess units go to waste)
Twoim zadaniem jest obliczenie wyniku jednego takiego zdarzenia pozyskiwania lub wydawania.
Wyzwanie
Jako dane wejściowe podano cztery liczby całkowite. Pierwsze trzy, I
, II
, III
, oznaczają ilość energii w każdej z trzech misek. Będą nieujemne i sumują się do 12. Czwarta liczba, P
oznacza ilość uzyskanej lub wydanej mocy i będzie w zakresie obejmującym [-III, 24]
(więc możesz założyć, że gracz nigdy nie będzie próbował wydać większej mocy niż mogą obecnie, ale mogą zyskać więcej mocy niż potrzebują przenieść całą moc do misy III).
Możesz wziąć te liczby w dowolnej spójnej kolejności, jako osobne argumenty, jako listę liczb całkowitych lub jako ciąg zawierający te liczby całkowite. Można również przyjąć P
jako jeden argument za I
, II
, III
jako osobna lista jej argumentów.
Należy wyjść trzy liczby całkowite I'
, II'
, III'
co stanowi ilość energii w każdej misce po P
jednostki zostały zdobyte lub wydane, zgodnie z zasadami wyjaśniono powyżej.
Możesz napisać program lub funkcję i użyć dowolnej z naszych standardowych metod otrzymywania danych wejściowych i dostarczania danych wyjściowych.
Możesz używać dowolnego języka programowania , ale pamiętaj, że te luki są domyślnie zabronione.
To jest golf golfowy , więc wygrywa najkrótsza ważna odpowiedź - mierzona w bajtach .
Przypadki testowe
I II III P => I' II' III'
5 7 0 3 => 2 10 0
2 10 0 6 => 0 8 4
0 8 4 7 => 0 1 11
0 1 11 -4 => 4 1 7
4 1 7 0 => 4 1 7
4 1 7 1 => 3 2 7
3 2 7 -7 => 10 2 0
10 2 0 12 => 0 10 2
0 10 2 12 => 0 0 12
źródło
Odpowiedzi:
Mathematica, 52 bajty
Jest to nienazwana funkcja, która pobiera listę
{I, II, III, P}
jako dane wejściowe i zwraca listę{I', II', III'}
.Rozwiązanie w formie zamkniętej. To naprawdę nie wydaje się optymalne ...
źródło
{##,12-+##}&[#-#4~Min~#,Max[#2+#-Abs[#4~Max~0-#],0]]&
jest bajt dłużej.12-+##
Mimo to lubię .C,
9794 bajtówW formie bez golfa:
źródło
Python 2, 104 bajty
Wypróbuj online
Nie golfowany:
źródło
Haskell, 58 bajtów
Wartość pośrednia
m
oznacza ilość mocy przechodzącej od (lub do, jeśli ujemna) pierwszej misy,z
oznacza ilość mocy w trzeciej misce po akcji. W ostatniej chwili optymalizacja jednego bajtu zmieniła stare wyrażenie dla drugiej miski od12-a+m-z
używania tożsamościa+b+c=12
.Naturalny typ wyniku jest potrójny dla misek, więc wkład bierze potrawy również jako potrójne, a zmiana mocy jako drugi argument. Umożliwia to obsługę wszystkich przypadków testowych za pomocą jednej aplikacji
scanl
:źródło
Röda ,
10094 bajtówNie golfowany:
źródło
++
i--
?JavaScript,
6159 bajtówWypróbuj online!
źródło
GNU sed , 66 bajtów
Obejmuje +1 dla
-r
Wykorzystuje unary (patrz ten konsensus ).
Wypróbuj online!
źródło
Siatkówka ,
46413938 bajtówDziękujemy Martinowi Enderowi za wiele pomocnych sugestii!
Pobiera dane wejściowe jednoargumentowe. Pierwszy wiersz zawiera ilości mocy w trzech miseczkach, oddzielonych przecinkami, drugi wiersz zawiera ilość mocy do cyklowania.
Zestaw testowy - pobiera wszystkie dane wejściowe w jednym wierszu i konwertuje z dziesiętnego na jednoargumentowy i odwrotnie dla wygody użytkowania.
Wyjaśnienie
Przypadek pozytywny: kilkakrotnie usuwamy prowadzenie
1
z drugiej linii i przenosimy a1
z pierwszej niepustej misy do następnej, o ile ta operacja jest możliwa (tzn. Liczba cykli zasilania jest niezerowa i nie wszystkie moc znajduje się w trzeciej misce). Ws
modyfikator środkisingle-line
, umożliwiając.
w celu dopasowania również do nowej linii.Przypadek ujemny: wykonane wszystko w jednym kroku, przenosząc ilość mocy wskazaną przez ostatni wkład z trzeciej do pierwszej misy. Spowoduje to również usunięcie linii zawierającej ujemną ilość mocy do ruchu.
Zachowaj (grep) tylko wiersze zawierające przecinek. Pozbędzie się to ewentualnych pozostałości pierwszej linii.
źródło
Python 2, 91 bajtów
Na podstawie tej odpowiedzi
Wypróbuj online
Nie golfowany:
źródło
Partia, 87 bajtów
Użyj następujących formuł:
Ponieważ Batch nie ma mniej niż operatora, obliczam
i = min(-i, 0)
za pomocąi*=i>>5
.źródło
Perl 6 , 99 bajtów
Niech
a
,b
ic
będzie liczbą początkowych żetonów odpowiednio w misach I, II i III. Następnie dla przypadku dodawania mocy tworzona jest lista zawierającaa
kopie tripletu(-1, 1, 0)
, następniea + b
kopie tripletu(0, -1, 1)
, a następnie nieskończone kopie0
. Pierwszed
elementy tej listy,d
czyli ilość mocy do dodania, są dodawane elementarnie do początkowego rozkładu mocy.Odjęcie energii (ujemne
d
), prosta forma zamknięta stosuje się:(a - d, b, c + d)
.źródło
tinylisp , 134 bajty
Definiuje funkcję,
f
która pobiera cztery argumenty, trzy miski (x y z
) i ilość mocy przetwarzanej (p
), i zwraca listę trzech misek po transakcji. Oto odpowiednio rozmieszczona wersja ze wszystkimi przypadkami testowymi: Wypróbuj online!źródło