Powiedz, że mam wyrażenie:
9 * 8 + 1 - 4
To wyrażenie można interpretować na sześć różnych sposobów, w zależności od pierwszeństwa operatora:
(((9 * 8) + 1) - 4) = 69 (* + -)
((9 * 8) + (1 - 4)) = 69 (* - +)
((9 * (8 + 1)) - 4) = 77 (+ * -)
(9 * ((8 + 1) - 4)) = 45 (+ - *)
((9 * 8) + (1 - 4)) = 69 (- * +)
(9 * (8 + (1 - 4))) = 45 (- + *)
Powiedzmy, że jestem programistą i nie chcę zapamiętywać tabel pierwszeństwa itp., Więc po prostu zgadnę.
W tym przypadku największy margines błędu wyniósłby 45-77, co stanowi różnicę 32. Oznacza to, że moje przypuszczenie będzie wyłączone tylko o 32.
Wyzwanie
Biorąc pod uwagę ekspresję składają się z liczb i +
, -
, *
, /
(podział całkowitej), a %
wyjście układu bezwzględna różnicy największej i najmniejszej możliwej wartości dla tego słowa, na podstawie pierwszeństwa operatorów.
Dane techniczne
- Wyrażenie wejściowe nie będzie zawierało nawiasów, a każdy operator jest lewostronny.
- Wyrażenie wejściowe będzie zawierać tylko nieujemne liczby całkowite. Jednak podwyrażenia mogą dawać w wyniku negatywy (np
1 - 4
.). - Możesz przyjąć wyrażenie w dowolnym rozsądnym formacie. Na przykład:
"9 * 8 + 1 - 4"
"9*8+1-4"
[9, "*", 8, "+", 1, "-", 4]
[9, 8, 1, 4], ["*", "+", "-"]
- Dane wejściowe będą zawierać co najmniej 1, a maksymalnie 10 operatorów.
- Każde wyrażenie zawierające dzielenie lub modulo przez 0 należy zignorować.
- Możesz założyć, że modulo nie otrzyma ujemnych argumentów.
Przypadki testowe
9 * 8 + 1 - 4 32
1 + 3 * 4 3
1 + 1 0
8 - 6 + 1 * 0 8
60 / 8 % 8 * 6 % 4 * 5 63
code-golf
number
arithmetic
expression-building
Esolanging Fruit
źródło
źródło
%
w drugim przykładzie traktujesz dwa różne priorytety.%
operator działa na liczbach ujemnych? Sposób jak C lub Python czy coś innego?Odpowiedzi:
Python 2 ,
171156 bajtówWypróbuj online!
Jak to działa
Otaczamy każdego operatora inną liczbą skierowanych na zewnątrz par nawiasów, aby symulować różne priorytety (na wszystkie możliwe sposoby), i zawijamy wystarczającą liczbę skierowanych do wewnątrz par nawiasów wokół całego łańcucha, aby uzyskać wyrażenie, które możemy
eval
. Na przykład za pomocą+
↦)+(
*
↦))*((
-
↦)))-(((
dostajemy
9 * 8 + 1 - 4
↦(((9 ))*(( 8 )+( 1 )))-((( 4)))
=77
.źródło
or
zewnątrz,sum
aby usunąć warstwę nawiasów kwadratowych:sum([...],[])or[eval(a)]
zamiastsum([...]or[[eval(a)]],[])
sum
może być pusty bez argumentu pustego - jednak tak naprawdę jest dobrze, ponieważeval
w tym przypadku musi się nie powieść. Dzięki.Galaretka , 126 bajtów
„Priorytet operatora? Nawiasy? Pah, kto tego potrzebuje?” - wyzwania związane z użyciem Galaretki jako wyzwania pierwszeństwa operatora.
Wypróbuj online!
Dane wejściowe są traktowane jako ciąg, np. „1 + 2_3 × 4: 5% 6”. Uwaga mnożenie używa „×” zamiast „*”, dzielenie używa „:” zamiast „/”, a odejmowanie używa „_” zamiast „-”.
Jak to działa Program jest podzielony na trzy części: generowanie wszystkich wyrażeń o innym priorytecie operatora, ich ocena i zwracanie różnicy między maksimum a minimum.
Wszystkie wyrażenia są generowane za pomocą kodu:
Łącza są oceniane za pomocą tego (prawdopodobnie mógłbym ulepszyć z inną strukturą):
Różnica między maksimum a minimum jest obliczana za pomocą kodu w linku (5):
źródło
Python 2 ,
235234233226 bajtów-1 bajt (i poprawka) dzięki Andersowi Kaseorgowi !
-7 bajtów dzięki Step Hen !
Wypróbuj online!
źródło
a
być krotką zamiast listy, a nawet zapisać 1 bajt, robiąc to (a=()
,a+=eval(*l),
).Haskell 582 bajtów
Nie poszło tak dobrze, jak miałem nadzieję, że ...
Wypróbuj online!
Próba grania w długi program sprawia, że piszę zły kod :(
Próbowałem użyć algorytmu Andersa w Haskell, ale wymknęło mi się to spod kontroli
Funkcja e jest jak szczególny przypadek eval. (#) pobiera listę ciągów znaków reprezentujących liczby całkowite i ciąg operatorów i zwraca różnicę między maksymalną i minimalną możliwą wartością. na przykład
źródło
#
na##
, możesz zmienić nazwęe
na(#)
:(n#s)(x:a)=...
r=read;j=zipWith;o=map
a następnie zamień te funkcje na aliasy literowe.Pyth, 45 bajtów
Jestem pewien, że można zrobić o wiele więcej optymalizacji, ale do tej pory mi się podobało.
Zajmuje wejście tak:
[9, 8, 1, 4], ["*", "+", "-"]
.Wypróbuj online!
źródło
Mathematica,
186164159 bajtów\[Function]
zajmuje 3 bajty.Niektóre alternatywy (zachowuje tę samą liczbę bajtów)
#2-#&@MinMax[...]
zamienićMax@#-Min@#&[...]
Head@#2
zamienić#2[[0]]
Wypróbuj online na stronie http://sandbox.open.wolframcloud.com : wpisz
( .... )[{60, "/", 8, "%", 8, "*", 6, "%", 4, "*", 5}]
z....
zastąpionym kodem powyżej dla przypadku testowego60 / 8 % 8 * 6 % 4 * 5
. Naciśnij,Shift + enter
aby ocenić.źródło
JavaScript, 280 bajtów
Uwaga : Dzielenie liczb całkowitych zaokrągla się przy użyciu funkcji floor, co oznacza, że liczby ujemne zaokrąglają się od zera.
To rozwiązanie opiera się na tej odpowiedzi .
Przykładowy fragment kodu:
źródło
a/b|0
zatrzymuje sprawdzanie błędów podziału / modulo 0, aleMath.floor(a/b)
zadziałałoHaskell , 254 bajty
Wypróbuj online!
Dane wejściowe to cały ciąg znaków, na przykład 4 + 5 * 2. Generuje wszystkie permutacje operacji, a dla każdej permutacji rozdziela rekurencyjnie ciąg. Filtruje podziały według 0 za pomocą monady listy.
źródło
(%)
jest operatorem modułu. Jest to pozostałość operacji dzielenia między lewym i prawym argumentem.Python 2 ,
262256254 bajtówWypróbuj online!
źródło
in [
nain[
(miejsce nie jest potrzebne)PHP , 316 bajtów
Wypróbuj online!
źródło
Python 3 , 284 bajtów
Edycja: wydaje się, że coś jest nie tak z oceną ostatniego przykładu. Zajmę się tym jutro.
Kolejna odpowiedź w języku Python. Nie mogłem prześcignąć wszystkich innych, ale spędziłem na tym zbyt długo, aby tego nie postawić.
Wypróbuj online!
źródło
while(p)
może zostaćwhile p
zapisany na jeden bajt.Clojure (+ kombinatoryka),
342377 + 41 = 418 bajtów+35 bajtów z powodu błędu.
Wypróbuj online!
Aby ta funkcja działa, trzeba
use
zclojure.math.combinatorics
biblioteki (41 bajtów):Niuanse:
Ta funkcja jest funkcją anonimową, co oznacza, że musisz to zrobić, aby z niej skorzystać:
Używam tego słowa
quot
zamiast/
(ponieważ Clojure domyślnie dokonuje podziału ułamkowego) imod
zamiast%
.Nieogrodzony program:
źródło
use
stwierdzenia.The characters used to import the library will likely be counted
codegolf.meta.stackexchange.com/questions/10225/…require
należy uwzględnić kod, a jego długość należy dodać do liczby bajtów.JavaScript (ES6), 210 bajtów
Wprowadź jako tablicę liczb i operatorów
Mniej golfa
Test
źródło