Wyobraź sobie, że mam nieskończoną liczbę problemów domowych (!), Z których każdy ma liczbę całkowitą.
Matematyka Notacja problemu to notacja opisująca podzbiory problemu za pomocą specyfikatorów problemu.
Wyrażenie MPN może składać się z kilku rzeczy:
- Jedna wartość. Stanowi zbiór zawierający numer:
99 -> {99}
. - Prosty zakres. Stanowi zbiór zawierający wszystkie numery od początku do końca zakresu:
10~13 -> {10, 11, 12, 13}
. Jeżeli lewa lub prawa strona brakuje, to są one traktowane jako -Infinity lub Nieskończoność odpowiednio:~10 -> {x|x ≤ 10}
;~ -> ℤ
. - Wyrażenie MPN, po którym następuje „pomiń” i inne wyrażenie MPN. Stanowi różnicę dwóch zestawach:
10~20 skip 12~14 -> {10, 11, 15, 16, 17, 18, 19, 20}
. - Dwa wyrażenia MPN, oddzielone przecinkiem. Stanowi to związek dwóch zestawach:
1,8~9,15~17 -> {1,8,9,15,16,17}
.
Operator „pomiń” wiąże się mocniej niż operator przecinka, więc 16,110~112 skip 16 -> {16,110,111,112}
(16 nie jest zawarte w zestawie {110,111,112}
, więc wykluczenie 16 nie ma znaczenia).
Możesz także umieścić wyrażenia w nawiasach, aby uzyskać jednoznaczność:
1~9 skip (2~8 skip (3~7 skip (4~6 skip 5))) -> {1,3,5,7,9}
Oto gramatyka:
<expr> ::= "(" <expr> ")"
|| <number>
|| [<number>] "~" [<number>]
|| <expr> "skip" <expr>
|| <expr> "," <expr>
Twoim zadaniem jest napisanie programu, który przyjmuje dwa dane wejściowe:
- Wyrażenie MPN
- Numer
i generuje pewną wartość prawdy lub falseya w zależności od tego, czy problem występuje w zestawie opisanym przez wyrażenie MPN.
Dane techniczne
- Możesz założyć, że pierwsze wejście jest poprawnie sformułowanym wyrażeniem MPN (tzn. Że pasuje do powyższej gramatyki)
- Liczby w wyrażeniu MPN są zawsze liczbami całkowitymi. Mogą być ujemne lub zerowe, ale nigdy nie będą miały części ułamkowej.
- To jest golf golfowy , więc wygrywa najkrótsze prawidłowe zgłoszenie (mierzone w bajtach).
- Możesz użyć różnych znaków dla
~
i,
, jeśli chcesz.
Przypadki testowe
10~20 14 -> True
10~20 20 -> True
10~20 skip 14~18 17 -> False
~ skip 6 8 -> True
16,17 skip 16 16 -> True
(16,17) skip 16 16 -> False
~10,5~ 8 -> True
~10,5~ 4 -> True
6 skip 6,~ 6 -> True
źródło
~
and,
but not forskip
.6 skip 6,~
który, jak sądzę , poprawnie zinterpretowałem. Pozostałe 2 odpowiedzi do tej pory nie spełniają tego (ponownie, zakładając, że interpretuję poprawnie). Jeśli źle zrozumiałem, proszę to poprawić i wyjaśnić, ale z mojego zrozumienia, powinien on pasować do wszystkiego (jest to połączenie zbioru, które nie pasuje do niczego z zestawem, który pasuje do wszystkiego). Są to przypadki, o których mówiłem wcześniej, które moim zdaniem mogą bardzo pomóc w testowaniu naszych rozwiązań.Odpowiedzi:
PowerShell ,
189195 bajtów-100..100
wartościami asWyjaśnienie
Wcześnie zdałem sobie sprawę, że nieskończoności sprawiają, że jest to niemożliwe do generowania tablic i testowania wartości.
Patrzyłem na zakresy, ale w .Net nie mają wymaganego zakresu ( długość zakresu jest ograniczona do liczby całkowitej ze znakiem (32-bitowym), więc nawet jeśli można ograniczyć zakres do 32-bitowej liczby całkowitej ze znakiem , Nie byłbym w stanie obsłużyć wszystkich zakresów.
Zacząłem więc myśleć o tym w kategoriach początków i końców, a ostatecznie serię testów boolowskich i zacząłem tworzyć kilka wyrażeń regularnych, aby przekształcić MPN w wyrażenie boolowskie, które rozumie PowerShell.
Zasadniczo podzieliłem to na kilka zasad:
2~8
jak powiedzenien >=2 && n <=8
, ale gdy brakuje jednego z końców, pomiń&&
stronę brakującą. Kiedy brakuje obu, pierwotnie zamierzałem po prostu go zastąpić$true
. Skończyło się na tym, że tak naprawdę wcale nie testowałem brakujących stron, ale upewniłem się, że zapakowałem każdą liczbę()
.()
wartością wejściową. Tak więc, w przypadku numeru MPN, na przykład~8
o wartości wejściowej55
, pierwsza zamiana wygeneruje(55-ge()-and55-le(8))
, a następnie pojawi się druga zamiana, aby ją zrobić(55-ge55-and55-le(8))
, zasadniczo unieważniając tę część zakresu.,
listach oddzielonych przecinkami oraz pojedyncze liczby przed lub poskip
, więc użyłem niefortunnych długich spojrzeń.skip
jest w zasadzie taki sam, jak-and -not
ja, więc dokonuję prostej zamianyskip
na-and!
(używając!
jako skrót-not
).-or
ale nie uwzględniało to kolejnych wyrażeń, więc16,17 skip 16
generowałem podobny kod($n-eq16)-or($n-eq17) -and! ($n-eq16)
. Potrzebował nawiasów, ale wydawało się to niewykonalne przy prostym zastąpieniu. Ponieważ wszystkie inne rzeczy zostały zastąpione oprócz przecinków i mają one najniższy priorytet, po prostu podzieliłem cały wygenerowany ciąg na pozostałe przecinki, następnie zawinąłem każdy element w nawiasy i ponownie dołączyłem-or
.Ostatecznie wygenerowany kod jest po prostu przesyłany do
Invoke-Expression
(iex
) w celu wykonania, a następnie otrzymujemy wynik boolowski (tutaj możesz zobaczyć kod, który zostanie wygenerowany zamiast wyniku ).Trwało to zbyt długo i jestem pewien, że jest miejsce na wyciśnięcie jeszcze kilku bajtów, ale nie mogę już na to patrzeć :-p
źródło
Perl,
99130 bajtówWypróbuj na Ideone.
Nie golfowany:
źródło
JavaScript (ES6),
221292287309274277278 bajtów(-5 bajtów dzięki Okx)
Łał. Nie było to łatwe z powodu wszystkich skrajnych przypadków, ale myślę, że to zrobiłem. Mam tylko nadzieję, że nie ma specjalnych przypadków, które mogłyby złamać użyte wyrażenia regularne. Będę grał w golfa więcej, kiedy tylko będę mógł.
Test Snippet
źródło
1/0
doInfinity
.6
z wyrażeniem,6 skip 6,~
które moim zdaniem powinno być,true
ale zwracafalse
.false
jakskip
odnosi się do wszystkiego , że po nim (6,~
w tym przypadku) tak długo, jak to jest nie owinięty wewnątrz nawiasu. Dlatego uważam, że powinien wrócićtrue
na(6 skip 6),~
raczej niż6 skip 6,~
z wejściem całkowitej6
.6 skip 6,~
powinien pasować do niczego, ponieważ reprezentuje różnicę między zestawem{6}
a zestawem{6,-Infinity...Infinity}
.Röda + bc, 183 bajtów
Jest to podobne do odpowiedzi programu PowerShell (lub tak myślę, nie rozumiem PowerShell). Zajmuje liczbę jako argument i kod jako wartość w strumieniu wejściowym, na przykład:
main { push("1~9") | f(5) }
.Myślę, że to działa, przynajmniej rozwiązuje wszystkie przypadki testowe. Poniższy skrypt może być użyty do weryfikacji tego.
A testy:
źródło