Xác định xem các chuỗi có bằng nhau không


29

Nhiệm vụ của bạn rất đơn giản . Xác định xem một chuỗi tương đương khác (không phải địa chỉ, giá trị) mà không cần dùng khai thác bình đẳng (ví dụ như ==, ===hoặc .equal()) hoặc bất bình đẳng ( !=, !==) bất cứ điều gì tương tự cho các ngôn ngữ khác. Điều này có nghĩa là bất cứ nơi nào! Bạn không thể sử dụng các toán tử này bất cứ nơi nào trong mã. Tuy nhiên, bạn có thể sử dụng các toggles !expnhư bạn không trực tiếp so sánh exp != with something else.

Ngoài ra, bạn không được sử dụng bất kỳ chức năng nào như strcmp , strcasecmp , v.v.

Đối với toán tử so sánh ( >=, <=, >, <), họ cũng không được phép . Tôi nhận ra rằng một số câu trả lời bao gồm điều này, nhưng tôi thực sự muốn thấy nhiều câu trả lời hơn không giới hạn toán tử bình đẳng.


Một ví dụ sử dụng PHP được hiển thị:

<?php

$a = 'string';
$b = 'string';

$tmp = array_unique(array($a, $b));

return -count($tmp) + 2;

Chỉ cần trả về true hoặc false (hoặc một cái gì đó đánh giá trong ngôn ngữ thành true hoặc false như 0 hoặc 1) để cho biết nếu các chuỗi khớp. Các chuỗi nên được mã hóa cứng nhìn thấy trong ví dụ trên. Các chuỗi không nên được tính trong golf, vì vậy nếu bạn khai báo biến trước khi ra tay, đừng đếm khai báo.


1
Có cần thiết phải xuất kết quả, hoặc chỉ đơn giản là viết một hàm để trả về một bool? Nếu việc viết một chương trình hoàn chỉnh là bắt buộc, điều đó có thể tạo ra hoặc trả lời bằng các ngôn ngữ có bản tóm tắt quan trọng (tương đối) để tạo ra một hàm thực thi như Java và C # (đó là bản chất của con thú, nhưng thách thức này có rất ít hướng dẫn cụ thể, để lại nhiều sự giải thích / lựa chọn). Và làm thế nào để chúng ta có được chuỗi? Mã hóa, đọc từ STDIN, chuyển qua làm đối số dòng lệnh?
Tony Ellis

Đây là [code-golf] hay [cuộc thi phổ biến]? Nó không thể là cả hai.
Gareth

Xin lỗi, tôi đã sửa đổi câu hỏi của mình để phản ánh cả hai bình luận.
David Chen

Vậy bất bình đẳng được phép?
dùng80551

Nếu các chuỗi được mã hóa nhiều lần (mỗi), tôi có phải đếm chiều dài của chúng không?
dùng80551

Câu trả lời:


34

Trăn 49 45 18 22 15 14

(+ 3 nếu các biến chuỗi được xem xét)

print{a:0,b:1}[a]

Chuỗi phải được mã hóa cứng tại hai lần xuất hiện avà một lần xuất hiện được bbao quanh bởi dấu ngoặc kép.

abnên được khởi tạo trước cho chuỗi.


Vỏ Python, 9

(+ 3 nếu các biến chuỗi được xem xét)

{a:0,b:1}[a]

Đầu ra trong vỏ

>>> a = 'string'
>>> b = 'string'
>>> {a:0,b:1}[a]
1
>>> a = 'string'
>>> b = 'stringgg'
>>> {a:0,b:1}[a]
0
>>> {'string':0,'string':1}['string']
1
>>> {'stringggg':0,'string':1}['stringggg']
0
>>> 

Giải trình

Tạo một dict (bảng băm) với khóa của chuỗi thứ nhất và thứ hai. Nếu chuỗi thứ hai giống nhau, giá trị của chuỗi thứ nhất được thay thế bằng chuỗi thứ hai. Cuối cùng, chúng tôi in giá trị của khóa đầu tiên.

