So sánh hai số được cho dưới dạng chuỗi


21

Tôi có một vấn đề trong công việc. Tôi cần so sánh hai số đến dưới dạng chuỗi từ hai cơ sở dữ liệu khác nhau. Các con số có thể đi kèm với các số 0 đứng đầu và / hoặc khoảng trắng đầu / cuối. Vì vậy, tôi có thể có "0001 "từ một cơ sở dữ liệu và " 1 "từ cơ sở dữ liệu khác.

Tôi đã giải quyết vấn đề trong C # với đoạn mã sau:

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

Các thách thức

Đây là một thử thách thực sự đơn giản, phù hợp cho người mới bắt đầu và bất kỳ loại ngôn ngữ bí truyền nào. Cho hai số là các chuỗi có thể đi kèm với các số 0 đứng đầu và / hoặc khoảng trắng hàng đầu / dấu, hãy viết mã ngắn nhất để kiểm tra xem hai chuỗi có đại diện cho cùng một số không.

  • Các đầu vào cần phải là hai chuỗi hoặc tương đương trong ngôn ngữ của bạn (một mảng char là OK) và chúng sẽ luôn đại diện cho các giá trị nguyên lớn hơn 0.
  • Đầu ra phải là bất kỳ hai giá trị nhất quán nào đại diện cho một giá trị trung thực và giá trị falsey.

Ví dụ

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

Đây là , vì vậy có thể mã ngắn nhất cho mỗi ngôn ngữ sẽ giành chiến thắng!



8
Ít nhất nó không được truyền cảm hứng bởi những đứa trẻ của bạn lần này ...
caird coinheringaahing

2
@cairdcoinheringaahing công việc của riêng tôi là nguồn cảm hứng thứ hai của tôi. Tôi biết đây là một thử thách rất đơn giản, nhưng tôi nghĩ đôi khi những thử thách dễ dàng này cũng cần thiết. Tôi sẽ cố gắng đưa ra một cái gì đó khó khăn hơn vào lần tới.
Charlie

Nhân tiện, có vẻ như những thử thách lấy cảm hứng từ công việc của tôi quá dễ hoặc quá khó ...
Charlie

@Jonathan ALLan không, mỗi chuỗi đầu vào sẽ chỉ đại diện cho một số. Sẽ không có bất kỳ khoảng trống nào giữa các chuỗi.
Charlie

Câu trả lời:


22

Javascript , 11 byte

a=>b=>+a==b

Lạm dụng quy tắc truyền của Javascript một chút; +aép buộc athành một loại số.

-6 byte nhờ ShaggyMartin Ender ♦

Cũng là một tuyệt vời của LiefdeWen :

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

2
Chào mừng đến với PPCG. Bạn có thể thực hiện điều này trong 11 byte bằng cách sử dụng currying và chỉ bằng cách chuyển đổi một trong các đầu vào thành một số nguyên: tio.run/##y0osSyxOLsosKNHNy09J/. Lưu ý rằng, trừ khi một hàm tham chiếu chính nó, bạn không cần bao gồm biến gán trong số byte của bạn.
Xù xì

2
Chào mừng đến với PPCG! Các chức năng không tên là tốt, do đó bạn không cần c=, và cà ri cũng tốt để bạn có thể sử dụng a=>b=>...thay vì (a,b)=>. Cuối cùng, JavaScript của tôi hơi bị rỉ sét, nhưng tôi nghĩ một cái gì đó như thế !(a-b)cũng sẽ hoạt động?
Martin Ender

1
Xem các mẹo để chơi gôn trong ES6 (và các mẹo chơi gôn chung của JS ) để biết thêm các thủ thuật để loại bỏ byte khỏi các giải pháp của bạn.
Xù xì

1
Phiên bản tuyệt vời thú vị nhưng có giới hạn về phạm vi, hãy thử nhập '9123456789' và '533522197'. Đây là sự xuất hiện chuỗi của các giá trị số nguyên, nằm trong phạm vi số nguyên hợp lệ trong javascript (nhưng hơn 32 bit)
edc65

1
Văn bản của bạn không còn phù hợp với mã; không có phép trừ. Bạn đang ép buộc avới một loại số với unary +.
Peter Cordes


