Tentukan apakah String sama

29

Tugas Anda sederhana . Menentukan apakah satu string sama dengan yang lain (bukan alamat, nilai) tanpa menggunakan operator kesetaraan (seperti ==, ===, atau .equal()) atau ketidaksetaraan ( !=, !==) sesuatu yang serupa untuk bahasa lain. Ini artinya di mana saja! Anda tidak boleh menggunakan operator ini di mana pun dalam kode. Namun Anda dapat, Anda menggunakan matikan seperti !expkarena Anda tidak secara langsung membandingkan exp != with something else.

Selain itu, Anda tidak boleh menggunakan fungsi apa pun seperti strcmp , strcasecmp , dll.

Adapun operator perbandingan ( >=, <=, >, <), mereka juga dianulir . Saya menyadari bahwa beberapa jawaban termasuk ini, tetapi saya benar-benar ingin melihat lebih banyak jawaban yang tidak membatasi operator kesetaraan.


Contoh menggunakan PHP ditunjukkan:

<?php

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

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

return -count($tmp) + 2;

Cukup kembalikan benar atau salah (atau sesuatu yang mengevaluasi dalam bahasa menjadi benar atau salah seperti 0 atau 1) untuk menunjukkan apakah string cocok. String harus hardcoded yang terlihat pada contoh di atas. String tidak boleh dihitung dalam golf, jadi jika Anda mendeklarasikan variabel sebelumnya, jangan menghitung deklarasi.

David Chen
sumber
1
Apakah perlu untuk menampilkan hasilnya, atau hanya menulis fungsi untuk mengembalikan bool? Jika menulis program yang lengkap diperlukan, itu bisa membuat atau memecahkan jawaban dalam bahasa dengan pelat relatif (relatif) untuk membuat executable yang berfungsi seperti Java dan C # (seperti sifat binatang itu, tetapi tantangan ini tidak banyak berpengaruh pedoman konkret, meninggalkan banyak interpretasi / pilihan). Dan bagaimana kita mengambil senarnya? Hardcoding, membaca dari STDIN, lulus sebagai argumen baris perintah?
Tony Ellis
Apakah ini [golf kode] atau [kontes popularitas]? Tidak mungkin keduanya.
Gareth
Maaf, saya telah memodifikasi pertanyaan saya untuk mencerminkan kedua komentar.
David Chen
Jadi ketimpangan diperbolehkan?
user80551
Jika string harus dikodekan lebih dari satu kali (masing-masing), apakah saya harus menghitung panjangnya?
user80551

Jawaban:

34

Python 49 45 18 22 15 14

(+ 3 jika variabel string dipertimbangkan)

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

String harus dikodekan pada dua kejadian adan satu kejadian bdikelilingi oleh tanda kutip.

adan bharus diinisialisasi dengan string.


Kulit ular sanca, 9

(+ 3 jika variabel string dipertimbangkan)

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

Output dalam shell

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

Penjelasan

Membuat dict (tabel hash) dengan kunci string pertama dan kedua. Jika string kedua sama, nilai pertama diganti dengan yang kedua. Akhirnya, kami mencetak nilai kunci pertama.

EDIT: OP diizinkan 0/1 bukan False / True serta menggunakan variabel pra-inisialisasi

pengguna80551
sumber
@manatwork Golfscript dan perl di bawah ini menggunakan 0/1, tidak bisakah saya menggunakannya?
user80551
@manatwork Selesai
user80551
Saya menghitung 16 bukannya 13, untuk solusi kedua Anda.
Abhijit
@Abhijit adan btidak termasuk, string harus hard-coded di sana, itu sebabnya saya menambahkan + 2 * len (str1) + len (str2) + 6 (')
user80551
+1 untuk kepintaran tetapi ini bukan yang terpendek lagi;)
avalancha
20

Python ( 17 11):

b in a in b

(Memeriksa apakah b terkandung dalam a dan a terkandung dalam b, jika itu tidak jelas dari kode.)

Python alternatif: ( 8 7)

berasal dari solusi Tom Verelst's Go:

b in[a]

