พิจารณาว่า Strings เท่ากันหรือไม่


29

งานของคุณคือง่าย ตรวจสอบว่าหนึ่งสายเท่ากับอื่น ๆ (ไม่ใช่ที่อยู่ค่า) โดยไม่ต้องใช้ของผู้ประกอบการความเท่าเทียมกัน (เช่น==, ===หรือ.equal()) หรือความไม่เท่าเทียมกัน ( !=, !==) อะไรที่คล้ายกันสำหรับภาษาอื่น ๆ ซึ่งหมายความว่าทุกที่! คุณไม่สามารถใช้โอเปอเรเตอร์เหล่านี้ได้ทุกที่ในรหัส คุณอาจจะ แต่คุณใช้สลับเช่นที่คุณไม่ได้โดยตรงเปรียบเทียบ!expexp != with something else

นอกจากนี้คุณไม่สามารถใช้ฟังก์ชั่นใด ๆ เช่นstrcmp , strcasecmpเป็นต้น

ในฐานะที่เป็นผู้ประกอบการเปรียบเทียบ ( >=, <=, >, <) พวกเขายังไม่ได้รับอนุญาต ฉันรู้ว่าคำตอบบางอย่างรวมถึงสิ่งนี้ แต่ฉันอยากเห็นคำตอบเพิ่มเติมที่ไม่ได้ทำให้ผู้ปฏิบัติงานเสมอภาคกัน


ตัวอย่างการใช้ PHP จะแสดง:

<?php

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

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

return -count($tmp) + 2;

เพียงแค่คืนค่าจริงหรือเท็จ (หรือบางสิ่งที่ประเมินในภาษาเป็นจริงหรือเท็จเช่น 0 หรือ 1) เพื่อระบุว่าสตริงตรงกันหรือไม่ สตริงควรจะ hardcoded เห็นในตัวอย่างข้างต้น ไม่ควรนับรวมสตริงในกอล์ฟดังนั้นหากคุณประกาศตัวแปรก่อนมือไม่นับการประกาศ


1
จำเป็นหรือไม่ที่จะต้องแสดงผลลัพธ์หรือเพียงแค่เขียนฟังก์ชั่นเพื่อคืนค่าบูล หากจำเป็นต้องเขียนโปรแกรมแบบสมบูรณ์นั่นอาจทำให้เกิดคำตอบในภาษาที่มีความหมายสำเร็จรูป (ค่อนข้าง) สำเร็จรูปเพื่อสร้างปฏิบัติการที่สามารถใช้งานได้เช่น Java และ C # (เช่นลักษณะของสัตว์ร้าย แต่ความท้าทายนี้มีน้อยมาก ของแนวทางที่เป็นรูปธรรมทำให้มีการตีความ / การเลือกมาก) และเราจะรับสายได้อย่างไร? Hardcoding อ่านจาก STDIN ส่งผ่านอาร์กิวเมนต์บรรทัดคำสั่งหรือไม่
Tony Ellis

นี่คือ [code-golf] หรือ [popular-competition] หรือไม่ มันไม่สามารถเป็นได้ทั้งคู่
Gareth

ขออภัยฉันได้แก้ไขคำถามเพื่อสะท้อนความคิดเห็นทั้งสอง
David Chen

ดังนั้นความไม่เท่าเทียมจึงได้รับอนุญาต?
user80551

หากสตริงจะฮาร์ดโค้ดมากกว่าหนึ่งครั้ง (แต่ละอัน) ฉันต้องนับความยาวของมันหรือไม่?
user80551

คำตอบ:


34

Python 49 45 18 22 15 14

(+3 ถ้าพิจารณาตัวแปรสตริง)

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

สตริงควรฮาร์ดโค้ดที่เกิดขึ้นสองครั้งaและเกิดขึ้นครั้งเดียวในbเครื่องหมายคำพูด

aและbควรถูกเตรียมข้อมูลเบื้องต้นให้กับสตริง


