Порівняйте два числа, подані у вигляді рядків


21

У мене проблеми на роботі. Мені потрібно порівняти два числа, які надходять як рядки з двох різних баз даних. Цифри можуть поставлятися з провідними нулями та / або провідними / задніми пробілами. Тож я можу мати "0001 "з однієї бази даних, а " 1 "з іншої.

Я вирішив проблему в C # за допомогою наступного коду:

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

Змагання

Це дійсно простий виклик, підходить для новачків і будь-яких езотеричних мов. Враховуючи два числа як рядки, які можуть поставлятися з провідними нулями та / або провідними / кінцевими пробілами, запишіть найкоротший код, який перевіряє, чи два рядки представляють однакове число.

  • Вхідні дані повинні бути двома рядками або еквівалентом у вашій мові (масив char є нормальним), і вони завжди представлятимуть цілі значення, що перевищують нуль.
  • Вихідні дані повинні бути будь-якими двома послідовними значеннями, які представляють триєшнє значення та значення фальси.

Приклади

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 байтах, використовуючи currying і лише перетворивши один з входів у ціле число: tio.run/##y0osSyxOLsosKNHNy09J/… Зауважте також, що, якщо функція не посилається на себе, вам не потрібно включати змінну призначення у вашому рахунку байтів.
Кудлатий

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

1
Перегляньте поради щодо гольфу в ES6 (та загальні поради щодо гольфу JS ), щоб дізнатися більше про хитрощі, як витіснити байти із своїх рішень.
Кудлатий

1
Класна версія versiopn є крутою, але обмеженою за обсягом, спробуйте ввести "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
Мені подобається різноманітність ситуацій, в яких ти
робиш

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.

Спробуйте в Інтернеті!

Безголівки:

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 (з кодом -O0тільки) фактично обробляє останній вираз в якості значення, що повертається, може бути таким же чином , що гну C оператор-вираз робіт. (Але це вимагає s=). На ARM32 він обчислює ==результат у r3, а потім використовує додатковий, mov r0, r3щоб зробити це поверненим значенням! Отже, це не хак-хенд-хак, це 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 Uals автоматично перекидає другий рядок на ціле число. Вихід відповідає значенням True / False.

Спробуйте в Інтернеті!


3

PowerShell , 19 байт

$args-join'-eq'|iex

Спробуйте в Інтернеті!

-joinмасив аргументів ( $args) з рядковим поданням оператора порівняння ( -eq), потім оцінюють вираз за допомогою Invoke-Expression( iex).


Цікаво. Цікаво, як ви дістаєтесь, не потребуючи приведення до цілого числа, тоді як міна переривається, якщо я видаляю, +оскільки він робить перевірку рівності рядків.
AdmBorkBork

@AdmBorkBork, оскільки я по суті створюю код PowerShell, а потім виконую його, а оскільки провідні нулі та провідні / кінцеві пробіли для інтерпретатора не мають значення, він "просто працює". Якщо два числа є, 00009 а 077 потім отриманий код - 00009 -eq077 цілком дійсний фрагмент коду. Ви маєте справу безпосередньо з рядком під час виконання, тому спочатку потрібно надати його, щоб операція була виконана на цифровій формі.
британіст

Правильно, так, це має сенс. Дякую за пояснення.
AdmBorkBork

3

Q (Kdb +), 13 байт

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

Пояснення

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

"J" $: передавання кожного вводу на довгий (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?
Найрб

На жаль, це рішення є недійсним, оскільки не вимагає введення даних, а скоріше покладається на наявність заздалегідь заданих значень ( що вважається проти правил спільноти ) та виведення на змінну ( що також суперечить правилам спільноти )
Тейлор Скотт

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




2

Гема , 21 символ

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

У Ґема немає булевих. Оскільки @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

Attache , 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$? Крім того, я не думаю, що вам потрібні ()s.
Ніл

Так, я міг би також використати це - я просто хотів довести концепцію
Shaun Bebbers

2

APL (NARS2000) , 7 байт

=⍥⍎

Ну так, я знаю, що NARS2000 тут не може змагатися за Dyalog, оскільки він використовує Unicode, але я подумав, що я краще покажуся (називається Composition в NARS2000, навіть якщо це насправді не пов'язане з функціональним складом), щось Dyalog не робить як вбудований, і я ніколи не бачив, щоб тут використовувався. У Dyalog це має бути реалізовано як{(⍵⍵⍺)⍺⍺⍵⍵ ⍵} . Це - викликати монадичну функцію правого операнда як на лівому, так і на правому аргументі, а потім викликати діадичну функцію лівого операнда за результатами.

Тут, правий операнд ( Execute , тобто Eval) і лівий операнд =( Так само , тобто перевірити , якщо її аргументи дорівнюють).


Чи повинні композиція та виконання виконуватись як пробіли?
Іван Дворак

@JohnDvorak гм, ні? Вони не пробіли, другий знак - це U + 2365 ФУНКЦІОНАЛЬНИЙ ЦІРНИЙ ДІАЕРЕЗ СИМБОЛУ, а третій - U + 234E ФУНКЦІОНАЛЬНА СИМВОЛА APL.
Ерік Аутгольфер

@JohnDvorak Який би шрифт ви не переглядали, він може не мати символів для цих кодових точок.
Οurous

@ Οurous Я дуже підозрюю, що це теж так, але якщо ви використовуєте добре оновлене програмне забезпечення, у вас не повинно виникнути проблем із переглядом таких символів.
Ерік Аутгольфер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.