Bonus: ini bekerja untuk semua jenis.

EDIT:

Tunggu sebentar, baca saja bahwa Anda juga dapat memprogram secara langsung dalam string, dan tidak perlu menghitung tanda kutip ... (atau setidaknya, apa yang dilakukan oleh skrip golf) Jadi ... Python setara dengan skrip golf? Astaga!

Alternatif alternatif Python ( 5 4):

(terima kasih Claudiu)

"string"in["string"]

asli:

"string" in["string"]

Alternatif Alternatif Alternatif Bendy-ruly Python (2):

"string"is"string"

Tidak ada yang dikatakan tentang kata kunci perbandingan (Ini bukan pengiriman serius, hanya sesuatu yang terjadi pada saya ...)

ɐɔıʇǝɥʇu
sumber
2
Anda bisa menggunakannya b in a in b. Dan tidak diperlukan ...
George
2
Sekarang ini duplikat dari jawaban willem .
manatwork
Anda dapat menurunkannya hingga tujuh karakter dengan menghapus spasi antara indan [a]. yaitu b in[a]harus bekerja.
user3002473
Oh, tidak tahu itu. Terima kasih :)
ɐɔıʇǝɥʇuʎs
Impresif! Juga tidak tahu itu
Willem
14

JavaScript, 11 10

String harus disimpan dalam a dan b.

!(a>b|a<b)

Sunting: terima kasih Danny untuk menunjukkan, |sudah cukup bukan||

Adam Szabo
sumber
5
Tidak, saya menggunakan lebih dari dan kurang dari operator. Itu tidak dilarang dalam kontes.
Adam Szabo
2
+1. Ini akan bekerja secara identik dalam banyak bahasa lain juga.
The Archetypal Paul
3
Saya mungkin salah tetapi tidak bisakah Anda menghapusnya |?
Danny
3
Jelas ada aturan pengawasan - fungsi perbandingan dilarang, seperti juga operator kesetaraan dan ketidaksetaraan , tetapi operator perbandingan tidak disebutkan.
user2357112 mendukung Monica
2
@ philcolbourn Ya, peraturan berubah kemarin tapi jawabannya 2 hari.
Bakuriu
8

Ruby, 11

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

Cek apakah setiap string terkandung di dalam yang lain.

histokrat
sumber
1
!(a<b||b<a)akan sama ...
David Herrmann
kecuali Anda tidak dapat menggunakan <>
philcolbourn
8

Python - 11 (tanpa string)

>>> a = 'ss'
>>> b = 's'
>>> a in b in a
False
Willem
sumber
Dengan semangat yang sama: a<=b<=ayang hanya 7 karakter. Meskipun saya tidak tahu apakah perbandingan <=itu akan dianggap sebagai "ketidaksetaraan". Dari pertanyaan tersebut tampak bahwa perbandingan apa pun yang bukan pemeriksaan kesetaraan tidak apa-apa, yang memungkinkan <=.
Bakuriu
ya, itu yang bagus @ Bakuriu, dan saya setuju, itu tidak sepenuhnya jelas ketika aturan dilanggar atau tidak. 'in' toh bagaimana pun juga mengandung pernyataan yang sama.
Willem
6

GolfScript (5 karakter)

'string1''string1'].&,(

Port implementasi PHP referensi yang cukup mudah. Meninggalkan 0(= false) pada tumpukan jika string sama, atau 1(= benar) jika berbeda.

Peter Taylor
sumber
tidak berfungsi untuk saya: 1jika senarnya sama, dan 2jika mereka berbeda. 'string1''string1'].&,1&works
guy777
@ guy777, ini mengasumsikan bahwa stack kosong pada awalnya. Pertanyaannya agak kabur pada fragmen program. Anda mungkin mengujinya secara keseluruhan dan mulai dengan string kosong di stack dari stdin.
Peter Taylor
5

Javascript (45 byte):

Berikut ini solusi lain dalam Javascript.

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

Ruang itu penting.

cseharusnya true.