Python shell, 9

(+3 ถ้าพิจารณาตัวแปรสตริง)

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

เอาต์พุตในเชลล์

>>> 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
>>> 

คำอธิบาย

สร้าง dict (ตารางแฮช) ด้วยคีย์ของสตริงตัวแรกและตัวที่สอง หากสตริงที่สองเหมือนกันค่าแรกจะถูกแทนที่ด้วยสตริงที่สอง สุดท้ายเราจะพิมพ์ค่าของคีย์แรก

แก้ไข: OP อนุญาต 0/1 แทน False / True รวมถึงการใช้ตัวแปรที่กำหนดค่าเริ่มต้นไว้แล้ว


@ manatwork Golfscript และ perl ด้านล่างใช้ 0/1 ฉันไม่สามารถใช้มันได้หรือไม่
user80551

@manatwork Done
user80551

ฉันนับ 16 แทน 13 สำหรับวิธีแก้ปัญหาที่สองของคุณ
Abhijit

@Abhijit aและbจะไม่รวมสตริงควรฮาร์ดโค้ดที่นั่นนั่นเป็นเหตุผลที่ฉันเพิ่ม + 2 * len (str1) + len (str2) + 6 (')
user80551

+1 สำหรับความฉลาด แต่นี่ไม่ใช่สิ่งที่สั้นที่สุดอีกต่อไป;)
avalancha

20

Python ( 17 11):

b in a in b

(ตรวจสอบว่ามีขใน a และ a อยู่ใน b หรือไม่ถ้าไม่ชัดเจนจากโค้ด)

ทางเลือกหลาม: ( 8 7)

มาจากวิธีแก้ปัญหาของ Tom Verelst's:

b in[a]

โบนัส: ใช้ได้กับทุกประเภท

แก้ไข:

รอสักครู่เพิ่งอ่านว่าคุณยังสามารถเขียนโปรแกรมโดยตรงในสตริงและไม่ต้องนับคำพูด ... (หรืออย่างน้อยที่สุดสิ่งที่ golfscript ทำ) ดังนั้น ... Python เทียบกับ golfscript เหรอ? พุทโธ่!

ทางเลือกอื่น Python ( 5 4):

(ขอบคุณ Claudiu)

"string"in["string"]

เดิม:

"string" in["string"]

ทางเลือกทางเลือกทางเลือกโก่ง -Ruly Python (2):

"string"is"string"

ไม่มีการพูดเกี่ยวกับคำหลักเปรียบเทียบ(นี่ไม่ใช่การส่งที่ร้ายแรงเพียงบางสิ่งที่เกิดขึ้นกับฉัน ... )


2
b in a in bคุณสามารถใช้ และไม่จำเป็น ...
George

2
ตอนนี้มันเป็นซ้ำของคำตอบของวิลเล็ม
จัดการ

คุณจะได้รับมันลงไปเจ็ดตัวละครโดยการลบช่องว่างระหว่างและin [a]เช่นb in[a]ควรทำงาน
user3002473

โอ้ไม่รู้ด้วยซ้ำว่า ขอบคุณ :)
Marıʇǝɥʇuʎs

ที่น่าประทับใจ! อีกทั้งยังไม่รู้ด้วยซ้ำว่า
วิลเล็ม

14

JavaScript, 11 10

ต้องเก็บสายอักขระไว้ใน a และ b

!(a>b|a<b)

แก้ไข: ขอบคุณ Danny สำหรับการชี้ให้เห็น|ก็เพียงพอแล้ว||


5
ไม่ฉันใช้มากกว่าตัวดำเนินการน้อยกว่า สิ่งเหล่านั้นไม่ได้ถูกห้ามในการแข่งขัน
Adam Szabo

2
+1 สิ่งนี้จะทำงานเหมือนกันในหลายภาษาเช่นกัน
เทพพอล