EDIT: OP cho phép 0/1 thay vì Sai / Đúng cũng như sử dụng các biến được khởi tạo trước.


@manatwork Golfscript và perl bên dưới sử dụng 0/1, tôi có thể sử dụng cái đó không?
dùng80551

@manatwork Xong
user80551

Tôi đang đếm 16 thay vì 13, cho giải pháp thứ hai của bạn.
Abhijit

@Abhijit abkhông được bao gồm, các chuỗi phải được mã hóa cứng ở đó, đó là lý do tại sao tôi đã thêm + 2 * len (str1) + len (str2) + 6 (')
user80551

+1 cho thông minh nhưng đây không phải là ngắn nhất nữa;)
avalancha

20

Con trăn ( 17 11):

b in a in b

(Kiểm tra nếu b được chứa trong a và a được chứa trong b, nếu điều đó không rõ ràng trong mã.)

Con trăn thay thế: ( 8 7)

bắt nguồn từ giải pháp Go của Tom Verelst:

b in[a]

Tiền thưởng: điều này hoạt động cho bất kỳ loại.

CHỈNH SỬA:

Đợi một chút, chỉ cần đọc rằng bạn cũng có thể lập trình trực tiếp trong chuỗi và không phải đếm các trích dẫn ... (hoặc ít nhất, đó là những gì golfscript làm). Vậy ... Python ngang hàng với golf? Ôi trơi!

Python thay thế thay thế ( 5 4):

(cảm ơn

"string"in["string"]

nguyên:

"string" in["string"]

Thay thế thay thế Thay thế uốn cong Python thực sự (2):

"string"is"string"

Không có gì được nói về các từ khóa so sánh (Đây không phải là một bài viết nghiêm túc, chỉ là điều gì đó xảy ra với tôi ...)


2
Bạn có thể sử dụng b in a in b. Và không cần thiết ...
George

2
Bây giờ nó là bản sao của câu trả lời của willem .
manatwork 13/03 '

Bạn có thể giảm xuống còn bảy ký tự bằng cách xóa khoảng trắng giữa in[a]. tức là b in[a]nên làm việc.
dùng3002473

Ồ, không biết điều đó. Cảm ơn :)
Ngày

Ấn tượng! Cũng không biết rằng
Willem

14

JavaScript, 11 10

Các chuỗi phải được lưu trữ trong a và b.

!(a>b|a<b)

Chỉnh sửa: cảm ơn Daniel đã chỉ ra, |là đủ thay vì||


5
Không, tôi đang sử dụng nhiều hơn và ít hơn các nhà khai thác. Những người không bị cấm trong cuộc thi.
Adam Szabo

2
+1. Điều này cũng sẽ hoạt động giống hệt nhau trong nhiều ngôn ngữ khác.
Archetypal Paul

3
Tôi có thể sai nhưng bạn không thể loại bỏ một |?
Daniel

3
Chắc chắn một quy tắc giám sát - các chức năng so sánh bị cấm, cũng như các toán tử đẳng thức và bất đẳng thức , nhưng các toán tử so sánh không được đề cập.
user2357112 hỗ trợ Monica

2
@philcolbourn Có, quy tắc đã thay đổi ngày hôm qua nhưng câu trả lời là 2 ngày.
Bakuriu

8

Ruby, 11

s = 'string'
t = 'string'
!!s[t]&t[s]

Kiểm tra nếu mỗi chuỗi được chứa trong chuỗi khác.


1
!(a<b||b<a)sẽ giống nhau ...
David Herrmann

ngoại trừ bạn không thể sử dụng <>
philcolbourn

8

Python - 11 (không có chuỗi)

>>> a = 'ss'
>>> b = 's'
>>> a in b in a
False