18

Hoạt động ngôn ngữ kịch bản Flashpoint , 33 byte

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

Gọi với:

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]

Đầu ra:

Phiên bản thay thế (41 byte):

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

Vẫn ngắn hơn 5 byte so với đơn giản hơn f={t=_this;call(t select 0)==call(t select 1)}

39 byte:

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

count(trả về kích thước của một mảng) hoạt động thay vì forEach, bởi vì bạn có thể cung cấp cho nó một "lambda" được sử dụng như một điều kiện để chỉ đếm các phần tử mảng đáp ứng điều kiện đó. "Điều kiện" được sử dụng trong trường hợp này không phải là điều kiện hợp lệ, nhưng nó không quan trọng ở đây vì nó không gây ra lỗi và giá trị trả về của countkhông cần thiết.


7
Tôi thích nhiều tình huống bạn chụp ảnh màn hình mã của bạn.
urous

11

Taxi , 488 byte

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.

Hãy thử trực tuyến!

Ung dung:

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.

Taxi (tương đối) rất phù hợp với thử thách này bởi vì chuỗi là loại đầu vào hoặc đầu ra duy nhất được phép. The Babelfisherylà những gì chuyển đổi chuỗi thành số (và ngược lại) và nó xử lý tước tất cả các khoảng trắng và số 0 đứng đầu. Nó cũng sẽ xử lý các số âm nếu -là ngay trước chữ số đầu tiên. Sau đó, Equal's Cornerkiểm tra hai giá trị với nhau và Writer's Depotcung cấp đầu ra ở định dạng chuỗi. Đầu ra là 1cho sự thật và 0cho falsey.


1
Đẹp quá Vì tò mò, tại sao cửa sổ gỡ lỗi hiển thị thông báo error: The boss couldn't find your taxi in the garage. You're fired!?
Charlie

6
@Charlie Taxi yêu cầu bạn lái xe trở lại gara taxi khi bạn hoàn thành tuyến đường của mình. Nếu bạn không mang xe trở lại, bạn sẽ bị đuổi việc. (Bạn cũng phải chắc chắn dừng lại và tiếp nhiên liệu mọi lúc hoặc sau khi hết xăng.) Trong các câu hỏi về môn đánh gôn không cho phép xuất ra STDERR, tôi thường không lo lắng về việc bị đuổi việc. Bạn có thể thêm phần này để loại bỏ lỗi nếu bạn không muốn mất việc:Go to Taxi Garage:n 1 r 1 l 1 r.
Kỹ sư Toast

Câu trả lời này và ý kiến ​​của nó là hoàn toàn siêu thực. Tôi yêu cộng đồng này.
Chân phải

@RightLeg Chương trình Taxi yêu thích của tôi Tôi đã viết mất hai tuần và rất nhiều gỡ lỗi. Bạn thực sự muốn một chuyến đi, mặc dù? Kiểm tra Shakespeare .
Kỹ sư Toast

10

C (gcc) , 27 byte

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

Với -O0(đó là cài đặt mặc định).

Hãy thử trực tuyến!

C, 32 byte

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

Hãy thử trực tuyến!


2
@Charlie Trong C, các chuỗi là các mảng charvà khi bạn truyền một mảng cho một hàm, bạn thực sự chỉ cần chuyển con trỏ đến phần tử đầu tiên của mảng. Ở đây, các con trỏ tới các charmảng được chuyển đổi hoàn toàn thành các số nguyên khi được truyền cho hàm và các số nguyên được chuyển đổi trở lại thành các con trỏ khi gọi atoi.
Steadybox

1
có thể nổ tung khủng khiếp trên một nền tảng nơi con trỏ rộng hơn ints ... chỉ cần nói, tất nhiên là tốt cho các tiêu chuẩn trang web ở đây :)
Felix Palmen

2
Nếu bạn muốn sử dụng crap vô lý như s=foo;thay vì return foo;bạn cần phải gắn nhãn này là "x86 gcc với tối ưu hóa bị vô hiệu hóa", không chỉ là "C", bởi vì mã này không trả về giá trị ngoại trừ như một vật phẩm triển khai.
Peter Cordes