3
ฉันอาจจะผิด แต่คุณไม่สามารถลบได้|หรือไม่
Danny

3
กฎการกำกับดูแลแน่นอน - ฟังก์ชั่นการเปรียบเทียบถูกแบนเช่นเดียวกับผู้ประกอบการความเท่าเทียมกันและความไม่เท่าเทียมกันแต่ผู้ประกอบการเปรียบเทียบไม่ได้กล่าวถึง
user2357112 รองรับ Monica

2
@philcolbourn ใช่กฎมีการเปลี่ยนแปลงเมื่อวานนี้ แต่คำตอบคือ 2 วัน
Bakuriu

8

ทับทิม, 11

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

ตรวจสอบว่าแต่ละสายมีอยู่ภายในอื่น ๆ


1
!(a<b||b<a)จะเหมือนกัน ...
David Herrmann

ยกเว้นคุณไม่สามารถใช้ <>
philcolbourn

8

Python - 11 (ไม่มีสตริง)

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

ในจิตวิญญาณเดียวกันa<=b<=aซึ่งมีเพียง 7 ตัวอักษร แม้ว่าฉันจะไม่รู้ว่าการเปรียบเทียบ<=นั้นจะถือว่าเป็น "ความไม่เท่าเทียม" หรือไม่ จากคำถามที่ปรากฏว่าการเปรียบเทียบที่ไม่ได้ตรวจสอบความเท่าเทียมกันใด ๆ <=จะถูกซึ่งจะช่วยให้
Bakuriu

ใช่เป็นคนดี @Bakuriu และฉันเห็นด้วยมันไม่ชัดเจนโดยสิ้นเชิงเมื่อมีการละเมิดกฎหรือไม่ 'ใน' หลังจากทั้งหมดยังมีคำสั่งที่เท่ากัน
วิลเล็ม

6

GolfScript (5 ตัวอักษร)

'string1''string1'].&,(

พอร์ตตรงไปตรงมาค่อนข้างยุติธรรมของการดำเนินการอ้างอิง PHP ปล่อย0(= false) บนสแต็กหากสตริงเหมือนกันหรือ1(= จริง) หากพวกเขาแตกต่างกัน


ใช้งานไม่ได้สำหรับฉัน: 1ถ้าสตริงเหมือนกันและ2หากมันแตกต่างกัน 'string1''string1'].&,1&ทำงาน
guy777

@ guy777 นี่ถือว่าสแต็กว่างเปล่าในตอนเริ่มต้น คำถามค่อนข้างคลุมเครือในส่วนของโปรแกรม คุณอาจทดสอบมันเป็นโปรแกรมทั้งหมดและเริ่มต้นด้วยสตริงว่างบนสแต็กจาก stdin
Peter Taylor

5

Javascript (45 ไบต์):

นี่เป็นอีกวิธีใน Javascript

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

พื้นที่มีความสำคัญ

ctrueควรจะเป็น


เพียง แต่!a.replace(b,'') จะถูกนับ ดังนั้นจำนวนตัวละครควรเป็น 16 จริง ๆ แล้วบางคนถึงกับนับ 14 เนื่องจากคุณสามารถระบุสตริงได้โดยตรง
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

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
คุณจะไปกับautoแทนที่จะได้const char*หรือไม่
aldo

ฉันคิดว่าใช่ แต่เนื่องจากกฎบอกว่าตัวแปรสตริงจะไม่ถูกนับเข้ากับการนับตัวละครฉันไม่ได้สนใจที่จะเล่นกอล์ฟ
mattnewport

คุณสามารถพับส่วนที่เพิ่มขึ้นในขณะทดสอบและปล่อยให้ร่างกายว่างเปล่าได้หรือไม่? และถ้าคุณไปหา c แทน c ++ ให้ลบ int ที่จุดเริ่มต้น
orion

