Napisz kod, aby ocenić, czy łańcuch nierówności jest prawdziwy, czy fałszywy. Przykładowym wejściem jest ciąg
3<=4!=9>3==3
Dzieje się tak, ponieważ każdy z jego składników jest prawdziwy:
(3<=4) and (4!=9) and (9>3) and (3==3)
Wejście:
Łańcuch reprezentujący łańcuch jednej lub więcej nierówności. Dozwolone operatory porównania to
== equals
!= does not equal
> is greater than
>= is greater than or equal to
< is less than
<= is less than or equal to
Dozwolone są numery numery jednocyfrowe 0
przez 9
. Nie będzie spacji, nawiasów ani innych symboli.
Wynik:
Poprawność nierówności jako spójnej wartości Prawdy lub Falseya . Spójny oznacza, że każdy wynik Prawdy jest taki sam, a każdy wynik Falsey jest taki sam.
Ograniczenie:
Celem tego wyzwania jest napisanie kodu przetwarzającego nierówności, zamiast oceniania ich jako kodu, nawet w przypadku pojedynczej nierówności w łańcuchu. W związku z tym metody takie jak Python eval
i exec
oceniające lub wykonujące kod są zakazane. Podobnie są funkcje, które wyszukują metodę lub operator, podając jego nazwę jako ciąg znaków. Niedozwolone jest także uruchamianie procesów lub programów w celu dokonania oceny.
Przypadki testowe:
3<=4!=9>3==3
True
3<=4!=4
False
5>5
False
8==8<9>0!=2>=1
True
Odpowiedzi:
Rubin, 71 + 1 = 72
Z flagą wiersza polecenia
-n
uruchomGeneruje wszystkie możliwe błędy wyrażeń regularnych i sprawdza, czy łańcuch wejściowy pasuje do któregokolwiek z nich. Wyprowadza,
true
jeśli nie, inaczejfalse
. Pobiera dane wejściowe przez STDIN, oddzielone znakami nowej linii.Wydziwianie:
a<=>b
zwrócenie wartości -1,0 lub 1 dla wartości mniejszej, równej lub większej. Wszystkie one dzielą się na różne elementy tablicy trzy łańcuchowej, znajdując wyrażenie regularne dla porównań, które nie pasują.źródło
Perl, 82
Wyświetla 1, gdy ma wartość true, a pustą linię, gdy ma wartość false, ponieważ pusty ciąg jest główną wartością falsela Perla.
Pętla while przechodzi przez ciąg pasujący do wyrażenia regularnego
\d(.)(=?)
. Następnie zmienne$1
i$2
odpowiadają znakom operatora oraz zmienne specjalne$&
i$'
będą zachowywać się jak dwa operandy w kontekście numerycznym. Operandy są porównywane z<=>
wynikiem, a wynik jest porównywany z pierwszym znakiem operatora. W takim przypadku równość i nierówność są traktowane specjalnie.źródło
CJam, 60 bajtów
Ten kod wydaje się trochę brzydki i potencjalnie nie w pełni zoptymalizowany, ale jest najlepszy, jaki do tej pory miałem.
Wypróbuj online.
Wyjaśnienie
źródło
JavaScript (ES6) 110
116Prosto: skanuj ciąg, c to cyfra bieżąca, l to ostatnia cyfra, o to operator.
Przetestuj w konsoli Firefox / FireBug
źródło
Haskell, 156 bajtów
Przykład użycia:
Wersja bez golfa:
eval
pobiera dwa argumenty: ciąg do analizy (rozpoczynający się zawsze od operatora porównania) i liczbę,i
która jest lewym argumentem do porównania (i był prawym argumentem w poprzedniej rundzie). Operator jest zwracany przez,lookup2
jeśli jest to operator dwuznakowy (sprawdź tylko 1. znak, ponieważ 2. jest zawsze=
) ilookup1
jeśli jest to tylko jeden znak.eval
wywołuje się rekurencyjnie i łączy wszystkie zwracane wartości z logicznym i&&
.źródło
Common Lisp -
300185169165Przykład
Wyjaśnienie
ppcre:split
dzieli się na cyfry; na przykład:Zwróć uwagę na pierwszy pusty ciąg znaków, który jest odrzucany za pomocą
cdr
Mapowanie
read-from-string
do tej listy wywołujeread
funkcję dla każdego łańcucha, która zwraca symbole i liczby.loop for (a op b) on '(3 < 5 > 2) by #'cddr
wykonuje iterację po liście o krok 2, a tym samym wiążea
,op
ib
następująco, dla każdego kolejnego przejścia.always
sprawdza, czy następne wyrażenie jest zawsze prawdziwe: operator jestnil
(patrz wyżej) lub wynik porównania jest wstrzymany (patrz poniżej).że
case
wybiera funkcja porównanie Common Lisp, według symbolu wcześniej czytać; ponieważ niektóre operatory są identyczne w Lisp, a dany język możemy po prostu powrócićo
w przypadku domyślnym.źródło
Python 2,
95102Pętla jest prostym przejściem przez ciąg po jednym znaku na raz.
t&=...
Część, gdzie dzieje się magia. Zasadniczo mieszam operator wraz z wartościącmp(lhs,rhs)
(-1, 0 lub 1 w zależności od tego, czylhs
jest mniejszy, równy lub większy niżrhs
). Wynik jest kluczem do tabeli przeglądowej, która daje 0 lub 1 w zależności od tego, czy liczby są poprawnie porównywane z danym operatorem. Jaki stół przeglądowy pytasz? Jest to liczba 627 =0001001110011
binarnie. Operatorzy bitowi zajmują się resztą.Działa to na czterech podanych przypadkach testowych; daj mi znać, jeśli znajdziesz błąd w innej sprawie. Nie testowałem tego bardzo rygorystycznie.
źródło
a
jako dane wejściowe.JavaScript 101 bajtów
inne podejście niż zamieszczone tutaj rozwiązanie js
źródło
Java 8, 283 bajtów
Wyjaśnienie:
Wypróbuj tutaj.
źródło