2
Tôi đã đi tìm xem có kiến ​​trúc nào s=retval;thay vì return retval;thực sự bị phá vỡ không. Có vẻ như logic bên trong của gcc ( -O0chỉ có) thực sự coi biểu thức cuối cùng là giá trị trả về, có thể giống như cách mà biểu thức câu lệnh GNU C hoạt động. (Nhưng nó đòi hỏi s=). Trên ARM32, nó tính toán ==kết quả r3và sau đó sử dụng một phần phụ mov r0, r3để làm cho giá trị trả về đó! Vì vậy, đây không phải là một bản hack dành riêng cho x86, đây là một bản gcc -O0hack mà gcc dường như không còn hỗ trợ.
Peter Cordes

2
@ KenY-N Bạn đang thiếu toàn bộ điểm của mã golf c. Đó là về việc tìm kiếm các trường hợp cạnh hacky cụ thể đó, nơi bạn có thể nhập số lượng mã tối thiểu và nhận được kết quả bạn muốn, không cung cấp trải nghiệm di động.

8

J , 4 byte

=&do

So sánh =sau khi &đánh giá do. Cũng có thể là=&". thử trực tuyến!


Điều thú vị là điều này sẽ hoạt động cho cả hai tiêu cực vì các ngôn ngữ khác hiểu chúng (ví dụ -10) và tiêu cực khi J hiểu chúng (ví dụ _10) do cách thức -hoạt động của đơn âm .
cole

6

Võng mạc , 11 byte

.+
$*
D`
¶$

Hãy thử trực tuyến!

Đầu vào được phân tách dòng, nhưng bộ kiểm tra sử dụng phân tách dấu phẩy để thuận tiện. In 1cho bình đẳng và 0bất bình đẳng.

Giải trình

.+
$*

Chuyển đổi từng dòng thành unary. Điều này bỏ qua các số không và không gian hàng đầu.

D`

Ded repeatate: xóa dòng thứ hai nếu cả hai giống nhau.

¶$

Kiểm tra xem chuỗi bây giờ kết thúc trong một nguồn cấp dữ liệu.




3

Tam giác , 17 byte

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

Hãy thử trực tuyến!

Tam giác là, cho một lần, cạnh tranh!

Làm thế nào nó hoạt động

Tam giác yêu cầu mã phải có phân bố tam giác của các chấm. Nghĩa là, độ dài của mỗi hàng phải bằng số hàng nhân với 2 và giảm dần và mỗi hàng phải có (ở mỗi bên) một số dấu chấm bằng với vị trí của nó trong chương trình (hàng dưới cùng là hàng 0, cái ở trên nó là hàng 1 và cứ thế). Hãy ghi nhớ điều này, hãy phân tích cách thức hoạt động của mã:

..).. || 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 byte

X/n
o@i

Hãy thử trực tuyến!

Bất kỳ dấu tách không chữ số hoạt động. In 1cho bình đẳng và 0khác.

Giải trình

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

Japt , 3 byte

¥Vn

Thử nó

Chuyển đổi đầu vào thứ hai thành một số nguyên và so sánh bằng với đầu tiên.





3

PowerShell , 20 byte

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

Tương tự như câu trả lời JavaScript, chỉ lâu hơn vì PowerShell không có cà ri. Sử dụng +để truyền chuỗi đầu tiên thành số nguyên, và sau đó-eq uals tự động chuyển chuỗi thứ hai thành số nguyên. Đầu ra là Đúng / Sai.

Hãy thử trực tuyến!


3

PowerShell , 19 byte

$args-join'-eq'|iex

Hãy thử trực tuyến!

-joinmảng đối số ( $args) với biểu diễn chuỗi của toán tử so sánh ( -eq) sau đó đánh giá biểu thức với Invoke-Expression( iex).


Hấp dẫn. Tôi tự hỏi làm thế nào bạn có được bằng cách không cần chuyển sang số nguyên, trong khi tôi phá vỡ nếu tôi loại bỏ +vì nó đang kiểm tra tính bằng nhau của chuỗi.
admBorkBork