ฉันไม่เห็นวิธีใดที่จะลดจำนวนตัวละครลงโดยการเพิ่มส่วนที่เหลือลงในขณะที่ทดสอบโดยไม่ต้องกดจุดบกพร่องเดียวกันในการเข้าถึงสตริงที่ผ่านมาในตอนท้าย คุณต้องการเพิ่ม a และ b เฉพาะเมื่อการทดสอบทั้งสองผ่าน (ทั้ง a และ b ไม่ได้ชี้ไปที่จุดสิ้นสุด null และ a เท่ากับ b) อาจมีวิธีการปรับปรุงในเรื่องนี้ แต่ฉันไม่สามารถหามัน!
mattnewport

3

coreutils: uniq -d

เพียงป้อนสองสายของคุณเป็นอินพุตมาตรฐานของไปป์และuniq -d | grep -q .จะไม่พิมพ์อะไรเลย แต่จะมีค่าส่งคืนของความสำเร็จหรือข้อผิดพลาด หากคุณต้องการพิมพ์บูลีนให้แทนที่ด้วยuniq -d | grep -c .

จำนวนตัวอักษร ฉันให้คุณนับ uniq -d|grep -q .ไม่มีช่องว่างเพิ่มเติมมี 17 ตัวอักษรในนั้น แต่เนื่องจากงานทั้งหมดจะดำเนินการโดย uniq ฉันจะบอกว่าวิธีนี้เป็น 0 ตัวอักษรใน ... uniqภาษาของตัวเอง!

ที่จริงแล้วuniq -dจะพิมพ์หนึ่งบรรทัดหากทั้งสองสายเหมือนกันและไม่มีอะไรจะแตกต่างกัน


3

ต้องเก็บสายอักขระไว้ใน a และ b จะไม่ทำงานหากเป็นnullเช่นนั้น

C #, 53

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

C #, 28

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

3

PHP - 49 ตัวอักษร

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

ไม่สามารถทำงานแบบนี้ได้: !strlen(str_replace($a,'',$b));มันควรคืน 1 ถ้าทั้งสองสายเท่ากัน?
Damir Kasipovic

@ D.Kasipovic ที่น่าสนใจ แต่ฉันคิดว่ามันล้มเหลว$a == 'foo'และ$b = 'foofoo':)
แจ็ค

จริงแล้วมัน จำกัด การแทนที่เป็นหนึ่ง!strlen(preg_replace("/{$a}/", '', $b, 1));และคือ 45 ตัวอักษร?
Damir Kasipovic

ฉันคิดว่าคุณสามารถใช้แองเคอร์แทนได้ แต่ที่สำคัญกว่านั้นคือต้องมี preg_quote () เช่นกัน :)
แจ็ค

3

APL ( 8 9)

อัปเดต: สายเก่าไม่สามารถใช้กับสายที่มีความยาวต่างกันได้

{∧/∊⌿↑⍺⍵}
  • ↑⍺⍵: สร้างเมทริกซ์ด้วยในบรรทัดแรกและบรรทัดที่สองเติมช่องว่างด้วยช่องว่าง
  • ∊⌿: สำหรับแต่ละคอลัมน์ดูว่าแถวบนมีแถวล่าง (เช่นเดียวกับในเวอร์ชั่นเก่า)
  • ∧/: ใช้ตรรกะandของค่าทั้งหมด

อันเก่า:

{∧/⍺∊¨⍵}
  • ⍺∊¨⍵: สำหรับการรวมกันขององค์ประกอบในแต่ละและดูว่าองค์ประกอบจากมีองค์ประกอบจาก เนื่องจากในสตริงสิ่งเหล่านี้จะเป็นอักขระเดี่ยวและสตริงมีตัวเองนี่เป็นการเปรียบเทียบอักขระแต่ละคู่โดยทั่วไป
  • ∧/: ใช้ตรรกะและของค่าทั้งหมด (ถ้าตัวละครทุกตัวตรงกันสตริงจะเท่ากัน)

3

Python 12

