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 !exp
karena 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.
Jawaban:
Python
49 45 18 22 1514(+ 3 jika variabel string dipertimbangkan)
String harus dikodekan pada dua kejadiana
dan satu kejadianb
dikelilingi oleh tanda kutip.a
danb
harus diinisialisasi dengan string.Kulit ular sanca, 9
(+ 3 jika variabel string dipertimbangkan)
Output dalam shell
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
sumber
a
danb
tidak termasuk, string harus hard-coded di sana, itu sebabnya saya menambahkan + 2 * len (str1) + len (str2) + 6 (')Python (
1711):(Memeriksa apakah b terkandung dalam a dan a terkandung dalam b, jika itu tidak jelas dari kode.)
Python alternatif: (
87)berasal dari solusi Tom Verelst's Go:
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 (
54):(terima kasih Claudiu)
asli:
Alternatif Alternatif Alternatif Bendy-ruly Python (2):
Tidak ada yang dikatakan tentang kata kunci perbandingan (Ini bukan pengiriman serius, hanya sesuatu yang terjadi pada saya ...)
sumber
b in a in b
. Dan tidak diperlukan ...in
dan[a]
. yaitub in[a]
harus bekerja.JavaScript,
1110String harus disimpan dalam a dan b.
Sunting: terima kasih Danny untuk menunjukkan,
|
sudah cukup bukan||
sumber
|
?Ruby, 11
Cek apakah setiap string terkandung di dalam yang lain.
sumber
!(a<b||b<a)
akan sama ...Python - 11 (tanpa string)
sumber
a<=b<=a
yang 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<=
.GolfScript (5 karakter)
Port implementasi PHP referensi yang cukup mudah. Meninggalkan
0
(= false) pada tumpukan jika string sama, atau1
(= benar) jika berbeda.sumber
1
jika senarnya sama, dan2
jika mereka berbeda.'string1''string1'].&,1&
worksJavascript (45 byte):
Berikut ini solusi lain dalam Javascript.
Ruang itu penting.
c
seharusnyatrue
.sumber
!a.replace(b,'')
dihitung. Jadi jumlah karakter harus 16. Sebenarnya, beberapa orang bahkan menghitungnya 14, karena Anda dapat menentukan string secara langsung.C ++,
635856sumber
auto
bukanconst char*
?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 ...uniq
bahasa sendiri!Sebenarnya,
uniq -d
akan mencetak satu baris jika dua string identik, dan tidak ada jika berbedasumber
String harus disimpan dalam a dan b. Tidak akan berfungsi jika keduanya
null
.C #, 53
C #, 28
sumber
PHP - 49 karakter
sumber
!strlen(str_replace($a,'',$b));
Seharusnya mengembalikan 1 jika dua string sama?$a == 'foo'
dan$b = 'foofoo'
:)!strlen(preg_replace("/{$a}/", '', $b, 1));
dan 45 karakter?APL (
89)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 logikaand
semua 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)sumber
Python - 12
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.
Sunting: Terima kasih kepada Peter Taylor karena menunjukkan ruang kosong yang tidak perlu.
sumber
a="s", b="ss"
?"s"!="ss"
, itu akan ditampilkanFalse
. Sensitivitas kasus juga dipertahankan. Bahkan berhasila="", b="s"
. Kode tidak mengonversi string menjadi set, tetapi membuat set yang berisi string.{}
tidak sama denganset()
. Anda dapat menyimpan 1 char dengan menghapus spasi.{a}
setara denganset([a])
.not {a}-{b}
?C - 62
Diuji. Sebut sebagai
e(str1, str2)
Kalau dipikir-pikir, jika Anda tidak menghitung
char*p,char*q
, yang tampaknya hanya adil, itu hanya 49 byte :)sumber
np
dannq
. Satu loop akan berhasil, karena jika Anda mencapai akhir satu string sebelum yang lain mereka akan memiliki nilai yang berbeda.*p&*q
dapat menghentikan loop terlalu dini (mis.'0'&'A'==0
)*p=='0'
&*q=='A'
, kami ingin loop berhenti lebih awal, karena kami tahu string tidak sama.Haskell - 9
Perhatikan bahwa ini, seperti banyak entri di sini, hanyalah sebuah ekspresi. Ini bukan program Haskell.
sumber
Java -
162147 karakterIdenya adalah untuk membandingkan perbedaan setiap byte, byte yang sama akan memiliki perbedaan 0. Program akan melempar
java.lang.ArrayIndexOutOfBoundsException
ketika 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:
Normal:
sumber
PHP
Skrip ini mungkin tidak memiliki utilitas apa pun, tetapi setidaknya ini menyediakan cara untuk membandingkan string.
PHP
Yang lain:
sumber
Prolog 7
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:
Secara teknis, perilaku solusi ini adalah perilaku operator unifikasi
=/2
, bukan perilaku==/2
yang memeriksa kesetaraan istilah. Perbedaannya menunjukkan ketika variabel tidak terikat terlibat. Dalam solusi ini, ketika variabel tidak terikat disediakan, predikat akan kembalitrue
ketika penyatuan berhasil. Sebagai perbandingan,==/2
akan membandingkan urutan istilah tanpa penyatuan.sumber
PHP, 21
Yang ini melakukan pekerjaan dengan menggunakan tipuan variabel.
Atau, jika Anda tidak membutuhkannya menjadi bool
EDIT : Saya lupa menangani case di mana Anda mencoba membandingkan dua string kosong, jadi kodenya sekarang
yaitu 21 karakter.
sumber
CPython: 6
Penggunaan
is
ini jelas sangat mencurigakan, tetapi karena tugas tersebut secara khusus menyebutkan bahwa kita akan menentukan kesetaraan nilai daripada kesetaraan referensi, danis
hanya 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.
sumber
Bahasa Mathematica / Wolfram, 15 byte
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.
sumber
C 342 bermain golf
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:
sumber
Python
Ini panjang dan tidak indah, tetapi ini adalah entri pertama saya!
sumber
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
xor
tidak akan menghasilkan hasil, tersedia untuk operasi lebih lanjut di PHP. Itu sebabnyaunpack()
digunakan. Jadi, kodenya adalah:Ini lebih panjang dari opsi dengan
<
/>
tetapi tidak akan menggunakannya. Juga, yang penting adalah tentang juggling jenis PHP (jadi array kosong akan dilemparkan kefalse
). Atau mungkin ada cara yang lebih sederhana untuk memeriksa apakah array berisi anggota yang bukan nol ( Edit : saat saya mengetik ini, ada tangkapan yang bagustrim()
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. Jika0
(diperlakukan dari semua byte yang dihasilkan) - maka string kami sama . Ini sangat mudah dan bahkan lebih sederhana daripada<
atau>
semacamnya.sumber
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).
sumber
Matlab: 12 karakter (setelah string dalam variabel)
Kode termasuk tugas adalah:
sumber
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.
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.
sumber
JavaScript [18 byte]
ATAU
Ini akan mengembalikan
true
jikaa == b
danfalse
jikaa =/= b
. Logika di belakang adalah menciptakan objek dengan nilaia
sebagai properti dan mengembalikan1
atauundefined
dalam kasus jika propertib
nilai ada atau tidak ada di objek itu.sumber
!!
itu tidak perlu1
atauundefined
(atau objek /undefined
untuk kasus kedua).18-2 = 16 bytes
.JavaScript [15 byte]
Ini akan mengembalikan
true
jikaa == b
danfalse
jikaa =/= b
. Script sedang mencari nilaib
dalam array yang menampung satu elemen nilaia
.sumber
C -
8683Obvioulsy 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.
sumber
char** v
dapat ditulis sebagaichar**v
. Ada beberapa pengecualian (seperti42 / *pointer
), tetapi dalam kebanyakan kasus spasi dapat dihapus dengan aman di dekat karakter khusus.