Сравните два числа, приведенные в виде строк


21

У меня проблема на работе. Мне нужно сравнить два числа, которые приходят как строки из двух разных баз данных. Числа могут идти с ведущими нулями и / или начальными / конечными пробелами. Так что я могу иметь "0001 "из одной базы данных и " 1 "из другой.

Я решил проблему в C # с помощью следующего кода:

Func<string, string, bool> f = (a,b) => int.Parse(a.Trim()) == int.Parse(b.Trim())

Соревнование

Это действительно простая задача, подходящая для начинающих и любых эзотерических языков. Учитывая два числа в виде строк, которые могут идти с начальными нулями и / или начальными / конечными пробелами, напишите кратчайший код, который проверяет, представляют ли две строки один и тот же номер.

  • Входные данные должны быть двумя строками или эквивалентными на вашем языке (массив символов в порядке), и они всегда будут представлять целочисленные значения больше нуля.
  • Выходные данные должны быть любыми двумя последовательными значениями, которые представляют истинное значение и ложное значение.

Примеры

A          B          Result
----------------------------
"0001"     "1    "    true
"1450"     "1450 "    true
"0010001 " " 10001  " true
"0010000"  "  10  "   false
"101023"   "101024"   false

Это , поэтому победит самый короткий код для каждого языка!



8
По крайней мере, на этот раз ваши дети не вдохновлены ...
caird coinheringaahing

2
@cairdcoinheringaahing моя собственная работа - мой второй источник вдохновения. Я знаю, что это очень простая задача, но я думаю, что эти простые задачи также иногда необходимы. Я постараюсь придумать что-то более сложное в следующий раз.
Чарли

Между прочим, кажется, что мои трудные задачи либо слишком легки, либо слишком трудны ...
Чарли

@JonathanAllan нет, каждая входная строка будет представлять только одно число. Между строками не будет пробелов.
Чарли

Ответы:


22

Javascript , 11 байт

a=>b=>+a==b

Немного нарушил правила кастинга в Javascript; +aпринуждают aв числовой тип.

-6 байт благодаря Шегги и Мартину Эндеру ♦

Также классный дубль от LiefdeWen :

a=>b=>~~a==~~b

2
Добро пожаловать в PPCG. Вы можете сделать это в 11 байтах, используя каррирование и только преобразовав один из входных данных в целое число: tio.run/##y0osSyxOLsosKNHNy09J/… Также обратите внимание, что, если функция не ссылается на себя, вам не нужно включать переменную назначение в вашем количестве байтов.
Лохматый

2
Добро пожаловать в PPCG! Неназванные функции в порядке, поэтому вам не нужно c=, и карри также хорошо, так что вы можете использовать a=>b=>...вместо (a,b)=>. Наконец, мой JavaScript немного ржавый, но я думаю, что-то вроде !(a-b)бы тоже подойдет?
Мартин Эндер

1
Посмотрите советы по игре в гольф в ES6общие советы по игре в гольф от JS ), чтобы узнать больше о том, как выжать байты из ваших решений.
лохматый

1
Классная версия классная, но ограниченная по объему, попробуйте ввести «9123456789» и «533522197». Это строковое представление целочисленных значений, которые находятся внутри допустимого диапазона целых чисел в javascript (но более 32 бит)
edc65

1
Ваш текст больше не соответствует коду; нет вычитания Вы aприводите к числовому типу с одинарным +.
Питер Кордес


18

Язык сценариев работы Flashpoint , 33 байта

f={call format(["%1==%2"]+_this)}

Звоните с:

hint format["%1\n%2\n%3\n%4\n%5",
    ["0001", "1    "] call f,
    ["1450", "1450 "] call f,
    ["0010001 ", " 10001  "] call f,
    ["0010000", "  10  "] call f,
    ["101023", "101024"] call f]

Выход:

Альтернативная версия (41 байт):

f={{t=call _x;r=t==s;s=t}forEach _this;r}