not({a}-{b})

วิธีนี้ใช้ชุด การลบชุดเท่า ๆ กันจะส่งผลให้ชุดว่างซึ่งมีค่าบูลีนเป็นเท็จ การลบที่จะส่งผลให้ค่า True สำหรับ a และ b เป็นสตริงที่เท่ากัน

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

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

แก้ไข: ขอบคุณ Peter Taylor ที่ชี้ให้เห็นถึงช่องว่างที่ไม่จำเป็น


สิ่งนี้ให้a="s", b="ss"อะไร?
Peter Taylor

@PeterTaylor: เนื่องจาก"s"!="ss"มันจะออกFalseมา ความไวตัวพิมพ์เล็ก - ใหญ่ยังคงอยู่ a="", b="s"มันยังทำงานสำหรับ รหัสไม่ได้แปลงสตริงเป็นชุด แต่สร้างชุดที่มีสตริง
Varicus

โอ้ไม่ได้เช่นเดียวกับ{} set()คุณสามารถบันทึก 1 อักขระโดยลบช่องว่างออก
Peter Taylor

@PeterTaylor: ขอบคุณที่ชี้ช่องว่างที่ไม่จำเป็น เทียบเท่ากับ{a} set([a])
Varicus

แล้วไงnot {a}-{b}ล่ะ
Winston Ewert

3

C - 62

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

ผ่านการทดสอบ โทรมาe(str1, str2)

ลองคิดดูถ้าคุณไม่นับchar*p,char*qซึ่งดูเหมือนว่ายุติธรรมเท่านั้นมันมีขนาด 49 ไบต์เท่านั้น :)


ยินดีต้อนรับสู่เว็บไซต์! สำหรับความท้าทายของโค้ดกอล์ฟเราขอแนะนำให้คุณตัดจำนวนไบต์ให้มากที่สุดเท่าที่จะทำได้และโพสต์จำนวนไบต์ในส่วนหัวคำตอบของคุณ ตรวจสอบเคล็ดลับสำหรับการเล่นกอล์ฟในหัวข้อCสำหรับแนวคิดที่ดีบางอย่าง
Jonathan Van Matre

คุณไม่จำเป็นจริงๆและnp nqวงหนึ่งจะทำเพราะถ้าคุณถึงจุดสิ้นสุดของหนึ่งสายก่อนที่อื่นพวกเขาจะมีค่าที่แตกต่างกัน
Peter Taylor

ขอบคุณ ฉันรู้ว่า ฉันทำงานกับเวอร์ชั่นย่อของฉัน (ด้านบน) กลับไปดูว่าฉันสามารถย่อให้สั้นลงได้อีกหรือไม่
Emmet

*p&*qอาจหยุดการวนซ้ำเร็วเกินไป (เช่น'0'&'A'==0)
ugoren

@ugoren: ถ้า*p=='0'& *q=='A'เราต้องการให้ loop หยุดก่อนเพราะเรารู้ว่าสายไม่เท่ากัน
Emmet

2

Haskell - 9

elem a[b]

โปรดทราบว่าสิ่งนี้เช่นเดียวกับหลาย ๆ รายการที่นี่เป็นเพียงการแสดงออก นี่ไม่ใช่โปรแกรม Haskell


2

Java - 162 147 ตัวอักษร

แนวคิดคือการเปรียบเทียบความแตกต่างของแต่ละไบต์ไบต์เดียวกันจะมีความแตกต่าง 0 โปรแกรมจะโยนjava.lang.ArrayIndexOutOfBoundsExceptionเมื่อไบต์แตกต่างกัน (พยายามเข้าถึงดัชนีเชิงลบ) หรือเมื่อสตริงมีความยาวแตกต่างกัน มันจะจับข้อยกเว้นและกลับ 0 (สตริงไม่เท่ากัน) หรือกลับ 1 อย่างอื่น (เท่ากับสตริง)

