Напишите код, чтобы оценить, является ли цепочка неравенств истинной или ложной. Пример ввода - строка
3<=4!=9>3==3
Это правда, потому что каждый из его компонентов верен:
(3<=4) and (4!=9) and (9>3) and (3==3)
Входные данные:
Строка, представляющая цепочку из одного или нескольких неравенств. Разрешенные операторы сравнения
== equals
!= does not equal
> is greater than
>= is greater than or equal to
< is less than
<= is less than or equal to
Допустимые числа - однозначные числа 0
через 9
. Там не будет пробелов, скобок или других символов.
Выход:
Правильность неравенства как последовательного значения Истина или Ложь . Последовательность означает, что каждый вывод Truthy одинаков, а каждый вывод Falsey одинаков.
Ограничение:
Цель этой задачи - написать код, который обрабатывает неравенства, а не оценивать их как код даже для одного неравенства в цепочке. Таким образом, такие методы, как Python eval
и такие, exec
которые оценивают или выполняют код, запрещены. Так же как и функции, которые ищут метод или оператор с именем в виде строки. Также не разрешено запускать процессы или программы для проведения оценки за вас.
Тестовые случаи:
3<=4!=9>3==3
True
3<=4!=4
False
5>5
False
8==8<9>0!=2>=1
True
Ответы:
Рубин, 71 + 1 = 72
С флагом командной строки
-n
запуститеГенерирует все возможные ошибочные регулярные выражения и проверяет, совпадает ли входная строка с любым из них. Выходы,
true
если никто не делает, ещеfalse
. Принимает ввод через STDIN, разделенные символами новой строки.Трюки:
a<=>b
, что возвращает -1,0 или 1 для значений меньше, равно или больше. Все они срезаются на разные элементы трехстрочного массива, находя регулярное выражение для несоответствующих сравнений.источник
Перл, 82
Печатает 1, когда true, и пустую строку, когда false, поскольку пустая строка является основным значением Fall в Perl.
Цикл while проходит по строке, соответствующей регулярному выражению
\d(.)(=?)
. Тогда переменные$1
и$2
соответствуют символам оператора, а специальные переменные$&
и$'
будут вести себя как два операнда в числовом контексте. Операнды сравниваются,<=>
и результат сравнивается с первым символом оператора. Тогда равенство и неравенство рассматриваются специально.источник
CJam, 60 байтов
Этот код кажется немного уродливым и, возможно, не полностью оптимизированным, но это лучшее, что у меня есть.
Попробуйте онлайн.
объяснение
источник
JavaScript (ES6) 110
116Непосредственно: строка сканирования, c - текущая цифра, l - последняя цифра, o - оператор.
Тест в консоли Firefox / FireBug
источник
Haskell, 156 байт
Пример использования:
Безголовая версия:
eval
принимает два аргумента: строку для анализа (начиная всегда с оператора сравнения) и число,i
которое является левым аргументом для сравнения (и был правым аргументом в предыдущем раунде). Оператор возвращается,lookup2
если это двухсимвольный оператор (проверяйте только 1-й символ, потому что 2-й всегда=
), иlookup1
если это только один символ.eval
вызывает себя рекурсивно и объединяет все возвращаемые значения с логическими и&&
.источник
Обыкновенный Лисп -
300185169165пример
объяснение
ppcre:split
разбивается на цифры; например:Обратите внимание на первую пустую строку, которая отбрасывается с помощью
cdr
Отображение
read-from-string
в этот список вызываетread
функцию для каждой строки, которая возвращает символы и цифры.loop for (a op b) on '(3 < 5 > 2) by #'cddr
итерацию по списку с помощью шага 2 и , таким образом , связываетa
,op
иb
следующим образом , для каждого последующего прохода.always
проверяет, всегда ли следующее выражение истинно: либо операторnil
(см. выше), либо результат сравнения сохраняется (см. ниже).то
case
выбирает функцию сравнения Common-Лисп, в соответствии с символом ранее чтением; поскольку некоторые операторы идентичны в Лиспе и данном языке, мы можем просто вернутьсяo
в случае по умолчанию.источник
Python 2,
95102Цикл представляет собой простой проход по строке по одному символу за раз.
t&=...
Часть, где происходит волшебство. По сути, я хеширую оператор вместе со значениемcmp(lhs,rhs)
(-1, 0 или 1 в зависимости от тогоlhs
, меньше, равно или больше, чемrhs
). Результатом является ключ к таблице поиска, который дает 0 или 1 в зависимости от того, правильно ли сравниваются числа с учетом этого оператора. Какую таблицу поиска, спросите вы? Это число 627 =0001001110011
в двоичном виде. Побитовые операторы делают все остальное.Это работает на четырех заданных тестовых случаях; дайте мне знать, если вы найдете ошибку для другого случая. Я не проверял это очень строго.
источник
a
качестве входных данных.Javascript 101 байт
другой подход от решения JS размещен здесь
источник
Java 8, 283 байта
Объяснение:
Попробуй это здесь.
источник