Przegląd
Biorąc pod uwagę listę cyfr, znajdź najmniej operacji, aby uzyskać 100
Wejście
Ciąg cyfr, który może, ale nie musi, być w kolejności numerycznej. Kolejności cyfr nie można zmienić, jednak można dodać między nimi operatory plus (+) lub minus (-), aby całkowita suma była równa 100.
Wynik
Liczba dodanych operatorów, po których następuje pełna sekwencja cyfr i operatorów. Obie mogą być oddzielone spacją, tabulatorem lub nową sekwencją linii.
Przykłady
ważny
Wejście: 123456789
Wyjście:3 123–45–67+89
Nieprawidłowe dane
wejściowe: Dane 123456789
wyjściowe:
6
1+2+34-5+67-8+9
(Istnieją sposoby na rozwiązanie tego przy mniejszej liczbie operacji)
code-golf
integer
integer-partitions
expression-building
CyberJacob
źródło
źródło
+
i-
? Czy możemy założyć, że zawsze będziemy w stanie dokonać100
na podstawie danych wejściowych?299399
byłyby-299+399
prawidłowe?Odpowiedzi:
JavaScript (ES6),
153176 bajtówEDYCJA: W trybie nie ścisłym JS interpretuje wyrażenia liczbowe z prefiksem 0 jako liczby ósemkowe (np.
017
Jest analizowany jako 15 w systemie dziesiętnym). To jest stała wersja, która obsługuje wiodące zera.źródło
2-017-2+117
. Ale017
jest notacją ósemkową w JS, która daje 15 w systemie dziesiętnym. Więc mój obecny kod znajduje tylko2-0-17-2+117
. Spróbuję rozwiązać ten problem później dzisiaj.3**(l=s.length,l-1)
=>3**~-(l=s.length)
MATL ,
3736 bajtówPrzypadek testowy zajmuje około 6 sekund w TIO.
Wypróbuj online!
Jak to działa
źródło
299399
nie ma rozwiązania i dlatego nie jest poprawnym wejściem (operatorzy zostali wymienieni, aby „przechodzić” między cyframi, wejście to wymagałoby,-299+399
gdy-
nie ma między cyframi).-299+399
i w takim przypadku potrzebuję niewielkiej zmiany w kodzie . Poprosiłem OP o wyjaśnienia123456789
powinien mieć liczbę operatorów4
nie3
.299399
jest nieprawidłowym wejściem, ponieważ, jak wyjaśnił PO, każde wejście powinno mieć co najmniej jedno rozwiązanie[Python 2],
164158 bajtówWypróbuj online!
Weź N jako ciąg cyfr; zwraca krotkę (numOps, expressionString).
Zasadniczo takie samo podejście jak inne; używa itertools.product do konstruowania pojedynczych „przypadków”, np. dla N == „1322”, „przypadek” byłby
('-','','+')
i oceniałby „1-32 + 2”.Zgłasza błąd ValueError, jeśli dane wejściowe są nieprawidłowe (ale myślę, że OP nie ma nieprawidłowych danych wejściowych).
źródło
PHP,
166171 bajtówUruchom jako potok
-nR
lub przetestuj go online .używa sformatowanych liczb do sortowania wyników ->
może wydrukować początkowe spacje (i może się nie powieść przy wprowadzaniu więcej niż 99 cyfr; zwiększyć liczbę w
%2d
celu naprawy).nie więcej niż 10 cyfr, 161 bajtów
awaria
źródło
Galaretka , 32 bajty
Pełny program wyświetlający za pomocą operatorów Jelly (
_
zamiast-
).Uwaga: Aby wyświetlić
-
na wyjściu zamiast_
(nie jest to wymóg), dodaj⁾_-y
pomiędzyF
iṄ
(⁾_-
jest literą pary znaków['_','-']
iy
jest dyadycznym atomem „translate”).W jaki sposób?
Wypróbuj online!
źródło
Mathematica, 136
146149156165166bajtyZwraca
{3, 123-45-67+89}
na przykład.Wykonanie przypadku testowego zajmuje około 0,09 sekundy.
źródło
Python 2 ,
256230208205172171170165 bajtów, metoda iteracyjnalen(a)
przezw
z-=1;d=z
przezd=z=z-1
Wypróbuj online!
Małe wyjaśnienie Korzystając z reprezentacji w bazie 3, kod przeplata cyfry z operatorami {'+', '-', konkatenacja} zgodnie ze wszystkimi możliwymi kombinacjami.
Python 2 , 167 bajtów, metoda rekurencyjna
Wypróbuj online!
Niektóre wyjścia
źródło
list(input())
justinput()
, ponieważ ciąg jest już iterowalny, aby zapisać 6 bajtów; wymienićb.count('+')+b.count('-')
zlen(b)-len(a)
zaoszczędzić 12 bajtów; i wymienićchr(r+43)
zchr(r+43)*(d>0!=r-1)
czym można usunąć linięb=b[:-1].replace(',','')
, aby zapisać netto 15 bajty ((d>0!=r-1)
odpowiada(d>0 and 0!=r-1)
).Brachylog , 36 bajtów
Wypróbuj online!
Ponad połowa z nich ma jednak na celu uzyskanie właściwego formatu wyjściowego. Rzeczywista podstawowa logika to tylko:
15 bajtów
Wypróbuj online!
Zwraca listę taką jak [123, –45, –67,89]. Wyrażenie jest sumą elementów, a liczba operatorów jest o 1 mniejsza niż długość listy.
~cLhℕ∧100~+L
prawie działa na 12 bajtów ( Wypróbuj online! ) - ale jest zbyt wolny, aby obsłużyć pełne 9-cyfrowe wejście w TIO, a co ważniejsze, nie udaje się na wejściach takich jak10808
- Brachylog jest zbyt inteligentny, aby rozdzielać liczby, aby miały początkowe zera, więc nie robi tego zobacz partycję [108, -08].źródło
Haskell ,
180178 bajtówWypróbuj online! Zastosowanie:
g "123456789"
plony(3,"123-45-67+89")
.#
buduje listę wszystkich możliwych terminów,?
ocenia je ig
filtruje te, które oceniają na 100, i zwraca ten z minimalną liczbą operandów.źródło
Galaretka , 27 bajtów
Wypróbuj online!
Nie mogę powiedzieć, że nie skorzystałem z kilku wskazówek ze starszej odpowiedzi Jonathana Allana. ;-)
W porównaniu do jego odpowiedzi, ten jest tylko dwa bajty krótszy (30), a nie pięć, jeśli sprawimy, że porównanie będzie uczciwe z powodu aktualizacji językowych:
Jeśli porównamy w drugą stronę (nowsza wersja zamiast starszej), różnica jest taka sama (jego staje się 29 bajtów, jak pokazano poniżej):
źródło