การบีบอัด:

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;

ปกติ:

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;

ตัวดำเนินการเปรียบเทียบมีอยู่ในลูป
ζ--

ขอบคุณ @hexafraction ฉันอัปเดตคำตอบเพื่อไม่รวม
Hopper Hunter

2

PHP

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

สคริปต์นี้อาจไม่มีโปรแกรมอรรถประโยชน์ใด ๆ แต่อย่างน้อยก็มีวิธีการเปรียบเทียบสตริง

PHP

อีกหนึ่ง:

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

1
ว้าวน่ารักมาก ๆ และการทำเช่นนี้สามารถทำให้สามารถใช้สตริงใด ๆ (พร้อมช่องว่างและ Unicode)
David Chen

2

บทที่ 7

e(A,A).

สิ่งนี้ใช้คุณลักษณะการจับคู่รูปแบบใน Prolog เพื่อรวมอาร์กิวเมนต์ 2 ข้อเข้ากับภาคแสดงซึ่งจะทดสอบอย่างมีประสิทธิภาพเท่ากับความเท่าเทียมกันเมื่อไม่มีตัวแปรที่ไม่ถูกผูกไว้

ตัวอย่างการใช้งาน:

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

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

เทคนิคการพูดพฤติกรรมของการแก้ปัญหานี้คือการที่ผู้ประกอบการรวม=/2มากกว่าที่==/2จะตรวจสอบความเท่าเทียมกันระยะ ความแตกต่างแสดงให้เห็นเมื่อเกี่ยวข้องกับตัวแปรที่ไม่ถูกผูก ในโซลูชันนี้เมื่อกำหนดตัวแปรที่ไม่ถูกผูกไว้เพรดิเคตจะส่งคืนtrueเมื่อการรวมสำเร็จ ในการเปรียบเทียบ==/2จะเปรียบเทียบลำดับของคำโดยไม่มีการรวมกัน


2

PHP, 21

อันนี้กำลังทำงานโดยใช้ตัวแปรทางอ้อม

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

หรือถ้าคุณไม่ต้องการให้มันบูล

$$a=$b;$$b;

แก้ไข : ฉันลืมจัดการกรณีที่คุณพยายามเปรียบเทียบสองสตริงว่างดังนั้นรหัสตอนนี้

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

ซึ่งคือ 21 ตัวอักษร


ฉันคาดว่าสิ่งนี้จะให้ข้อผิดพลาดเมื่อได้รับสตริงซึ่งไม่ใช่ตัวระบุที่ถูกต้อง แต่ฉันไม่แปลกใจเลย
Peter Taylor

สองปัญหา: 1. คืนค่าจริงเมื่อเปรียบเทียบ "0" และ "" 2. คืนค่าจริงเมื่อ $ b เป็นชื่อของตัวแปรที่มีอยู่ (ในตารางสัญลักษณ์ปัจจุบัน) ที่มีค่าที่แปลงเป็นจริง (เช่น "GLOBALS" หรือ "_SERVER" ในขอบเขตทั่วโลกหรือ "b" ในขอบเขตใด ๆ ) แม้ว่า $ b จะไม่เท่ากับ $ a
PleaseStand

2

CPython: 6

a is b

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

isเห็นได้ชัดว่าการใช้งานนั้นค่อนข้างน่าสงสัย แต่เนื่องจากงานเรียกร้องเป็นพิเศษว่าเราต้องกำหนดค่าความเสมอภาคมากกว่าการอ้างอิงความเท่าเทียมและisเปรียบเทียบตัวตนของวัตถุเท่านั้นฉันรู้สึกว่ามันอาจไม่ตกอยู่ในรายการผู้ประกอบการต้องห้าม

แน่นอนว่ายังมีคำถามบางอย่างที่แสดงว่าเรื่องนี้ใช้ได้จริงหรือไม่ มันใช้งานได้กับทุกระบบของฉัน แต่เฉพาะการติดตั้งใช้งานและอาจไม่ทำงานหากสตริงไม่ได้ถูกกำหนดด้วยมือในล่ามแบบโต้ตอบ


