Czasami przydatne jest uruchomienie zadania matematycznego z wieloma danymi wejściowymi. Celem tego wyzwania jest stworzenie programu, który ułatwia to zadanie.
Wyrażenia generujące liczby
Musisz obsługiwać 3 typy wyrażeń:
- Generator pojedynczych liczb: bardzo prosty, tylko liczba dosłowna
- Generator wielu numerów: odrobinę bardziej skomplikowany. Te są otoczone nawiasami kwadratowymi (
[]
). Liczby są oddzielone przecinkami (,
) w wyrażeniu. Przykład[-1,2,3.26]
. - Generator zasięgu: ten jest otoczony nawiasami klamrowymi (
{}
). Będzie miał 3 liczby oddzielone przecinkiem. Format tego wyrażenia to{start,stop,step}
.start
istop
są włącznie.
Zasady oceny
- Musisz obsługiwać kolejność operacji. ( https://en.wikipedia.org/wiki/Order_of_operations#Definition )
- Nie musisz obsługiwać nawiasów.
- W wyrażeniu może wystąpić dowolna liczba spacji.
- Musisz obsługiwać liczby zmiennoprzecinkowe (bez względu na to, jaką precyzją domyślny jest Twój język).
- Podziel według
0
wyników wNaN
(nie liczba).
Twój program musi obsługiwać mnożenie ( *
), dzielenie ( /
), dodawanie ( +
) i odejmowanie ( -
).
Wynik
Każda linia wyjściowa jest jedną z kombinacji generatorów. Format to wyrażenie (z podstawionymi liczbami rzeczywistymi), po którym następuje znak równości ( =
) i wynik oceny. Wszystkie kombinacje generatorów muszą być przedstawione w danych wyjściowych.
Przykłady
( >>>
oznacza wejście)
>>>3 * [3,2]
3 * 3 = 9
3 * 2 = 6
>>>{1,2,3}
1 = 1 <-- this is because 1 + 3 > the end
>>>{0,2,1} + {0,1,1}
0 + 0 = 0
1 + 0 = 1
2 + 0 = 2
0 + 1 = 1
1 + 1 = 2
2 + 1 = 3
>>>6/[2,3]
6/2 = 3
6/3 = 2
>>>{1.5,2.5,0.5}
1.5 = 1.5
2 = 2
2.5 = 2.5
>>>3-{6,5,-1}
3-6 = -3
3-5 = -2
>>>5/{-1,1,1}
5/-1 = -5
5/0 = NaN
5/1 = 5
>>>4.4 / [1,2.2] + {0,2,1}
4.4 / 1 + 0 = 4.4
4.4 / 1 + 1 = 5.4
4.4 / 1 + 2 = 6.4
4.4 / 2.2 + 0 = 2
4.4 / 2.2 + 1 = 3
4.4 / 2.2 + 2 = 4
>>> [1,2] / 0 + 5
1 / 0 + 5 = NaN
2 / 0 + 5 = NaN
Program musi być krótki, aby móc go zapamiętać i używać w dowolnym miejscu.
Dzięki @PeterTaylor i @geokavel za pomoc w tym poście w piaskownicy
x/0
powoduje natychmiastową ocenę NaN, czy też muszę traktować NaN jako wartość?Odpowiedzi:
JavaScript (ES6),
213211 bajtówWyjaśnienie
Funkcja rekurencyjna, która wykonuje wyrażenie, jeśli nie zawiera generatorów wielu numerów lub zakresów lub jeśli zawiera jeden z tych generatorów, wywołuje się z generatorem zamienionym na każdą wygenerowaną przez niego liczbę.
Dzielenie przez
0
w JavaScript tworzyInfinity
, więcInfinity
można go po prostu zastąpićNaN
.Dzięki tej metodzie generatory wieloparametrowe są analizowane od tyłu do przodu zamiast od przodu do tyłu, jak w przypadkach testowych. Oznacza to po prostu, że kolejność wyrażeń wyjściowych jest czasem inna.
Test
Test nie używa przypisań destrukcyjnych dla kompatybilności przeglądarki.
źródło
Haskell,
474362 bajtówFunkcja f pobiera ciąg wejściowy i wypisuje wyniki
testy:
wynik:
źródło
Python 3, 387 bajtów
Możesz to przetestować za pomocą następującego kodu:
Oto kod bez golfa:
Działa poprzez znalezienie pierwszego zestawu nawiasów dowolnego typu, a następnie przejście przez wszystkie wartości w nim zawarte, poprzez zastąpienie nawiasów i ich zawartości wartością i uruchomienie metody rekurencyjnie. Używa,
eval
gdy w wierszu nie ma nawiasów. Zwraca,NaN
jeśli jest uruchomiony wyjątekeval
.źródło
e[:]=s[:]
? Czy niee[:]=s
zrobiłby tego samego?Java, 874 bajty
Szczegółowe spróbuj tutaj
źródło
Dyalog APL , 164 bajtyTa odpowiedź nie jest zgodna ze zaktualizowanymi wymogami i dlatego nie jest konkurencyjna:
Używa wyrażeń regularnych, aby zmienić dane wyrażenie na odpowiednią APL (i wszystkie operatory zostały zmodyfikowane w celu zaimplementowania
NaN
) i wyodrębnić operatory. Zastępuje wszystkie operatory catenacją i wykonuje wyrażenie, aby uzyskać końcowe liczby wejściowe. Następnie łączy to wszystko razem, aby uzyskać ostateczny wynik.Zachowuje kolejność oceny APL (ściśle od prawej do lewej).
Obsługuje poprawnie nawiasy.
Przypadki testowe (z dodanymi nawiasami, aby wymusić matematyczną kolejność wykonywania):
źródło