Все еще на 5 байт короче, чем более простой f={t=_this;call(t select 0)==call(t select 1)}

39 байтов:

f={{t=call _x;r=t==s;s=t}count _this;r}

count(который возвращает размер массива) работает вместо forEach, потому что вы можете дать ему «лямбду», которая используется в качестве условия для подсчета только тех элементов массива, которые удовлетворяют этому условию. «Условие», используемое в этом случае, не является допустимым условием, но здесь это не имеет значения, поскольку оно не вызывает ошибку и возвращаемое значение countне требуется.


7
Мне нравится разнообразие ситуаций, в которых вы делаете снимки экрана своего кода.
Οurous

11

Такси , 488 байтов

Go to Post Office:w 1 l 1 r 1 l.Pickup a passenger going to The Babelfishery.Pickup a passenger going to The Babelfishery.Go to The Babelfishery:s 1 l 1 r.Pickup a passenger going to Equal's Corner.Pickup a passenger going to Equal's Corner.Go to Equal's Corner:n 1 l 1 l 1 l.Switch to plan "b" if no one is waiting.'1' is waiting at Writer's Depot.[b]'0' is waiting at Writer's Depot.Go to Writer's Depot:n 1 l 1 r.Pickup a passenger going to Post Office.Go to Post Office:n 1 r 2 r 1 l.

Попробуйте онлайн!

Ungolfed:

Go to Post Office: west 1st left 1st right 1st left.
Pickup a passenger going to The Babelfishery.
Pickup a passenger going to The Babelfishery.
Go to The Babelfishery: south 1st left 1st right.
Pickup a passenger going to Equal's Corner.
Pickup a passenger going to Equal's Corner.
Go to Equal's Corner: north 1st left 1st left 1st left.
Switch to plan "b" if no one is waiting.
'1' is waiting at Writer's Depot.
[b]
'0' is waiting at Writer's Depot.
Go to Writer's Depot: north 1st left 1st right.
Pickup a passenger going to Post Office.
Go to Post Office: north 1st right 2nd right 1st left.

Такси (относительно) хорошо подходит для этой задачи, потому что строки являются единственным допустимым типом ввода или вывода. The Babelfisheryэто то, что преобразует строки в число (и наоборот) и обрабатывает все пробелы и ведущие нули. Он также будет обрабатывать отрицательные числа, если -непосредственно перед первой цифрой. После этого Equal's Cornerпроверяет два значения друг против друга и Writer's Depotвыдает выходные данные в строковом формате. Выход 1для правды и 0фальси.


1
Хороший! Просто из любопытства, почему в окне отладки отображается сообщение error: The boss couldn't find your taxi in the garage. You're fired!?
Чарли

6
@Charlie Taxi требует, чтобы вы поехали обратно в гараж, когда закончите свой маршрут. Если вы не вернете машину, вас уволят. (Вы также должны быть уверены, что будете останавливаться и дозаправляться время от времени, или у вас кончится бензин.) В вопросах кода-гольфа, которые не запрещают вывод в STDERR, я обычно не беспокоюсь о том, что меня уволят. Вы можете добавить это, чтобы избавиться от ошибки, если вы не хотите потерять работу:Go to Taxi Garage:n 1 r 1 l 1 r.
Тост инженера

Этот ответ и его комментарии совершенно сюрреалистичны. Я люблю это сообщество.
Правая нога

@RightLeg Моя любимая программа такси, которую я написал, заняла у меня две недели и много отладки. Вы действительно хотите поездку, хотя? Проверьте Шекспира .
Инженер Тост

10

C (gcc) , 27 байтов

f(s,t){s=atoi(s)==atoi(t);}

С -O0(это настройка по умолчанию).

Попробуйте онлайн!

C, 32 байта

f(s,t){return atoi(s)==atoi(t);}

Попробуйте онлайн!


2
@Charlie В C строки - это массивы char, и когда вы передаете массив функции, вы просто передаете указатель на первый элемент массива. Здесь указатели на charмассивы неявно преобразуются в целые числа при передаче в функцию, а целые числа преобразуются обратно в указатели при вызове atoi.
Steadybox