2

Mathematica / Wolfram Language ขนาด 15 ไบต์

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

อธิบายตนเองได้สวยตั้งค่าแต่ละสตริงเป็นชุดจากนั้นตรวจสอบความยาวของการรวมกันของทั้งสองชุด หากสตริงเหมือนกันส่งคืน 1 มิฉะนั้นคืนค่า 0 หากฉันอนุญาตให้ส่งกลับ '2' สำหรับ "different" และ "1" สำหรับ "เดียวกัน" ให้ลบสองไบต์


2

C 342 golfed

#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;
}

หมายเหตุ: Visual Studio บ่นหากคุณไม่ใช้วิธีการที่ปลอดภัยเช่น get_s CodeBlocks พร้อม mingw คอมไพล์โดยไม่มีคำเตือน

C 655 ไม่กอล์ฟ

รหัสสร้างผลรวมถ่วงน้ำหนักของตัวอักษรสำหรับแต่ละสตริง หากความแตกต่างเป็นศูนย์พวกเขาจะเท่ากันรวมทั้ง 2 สายว่าง:

    #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();
}

เป็นงานที่ดี แต่คุณควรเล่นกอล์ฟ
Hosch250

ฉันไม่สามารถรวบรวมผลงานของคุณ ฉันได้รับ "สัญลักษณ์ที่ไม่ได้กำหนดสำหรับสถาปัตยกรรม x86_64:" _gets_s "อ้างอิงจาก: _main ใน golf-310cf2.o ld: สัญลักษณ์ไม่พบสำหรับสถาปัตยกรรม x86_64"
Stephen Melvin

2

หลาม

มันยาวและมันก็ไม่สวย แต่นี่เป็นรายการแรกของฉัน!

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 ไบต์

ฉันถือว่าคุณไม่ได้รับอนุญาตให้ใช้ตัวดำเนินการเปรียบเทียบใด ๆ ดังนั้น<หรือ>รวม

ความคิดคือการใช้บิต XOR ในภาษาต่าง ๆ โอเปอเรเตอร์นี้มีไวยากรณ์ต่างกัน - ฉันจะแสดงตัวอย่างสำหรับ PHP ^มีมันใช้ได้กับ น่าเสียดายที่พฤติกรรมกับสตริงไม่ดีเท่าที่ควรดังนั้นคุณต้องตรวจสอบความยาวของสตริงก่อน นั่นเป็นเพราะใน PHP, xor จะดึงสตริงที่ยาวกว่าลงไปจนถึงความยาวของสตริงที่สั้นกว่า

สิ่งต่อไปคือการทำงานกับสตริงอย่างถูกต้องเพราะxorจะไม่สร้างผลลัพธ์พร้อมสำหรับการดำเนินงานเพิ่มเติมใน PHP นั่นเป็นเหตุผลที่unpack()ถูกนำมาใช้ ดังนั้นรหัสจะเป็น:

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

มันยาวกว่าตัวเลือกด้วย</ >แต่มันจะไม่ใช้มัน สิ่งที่สำคัญคือการเล่นกลประเภท PHP (อาร์เรย์ที่ว่างเปล่าจะถูกส่งไปยังfalse) หรืออาจจะมีวิธีที่ง่ายกว่าในการตรวจสอบว่าอาร์เรย์มีสมาชิกที่ไม่เป็นศูนย์หรือไม่ ( แก้ไข : ในขณะที่ฉันพิมพ์สิ่งนี้มีtrim()คำตอบที่ดีอีกข้อหนึ่งดังนั้นเราจึงสามารถกำจัดการทำงานของอาร์เรย์ได้)