Ismael Miguel
sumber
Hanya !a.replace(b,'') dihitung. Jadi jumlah karakter harus 16. Sebenarnya, beberapa orang bahkan menghitungnya 14, karena Anda dapat menentukan string secara langsung.
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);}
mattnewport
sumber
2
Bisakah Anda pergi dengan autobukan const char*?
aldo
Saya pikir begitu ya, tetapi karena aturan mengatakan variabel string tidak dihitung terhadap jumlah karakter saya tidak repot-repot golf mereka.
mattnewport
Bisakah Anda melipat kenaikan menjadi test sementara dan membiarkan tubuh kosong? Dan jika Anda memilih c dan bukannya c ++, hapus int di awal.
orion
Saya tidak melihat cara untuk mengurangi jumlah karakter dengan melipat kenaikan menjadi tes sementara tanpa memukul bug yang sama mengakses string melewati akhir saya tunjukkan dalam jawaban C Abhijit. Anda hanya ingin menambah a dan b jika kedua tes lulus (baik a maupun b tidak menunjuk ke terminator nol dan a sama dengan b). Mungkin ada cara untuk memperbaiki ini, tetapi saya belum dapat menemukannya!
mattnewport
3

coreutils: uniq -d

Cukup masukkan dua string Anda sebagai input standar pipa dan tidak uniq -d | grep -q .akan mencetak apa pun kecuali akan memiliki nilai balik keberhasilan atau kesalahan. Jika Anda ingin mencetak boolean, ganti saja denganuniq -d | grep -c .

Berapa banyak karakter? Aku membiarkanmu menghitung; uniq -d|grep -q .tanpa spasi tambahan memiliki 17 karakter di dalamnya, tetapi karena seluruh pekerjaan dilakukan oleh uniq, saya akan mengatakan solusi ini adalah 0-karakter satu di ... uniqbahasa sendiri!

Sebenarnya, uniq -dakan mencetak satu baris jika dua string identik, dan tidak ada jika berbeda

Thomas Baruchel
sumber
3

String harus disimpan dalam a dan b. Tidak akan berfungsi jika keduanya null.

C #, 53

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

C #, 28

a.Contains(b)&&b.Contains(a)
Adam Szabo
sumber
3

PHP - 49 karakter

!(strlen($a)^strlen($b)|strlen(trim($a^$b,"\0")))
Mendongkrak
sumber
Tidak bisakah sesuatu seperti ini berfungsi: !strlen(str_replace($a,'',$b));Seharusnya mengembalikan 1 jika dua string sama?
Damir Kasipovic
@ D.Kasipovic Menarik, tapi saya pikir itu gagal untuk $a == 'foo'dan $b = 'foofoo':)
Jack
Benar, bagaimana kalau begitu, ia batasi ganti menjadi satu !strlen(preg_replace("/{$a}/", '', $b, 1));dan 45 karakter?
Damir Kasipovic
Saya kira Anda bisa menggunakan jangkar sebagai gantinya, tetapi yang lebih penting itu akan memerlukan preg_quote () juga :)
Jack
3

APL ( 8 9)

Pembaruan: yang lama tidak berfungsi untuk string dengan panjang yang berbeda.

{∧/∊⌿↑⍺⍵}
  • ↑⍺⍵: membuat matriks dengan di baris pertama dan di baris kedua, mengisi kosong dengan spasi.
  • ∊⌿: Untuk setiap kolom, lihat apakah baris atas berisi baris bawah (seperti pada versi lama).
  • ∧/: Ambil logika andsemua nilai.

Yang lama:

{∧/⍺∊¨⍵}
  • ⍺∊¨⍵: untuk setiap kombinasi elemen di dan , lihat apakah elemen dari mengandung elemen dari . Karena dalam string semua ini akan menjadi karakter tunggal, dan string berisi dirinya sendiri, ini pada dasarnya membandingkan setiap pasangan karakter.
  • ∧/: ambil logika dan semua nilai (jika semua karakter cocok, string-stringnya sama)
marinus
sumber
3

Python - 12

not({a}-{b})