Trong cùng một tinh thần: a<=b<=achỉ có 7 ký tự. Mặc dù tôi không biết liệu so sánh <=có được coi là "bất bình đẳng" hay không. Từ câu hỏi, có vẻ như bất kỳ so sánh nào không phải là kiểm tra bình đẳng đều ổn, điều đó sẽ cho phép <=.
Bakuriu

vâng, đó là một điều tốt đẹp @Bakuriu, và tôi đồng ý, nó không hoàn toàn rõ ràng khi các quy tắc có bị vi phạm hay không. 'trong' sau tất cả cũng như thế nào chứa một tuyên bố bằng nhau.
Willem

6

GolfScript (5 ký tự)

'string1''string1'].&,(

Cổng khá đơn giản của việc thực hiện tham chiếu PHP. Lá 0(= false) trên ngăn xếp nếu các chuỗi giống nhau hoặc 1(= true) nếu chúng khác nhau.


không phù hợp với tôi: 1nếu chuỗi giống nhau và 2nếu chúng khác nhau. 'string1''string1'].&,1&hoạt động
chàng777

@ guys777, điều này giả định rằng ngăn xếp trống khi bắt đầu. Câu hỏi khá mơ hồ về các đoạn chương trình. Có lẽ bạn đang kiểm tra toàn bộ chương trình và bắt đầu với một chuỗi trống trên ngăn xếp từ stdin.
Peter Taylor

5

Javascript (45 byte):

Đây là một giải pháp khác trong Javascript.

var a='string',b='string',c=!a.replace(b,'');

Không gian là quan trọng.

cnên true.


Chỉ !a.replace(b,'') được tính. Vì vậy, số lượng ký tự phải là 16. Trên thực tế, một số người thậm chí còn đếm nó 14, vì bạn có thể chỉ định chuỗi trực tiếp.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ 17/03/2016

5

C ++, 63 58 56

const char* a = "string";
const char* b = "string";
int main(){while(*a**b*!(*a^*b))++a,++b;return!(*a^*b);}

2
Bạn có thể thoát khỏi autothay vì const char*?
aldo

Tôi nghĩ là có, nhưng vì các quy tắc nói rằng các biến chuỗi không được tính vào số lượng ký tự, tôi không bận tâm đến việc đánh gôn chúng.
mattnewport

Bạn có thể gấp gia tăng vào kiểm tra trong khi và để trống cơ thể? Và nếu bạn chọn c thay vì c ++, hãy xóa int ngay từ đầu.
orion

Tôi không thấy bất kỳ cách nào để giảm số lượng ký tự bằng cách gấp số gia vào kiểm tra trong khi không gặp lỗi tương tự khi truy cập chuỗi qua cuối câu tôi đã chỉ ra trong câu trả lời C của Abhijit. Bạn chỉ muốn tăng a và b nếu cả hai phép thử đều vượt qua (cả a và b đều không trỏ đến dấu kết thúc null và a bằng b). Có lẽ có một cách để cải thiện điều này nhưng tôi không thể tìm thấy nó!
mattnewport

3

lõi: uniq -d

Chỉ cần nhập hai chuỗi của bạn làm đầu vào tiêu chuẩn của một đường ống và uniq -d | grep -q .sẽ không in gì nhưng sẽ có giá trị trả về thành công hoặc lỗi. Nếu bạn muốn in boolean, chỉ cần thay thế bằnguniq -d | grep -c .

Có bao nhiêu nhân vật? Tôi để bạn đếm; uniq -d|grep -q .không có khoảng trắng thừa có 17 ký tự trong đó, nhưng vì toàn bộ công việc được thực hiện bởi uniq, tôi sẽ nói giải pháp này là một ký tự 0 ký tự trong ... uniqngôn ngữ riêng!

Trên thực tế, uniq -dsẽ in một dòng nếu hai chuỗi giống hệt nhau và không có gì nếu khác nhau.


3