แต่ฉันเชื่อว่ามีภาษาที่เราสามารถทำได้a ^ b- รับผลลัพธ์อย่างแท้จริง ถ้ามัน0(ได้รับการรักษาจากไบต์ส่งผลให้ทั้งหมด) - แล้วสตริงของเรามีค่าเท่ากัน มันง่ายมากและง่ายกว่า<หรือมากกว่า>นั้น


1

grep 14 ตัวอักษร

แน่นอนฉันนับโค้ด grep เท่านั้น สองสตริงอยู่บนสองบรรทัดติดต่อกันในอินพุต (ไปป์หรือไฟล์หรือแม้แต่เซสชันแบบโต้ตอบ)

$ 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 ตัวอักษร (หลังจากสตริงอยู่ในตัวแปร)

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

รหัสรวมถึงการมอบหมายจะเป็น:

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

1

วิธีที่บ้ามาก

เพียงเพื่อความสนุกสนาน แต่มีหลายวิธีที่ทำให้มันล้มเหลวหากมีใครคิดถึงมัน ยิ่งไปกว่านั้นอย่าลืมว่าสตริงจะดำเนินการโดยเชลล์

$ 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

ตัวอย่างที่ดีคือการเปรียบเทียบ "string" เป็นสตริงแรกและ "rm -Rf /" เป็นสตริงที่สอง เพียงตรวจสอบว่ารูทและดู: มันจะพูดว่า "จริง" แม้ว่าทั้งสองสตริงจะไม่เหมือนกัน


1

JavaScript [18 ไบต์]

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

หรือ

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

นี้จะกลับtrueถ้าa == bและถ้าfalse a =/= bตรรกะที่อยู่เบื้องหลังคือการสร้างวัตถุที่มีค่าaเป็นคุณสมบัติและส่งคืน1หรือundefinedในกรณีที่มีคุณสมบัติของbค่าหรือไม่มีอยู่ในวัตถุนั้น


กฎบอกว่าคุณได้รับอนุญาตให้ส่งคืนวัตถุที่ประเมินเป็นจริงหรือเท็จดังนั้นจึง!!ไม่จำเป็น
James_pic

@James_pic ใช่ แต่ไม่เช่นนั้นจะส่งคืน1หรือundefined(หรือวัตถุ / undefinedสำหรับกรณีที่สอง)
VisioN

ฉันตีความกฏว่าเป็นการบอกว่าค่าความจริง -y และเท็จ -y จะทำแทนความจริงและเท็จดังนั้นฉันคิดว่า 1 หรือไม่ได้นิยามนั้นดีพอ
James_pic

@James_pic ฉันแค่อยากจะเป็นในด้านความปลอดภัย :) 18-2 = 16 bytesถ้าเป็นเช่นนั้นแล้ว
VisioN

1

JavaScript [15 ไบต์]

![a].indexOf(b)

นี้จะกลับtrueถ้าa == bและถ้าfalse a =/= bสคริปต์กำลังค้นหาค่าของbในอาร์เรย์ที่มีองค์ประกอบของค่า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 ไม่ใช่สั้นที่สุด แต่จะไม่ทำงานกับตัวแปรสตริงและใช้สตริงเป็นอินพุตจากคอนโซลแทน นอกจากนี้ฉันชอบเรียงลำดับหลักซ้ำแม้ว่ามันจะไม่ใช่รุ่นสั้นที่สุด แต่แนะนำให้เลือกน้อยที่สุด


คุณไม่ต้องการช่องว่างรอบตัวดำเนินการจำนวนมาก ยกตัวอย่างเช่นสามารถเขียนเป็นchar** v char**vมีข้อยกเว้นบางอย่าง (เช่น42 / *pointer) แต่ในกรณีส่วนใหญ่สามารถลบช่องว่างได้อย่างปลอดภัยใกล้ตัวอักษรพิเศษ
Konrad Borowski

และการละทิ้งความรู้สึกมากเกินไป ไม่ได้อยู่ด้านบนวันนี้
SBI
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.