Solusi ini menggunakan set. Mengurangi set yang sama akan menghasilkan set yang kosong, yang memiliki nilai boolean dari False. Meniadakan itu akan menghasilkan nilai True untuk a dan b menjadi string yang sama.

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

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

Sunting: Terima kasih kepada Peter Taylor karena menunjukkan ruang kosong yang tidak perlu.

Varicus
sumber
Untuk apa output ini dihasilkan a="s", b="ss"?
Peter Taylor
@PeterTaylor: Karena "s"!="ss", itu akan ditampilkan False. Sensitivitas kasus juga dipertahankan. Bahkan berhasil a="", b="s". Kode tidak mengonversi string menjadi set, tetapi membuat set yang berisi string.
Varicus
Ah, {}tidak sama dengan set(). Anda dapat menyimpan 1 char dengan menghapus spasi.
Peter Taylor
@PeterTaylor: Terima kasih telah menunjukkan ruang kosong yang tidak perlu. {a}setara dengan set([a]).
Varicus
Bagaimana dengan not {a}-{b}?
Winston Ewert
3

C - 62

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

Diuji. Sebut sebagaie(str1, str2)

Kalau dipikir-pikir, jika Anda tidak menghitung char*p,char*q, yang tampaknya hanya adil, itu hanya 49 byte :)

Semut
sumber
Selamat datang di situs ini! Untuk tantangan kode-golf, kami mendorong Anda untuk memotong sebanyak mungkin byte dari kode Anda, dan memposting hitungan byte di tajuk jawaban Anda. Lihatlah Tips untuk Bermain Golf di thread C untuk beberapa ide bagus.
Jonathan Van Matre
Anda tidak benar-benar membutuhkan npdan nq. Satu loop akan berhasil, karena jika Anda mencapai akhir satu string sebelum yang lain mereka akan memiliki nilai yang berbeda.
Peter Taylor
Terima kasih. Saya menyadari itu. Saya sedang mengerjakan versi singkat saya (di atas). Kembali untuk melihat apakah saya dapat mempersingkat lebih lanjut.
Emmet
*p&*qdapat menghentikan loop terlalu dini (mis. '0'&'A'==0)
ugoren
@ugoren: Jika *p=='0'& *q=='A', kami ingin loop berhenti lebih awal, karena kami tahu string tidak sama.
Emmet
2

Haskell - 9

elem a[b]

Perhatikan bahwa ini, seperti banyak entri di sini, hanyalah sebuah ekspresi. Ini bukan program Haskell.

Rhymoid
sumber
2

Java - 162 147 karakter

Idenya adalah untuk membandingkan perbedaan setiap byte, byte yang sama akan memiliki perbedaan 0. Program akan melempar java.lang.ArrayIndexOutOfBoundsExceptionketika byte berbeda (mencoba mengakses indeks negatif) atau ketika string memiliki panjang yang berbeda. Ini akan menangkap pengecualian dan mengembalikan 0 (string tidak sama), atau mengembalikan 1 sebaliknya (string sama).

Terkompresi:

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;

Normal:

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;
Hopper Hunter
sumber
Operator pembanding ada di loop.
ζ--
Terima kasih @hexafraction, saya memperbarui jawaban untuk tidak memasukkannya.
Hopper Hunter
2

PHP

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

Skrip ini mungkin tidak memiliki utilitas apa pun, tetapi setidaknya ini menyediakan cara untuk membandingkan string.

PHP

Yang lain:

    $string = 'something';
    $text   = 'something';
    return count( array( $string => 1 , $text => 1 ) ) % 2;
Hamid Sarfraz
sumber
1
Wah, sangat indah. Dan melakukannya seperti ini dapat memungkinkan untuk menggunakan string apa pun (dengan spasi dan unicode).
David Chen
2

Prolog 7

e(A,A).

Ini memanfaatkan fitur pencocokan pola dalam Prolog untuk menyatukan 2 argumen dengan predikat, yang secara efektif menguji kesetaraan yang setara ketika tidak ada variabel tidak terikat .

Penggunaan sampel:

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

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