1
который мог бы ужасно взорваться на платформе, где указатели шире, чем целые ... просто говорю, конечно, это хорошо для стандартов сайта здесь :)
Феликс Палмен,

2
Если вы хотите использовать нелепую хрень, как s=foo;вместо того return foo;, чтобы пометить это как «x86 gcc с отключенной оптимизацией», а не просто «C», потому что этот код не возвращает значение, кроме как в качестве артефакта реализации.
Питер Кордес

2
Я пошел посмотреть, есть ли какие-нибудь архитектуры, где s=retval;вместо того, чтобы return retval;фактически сломаться. Похоже, что внутренняя логика gcc (with -O0only) фактически обрабатывает последнее выражение как возвращаемое значение, возможно, так же, как работает выражение-выражение GNU C. (Но это требует s=). На ARM32 он вычисляет ==результат r3, а затем использует дополнительное значение, mov r0, r3чтобы сделать это возвращаемое значение! Так что это не хак, специфичный для x86, это gcc -O0хак, который gcc, похоже, старается изо всех сил поддерживать.
Питер Кордес

2
@ KenY-N Вы упускаете из виду весь смысл игры в гольф. Речь идет о поиске тех специфических хакерских крайних случаев, когда вы можете ввести минимальный объем кода и получить желаемый результат, не предоставляя удобство работы.

8

J , 4 байта

=&do

Сравните =после &оценки do. Также можно =&". попробовать онлайн!


Интересно, что это будет работать как для негативов, так как другие языки понимают их (например -10), так и для негативов, так как J понимает их (например _10) из-за способа -работы монад .
Коул

6

Сетчатка , 11 байт

.+
$*
D`
¶$

Попробуйте онлайн!

Входные данные разделены переводом строки, но для удобства набор тестов использует разделение запятыми. Принты 1на равенство и0 неравенство.

объяснение

.+
$*

Перевести все строки в одинарные. Это игнорирует ведущие нули и пробелы.

D`

Дедупликация: очистите вторую строку, если оба одинаковы.

¶$

Убедитесь, что строка теперь заканчивается переводом строки.




3

Треугольность , 17 байтов

..)..
.Ii).
@Ii=.

Попробуйте онлайн!

Треугольность, на этот раз, конкурентоспособна!

Как это устроено

Треугольность требует, чтобы код имел треугольное распределение точек. То есть длина каждой строки должна быть равна числу строк, умноженному на 2 и уменьшенному, и каждая строка должна иметь (с каждой стороны) количество точек, равное ее позиции в программе (нижняя строка - строка 0, тот, что выше, это строка 1 и т. д.). Имея это в виду, давайте проанализируем, как работает код:

..).. || Push a 0 onto the stack.
.Ii   || Get the 0th input and cast it to an integer.
   ). || Push another 0 onto the stack.
@I    || Increment the ToS => 1. Get the first input.
  i=. || Then cast it to an integer and compare their equality.

3

Алиса , 7 байт

X/n
o@i

Попробуйте онлайн!

Любой нецифровый разделитель работает. Принты 1на равенство и0 прочее.

объяснение

X   XOR, does nothing.
/   Switch to Ordinal mode.
i   Read all input as a string.
/   Switch to Cardinal mode.
X   XOR. Implicitly finds all integers in the string and pushes them separately
    onto the stack. The XOR gives 0 if the values are identical.
n   Logical NOT. Gives 1 for equal inputs and 9 otherwise.
/   Switch to Ordinal.
o   Print the 0 or 1 as a string.
/   Switch to Cardinal.
@   Terminate the program.





3

PowerShell , 20 байт

param($a,$b)+$a-eq$b

Подобно ответу на JavaScript, только дольше, потому что PowerShell не имеет карри. Использует +приведение первой строки к целому числу, а затем-eq автоматически преобразует вторую строку в целое число. Вывод True / False.