Các chuỗi phải được lưu trữ trong a và b. Sẽ không hoạt động nếu một trong hai là null.

C #, 53

string.IsNullOrEmpty(a.Replace(b,"")+b.Replace(a,""))

C #, 28

a.Contains(b)&&b.Contains(a)

3

PHP - 49 ký tự

!(strlen($a)^strlen($b)|strlen(trim($a^$b,"\0")))

Không thể làm một cái gì đó như thế này: !strlen(str_replace($a,'',$b));Nó sẽ trả về 1 nếu hai chuỗi bằng nhau?
Damir Kasipovic

@ D.Kasipovic Thú vị, nhưng tôi nghĩ nó thất bại $a == 'foo'$b = 'foofoo':)
Jack

Đúng vậy, làm thế nào về điều này sau đó, nó giới hạn thay thế thành một !strlen(preg_replace("/{$a}/", '', $b, 1));và là 45 ký tự?
Damir Kasipovic

Tôi cho rằng bạn có thể sử dụng neo thay thế, nhưng quan trọng hơn là nó cũng sẽ yêu cầu preg_quote () :)
Jack

3

APL ( 8 9)

Cập nhật: cái cũ không hoạt động cho các chuỗi có độ dài khác nhau.

{∧/∊⌿↑⍺⍵}
  • ↑⍺⍵: tạo một ma trận với trên dòng đầu tiên và trên dòng thứ hai, điền vào chỗ trống bằng khoảng trắng.
  • ∊⌿: Đối với mỗi cột, hãy xem hàng trên có chứa hàng thấp hơn không (như trong phiên bản cũ).
  • ∧/: Lấy logic andcủa tất cả các giá trị.

Người già:

{∧/⍺∊¨⍵}
  • ⍺∊¨⍵: cho mỗi kết hợp các phần tử trong , xem phần tử từ có chứa phần tử từ không . Vì trong một chuỗi, tất cả sẽ là các ký tự đơn và một chuỗi chứa chính nó, về cơ bản, đây là so sánh từng cặp ký tự.
  • ∧/: lấy logic và của tất cả các giá trị (nếu tất cả các ký tự khớp với nhau, các chuỗi bằng nhau)

3

Con trăn - 12

not({a}-{b})

Giải pháp này sử dụng bộ. Trừ các tập bằng nhau sẽ dẫn đến một tập hợp trống, có giá trị boolean là Sai. Việc phủ định điều đó sẽ dẫn đến một giá trị True cho a và b là các chuỗi bằng nhau.

>>> a="string1"
>>> b="string2"
>>> not({a}-{b})
False

>>> a="string"
>>> b="string"
>>> not({a}-{b})
True

Chỉnh sửa: Cảm ơn Peter Taylor đã chỉ ra khoảng trắng không cần thiết.


Đầu ra này cho a="s", b="ss"cái gì?
Peter Taylor

@PeterTaylor: Kể từ "s"!="ss"đó, nó sẽ xuất ra False. Trường hợp nhạy cảm cũng được bảo tồn. Nó thậm chí hoạt động cho a="", b="s". Mã không chuyển đổi chuỗi thành tập hợp, nhưng tạo tập hợp chứa chuỗi.
Varicus

Ah, {}không giống như set(). Bạn có thể lưu 1 char bằng cách xóa khoảng trắng.
Peter Taylor

@PeterTaylor: Cảm ơn bạn đã chỉ ra khoảng trắng không cần thiết. {a}tương đương với set([a]).
Varicus

Thế còn not {a}-{b}?
Winston Ewert

3

C - 62

e(char*p,char*q){for(;*p&*q&&!(*p^*q);q++,p++);return!(*p^*q);}

Thử nghiệm. Gọi nhưe(str1, str2)

Hãy nghĩ về nó, nếu bạn không đếm char*p,char*q, có vẻ như chỉ công bằng, nó chỉ có 49 byte :)


