Ваша задача проста . Определить , если одна строка равна другой (не адрес, то значение) без использования операторов равенства (например ==
, ===
или .equal()
) или неравенство ( !=
, !==
) ничего подобного на других языках. Это значит где угодно! Вы не можете использовать эти операторы где-либо в коде. Однако вы можете использовать такие переключатели, как !exp
если бы вы не сравнивали напрямую exp != with something else
.
Кроме того, вы не можете использовать любые функции, такие как strcmp , strcasecmp и т. Д.
Что касается операторов сравнения ( >=
, <=
, >
, <
), они также запрещены . Я понимаю, что некоторые ответы включают это, но я действительно хотел бы видеть больше ответов, которые не ограничивают оператор равенства.
Пример использования PHP показан:
<?php
$a = 'string';
$b = 'string';
$tmp = array_unique(array($a, $b));
return -count($tmp) + 2;
Просто верните true или false (или что-то, что оценивается в языке как true или false, например 0 или 1), чтобы указать, совпадают ли строки. Строки должны быть жестко закодированы, как видно из приведенного выше примера. Строки не должны учитываться в гольфе, поэтому, если вы объявите переменную заранее, не считайте объявление.
Ответы:
Python
49 45 18 22 1514(+ 3, если рассматриваются строковые переменные)
Строка должна быть жестко запрограммирована в двухa
и в одном экземплярах вb
кавычках.a
иb
должен быть предварительно инициализирован для строк.Оболочка Python, 9
(+ 3, если рассматриваются строковые переменные)
Вывод в оболочку
объяснение
Создает dict (хэш-таблицу) с ключом первой и второй строки. Если вторая строка совпадает, значение first заменяется значением second. Наконец, мы печатаем значение первого ключа.
РЕДАКТИРОВАТЬ: OP допускает 0/1 вместо False / True, а также с использованием предварительно инициализированных переменных.
источник
a
иb
не должны быть включены, строки должны быть там жестко закодированы, поэтому я добавил + 2 * len (str1) + len (str2) + 6 (')Python (
1711):(Проверяет, содержится ли b в a, а a содержится в b, если это не было ясно из кода.)
Альтернативный питон: (
87)получено из решения Go из Tom Verelst:
Бонус: это работает для любого типа.
РЕДАКТИРОВАТЬ:
Подождите секунду, просто прочитайте, что вы также можете напрямую программировать в строках, и вам не нужно считать кавычки ... (или, по крайней мере, это то, что делает golfscript). Итак ... Python наравне с гольф-скриптом? Боже мой!
Альтернативная альтернатива Python (
54):(спасибо Клавдиу)
оригинал:
Альтернатива Альтернатива Альтернатива Бенди-рули Питон (2):
Ничего не было сказано о сравнительных ключевых словах (это не серьезное представление, просто то, что пришло мне в голову ...)
источник
b in a in b
. В и нет необходимости ...in
и[a]
. т.е.b in[a]
должен работать.JavaScript,
1110Строки должны храниться в a и b.
Редактировать: спасибо Дэнни за указание,
|
достаточно вместо||
источник
|
?Руби, 11
Проверяет, содержится ли каждая строка в другой.
источник
!(a<b||b<a)
было бы то же самое ...Python - 11 (без строк)
источник
a<=b<=a
всего 7 символов. Хотя я не знаю, будет ли это сравнение<=
считаться «неравенством». Из вопроса видно, что любое сравнение, которое не является проверкой равенства, это нормально, что позволило бы<=
.GolfScript (5 символов)
Довольно простой порт реализации PHP-ссылок. Оставляет
0
(= false) в стеке, если строки одинаковые, или1
(= true), если они разные.источник
1
если строки одинаковы, и2
если они разные.'string1''string1'].&,1&
работаетJavascript (45 байт):
Вот еще одно решение в Javascript.
Пространство важно.
c
должно бытьtrue
.источник
!a.replace(b,'')
считается. Таким образом, количество символов должно быть 16. На самом деле, некоторые люди даже считают это 14, так как вы можете указать строку напрямую.C ++,
635856источник
auto
вместоconst char*
?coreutils: uniq -d
Просто введите две строки в качестве стандартного ввода канала и
uniq -d | grep -q .
ничего не напечатает, но будет иметь возвращаемое значение успеха или ошибки. Если вы хотите напечатать логическое значение, просто замените наuniq -d | grep -c .
Сколько персонажей? Я позволю тебе считать;
uniq -d|grep -q .
без лишних пробелов содержит 17 символов, но так как вся работа выполняется uniq, я бы сказал, что это 0-символьное решение на ...uniq
своем языке!На самом деле,
uniq -d
напечатает одну строку, если две строки идентичны, и ничего, если они разные.источник
Строки должны храниться в a и b. Не будет работать, если есть
null
.C #, 53
C #, 28
источник
PHP - 49 символов
источник
!strlen(str_replace($a,'',$b));
должно возвращаться 1, если две строки равны?$a == 'foo'
и$b = 'foofoo'
:)!strlen(preg_replace("/{$a}/", '', $b, 1));
и составляет 45 символов?APL (
89)Обновление: старый не работает для строк разной длины.
↑⍺⍵
: сделать матрицу с⍺
первой и⍵
второй строкой, заполняя пробелы.∊⌿
: Для каждого столбца посмотрите, содержит ли верхний ряд нижний ряд (как в старой версии).∧/
: Взять логическоеand
из всех значений.Старый:
⍺∊¨⍵
: для каждой комбинации элементов в⍺
и⍵
, посмотрите,⍺
содержит ли элемент из элемента из⍵
. Так как в строке все они будут одиночными символами, а строка содержит себя, это в основном сравнивает каждую пару символов.∧/
: взять логическое и все значения (если все символы совпадают, строки равны)источник
Питон - 12
Это решение использует наборы. Вычитание равных наборов приведет к пустому набору, который имеет логическое значение False. Отрицание этого приведет к тому, что значения True для a и b будут равными строками.
Изменить: Спасибо Питер Тейлор за указание на ненужные пробелы.
источник
a="s", b="ss"
?"s"!="ss"
, это будет выводитьFalse
. Чувствительность к регистру также сохраняется. Это даже работает дляa="", b="s"
. Код не преобразует строки в наборы, но создает наборы, содержащие строки.{}
это не то же самое, чтоset()
. Вы можете сохранить 1 символ, удалив пробел.{a}
эквивалентноset([a])
.not {a}-{b}
?С - 62
Проверено. Позвонить как
e(str1, str2)
Если подумать, если не считать
char*p,char*q
, что кажется справедливым, это всего 49 байтов :)источник
np
иnq
. Подойдет один цикл, потому что если вы достигнете конца одной строки раньше другой, они будут иметь другое значение.*p&*q
может остановить цикл слишком рано (например'0'&'A'==0
)*p=='0'
&*q=='A'
, мы хотим, чтобы цикл остановился раньше, поскольку мы знаем, что строки не равны.Haskell - 9
Обратите внимание, что это, как и многие другие записи здесь, является просто выражением. Это не программа на Haskell.
источник
Ява -
162147 символовИдея состоит в том, чтобы сравнить разность каждого байта, одинаковые байты будут иметь разность 0. Программа сгенерирует,
java.lang.ArrayIndexOutOfBoundsException
когда байты различаются (попробуйте получить доступ к отрицательному индексу) или когда строки имеют разную длину. Он поймает исключение и вернет 0 (строки не равны) или вернет 1 в противном случае (строки равны).Сжатый:
Обычный:
источник
PHP
Этот сценарий может не иметь никакой утилиты, но, по крайней мере, это позволяет сравнивать строки.
PHP
Еще один:
источник
Пролог 7
Это позволяет использовать функцию сопоставления с образцом в Прологе, чтобы объединить 2 аргумента с предикатом, что эффективно проверяет эквивалентность эквивалентности, когда нет несвязанной переменной .
Пример использования:
Технически говоря, поведение этого решения - поведение оператора объединения
=/2
, а не оператора==/2
, который проверяет эквивалентность терминов. Разница показывает, когда задействованы несвязанные переменные. В этом решении, когда указана несвязанная переменная, предикат вернетсяtrue
после успешного объединения. Для сравнения,==/2
сравним порядок сроков без унификации.источник
PHP, 21
Этот делает работу, используя переменную косвенность.
Или, если вам не нужно быть булой
РЕДАКТИРОВАТЬ : я забыл обработать случай, когда вы пытаетесь сравнить две пустые строки, поэтому код сейчас
что составляет 21 символ.
источник
CPython: 6
Использование,
is
очевидно, довольно подозрительно, но поскольку задача специально призывает к тому, чтобы мы определяли равенство значений, а не эталонное равенство, аis
сравнивала только идентичность объекта, я чувствую, что она может не попасть в список запрещенных операторов.Конечно, есть также некоторый вопрос относительно того, действительно ли это даже; это работает на всех моих системах, но это зависит от реализации и, вероятно, не всегда будет работать, если строки не определены вручную в интерактивном интерпретаторе.
источник
Mathematica / Wolfram Language, 15 байтов
Довольно понятно, устанавливает каждую строку как набор, а затем проверяет длину объединения двух наборов. Если строки совпадают, возвращает 1, в противном случае возвращает 0. Если мне разрешено возвращать «2» для «другого» и «1» для «одного и того же», вычтите два байта.
источник
C 342 в гольфе
Примечание: Visual Studio жалуется, если вы не используете их безопасные методы, например gets_s. CodeBlocks с Mingw компилируется без предупреждений.
C 655 не в гольф
Код создает взвешенную сумму символов для каждой строки. Если разница равна нулю, то они равны, включая 2 пустые строки:
источник
питон
Это долго и не красиво, но это моя первая запись!
источник
PHP, 68 байт
Я предполагаю, что вам запрещено использовать любые операторы сравнения. Так
<
или>
включены.Идея состоит в том, чтобы использовать побитовый XOR. В разных языках этот оператор имеет разный синтаксис - я покажу пример для PHP. Там это доступно с
^
. К сожалению, его поведение со строками не так хорошо, как могло бы быть, поэтому вам нужно проверить длину строки раньше. Это связано с тем, что в PHP xor обрезает более длинную строку до длины более короткой.Следующим шагом является правильная работа со строками, потому что один
xor
не даст результата, доступного для дальнейших операций в PHP. Вот почемуunpack()
был использован. Итак, код будет:Это длиннее, чем опция с
<
/,>
но он не будет их использовать. Кроме того, важна жонглирование типов PHP (поэтому будет приведен пустой массивfalse
). Или, может быть, есть более простой способ проверить, содержит ли массив ненулевые члены ( Правка : хотя я уже набирал это, есть хороший уловtrim()
в другом ответе, поэтому мы можем избавиться от операций с массивами)Но я верю, что есть языки, на которых мы можем просто
a ^ b
- буквально, получить результат. Если это0
(обрабатывается из всех приведенных байтов) - тогда наши строки равны . Это очень легко и даже проще, чем<
или>
вещи.источник
grep 14 символов
Конечно, я считаю только код grep; эти две строки находятся на двух последовательных строках ввода (либо канал, либо файл, либо даже интерактивный сеанс).
источник
Matlab: 12 символов (после того, как строки в переменных)
Код, включающий присвоения, будет:
источник
Очень сумасшедший путь
Просто для удовольствия, но есть много способов заставить его потерпеть неудачу, если задуматься. Более того, не забывайте, что строки будут исполняться оболочкой.
Хорошим контрпримером является сравнение «string» в качестве первой строки и «rm -Rf /» в качестве второй строки; просто проверьте как root и посмотрите: он скажет "true", хотя обе строки явно не одинаковы.
источник
JavaScript [18 байт]
ИЛИ
Это вернется,
true
еслиa == b
иfalse
еслиa =/= b
. Логика заключается в создании объекта со значениемa
как свойство и возвращении1
илиundefined
в случае, если свойствоb
значения существует или не существует в этом объекте.источник
!!
этом нет необходимости1
илиundefined
(или объект /undefined
для второго случая).18-2 = 16 bytes
.JavaScript [15 байт]
Это вернется,
true
еслиa == b
иfalse
еслиa =/= b
. Скрипт ищет значениеb
в массиве, который содержит единственный элемент значенияa
.источник
С -
8683Obvioulsy не самый короткий, но это не работает со строковыми переменными и вместо этого принимает строки в качестве ввода из консоли. Кроме того, мне нравится рекурсивный main, даже если это явно не самая короткая версия. Но, безусловно, наименее рекомендуется.
источник
char** v
можно записать какchar**v
. Есть некоторые исключения (например42 / *pointer
), но в большинстве случаев пробелы могут быть безопасно удалены возле специальных символов.