Попробуйте онлайн!


3

PowerShell , 19 байт

$args-join'-eq'|iex

Попробуйте онлайн!

-joinАргумент array ( $args) со строковым представлением оператора сравнения ( -eq) затем вычисляет выражение с помощью Invoke-Expression( iex).


Интересный. Интересно, как вы обходитесь без необходимости приводить к целому числу, в то время как мой прерывается, если я удаляю, +так как он выполняет проверку на равенство строк.
AdmBorkBork

@AdmBorkBork, потому что я по сути генерирую код PowerShell, а затем выполняю его, а поскольку ведущие нули и начальные / конечные пробелы не имеют значения для интерпретатора, он «просто работает». Если 2 числа, 00009 а 077 затем результирующий код - 00009 -eq077 это совершенно допустимый фрагмент кода. Вы имеете дело непосредственно со строкой во время выполнения, поэтому вы должны сначала ее привести, чтобы операция выполнялась в числовом формате.
Бриантист

Да, да, это имеет смысл. Спасибо за объяснение.
AdmBorkBork

3

Q (Kdb +), 13 байтов

=/["J"$(x;y)]

объяснение

(x; y): список двух входов.

«J» $: приведение каждого ввода к типу long (7j) из строки (10c), которая может правильно интерпретировать
пробел и начальные 0.

= /: проверяет равенство элементов в списке (каждая последующая пара).
Поскольку существует только одна пара, возвращает одиночное булианское значение 0b / 1b.


Добро пожаловать в PPCG! Обычно приветствуется ссылка на онлайн-интерпретатор / компилятор и, если не очевидно, объяснение.
FantaC

Благодарность! Объяснение добавлено там. Я сомневаюсь, что есть онлайн-переводчик для q, я быстро посмотрел и не смог его найти.
Сидни

Я бы сказал, что это должно быть записано как лямбда, включая фигурные скобки, то есть {=/["J"$(x;y)]}для 15 байтов ... Хотя для 8 байтов вы могли бы иметь это: (~/)"J"$если вы просто используете REPL и передаете входные данные в виде списка строк .. или {(~/)"J"$x}для 11 как функция.
Стритстер

3

T-SQL, 35 байт

Согласно нашим стандартам , данные вводятся через существующую таблицу tс varcharполями aи b.

    SELECT IIF(ABS(a)=ABS(b),1,0)FROM t

Возвращает, 1если они совпадают,0 если они не .

Несколько математических функции SQL ( в том числе ABS, FLOORи CEILING) будет делать неявное преобразование к числовому если данному строковым параметрам, это меньше , чем явный CAST(a AS INT)или CONVERT(INT,b), и работа в этом случае , так как мы знаем , что входные значения всегда положительны.

IIF специфичен для MS SQL 2012 и выше, поэтому нет никаких гарантий относительно других реализаций.


3

Excel VBA, 27 16 байт

-9 Благодаря @Nayrb и @TaylorScott

[C1]=[A1]-[B1]=0

Где вы вводите значения в ячейки с 'string.

Где xи где yнаходятся входные строки иz является логическим выходом.

Если CInt (x) = CInt (y), то z = 1

Использование CInt


1
Почему нет: z = xy = 0?
Nayrb

К сожалению, это решение недопустимо, так как оно не принимает входные данные и скорее полагается на наличие предопределенных значений ( что считается нарушением правил сообщества ) и вывод в переменную ( что также противоречит правилам сообщества )
Тейлор Скотт,

Что же касается действительного решения возможно немедленное VBE функции окна , таких как , ?[Int(A1)=Int(B1)]который принимает входной сигнал от диапазонов A1и B1выходов к немедленному окну VBE
Taylor Scott




2

Гема , 21 персонаж

*\n*=@cmpn{*;*;0;1;0}

Нет логического в Gema. В качестве функций @get-switch{}/ @set-switch{}используются 0 и 1 для представления состояний переключателей, также используются 0 и 1.

