문자열로 주어진 두 숫자를 비교


21

직장에 문제가 있습니다. 두 개의 다른 데이터베이스에서 문자열로 오는 두 개의 숫자를 비교해야합니다. 숫자에는 선행 0 및 / 또는 선행 / 트레일 공백이있을 수 있습니다. 따라서 "0001 "한 데이터베이스와 " 1 "다른 데이터베이스에서 가질 수 있습니다 .

다음 코드를 사용하여 C #의 문제를 해결했습니다.

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

도전

이것은 초보자와 모든 종류의 난해한 언어에 적합한 매우 간단한 도전입니다. 선행 제로 및 / 또는 선행 / 후행 공백과 함께 제공 될 수있는 문자열로 두 개의 숫자가 주어지면 두 문자열이 동일한 숫자를 나타내는 지 확인하는 가장 짧은 코드를 작성하십시오.

  • 입력은 두 개의 문자열이거나 해당 언어에서 동등한 문자열이어야하며 (문자 배열은 정상 임) 항상 0보다 큰 정수 값을 나타냅니다.
  • 결과는 진솔한 값과 거짓된 값을 나타내는 일관된 두 값이어야합니다.

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

이것은 이므로 각 언어마다 가장 짧은 코드가 이길 수 있습니다!



8
적어도 이번에는 아이들에게 영감을
얻지 못했습니다

2
@cairdcoinheringaahing 내 자신의 작품은 영감의 두 번째 원천입니다. 나는 이것이 매우 간단한 도전이라는 것을 알고 있지만, 이러한 쉬운 도전들도 때때로 필요하다고 생각합니다. 다음에 더 어려운 것을 생각해 보겠습니다.
Charlie

그건 그렇고, 내 작업에서 영감을 얻은 도전은 너무 쉽고 어렵습니다 ...
Charlie

@JonathanAllan 아니오, 각 입력 문자열은 하나의 숫자 만 나타냅니다. 문자열 사이에 공백이 없습니다.
Charlie

답변:


22

자바 스크립트 , 11 바이트

a=>b=>+a==b

자바 스크립트의 캐스팅 규칙을 약간 남용하는 것; 숫자 형으로 +a강제 a합니다.

ShaggyMartin Ender 덕분에 -6 바이트

LiefdeWen 의 멋진 작품 :

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

2
PPCG에 오신 것을 환영합니다. 커리 를 사용하고 입력 중 하나를 정수로만 변환하여 11 바이트로이 를 수행 할 수 있습니다. 바이트 수에 할당.
얽히고 설킨

2
PPCG에 오신 것을 환영합니다! 이름이없는 함수는 c=괜찮아서 필요하지 않으며 , 카레도 괜찮아서 a=>b=>...대신 사용할 수 있습니다 (a,b)=>. 마지막으로 JavaScript가 약간 녹슬지 만 비슷한 !(a-b)것이 작동 한다고 생각 합니까?
Martin Ender

1
참고 항목 ES6에서 골프에 대한 팁을 (그리고 일반 JS는 팁을 골프 짜기에 더 많은 트릭은) 솔루션 밖으로 바이트.
얽히고 설킨

1
멋진 버전은 시원하지만 범위가 제한되어 있으므로 '9123456789'및 '533522197'을 입력하십시오. 이것들은 정수 값의 문자열 표현이며, 자바 스크립트에서 유효한 정수 범위 안에 있지만 (32 비트 이상)
edc65

1
텍스트가 더 이상 코드와 일치하지 않습니다. 빼기가 없습니다. aunary로 숫자 유형으로 강제하고 +있습니다.
Peter Cordes


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문자열을 숫자로 변환하거나 그 반대로 변환하여 모든 공백과 선행 0을 제거합니다. 또한 -첫 번째 숫자 바로 앞에있는 경우 음수를 처리 합니다. 그런 Equal's Corner다음 두 값을 서로 확인 Writer's Depot하고 출력을 문자열 형식으로 제공합니다. 결과는 1진실되고 0거짓입니다.


1
좋은 것! 호기심 때문에 디버그 창에 메시지가 표시되는 이유는 error: The boss couldn't find your taxi in the garage. You're fired!무엇입니까?
Charlie

6
@Charlie Taxi는 경로가 끝나면 택시 차고로 다시 운전해야합니다. 차를 다시 가져 오지 않으면 해고됩니다. (또한 매번 중지하고 연료를 보급해야합니다. 그렇지 않으면 가스가 부족합니다.) STDERR 로의 출력을 허용하지 않는 코드 골프 문제 에서는 일반적으로 해고 될 염려가 없습니다. 직업을 잃고 싶지 않다면 다음을 추가하여 오류를 제거 할 수 있습니다.Go to Taxi Garage:n 1 r 1 l 1 r.
Engineer Toast

