tło
Zostałeś niedawno zatrudniony przez małą firmę księgową. Świat rachunkowości jest dla Ciebie nieco obcy, więc nie masz pewności, czy przestrzegasz wszystkich profesjonalnych wskazówek. W szczególności nie wiesz, kiedy powinieneś zaokrąglić wszystkie te liczby i w jakim kierunku, więc przez większość czasu po prostu je przeskakujesz i masz nadzieję na najlepsze.
Wejście
Twój wkład jest pojedynczym ciągiem, który reprezentuje proste obliczenie. Zawiera pewną liczbę nieujemnych liczb całkowitych rozdzielonych znakami +-*/
. Ciąg jest odczytywany od lewej do prawej, a normalne reguły pierwszeństwa są ignorowane, co "23+1*3/4"
oznacza „zacznij od 23, dodaj 1, pomnóż przez 3 i podziel przez 4”, co daje wynik 18. Wartość wejściowa nie będzie zawierać liczb rozpoczynających się od 0
(oprócz 0
siebie), ani dzielenie przez zero.
Wynik
Na każdym etapie obliczeń można zaokrąglić wynik w górę lub w dół do najbliższej liczby całkowitej lub zachować go bez zmian. Na koniec zaokrąglasz w górę lub w dół, aby uzyskać wynik w postaci liczby całkowitej. Twoje dane wyjściowe to lista liczb całkowitych, które mogą wynikać z takiego obliczenia, posortowane i bez duplikatów.
Zasady
Możesz napisać pełny program lub funkcję. Wygrywa najniższa liczba bajtów, a standardowe luki są niedozwolone.
Przypadki testowe
"42" -> [42]
"2+0+4-0" -> [6]
"23+1*3/4" -> [18]
"5/2" -> [2,3]
"5/2+7/3*6-1" -> [17,18,19,23]
"23/2/2*30-170/3" -> [-7,-6,-2,-1,0,1,3,4]
"1/3*2*2*2*2*2*2" -> [0,16,20,21,22,24,32,64]
"1/3*9" -> [0,3,9]
1/3*9
, który może się nie powieść, jeśli użyjesz liczb zmiennoprzecinkowych.Odpowiedzi:
J, 84 bajtów
Zaczynając od listy 1-elementowej, funkcja zachowuje wszystkie możliwe liczby pośrednie na liście, sprawdzając następne wyrażenie i dodając je w górę iw dół zaokrąglonych kopii.
Czy golf będzie dalej i jutro doda wyjaśnienie.Nie mogę znaleźć bardziej oczywistych sposobów na grę w golfa.Przechodzi wszystkie testy.
Stosowanie:
Wypróbuj tutaj.
źródło
x
na końcu listy.Python 2, 220 znaków
Prowadzi listę wszystkich możliwych liczb i na każdym kroku generuje trzy liczby dla każdej liczby na liście, nawet jeśli są duplikaty. Zatem złożoność w czasie wykonywania jest wykładnicza. Działa to jednak natychmiast dla tych małych przykładów. Duplikaty są usuwane na końcu.
Wykorzystuje
fractions.Fraction
się do dokładnego dzielenia, unikając niedokładności zmiennoprzecinkowych.Dodaj 5 znaków (
r=map(X,g)
->r=set(map(X,g))
), aby znacznie zwiększyć wydajność.źródło
\D
jest predefiniowaną klasą postaci do dopasowywania znaków innych niż cyfryr"(\D)"
albo"(\\D)"
. Ponadto, jeśli używasz Python 3, możesz zamienić indeksowanie naF
przypisanie oznaczone gwiazdką, np .:A,B,*F=F
użyj,A
aB
zamiastF[0]
iF[1]
, i pozbądź sięF=F[2:]
."\D"
i tak działa i jest krótszy. To nie jest poprawna sekwencja ucieczki, więc Python zawiera po prostu\
iD
dosłownie. Dobra wskazówka dla Python3, sprawdzę to, choć będę musiał zastąpić backticksrepr()
i przekształcićmap
wynik w listę. Zadanie oznaczone gwiazdką to coś, co chciałbym, aby Python 2 miał ...Python,
421370354 bajtówPrzepraszam, proszę o wyrozumiałość. Jestem naprawdę nowy w Pythonie (szukałem tylko języka obsługującego Fractiosn) i wykorzystałem wszystkie nieliczne sztuczki, które znałem do skracania kodu, ale wciąż jest to potwór, biorąc pod uwagę, że istnieje rozwiązanie python prawie o połowę mniejsze. Wiele się nauczyłem i myślałem, że mimo to go prześlę =)
Nowa wersja dzięki @ kirbyfan64sos i @Zgarb
Stara wersja
źródło
if
s (d={'+': operator.add, '-': operator.sub, ...}; d[op](a, b)
). Ponadto,[floor(k) for k in n]
można skrócić domap(floor, n)
, an.add
połączenia mogą staćn.extend([floor(f), ceil(f), f])
.F
tylko raz, więc możesz zrobićfrom fractions import*
i zapisać niektóre bajty. To samo zmath
. Usuń spacje wokół=
, są niepotrzebne. Ponadto należy przypisać dane wejściowes
zamiast kodowania na stałe.s=input()
zamiasts = "1/3*9"
, usuń swoje komentarze itp.Mathematica, 134
źródło
MATLAB, 283 znaków
Nie golfowany:
Pisząc to, zdałem sobie sprawę, że istnieje jeszcze krótszy sposób na zrobienie tego, co dodam, gdy skończę pisać.
źródło
VBA, 347 bajtów
źródło