Chào mừng đến với trang web! Đối với các thử thách chơi gôn, chúng tôi khuyến khích bạn cắt càng nhiều byte từ mã của bạn càng tốt và đăng số byte trong tiêu đề câu trả lời của bạn. Kiểm tra Mẹo chơi gôn trong chủ đề C để biết một số ý tưởng hay.
Jonathan Van Matre

Bạn không thực sự cần npnq. Một vòng lặp sẽ làm được, bởi vì nếu bạn đạt đến cuối của một chuỗi trước chuỗi kia thì chúng sẽ có một giá trị khác.
Peter Taylor

Cảm ơn. Tôi nhận ra điều đó. Tôi đã làm việc trên phiên bản rút gọn của tôi (ở trên). Quay trở lại để xem nếu tôi có thể rút ngắn nó hơn nữa.
Emmet

*p&*qcó thể dừng vòng lặp quá sớm (ví dụ '0'&'A'==0)
ugoren 17/03/2016

@ugoren: Nếu *p=='0'& *q=='A', chúng tôi muốn vòng lặp dừng sớm, vì chúng tôi biết các chuỗi không bằng nhau.
Emmet

2

Haskell - 9

elem a[b]

Lưu ý rằng điều này, giống như nhiều mục ở đây, chỉ là một biểu thức. Đây không phải là một chương trình Haskell.


2

Java - 162 147 ký tự

Ý tưởng là so sánh sự khác biệt của từng byte, cùng một byte sẽ có chênh lệch 0. Chương trình sẽ đưa ra java.lang.ArrayIndexOutOfBoundsExceptionkhi các byte khác nhau (cố gắng truy cập một chỉ số âm) hoặc khi các chuỗi có độ dài khác nhau. Nó sẽ bắt ngoại lệ và trả về 0 (chuỗi không bằng) hoặc trả về 1 nếu không (chuỗi bằng).

Nén:

String a = "12345";
String b = "12345";
byte[]x=a.getBytes(),y=b.getBytes();int z,i=a.length()-b.length();try{for(byte d:x){z=d-y[i];z=x[-z*z];i++;}}catch(Exception e){return 0;}return 1;

Bình thường:

String a = "12345";
String b = "12345";
byte[] byteArrA = a.getBytes();
byte[] byteArrB = b.getBytes();

int byteDifference = 0;
int i = a.length() - b.length();

try {
    for (byte aByte : byteArrA) {
        byteDifference = aByte - byteArrB[i];
        byteDifference = byteArrA[-byteDifference*byteDifference];
        i++;
    }
} catch (Exception e){
    return 0;
}

return 1;

Toán tử so sánh tồn tại trong vòng lặp.
ζ--

Cảm ơn bạn @hexafraction, tôi đã cập nhật câu trả lời để không bao gồm chúng.
Thợ săn

2

PHP

    $string = 'string';
    isset( ${'string'} );

Kịch bản lệnh này có thể không có bất kỳ tiện ích nào, nhưng ít nhất điều này cung cấp một cách để so sánh các chuỗi.

PHP

Khác

    $string = 'something';
    $text   = 'something';
    return count( array( $string => 1 , $text => 1 ) ) % 2;

1
Wow rất đáng yêu. Và làm như thế này có thể làm cho nó có thể sử dụng bất kỳ chuỗi nào (có dấu cách và unicode).
David Chen

2

Lời mở đầu 7

e(A,A).

Điều này sử dụng tính năng khớp mẫu trong Prolog để thống nhất 2 đối số với biến vị ngữ, kiểm tra hiệu quả tương đương khi không có biến không liên kết .

Sử dụng mẫu:

?- e("abcd", "Abcd").
false.

?- e("abcd", "abcd").
true.