Secara teknis, perilaku solusi ini adalah perilaku operator unifikasi =/2, bukan perilaku ==/2yang memeriksa kesetaraan istilah. Perbedaannya menunjukkan ketika variabel tidak terikat terlibat. Dalam solusi ini, ketika variabel tidak terikat disediakan, predikat akan kembali trueketika penyatuan berhasil. Sebagai perbandingan, ==/2akan membandingkan urutan istilah tanpa penyatuan.

n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳
sumber
2

PHP, 21

Yang ini melakukan pekerjaan dengan menggunakan tipuan variabel.

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

Atau, jika Anda tidak membutuhkannya menjadi bool

$$a=$b;$$b;

EDIT : Saya lupa menangani case di mana Anda mencoba membandingkan dua string kosong, jadi kodenya sekarang

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

yaitu 21 karakter.

Flonk
sumber
Saya berharap ini memberikan kesalahan ketika diberikan string yang bukan pengidentifikasi yang valid, tetapi saya terkejut tidak.
Peter Taylor
Dua masalah: 1. Mengembalikan nilai true ketika membandingkan "0" dan "". 2. Mengembalikan nilai true ketika $ b adalah nama variabel yang ada (dalam tabel simbol saat ini) yang memiliki nilai yang dikonversi menjadi true (mis. "GLOBALS" atau "_SERVER" dalam lingkup global, atau "b" dalam ruang lingkup apa pun), bahkan ketika $ b tidak sama dengan $ a.
PleaseStand
2

CPython: 6

a is b

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

Penggunaan isini jelas sangat mencurigakan, tetapi karena tugas tersebut secara khusus menyebutkan bahwa kita akan menentukan kesetaraan nilai daripada kesetaraan referensi, dan ishanya membandingkan identitas objek, saya merasa itu mungkin tidak termasuk dalam daftar operator yang dilarang.

Tentu saja ada juga beberapa pertanyaan, apakah ini benar; ini bekerja pada semua sistem saya, tapi ini implementasi khusus dan mungkin tidak akan selalu berfungsi jika string tidak didefinisikan secara manual oleh interpreter interaktif.

Henry Keiter
sumber
2

Bahasa Mathematica / Wolfram, 15 byte

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

Cukup jelas sendiri, set setiap string sebagai set, lalu periksa panjang penyatuan dua set. Jika string sama, mengembalikan 1, jika tidak mengembalikan 0. Jika saya diizinkan mengembalikan '2' untuk "berbeda" dan '1' untuk "sama", kurangi dua byte.

Michael Stern
sumber
2

C 342 bermain 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;
}

Catatan: Visual Studio mengeluh jika Anda tidak menggunakan metode aman mereka mis. CodeBlocks dengan mingw mengkompilasi tanpa peringatan.

C 655 tidak golf

Kode menghasilkan jumlah karakter tertimbang untuk setiap string. Jika perbedaannya nol maka keduanya sama, termasuk 2 string kosong:

    #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();
}
bacchusbeale
sumber
Pekerjaan yang bagus, tetapi Anda mungkin harus membuatnya golf.
Hosch250
Saya tidak dapat menyusun kiriman Anda. Saya mendapatkan "Simbol yang tidak terdefinisi untuk arsitektur x86_64:" _gets_s ", direferensikan dari: _main in golf-310cf2.o ld: simbol tidak ditemukan untuk arsitektur x86_64"
Stephen Melvin
2

Python

Ini panjang dan tidak indah, tetapi ini adalah entri pertama saya!

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
yung galbanum
sumber
2

PHP, 68 Bytes

Saya berasumsi Anda dilarang menggunakan operator perbandingan apa pun . Begitu <atau >sudah termasuk.

Idenya adalah menggunakan bitor XOR. Dalam berbagai bahasa, operator ini memiliki sintaks yang berbeda - saya akan menunjukkan contoh untuk PHP. Itu tersedia dengan ^. Sayangnya, perilakunya dengan string tidak sebaik yang seharusnya, jadi Anda harus memeriksa panjang string sebelumnya. Itu karena dalam PHP, xor akan mengupas string yang lebih panjang hingga sepanjang string yang lebih pendek.