2 строки передаются на отдельных входных строках.

Образец прогона:

bash-4.4$ gema '*\n*=@cmpn{*;*;0;1;0}' <<< $'0010001\n10001  '
1

bash-4.4$ gema '*\n*=@cmpn{*;*;0;1;0}' <<< $'0010000\n  10  '
0



2

Атташе , 11 байт

Same@Map&:N

Попробуйте онлайн!

Это принимает массив строк, таких как V["0001", "1 "]. Проще говоря, Map&:Nэто функция, которая отображает Nсвой аргумент и Sameпроверяет, что массив содержит только равные члены. (Интересный факт: эта функция работает для более чем двух строковых аргументов.)


2

SNOBOL4 (CSNOBOL4) , 42 байта

	OUTPUT =EQ(EVAL(INPUT),EVAL(INPUT)) 1
END

Попробуйте онлайн!

Выходы 1 для правды, ничего для фальси. Поскольку (пробел) является оператором конкатенации в SNOBOL, EVALиспользование числа с начальными / конечными пробелами дает само число, и оно также аккуратно заботится о любых ведущих нулях. EQтесты на числовое равенство, условно устанавливающие OUTPUTна 1 по Success.


2

Sinclair ZX81 / Timex TS1000 / 1500 BASIC, ~ 29 токенов BASIC

Новое решение благодаря Нейлу (спасибо за подсказку).

 1 INPUT A$
 2 INPUT B$
 3 PRINT VAL A$=VAL B$

Это решение требует ввода данных пользователем, поэтому введите две строки с пробелами и / или начальными нулями или введите две строки с неравным числовым значением; 0ложно и1 имеет значение true, если в третьей строке сравнивается значение каждой введенной строки.

Старое решение: Sinclair ZX81 / Timex TS1000 / 1500 BASIC, ~ 46 байтов с токенами BASIC

 1 LET A$=" 001 "
 2 LET B$="1"
 3 PRINT (VAL A$=VAL B$)

Фактическая проверка выполняется в третьей строке, что составляет всего ~ 16 байтов BASIC; поэтому ввод каждой пары тестовых примеров в прямом режиме сэкономит ~ 30 байт из списка. Обратите внимание, что это число байтов не включает в себя var stack.


1
Разве вы не должны использовать INPUT A$и INPUT B$? Также я не думаю, что вам нужно ()с.
Нил

Да, я мог бы также использовать это - я просто хотел подтверждение концепции
Шон Бебберс

2

APL (NARS2000) , 7 байтов

=⍥⍎

Ну, да, я знаю, что NARS2000 не может конкурировать с Dyalog здесь, поскольку он использует Unicode, но я подумал, что лучше показать ( составление в NARS2000, хотя на самом деле это не связано с композицией функций), чего-то, чего не делает Dyalog есть как встроенный, и я никогда не видел здесь используется. В Dyalog это должно быть реализовано как{(⍵⍵⍺)⍺⍺⍵⍵ ⍵} . Он вызывает монадическую функцию правого операнда как для левого, так и правого аргумента, а затем вызывает двоичную функцию левого операнда для результатов.

Здесь правый операнд ( Выполнить , т. Е. Eval), а левый операнд =( Равен , то есть проверить, равны ли его аргументы).


Композиция и исполнение должны отображаться как пробелы?
Джон Дворак

@JohnDvorak эм, нет? Они не являются пробелами, второй символ - это U + 2365 APL FUNCTIONAL SYMBOL DIRERESIS, а третий - это U + 234E APL FUNCTIONAL SYMBOL DOWN TACK JOT.
Эрик Outgolfer

@JohnDvorak Независимо от того, какой шрифт вы просматриваете, он может не иметь символов для этих кодов.
Οurous

@ Я очень подозреваю, что это тоже так, но если вы используете хорошо обновленное программное обеспечение, у вас не должно возникнуть проблем с просмотром таких символов.
Эрик Outgolfer
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.