Về mặt kỹ thuật, hành vi của giải pháp này là của toán tử hợp nhất =/2, chứ không phải là ==/2, kiểm tra sự tương đương trong thời hạn. Sự khác biệt cho thấy khi các biến không liên kết có liên quan. Trong giải pháp này, khi biến không liên kết được cung cấp, biến vị ngữ sẽ trở lại truekhi hợp nhất thành công. Trong so sánh, ==/2sẽ so sánh thứ tự của thuật ngữ mà không thống nhất.


2

PHP, 21

Điều này là làm công việc bằng cách sử dụng biến đổi.

$$a=$b;!!$$b;

Hoặc, nếu bạn không cần nó là bool

$$a=$b;$$b;

EDIT : Tôi quên xử lý trường hợp bạn cố gắng so sánh hai chuỗi trống, vì vậy mã bây giờ là

$$a=$b;!($a.$b)||$$b;

đó là 21 ký tự.


Tôi hy vọng điều này sẽ gây ra lỗi khi đưa ra các chuỗi không phải là định danh hợp lệ, nhưng tôi ngạc nhiên là không có.
Peter Taylor

Hai vấn đề: 1. Trả về giá trị true khi so sánh "0" và "". 2. Trả về true khi $ b là tên của một biến hiện có (trong bảng ký hiệu hiện tại) có giá trị chuyển đổi thành true (ví dụ: "GLOBALS" hoặc "_SERVER" trong phạm vi toàn cầu hoặc "b" trong bất kỳ phạm vi nào), ngay cả khi $ b không bằng $ a.
Xin hãy khởi động

2

CPython: 6

a is b

>>> a = 'string'
>>> b = 'string'
>>> c = 'STRING'
>>> a is b
True
>>> a is c
False

Việc sử dụng isrõ ràng là khá đáng ngờ, nhưng vì nhiệm vụ đặc biệt kêu gọi rằng chúng tôi xác định sự bình đẳng giá trị thay vì bình đẳng tham chiếu và ischỉ so sánh danh tính đối tượng, tôi cảm thấy như nó có thể không nằm trong danh sách các nhà khai thác bị cấm.

Tất nhiên cũng có một số câu hỏi là liệu điều này có hợp lệ hay không; nó hoạt động trên tất cả các hệ thống của tôi, nhưng nó hoạt động cụ thể và có thể sẽ không hoạt động nếu các chuỗi không được xác định bằng tay trong trình thông dịch tương tác.


2

Ngôn ngữ toán học / Wolfram, 15 byte

2 - Length[{a} ∪ {b}]

Khá tự giải thích, đặt mỗi chuỗi thành một tập hợp, sau đó kiểm tra độ dài hợp nhất của hai bộ. Nếu các chuỗi giống nhau, trả về 1, nếu không trả về 0. Nếu tôi được phép trả về '2' cho "khác nhau" và '1' cho "giống nhau", hãy trừ hai byte.


2

C C đánh golf

#include <stdio.h>
#define N 100
#define P(x) printf("%s\n",x)
#define G(x) gets(x)
void e(int x){x?P("y"):P("n");}
int main(){
char s[N],t[N];char *p,*q;int r=0; int n=0,m=0;int i=1;p=s,q=t;
if((p=G(s))&&(q=G(t))){while (*p){n+=i*(int)*p;m+=i*(int)*q;i++;p++;q++;if(!(*q)){break;}}
if(!*p&!*q){if(!(m-n)){r=1;}}e(r);}
return 0;
}

Lưu ý: Visual Studio phàn nàn nếu bạn không sử dụng các phương pháp an toàn của họ, ví dụ: get_s. CodeBlocks với mingw biên dịch mà không có cảnh báo.

C 655 không chơi gôn

Mã tạo tổng số ký tự cho mỗi chuỗi. Nếu chênh lệch bằng 0 thì chúng bằng nhau, bao gồm 2 chuỗi trống:

    #include <stdio.h>
#define N 100
#define P(x) printf(x)
#define G(x) gets_s(x)