이 답변과 그 의견은 완전히 초현실적입니다. 나는이 공동체를 좋아한다.
오른쪽 다리

@RightLeg 내가 작성한 가장 좋아하는 택시 프로그램 은 2 주가 걸렸고 많은 디버깅 작업이 필요했습니다. 그래도 여행을 원하십니까? 셰익스피어를 확인하십시오 .
엔지니어 토스트

10

C (gcc) , 27 바이트

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

With -O0(기본 설정)입니다.

온라인으로 사용해보십시오!

C, 32 바이트

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

온라인으로 사용해보십시오!


2
@Charlie C에서 문자열은의 배열이며 char함수에 배열을 전달하면 실제로 배열의 첫 번째 요소에 포인터를 전달합니다. 여기서 char배열에 대한 포인터 는 함수에 전달 될 때 암시 적으로 정수로 변환되고를 호출하면 정수가 포인터로 다시 변환됩니다 atoi.
Steadybox

1
포인터가 int보다 넓은 플랫폼에서 끔찍하게 날려 버릴 수 있습니다 ... 단지 말하면 사이트 표준에 적합합니다 :)
Felix Palmen

2
s=foo;대신에 우스꽝스러운 쓰레기를 사용하려면 return foo;이 코드는 구현 아티팩트 이외의 값을 반환하지 않기 때문에 "C"뿐만 아니라 "최적화가 비활성화 된 x86 gcc"로 레이블을 지정해야합니다.
Peter Cordes

2
나는 실제로 고장이 s=retval;아닌 아키텍처가 있는지 확인하려고 갔다 return retval;. 그것은 (와 GCC의 내부 로직과 같은 -O0실제로 반환 값으로 마지막 표현을 취급 만), 어쩌면 같은 방법으로 하는 GNU C 문장 표현의 작품. (하지만 필요합니다 s=). ARM32에서는 ==결과를에서 계산 r3한 다음 추가 mov r0, r3값을 사용하여 반환 값을 만듭니다! 따라서 x86 관련 해킹이 아니며 gcc -O0gcc가 지원 하지 않는 해킹입니다.
Peter Cordes

2
@ KenY-N C 코드 골프의 요점을 모두 잃어 버렸습니다. 휴대용 경험을 제공하지 않고 최소의 코드를 입력하고 원하는 결과를 얻을 수있는 특정 해키 엣지 사례를 찾는 것입니다.

8

J , 4 바이트

=&do

평가 =후 비교하십시오 . 온라인 으로 사용해 볼 수도 있습니다 !&do=&".


흥미롭게도 이것은 다른 언어가 이해하는 -10것처럼 부정적인 것 (예 _10:)과 모나 딕의 -작동 방식으로 인해 이해하는 부정적인 것 (예 :) 모두에 효과적입니다.
cole

6

레티 나 , 11 바이트