@AdmBorkBork vì về cơ bản tôi đang tạo mã PowerShell và sau đó thực thi nó, và vì các số 0 đứng đầu và khoảng trắng hàng đầu không quan trọng đối với trình thông dịch, nên "nó chỉ hoạt động". Nếu 2 số là 00009 077 mã kết quả là 00009 -eq077 , một đoạn mã hoàn toàn hợp lệ. Bạn đang xử lý trực tiếp chuỗi trong thời gian chạy, vì vậy bạn phải truyền chuỗi đó trước để thao tác được thực hiện trên một số.
briantist

Phải, đúng, điều đó có ý nghĩa. Cảm ơn đã giải thích.
admBorkBork

3

Q (Kdb +), 13 byte

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

Giải trình

(x; y): danh sách hai đầu vào.

"J" $: chuyển từng đầu vào thành một loại dài (7j) từ chuỗi (10c), có thể diễn giải chính xác
khoảng trắng và 0 đầu.

= /: kiểm tra sự bằng nhau trên các phần tử trong danh sách (mỗi cặp tiếp theo).
Vì chỉ có một cặp, trả về boolian đơn 0b / 1b.


Chào mừng đến với PPCG! Thông thường, một liên kết đến một trình thông dịch / trình biên dịch trực tuyến được đánh giá cao, và nếu không rõ ràng, một lời giải thích là tốt.
FantaC

Cảm ơn! Giải thích thêm vào đó. Tôi nghi ngờ có một thông dịch viên trực tuyến cho q, tôi đã xem nhanh và không thể tìm thấy.
Sidney

Tôi sẽ nói rằng điều này nên được viết dưới dạng lambda bao gồm các dấu ngoặc nhọn, tức là {=/["J"$(x;y)]}cho 15 byte ... Mặc dù đối với 8 byte bạn có thể có điều này: (~/)"J"$nếu bạn chỉ sử dụng REPL và chuyển các đầu vào dưới dạng danh sách các chuỗi .. hoặc {(~/)"J"$x}cho 11 là một hàm.
streetster

3

T-SQL, 35 byte

Theo tiêu chuẩn của chúng tôi , dữ liệu được nhập thông qua bảng có sẵn tvới varcharcác trường ab.

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

Trả về 1nếu chúng khớp, 0nếu chúng không.

Một vài trong số các hàm toán học SQL (bao gồm ABS, FLOORCEILING) sẽ làm một chuyển đổi ngầm để số nếu được thông số chuỗi, đây là ngắn hơn so với một rõ ràng CAST(a AS INT)hoặcCONVERT(INT,b) , và các công trình trong trường hợp này vì chúng tôi biết các giá trị đầu vào luôn tích cực.

IIF là dành riêng cho MS SQL 2012 trở lên, vì vậy không có gì đảm bảo về việc triển khai khác.


3

VBA Excel, 27 16 byte

-9 Cảm ơn @Nayrb và @TaylorScott

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

Nơi bạn nhập các giá trị trên các ô với 'string.

Ở đâu xylà đầu vào Strings và zlà một đầu ra Boolean.

Nếu CInt (x) = CInt (y) thì z = 1

Sử dụng CInt


1
Tại sao không: z = xy = 0?
Nayrb

Thật không may, giải pháp này không hợp lệ vì nó không lấy đầu vào và thay vào đó dựa vào việc có các giá trị được xác định trước ( được coi là trái với quy tắc của cộng đồng ) và xuất ra một biến ( cũng trái với quy tắc cộng đồng )
Taylor Scott

Đối với một giải pháp hợp lệ có lẽ một vbe ngay lập tức chức năng cửa sổ như ?[Int(A1)=Int(B1)]rằng có đầu vào từ các dãy A1B1và đầu ra phía cửa sổ ngay lập tức VBE
Taylor Scott




2

Gema , 21 ký tự

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

Không có boolean trong Gema. Như@get-switch{}@set-switch{} hàm / sử dụng 0 và 1 để biểu thị trạng thái chuyển đổi, cũng được sử dụng 0 và 1.

2 chuỗi được truyền trên các dòng đầu vào riêng biệt.

Chạy mẫu:

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

Tùy viên , 11 byte

Same@Map&:N

Hãy thử trực tuyến!