void e(int x){ x ? P("equal\n") : P("not equal\n"); }
int main()
{
    char s[N], t[N];//words
    char *p = 0, *q = 0;
    int r = 0; //result 0=false
    int n=0, m=0; //weighted sums
    int i = 1; //char pos start at 1
    if ((p=gets_s(s)) &&
        (q=gets_s(t)))
    {
        while (*p)
        {
            n += i*(int)*p;
            m += i*(int)*q;
            i++;
            p++;
            q++;
            if (!(*q)){
                break;
            }
        }

        if (!*p && !*q){ //both same length strings
            if (!(m - n)){ r = 1; } //weighted sums are equal           
        }//else r=0, false=>not equal

        e(r);
    }
    else{
        P("error\n");
    }
    getchar();
}

Công việc tốt, nhưng có lẽ bạn nên chơi nó.
Hosch250

Tôi không thể biên dịch trình của bạn. Tôi nhận được "Các biểu tượng không xác định cho kiến ​​trúc x86_64:" _gets_s ", được tham chiếu từ: _main trong golf-310cf2.o ld: biểu tượng không tìm thấy cho kiến ​​trúc x86_64"
Stephen Melvin

2

Con trăn

Nó dài và không đẹp, nhưng đây là mục đầu tiên của tôi!

def is_equal(a,b):
    i=0
    a,b=list(a),list(b)
    if len(a)>len(b):
        c=a
        lst=b
    else:
        c=b
        lst=a
    try:
        while i<len(c):
            for j in c:
                if j not in lst[i]:
                    return False
                i+=1
    except IndexError:
        return False
    return True

2

PHP, 68 byte

Tôi cho rằng bạn bị cấm sử dụng bất kỳ toán tử so sánh. Vì vậy, <hoặc >được bao gồm.

Ý tưởng là sử dụng bitcoin XOR. Trong các ngôn ngữ khác nhau, toán tử này có cú pháp khác nhau - Tôi sẽ hiển thị một ví dụ cho PHP. Có sẵn với ^. Thật không may, hành vi của nó với các chuỗi không tốt như nó có thể, vì vậy bạn sẽ cần kiểm tra độ dài chuỗi trước đó. Đó là bởi vì trong PHP, xor sẽ tước chuỗi dài hơn xuống theo chiều dài của chuỗi ngắn hơn.

Điều tiếp theo là làm việc với các chuỗi đúng cách, bởi vì một chuỗi xorsẽ không tạo ra kết quả, có sẵn cho các hoạt động tiếp theo trong PHP. Đó là lý do tại sao unpack()được sử dụng. Vì vậy, mã sẽ là:

return !(strlen($a)^strlen($b)) & !array_filter(unpack('c*', $a^$b))

Nó dài hơn tùy chọn với </ >nhưng nó sẽ không sử dụng chúng. Ngoài ra, điều quan trọng là về cách tung hứng kiểu PHP (vì vậy mảng trống sẽ được chuyển sang false). Hoặc có thể có một cách đơn giản hơn để kiểm tra xem một mảng có chứa các thành viên khác không ( Chỉnh sửa : trong khi tôi đang gõ này, có trim()một câu trả lời hay trong câu trả lời khác, vì vậy chúng tôi có thể thoát khỏi các hoạt động của mảng)

Nhưng tôi tin rằng có những ngôn ngữ, nơi chúng ta có thể làm chỉ a ^ b- theo nghĩa đen, nhận được kết quả. Nếu nó 0(được xử lý từ tất cả các byte kết quả) - thì các chuỗi của chúng ta bằng nhau . Nó rất dễ dàng và thậm chí đơn giản hơn <hoặc nhiều >thứ.


1

grep 14 ký tự

Tất nhiên, tôi chỉ đếm mã grep; hai chuỗi nằm trên hai dòng liên tiếp trong đầu vào (có thể là ống hoặc tệp hoặc thậm chí là phiên tương tác).

