Zadanie jest więc proste, biorąc pod uwagę tablicę liczb i wyników, musisz znaleźć operacje, których należy użyć na liczbach z tablicy, aby uzyskać żądany wynik.
Uprośćmy to na początek i zezwalajmy tylko na podstawowe operacje, takie jak: dodawanie, odejmowanie, mnożenie i dzielenie.
Przykład:
Input : [5,5,5,5,5] 100
Output : 5*5*5-5*5
Aby dać przewagę takim językom jak Java, żądanie polega na implementacji funkcji, a nie całego programu, a wynik może zostać zwrócony poprzez parametr lub wydruk na konsolę.
Kod jest oceniany na podstawie ilości bajtów, a ponieważ jest wyzwaniem dla kodu golfowego, wygrywa najniższy wynik.
Kolejnym wymaganiem jest to, że można uzyskać dodatkowe -10 punktów, jeśli tablica zawiera tylko cyfry, obsługuje rozwiązania, w których można konstruować liczby na podstawie kolejnych cyfr. To znaczy
Input : [1,2,3,4,5] 0
Output : 12-3-4-5
Należy pamiętać, że pod warunkiem, że wyniki są proponowanymi wynikami, niektóre przypadki mogą mieć więcej niż jedno rozwiązanie. Od Ciebie zależy, czy dostarczysz jedno lub więcej rozwiązań dla danego zadania.
EDYCJA: Wynik musi być poprawny z matematycznego punktu widzenia, stąd podział jest podziałem racjonalnym, a nie liczbą całkowitą, a pierwszeństwo operacji jest takie samo jak w matematyce klasycznej (najpierw mnożenie i dzielenie, a następnie dodawanie i odejmowanie).
źródło
*
i/
ma pierwszeństwo przed+
i-
? Dwa przykłady są ze sobą sprzeczne.Odpowiedzi:
Pyth, 23 bajty
Ze względów bezpieczeństwa
*
i/
nie będą oceniać online, ale teoretycznie działają.Zestaw testowy z tylko
+
i-
.źródło
Oracle SQL 11.2,
322304270 bajtów: 1 to lista cyfr
: 2 to szukany wynik
Bez golfa:
źródło
TSQL (sqlserver 2016)
310294280 bajtówCóż za wspaniała okazja do napisania brzydkiego kodu:
Gra w golfa:
Wypróbuj online
Czytelny: (wstawienie przecinka dziesiętnego (.) I usunięcie go jest konieczne, aby SQL mógł zaakceptować, że 4/5 nie jest równe 0 - usunięcie studni jest dla osób testujących)
To rozwiązanie może również obsługiwać następujące typy danych wejściowych:
źródło
JavaScript (ES6),
165147 bajtówZagnieżdżone
eval
... cudownie.źródło
Python 3,
170155 bajtówUtwórz generator ze wszystkimi możliwymi zamówieniami operatorów, połącz to z liczbami, a następnie ewaluuj, aż otrzymamy odpowiedź.
https://repl.it/C2F5
źródło
['+','-','*','/']
z'+-*/'
; ponieważstring
s są iterowalne, potraktuje to tak, jakbyarray
każdy element był każdą postacią wstring
- więc będzie działał tak, jakbyś dostarczył go z tablicą, którą aktualnie masz.Python,
195186 bajtówOto okropny sposób na zrobienie tego.
Funkcja
x
przyjmuje na przykład argumentlist
ai aresult
-x([1,2,3,4,5], 15)
.Program rozpoczyna pętlę, w której zaczynamy losowo wybierać, czy należy dołączyć
"+", "-", "*", or "/"
między każdą liczbą, czy też połączyć je razem. Wydawało się to bardziej zwięzłą opcją niż faktyczne przechodzenie przez permutacje i wypróbowywanie każdej kombinacji w celu znalezienia każdego wyniku, i chociaż trwa dłużej i jest znacznie mniej wydajne. (Na szczęście nie jest to problemem w tym kontekście!)Dołącza także „.” do każdej liczby, aby uniknąć wykonywania operacji zaokrąglonych do liczb całkowitych, takich jak
6/4 = 1
. Następnieeval
jest naszym wyrażeniem i określa, czy wynik jest równy oczekiwanemu, a jeśli tak, generuje wyrażenie.Ten program nigdy nie wychodzi - będzie nieprzerwanie wyświetlał wyniki aż do zabicia.
EDYCJA 1 : Usuń niepotrzebne znaki nowej linii, w których
if
można użyć instrukcji jednowierszowych.źródło
Matlab, 234
238258bajtyZakładam, w oparciu o ograniczenia innych odpowiedzi, że porządek liczb w tablicy wejściowej jest utrzymywany przez fiat.
Ten kod pobiera ciąg liczb
x
, powiedzmyx = '12345'
, a wynikr
, powiedzmyr = 15
i powroty wszystkich ciągów wyrażeń można ocenić uzyskaćr
zx
pomocą czterech operatorów.Użyłem dwóch różnych równoważnych długości sposobów unikania używania wyrażeń
ones(length())
-type lubrepmat(length())
-type:~~p(1,:)
które zwracają wartości nie-nie wp
(tj. Listę1
s długości dla pierwszego wymiarup
) i0|p(:,1)
która zwraca 0 lub jest tam -a-wartość-wp
(tj. lista1
s tej samej długości co drugi wymiarp
).Matlab nie ma metody
nchoosek
zastępczej , więc zduplikowałem operatory poprawną liczbę razy, obliczyłem całą przestrzeńnchoosek
dla tego większego wyboru operatorów, a następnie użyłemunique
wywołania, aby zmniejszyć wynik do tego, co powinno być (usuwanie równoważnych kombinacji, takich jak „*** +” i „*** +”). Dodaję spację końcową, aby dopasować długość wektora wejściowego do celów konkatenacji, a następnie układam ciągi operatora z ciągami wejściowymi w kolumnach macierzy. Następnie oceniam wyrażenia według kolumn, aby uzyskać wyniki i znaleźć kolejność operatorów, która odpowiada tym kolumnom, z wynikami zgodnymi z naszymi danymi wejściowymir
.Test:
x = '12345'
,r = 15
:Gdybym musiał wziąć tablicę wartości podwójnej precyzji, musiałbym
x = num2str(x,'%d');
przekonwertować cyfry na ciąg, dodając 21 (20 bez tego;
) do mojego wyniku. * Dodatkowymi bajtami były średniki, które pozostawiłem w czystej postaci, aby każdy, kto uruchomił ten kod, nie zobaczył, że jego wiersz polecenia wysadza długie tablice. Ponieważ moja edycja generuje teraz ogromną stertę ostrzeżeń o logice i operandzie na dwukropku, usunąłem średniki w nowej wersji.Edit 2: Zapomniałem wymienić
2*n+2
zk
.Stara odpowiedź:
źródło
JavaScript (ES6), 88 bajtów
Wrzucił trochę losowości do miksu. Znacznie łatwiejsze niż systematyczne powtarzanie kombinacji.
Pakiet testowy
źródło
PHP, 108 bajtów
pobiera dane wejściowe z argumentów wiersza poleceń w odwrotnej kolejności. Biegnij z
-r
.awaria
źródło
Perl 5 z
-pa
, 46 bajtówWypróbuj online!
źródło