Điều này có một loạt các chuỗi, chẳng hạn như V["0001", "1 "]. Nói một cách đơn giản, Map&:Nlà một hàm ánh xạ Nđối số của nó và Samekiểm tra xem mảng chỉ chứa các thành viên bằng nhau. (Sự thật thú vị: hàm này hoạt động với hơn 2 đối số chuỗi.)


2

SNOBOL4 (CSNOBOL4) , 42 byte

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

Hãy thử trực tuyến!

Kết quả 1 cho sự thật, không có gì cho falsey. Vì (dấu cách) là toán tử ghép trong SNOBOL, nên EVALmột số có khoảng trắng ở đầu / cuối sẽ tự tạo ra số đó và nó cũng chăm sóc gọn gàng cho bất kỳ số 0 đầu nào. EQkiểm tra sự bằng nhau về số, đặt điều kiện thành OUTPUT1 trên Success.


2

Sinclair ZX81 / Timex TS1000 / 1500 BASIC, ~ 29 byte BASIC được mã hóa

Giải pháp mới nhờ Neil (cảm ơn vì tiền boa).

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

Giải pháp này yêu cầu đầu vào của người dùng, vì vậy hãy nhập hai chuỗi có khoảng trắng và / hoặc các số 0 đứng đầu hoặc nhập hai chuỗi có giá trị số không bằng nhau; 0là sai và1 đúng khi dòng ba đã so sánh giá trị của mỗi chuỗi được nhập.

Giải pháp cũ: Sinclair ZX81 / Timex TS1000 / 1500 BASIC, ~ 46 byte BASIC được mã hóa

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

Việc kiểm tra thực tế được thực hiện trong dòng ba, chỉ có ~ 16 byte BASIC được mã hóa; vì vậy, nhập từng cặp trường hợp thử nghiệm bằng chế độ trực tiếp sẽ tiết kiệm ~ 30 byte từ danh sách. Lưu ý rằng số byte này không bao gồm var stack.


1
Bạn không nên sử dụng INPUT A$INPUT B$? Ngoài ra tôi không nghĩ rằng bạn cần ()s.
Neil

Vâng, tôi cũng có thể sử dụng điều đó - tôi chỉ muốn một bằng chứng về khái niệm
Shaun Bebbers

2

APL (NARS2000) , 7 byte

=⍥⍎

Vâng, vâng, tôi biết NARS2000 không thể cạnh tranh với Dyalog ở đây vì nó sử dụng Unicode, nhưng tôi nghĩ rằng tôi muốn thể hiện hơn (được gọi là Thành phần trong NARS2000, mặc dù nó thực sự không liên quan đến thành phần chức năng), nhưng điều gì đó Dyalog không có sẵn như là một tích hợp và tôi chưa từng thấy được sử dụng ở đây. Trong Dyalog, nó phải được thực hiện như {(⍵⍵⍺)⍺⍺⍵⍵ ⍵}. Những gì nó làm là gọi hàm đơn thức toán hạng bên phải trên cả đối số bên trái và bên phải, và sau đó gọi hàm toán hạng bên trái trên các kết quả.

Ở đây, toán hạng bên phải là ( Thực thi , tức là eval) và toán hạng bên trái là =( Bằng , nghĩa là kiểm tra xem các đối số của nó có bằng nhau không).


Là thành phần và thực hiện được cho là để hiển thị như khoảng trắng?
John Dvorak

@ JohnDvorak um, không? Chúng không phải là khoảng trắng, char thứ hai là U + 2365 APL CHỨC NĂNG CHẨN ĐOÁN CHỨC NĂNG APL và thứ ba là U + 234E APL FUNCTIONAL SYMBOL DOWN TACK JOT.
Erik the Outgolfer

@JohnDvorak Bất cứ phông chữ nào bạn đang xem này có thể không có biểu tượng cho các điểm mã đó.
Οurous

@ Οurous Tôi rất nghi ngờ đó là trường hợp quá, nhưng nếu bạn đang sử dụng phần mềm được cập nhật tốt, bạn không nên có bất kỳ vấn đề nào khi xem các ký tự như vậy.
Erik the Outgolfer
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.