Biorąc pod uwagę ciąg znaków, w +=-
których jest co najmniej jeden =
, wstaw dodatnie liczby całkowite między wszystkimi symbolami oraz na początku i na końcu, aby równania matematyczne były spełnione.
Na przykład biorąc pod uwagę dane wejściowe
+-=-=
musisz wstawić dodatnie liczby całkowite od A do F w ten sposób
A+B-C=D-E=F
tak, że wszystkie równania są spełnione, tj. A + B - C
i D - E
i F
wszystkie mają tę samą liczbę.
Istnieje wiele możliwych sposobów, aby to zrobić, dopóki dopóty równania się sprawdzą, można zastosować dowolny zestaw dodatnich liczb całkowitych. Każda linia tutaj jest możliwym prawidłowym wyjściem do wprowadzenia +-=-=
:
2+3-4=6-5=1
1+1-1=2-1=1
4+2-4=4-2=2
100+1-10=182-91=91
89+231-77=1024-781=243
Zauważ, że wartość wyrażeń nie musi być dodatnią liczbą całkowitą, jak w przypadku wstawionych liczb. Na przykład, biorąc pod uwagę dane wejściowe, -=-
wyjścia 1-10=8-17
(evals do -9) i 10-1=17-8
(evals do 9) są jednakowo ważne. Oczywiście w przypadku niektórych danych wejściowych, takich jak =
wyrażenie ujemne, ponieważ 5=5
nie można wstawić tylko liczb dodatnich .
Zauważ też, że zero nie jest dodatnią liczbą całkowitą.
Najkrótszy kod w bajtach wygrywa.
Możesz wyprowadzać liczby jako listę zamiast wstawiać je bezpośrednio w ciągu. Jeśli wypiszesz ciąg znaków, mogą istnieć spacje oddzielające symbole i liczby. Tak więc dla danych wejściowych +-=-=
, wyjściowych
2, 3, 4, 6, 5, 1
lub
2 + 3 - 4 = 6 - 5 = 1
jest równoważne z wyjściem
2+3-4=6-5=1
Przypadki testowe
Input | One Possible Output
= | 1=1
== | 2=2=2
+= | 1+3=4
=+ | 2=1+1
-= | 30-10=20
=- | 1=2-1
=-= | 3=7-4=3
=+= | 2=1+1=2
=== | 100=100=100=100
+=- | 3+2=7-2
-=+ | 7-2=3+2
+=+ | 3+3=3+3
-=- | 1-10=8-17
--= | 60-1-1=58
++= | 60+1+1=62
-+= | 60-9+1=52
+-= | 60+9-1=68
+-=-= | 2+3-4=6-5=1
--=-- | 2-1-1=2-1-1
==-== | 47=47=50-3=47=47
=++=+-=-+=--= | 3=1+1+1=3+1-1=1-1+3=5-1-1=3
+--++-=-+-+- | 35+10-16-29+20+107-1000=5-4+3-2+1-876
====== | 8=8=8=8=8=8=8
źródło
Odpowiedzi:
Siatkówka , 58 bajtów
Wypróbuj online!
Alternatywne rozwiązanie przy tej samej liczbie bajtów:
Wypróbuj online!
Wyjaśnienie
Podstawowym założeniem jest, aby włączyć wszystkie
+
S i-
S na proste+1
i-1
operacji, a następnie poprzedzić wystarczająco dużą liczbę, która sprawia, że wszystkie prace równań. Aby dopasować równania, możemy po prostu przypisać tę samą liczbę każdemu z nich, a następnie zmniejszyć go o jeden dla każdego+1
i zwiększyć o jeden dla każdego-1
po nim. Ponieważ będziemy pracować z liczbami jednoargumentowymi, jedynym haczykiem jest to, że pierwsza liczba musi być wystarczająco duża, abyśmy mogli ją zmniejszyć odpowiednio 1 razy.Zaczynamy od wstawienia
1
po każdym-
lub+
.W
\B
gwarantuje, że te mecze są albo na początku wejścia lub między=
a+
lub-
, czyli wszystkie pozycje gdzie chcemy wstawić wiodącą liczbę wyrażenia.((\+1)|(-1))*
Część po prostu zlicza liczbę+1
S i-1
S w grupach2
i3
odpowiednio. Teraz podzielmy łańcuch podstawienia:Wielokrotnie zrzucaj
1_
z łańcucha, stosując wymagane anulowanie z+1
s.Na koniec zamień wszystkie ciągi
1
s ich długościami, aby przekonwertować z jedności na dziesiętne.źródło
Python 2 , 76 bajtów
Wypróbuj online!
źródło
eqtn_len + plus_signs + minus_signs - 2 * plus_signs = eqtn_len + minus_signs - plus_signs
. Następnie, ponieważ wszystkie inne liczby w porcji są jednymi, suma dla porcji działaeqtn_len + minus_signs - plus_signs - minus_signs + plus_signs = eqtn_len
. Długość równania musi być dodatnia, więc wszystko się ułoży.Python 2,
199179178172162158156152151 bajtówZbyt długo, ale rozwiązanie było łatwe do stworzenia.
Wypróbuj online
Spróbuje każdej możliwości, dopóki nie znajdzie rozwiązania. Program jest bardzo wolny. Wykonuje również zamianę łańcucha w każdej iteracji. Edycja „172” drastycznie spowolniła, ponieważ zamiast zaczynać od małego zakresu, zaczyna się od maksimum. Na przykład dane wejściowe
-=
lub=+
trzeba spróbować 2 ** 32 prób przed osiągnięciem rozwiązania.Aby przyspieszyć program, użyj wersji z 178 bajtami z historii edycji.
źródło
range
w Python2 nie tworzy od razu całego zakresu jako listy? IIRC można przyspieszyć, używającxrange
zamiast tego, ponieważ myślę, że jest to wersja leniwa ładująca (Python3 używa domyślnie lazyrange
)print range(1,65537)
i zakończył się w 0,034 s.l=...
, ale umieszczając to bezpośrednio wproduct(range(...),repeat=len(s)+1)
. Jeśli potrzebujesz nawiasów, zapisuje tylko jeden bajt (\ n)len(s)+1
, mógłbym użyć-~len(s)
zamiast tego, co nie wymagałoby parens.JavaScript (ES6),
9282 bajtyGrał w golfa 8 bajtów lewą z @xnor
Sztuczka polega na tym, aby wstawić
1
po każdym+
lub-
, a następnie wstawić do każdego wyrażenia liczbę, która sprawia, że wyrażenie jest równe długości danych wejściowych. W ten sposób możemy zagwarantować, że liczba będzie zawsze dodatnia; ponieważ=
w łańcuchu zawsze znajduje się co najmniej 1 , liczba+
s nigdy nie może osiągnąć długości łańcucha, więc reszta zawsze wynosi co najmniej1
. Możesz to sprawdzić, wpisując dowolną liczbę+
s we fragmencie powyżej.źródło
Python 2 ,
120119 bajtów-1 bajt dzięki mbomb007
Wypróbuj online! lub Zweryfikuj wszystkie przypadki testowe
Najpierw wstawiam
1
w każdej pozycji, aby sprawdzić najwyższą wartość, a następnie dodaj ją jako przesunięcie przy każdym równaniu. Działa to, ponieważ nie można dodawać liczb ujemnych, więc minimalny wynik jest podawany przez liczbę+
w równaniu, które mają tylko+
.źródło
GNU Prolog, 156 bajtów
Wyjaśnienie
Mamy kilka równań do rozwiązania, więc dlaczego nie skorzystać z rzeczywistego rozwiązania równań?
x
jest w zasadzie ewaluatorem równań dla równań formy+-+
; oprócz samego równania ma dwa dodatkowe argumenty (lista różnic,L,R
która zawiera wartości równania i wartośćV
, na którą równanie się ocenia). Jak zwykle w Prologu, może być stosowany dowolny odwrotnie (np można określićV
i uzyskaćL,R
, należy określićL,R
i uzyskaćV
, należy podać oba i sprawdzić, czy wartość jest poprawna, lub określić ani w tym przypadku odpowiednie ograniczenia zostaną umieszczone na obuV
iL,R
). „Bieżący element”L,R
jest nazwanyE
, a my również uwzględniamy to twierdzenieE
jest większa niż 0 (ponieważ pytanie wymaga użycia liczb dodatnich). Ta funkcja jest nieco bardziej szczegółowa, niż bym chciał, np.[E|R]
Musiałem dwukrotnie napisać wzór dopasowania / anulować dopasowanie, ponieważ listy są prawostronne, ale dodawanie i odejmowanie jest lewostronne. Niestety, do pracy musimy użyć rzeczywistej listy, zamiast wynaleźć własny typ listy lewostronnie skojarzonej z komórek przeciwfd_labeling
.q
jest podobnyx
, ale obejmuje również=
. Zasadniczo po prostu wywołujex
i sam się rekurencyjnie. Nawiasem mówiąc, jest to bardzo wyraźnie pokazuje, jak działają listy różnica, pokazując, że można łączyć dwie listy różnicyL,T
iT,R
na jednej liście różnicyL,R
. Podstawową ideą jest to, że lista różnic jest funkcją częściową, która przyjmuje argumentR
i zwraca wartość, doL
którejR
dołączona jest sama lista. Tak więc, identyfikując argument jednej listy różnic i wartość zwracaną innej, możemy skomponować funkcje, a tym samym połączyć listy.Wreszcie,
s
która jest funkcją, która faktycznie rozwiązuje zadanie w pytaniu, jest funkcją otoki, która wywołujeq
argumenty. Przekształcamy listę różnic w zwykłą listę, podając[]
jako jej argument i używamyfd_labeling
do znalezienia rozwiązania zbudowanego równania. (Domyślnie wydaje się, że lubi ustawiać wartości na 1, jeśli nie ma powodu, aby ustawiać je na coś innego. Jednak można to skonfigurować;value_method(random)
daje więcej „interesujących” rozwiązań niż umieszczanie wszędzie 1, na przykład, i wciąż jest bardzo szybkie. )Próbka wyjściowa
Z programem jak napisano:
Jeśli sprawię, że program trochę dłużej doda
value_method(random)
, a wynik będzie różny, ale wygląda mniej więcej tak:W obu przypadkach
?
koniec danych wyjściowych oznacza, że może istnieć więcej niż jedno rozwiązanie. (Oczywiście w tym przypadku wiemy, że istnieje o wiele więcej niż jedno rozwiązanie!)źródło
Mathematica, 116 bajtów
Czysta funkcja przyjmująca ciąg wejściowy i zwracająca listę liczb całkowitych dodatnich. Podstawowa strategia: zawsze dodajemy 1 i odejmujemy 1 oraz wybieramy liczby początkowe w każdym wyrażeniu, aby wszystko było równe.
c=Characters@StringSplit[#,"="]/."+"->-1/."-"->1
dzieliłby wejściowy ciąg znaków przy każdym znaku równości, a następnie zamieniałby każdy+
przez-1
i każdy-
przez1
. Jeśli jednak na początku lub na końcu jest znak równości, zostanie zignorowany. Dlatego sztucznie dodajemy nowy znak na każdym końcu ("0"<>#<>"0"
) i odsuwamy go po zakończeniu dzielenia łańcucha (/."0"->Nothing
).Suma każdej podlisty jest teraz równa liczbie całkowitej, którą możemy umieścić przed
+
s i-
s, aby każde wyrażenie było równe.1-Min[Tr/@c]
jest najmniejszą liczbą całkowitą, którą możemy dodać do każdej sumy, aby wszystkie były dodatnie. WięcPrepend[#^2,1-Min[Tr/@c]+Tr@#]&
bierze każdą podlistę (^2
odwraca wszystkie ich wpisy1
) i przenosi całkowitą przesunięcie o tę najmniejszą liczbę całkowitą kompensacji. Powstałe listy sąJoin
edytowane razem, aby uzyskać wynik.źródło
Ruby, 76
Wartość docelowa wyrażeń jest ustalona na
5**8
minus 1 z powodów golfowych! Pierwotnie używałems.size+1
minus 1.Niegolfowany w programie testowym
Wydajność
źródło
PHP,
207204197114 bajtówbezpośrednie podejście: znacznie krótsze i szybsze
Uruchom go
echo '<input>' | php -nR '<code>'
lub przetestuj online .awaria
!$c
jest prawdziwe w pierwszej iteracji, rzutowanej1
na indeksowanie ciągów;"="[1]
jest pusty.Następnie
$c
jest ustawiany i!$c
fałsz, rzucany na0
i"="[0]
jest pierwszą postacią.więc jesteśmy zdecydowanie bezpieczni z długością wejścia. Wszystkie warunki zostaną ocenione zgodnie z tym.
chunk_split($s,$n,$i)
wstawia$i
po każdym$n
znaku$s
- i na końcu.Aby zapobiec zamianie pustych terminów
1
, wymuszany jest błąd poprzez ustawienie długości porcji na0
.źródło
Röda ,
112110109 bajtówWypróbuj online!
Funkcja podziału nie działała tak, jak zamierzałem z tym programem. Na przykład
split("", sep="")
zwraca jeden pusty ciąg zamiast niczego. Jak to jest logiczne? Z tego powodu program jest prawie 20 bajtów większy niż mógłby być, gdyby semantyka podziału była idealna.Ideą tej odpowiedzi jest to, że wiemy, że długość łańcucha wejściowego musi być większa lub równa wartości równania, więc definiujemy wartość równania jako długość łańcucha. Dla każdej części równania uważamy, że każdy operator jest
+1
lub-1
odejmuje i dodaje je do wartości równania.Nie golfowany:
źródło