.+
$*
D`
¶$

온라인으로 사용해보십시오!

입력은 줄 바꿈으로 구분되지만 테스트 스위트는 편의를 위해 쉼표 구분을 사용합니다. 인쇄물1평등과 0불평등을 위해 합니다 .

설명

.+
$*

각 줄을 단항으로 변환하십시오. 선행 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

Alice , 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 bytes

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

Similar to the JavaScript answer, just longer because PowerShell doesn't have currying. Uses + to cast the first string to integer, and then the -equals automatically casts the second string to integer. Output is True/False.

Try it online!


3

PowerShell, 19 bytes

$args-join'-eq'|iex

Try it online!

-join the argument array ($args) with the string representation of the comparison operator (-eq) then evaluate the expression with Invoke-Expression (iex).


Interesting. I wonder how you get by without needing to cast to integer, whereas mine breaks if I remove the + since it's doing string equality checking.
AdmBorkBork

@AdmBorkBork because I'm essentially generating PowerShell code and then executing it, and since leading zeroes and leading/trailing spaces don't matter for the interpreter, it "just works". If the 2 numbers are 00009 and 077 then the resultant code is 00009 -eq077 , a perfectly valid piece of code. You're dealing directly with the string at runtime, so you must cast it first so the operation is done on a numeric.
briantist

Right, yes, that makes sense. Thanks for the explanation.
AdmBorkBork

3

Q (Kdb+), 13 bytes

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

Explanation

(x;y) : a list of the two inputs.

"J"$ : casting each input to a long (7j) type from string (10c), which can correctly interpret
white space and leading 0s.

=/ : checks equality over elements in a list (each subsequent pair).
As there is only one pair, returns single boolian 0b/1b.


Welcome to PPCG! Usually, a link to an online interpreter/compiler is appreciated, and if not obvious, an explanation as well.
FantaC

Thanks! Explanation added there. I doubt there is an online interpreter for q, I did a quick look and couldn't find one.
Sidney

I would say that this should be written as a lambda including the curly braces, i.e. {=/["J"$(x;y)]} for 15 bytes... Although for 8 bytes you could have this: (~/)"J"$ if you are just using the REPL and passing the inputs as a list of strings... or {(~/)"J"$x} for 11 as a function.
streetster

3

T-SQL, 35 bytes

Per our standards, data is input via pre-existing table t with varchar fields a and b.

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

Returns 1 if they match, 0 if they don't.

A few of SQL's mathematical functions (including ABS, FLOOR and CEILING) will do an implicit conversion to numeric if given string parameters, this is shorter than an explicit CAST(a AS INT) or CONVERT(INT,b), and works in this case since we know the input values are always positive.

IIF is specific to MS SQL 2012 and above, so no guarantee about other implementations.


3

Excel VBA, 27 16 Bytes

-9 Thanks to @Nayrb and @TaylorScott

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

Where you input the values on the Cells with 'string.

Where x and y are the input Strings and z is a Boolean output.

If CInt(x)=CInt(y) Then z=1

Using CInt


1
Why not: z=x-y=0?
Nayrb

Unfortunately this solution is invalid as it does not take input and rather relies on having predefined values (which has been deemed against the community's rules) and outputing to a variable (which is also against community rules)
Taylor Scott

As for a valid solution perhaps a vbe immediate window function such as ?[Int(A1)=Int(B1)] that takes input from the ranges A1 and B1 and outputs to the VBE immediate window
Taylor Scott




2

Gema, 21 characters

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

No boolean in Gema. As the @get-switch{}/@set-switch{} functions use 0 and 1 to represent switch statuses, also used 0 and 1.

The 2 strings are passed on separate input lines.

Sample run:

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 bytes

Same@Map&:N

Try it online!

This takes an array of strings, such as V["0001", "1 "]. Simply stated, Map&:N is a function that maps N over its argument, and Same checks that the array contains only equal members. (Fun fact: this function works for more than 2 string arguments.)


2

SNOBOL4 (CSNOBOL4), 42 bytes

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

Try it online!

Outputs 1 for truthy, nothing for falsey. Since (space) is the concatenation operator in SNOBOL, EVALing a number with leading/trailing spaces yields the number itself, and it also neatly takes care of any leading zeroes. EQ tests for numerical equality, conditionally setting OUTPUT to 1 on Success.


2

Sinclair ZX81/Timex TS1000/1500 BASIC, ~29 tokenized BASIC bytes

New solution thanks to Neil (thanks for the tip).

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

This solution requires user input, so enter in two strings with white spaces and/or leading zeros, or enter two strings of non-equal numeric value; 0 is false and 1 is true once line three has compared the value of each string entered.

Old solution: Sinclair ZX81/Timex TS1000/1500 BASIC, ~46 tokenized BASIC bytes

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

The actual check is done in line three, which is only ~16 tokenized BASIC bytes; so entering each test case pair using direct mode will save ~30 bytes from the listing. Note that this byte count does not include the var stack.


1
Shouldn't you use INPUT A$ and INPUT B$? Also I don't think you need the ()s.
Neil

Yes, I could use that also - I just wanted a proof of concept
Shaun Bebbers

2

APL (NARS2000), 7 bytes

=⍥⍎

Well, yes, I do know NARS2000 can't compete over Dyalog here since it uses Unicode, but I thought I'd rather show off (called Composition in NARS2000, even though it's actually unrelated to function composition), something Dyalog doesn't have as a built-in and I haven't ever seen used here. In Dyalog, it has to be implemented as {(⍵⍵⍺)⍺⍺⍵⍵ ⍵}. What it does is call the right operand monadic function on both the left and right argument, and then call the left operand dyadic function on the results.

Here, the right operand is (Execute, i.e. eval) and the left operand is = (Equal To, i.e. check if its arguments are equal).


Are composition and execute supposed to render as whitespace?
John Dvorak

@JohnDvorak um, no? They're not whitespace, the second char is U+2365 APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS and the third is U+234E APL FUNCTIONAL SYMBOL DOWN TACK JOT.
Erik the Outgolfer

@JohnDvorak Whatever font you're viewing this in may not have symbols for those codepoints.
Οurous

@Οurous I highly suspect that's the case too, but if you're using well-updated software you shouldn't have any problem viewing such chars.
Erik the Outgolfer
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.