Hal berikutnya adalah bekerja dengan string dengan benar, karena satu xortidak akan menghasilkan hasil, tersedia untuk operasi lebih lanjut di PHP. Itu sebabnya unpack()digunakan. Jadi, kodenya adalah:

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

Ini lebih panjang dari opsi dengan </ >tetapi tidak akan menggunakannya. Juga, yang penting adalah tentang juggling jenis PHP (jadi array kosong akan dilemparkan ke false). Atau mungkin ada cara yang lebih sederhana untuk memeriksa apakah array berisi anggota yang bukan nol ( Edit : saat saya mengetik ini, ada tangkapan yang bagus trim()di jawaban lain, sehingga kita dapat menyingkirkan operasi array)

Tapi saya percaya ada bahasa, di mana kita bisa melakukan a ^ b- secara harfiah, mendapatkan hasilnya. Jika 0(diperlakukan dari semua byte yang dihasilkan) - maka string kami sama . Ini sangat mudah dan bahkan lebih sederhana daripada <atau >semacamnya.

Alma Do
sumber
1

grep 14 karakter

Tentu saja, saya hanya menghitung kode grep; dua string berada pada dua baris berturut-turut dalam input (baik pipa atau file atau bahkan sesi interaktif).

$ 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
Thomas Baruchel
sumber
1

Matlab: 12 karakter (setelah string dalam variabel)

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

Kode termasuk tugas adalah:

x='string1'
y='string2'
~(x*x'-y*y')
Dennis Jaheruddin
sumber
1

Cara yang sangat gila

Hanya untuk bersenang-senang, tetapi banyak cara untuk membuatnya gagal jika orang memikirkannya. Terlebih lagi, jangan lupa string akan dieksekusi oleh shell.

$ 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

Contoh tandingan yang baik adalah membandingkan "string" sebagai string pertama dan "rm -Rf /" sebagai string kedua; cukup periksa sebagai root dan lihat: ia akan mengatakan "benar" meskipun kedua string jelas tidak sama.

Thomas Baruchel
sumber
1

JavaScript [18 byte]

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

ATAU

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

Ini akan mengembalikan truejika a == bdan falsejika a =/= b. Logika di belakang adalah menciptakan objek dengan nilaia sebagai properti dan mengembalikan 1atau undefineddalam kasus jika properti bnilai ada atau tidak ada di objek itu.

Penglihatan
sumber
Aturan mengatakan Anda diizinkan mengembalikan objek yang bernilai benar atau salah, jadi !!itu tidak perlu
James_pic
@ James_pic Ya, tetapi jika tidak, ia akan kembali 1atau undefined(atau objek / undefineduntuk kasus kedua).
VisioN
Saya menafsirkan aturan yang mengatakan bahwa nilai kebenaran-y dan salah-y akan menggantikan nilai benar dan salah, jadi saya akan berpikir bahwa 1 atau tidak terdefinisi cukup baik.
James_pic
@ James_pic Saya hanya ingin berada di sisi yang aman :) Jika demikian, maka 18-2 = 16 bytes.
VisioN
1

JavaScript [15 byte]

![a].indexOf(b)

Ini akan mengembalikan truejika a == bdan falsejika a =/= b. Script sedang mencari nilai bdalam array yang menampung satu elemen nilai a.

Penglihatan
sumber
1

C - 86 83

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

Obvioulsy bukan yang terpendek, tetapi ini tidak bekerja dengan variabel string dan sebagai gantinya mengambil string sebagai input dari konsol. Juga, saya agak suka main rekursif, bahkan jika itu jelas bukan versi terpendek. Namun yang pasti paling tidak dianjurkan.

SBI
sumber
Anda tidak memerlukan ruang di sekitar banyak operator. Sebagai contoh, char** vdapat ditulis sebagai char**v. Ada beberapa pengecualian (seperti 42 / *pointer), tetapi dalam kebanyakan kasus spasi dapat dihapus dengan aman di dekat karakter khusus.
Konrad Borowski
Dan apersand terlalu banyak. Tidak di atas hari ini.
SBI