$ echo -e 'string\nstring' | grep -cPzo "(?s)^(\N*).\1$"
1
$ echo -e 'string\nstring1' | grep -cPzo "(?s)^(\N*).\1$"
0
$ echo -e 'string1\nstring' | grep -cPzo "(?s)^(\N*).\1$"
0

1

Matlab: 12 ký tự (sau khi chuỗi có trong biến)

~(x*x'-y*y')

Mã bao gồm các bài tập sẽ là:

x='string1'
y='string2'
~(x*x'-y*y')

1

Cách rất điên rồ

Chỉ để cho vui, nhưng nhiều cách để làm cho nó thất bại nếu người ta nghĩ về nó. Hơn nữa, đừng quên các chuỗi sẽ được THỰC HIỆN bởi vỏ.

$ echo -e 'string\nstring1' | sed -e '1s/^/#define /' | cpp | sh 2>/dev/null && echo true
$ echo -e 'string\nstring' | sed -e '1s/^/#define /' | cpp | sh 2>/dev/null && echo true
true
$ echo -e 'string1\nstring' | sed -e '1s/^/#define /' | cpp | sh 2>/dev/null && echo true

Một ví dụ phản biện tốt là so sánh "chuỗi" là chuỗi thứ nhất và "rm -Rf /" là chuỗi thứ hai; chỉ cần kiểm tra bằng root và xem: nó sẽ nói "true" mặc dù cả hai chuỗi rõ ràng không giống nhau.


1

JavaScript [18 byte]

(_={})[a]=1,!!_[b]

HOẶC LÀ

!!((_={})[a]=_)[b]

Điều này sẽ trở lại truenếu a == bfalsenếu a =/= b. Logic đằng sau là tạo ra một đối tượng có giá trị anhư một thuộc tính và trả về 1hoặc undefinedtrong trường hợp nếu một thuộc tính có bgiá trị tồn tại hoặc không tồn tại trong đối tượng đó.


Các quy tắc nói rằng bạn được phép trả lại một đối tượng đánh giá là đúng hoặc sai, vì vậy điều đó !!là không cần thiết
James_pic 20/03/2016

@James_pic Vâng, nhưng nếu không, nó sẽ trả về 1hoặc undefined(hoặc đối tượng / undefinedcho trường hợp thứ hai).
VisioN

Tôi đã giải thích các quy tắc khi nói rằng các giá trị thật-y và false-y sẽ thay thế cho đúng và sai, vì vậy tôi nghĩ rằng 1 hoặc không xác định là đủ tốt.
James_pic

@James_pic Tôi chỉ muốn ở bên an toàn :) Nếu vậy, thì 18-2 = 16 bytes.
VisioN

1

JavaScript [15 byte]

![a].indexOf(b)

Điều này sẽ trở lại truenếu a == bfalsenếu a =/= b. Kịch bản đang tìm kiếm giá trị của btrong mảng chứa một phần tử giá trị duy nhất của a.


1

C - 86 83

main(int i,char**v){return*v[1]&!(*v[1]++^*v[2]++)?main(3,v):!(*--v[1]^*--v[2]);}

Obvioulsy không phải là ngắn nhất, nhưng điều này không hoạt động với các biến chuỗi và thay vào đó lấy các chuỗi làm đầu vào từ bàn điều khiển. Ngoài ra, tôi giống như chính đệ quy, ngay cả khi nó rõ ràng không phải là phiên bản ngắn nhất. Nhưng chắc chắn là ít khuyên nhất.


Bạn không cần không gian xung quanh nhiều nhà khai thác. Ví dụ, char** vcó thể được viết là char**v. Có một số trường hợp ngoại lệ (như 42 / *pointer), nhưng trong hầu hết các trường hợp, không gian có thể được xóa an toàn gần các ký tự đặc biệt.
Konrad Borowski

Và một lời xin lỗi quá nhiều. Không phải trên đầu ngày hôm nay.
SBI
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.