Dua kata adalah isomorf jika mereka memiliki pola pengulangan huruf yang sama. Misalnya keduanya ESTATE
dan DUELED
punya polaabcdca
ESTATE
DUELED
abcdca
karena huruf 1 dan 6 sama, huruf 3 dan 5 sama, dan tidak lebih jauh. Ini juga berarti kata-kata tersebut terkait dengan sandi pengganti, di sini dengan pencocokan E <-> D, S <-> U, T <-> E, A <-> L
.
Tulis kode yang membutuhkan dua kata dan periksa apakah isomorfnya. Bytes paling sedikit menang.
Input: Dua string huruf kapital yang tidak kosong A..Z
. Jika mau, Anda dapat mengambil ini sebagai kumpulan dua string atau sebagai string tunggal dengan pemisah.
Keluaran: Nilai kebenaran yang konsisten untuk pasangan yang isomorf, dan nilai Falsey yang konsisten jika tidak. String dengan panjang berbeda adalah input yang valid yang tidak pernah isomorf.
Kasus uji:
Benar:
ESTATE DUELED
DUELED ESTATE
XXX YYY
CBAABC DEFFED
RAMBUNCTIOUSLY THERMODYNAMICS
DISCRIMINATIVE SIMPLIFICATION
Salah:
SEE SAW
ANTS PANTS
BANANA SERENE
BANANA SENSES
AB CC
XXY XYY
ABCBACCBA ABCBACCAB
ABAB CD
Jangan ragu untuk menambahkan lebih banyak test case yang menurut Anda berguna.
Papan peringkat
Berikut ini adalah Stack Snippet untuk menghasilkan leaderboard biasa dan gambaran umum pemenang berdasarkan bahasa.
Untuk memastikan bahwa jawaban Anda muncul, silakan mulai jawaban Anda dengan tajuk utama, menggunakan templat Penurunan harga berikut:
# Language Name, N bytes
di mana N
ukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda bisa menyimpan skor lama di headline, dengan mencoretnya. Misalnya:
# Ruby, <s>104</s> <s>101</s> 96 bytes
ABAB CD
Jawaban:
J, 4 byte
Pemakaian
Penjelasan
=
dengan 1 argumen menciptakan tabel kesetaraan yang membandingkan elemen input dan nubnya.-:
dengan 2 argumen memeriksa kesetaraan mereka (seperti==
umumnya dilakukan). Ini berfungsi untuk matriks ukuran yang berbeda (atau bahkan tipe yang berbeda) juga.f&g
berlaku g untuk kedua input secara terpisah dan kemudian berlaku f untuk dua hasil secara bersamaanx f&g y == f(g(x), g(y))
.Jadi dalam kasus kami, kami membandingkan dua tabel kesetaraan.
Cobalah online di sini.
sumber
&
, hal terdekat yang bisa Anda lakukan di K mungkin~/{x=/:x}'
, yang sedikit lebih baik.=
memiliki kegunaan lain selain untuk menghitung kejadian.K, 5 byte
Ini memiliki solusi elegan yang menyenangkan di K!
Operator "grup" (monadik
=
) justru menciptakan tanda tangan yang kita inginkan untuk kata isomorfisme; mengumpulkan vektor indeks setiap elemen vektor, dengan kelompok-kelompok yang diurutkan berdasarkan penampilan:Mengambil sepasang string sebagai vektor, kita hanya perlu menerapkan grup ke setiap elemen (
=:'
) dan kemudian menguranginya dengan "match" (~
), operator kesetaraan mendalam:sumber
Python 2, 41 byte
sumber
CJam, 9 byte
Mencetak
1
jika kata-katanya adalah isomorf dan0
jika tidak.Cobalah online di juru bahasa CJam .
Bagaimana itu bekerja
sumber
JavaScript, ES7,
62 55 54 5251 byteLogikanya sederhana. Saya hanya mengkonversi kedua input ke nilai indeks karakter yang sesuai, mengubah array itu menjadi string dan membandingkan.
Coba kode di atas menggunakan cuplikan di bawah ini.
Tampilkan cuplikan kode
2 byte disimpan berkat @ edc65
sumber
+0
bukan+""
?Bash + coreutils, 38
Perhatikan bahwa kami menggunakan ide shell yang biasa dari truthy / falsy di sini - nol berarti SUKSES atau BENAR dan kesalahan berarti non-nol atau SALAH:
sumber
Haskell,
3329SUNTING:
ini sudah sangat terlambat, tetapi saya menemukan peningkatan ini menggunakan pelamar, yang ditambahkan ke pembuka hanya pada Maret 2015.
Versi lama:
fungsi pemeriksaan adalah
(%)
ini bekerja dengan menghasilkan untuk setiap string "catatan kesetaraan": untuk setiap dua indeks ij, ia merekam apakah mereka memiliki karakter yang sama. catatan diperintahkan sehingga catatan untuk dua indeks i, j selalu di tempat yang sama * dan karena itu memeriksa kesetaraan catatan akan mengembalikan apakah string memiliki pola yang sama atau tidak.
misalnya, catatan kesetaraan "ABC" adalah
[1,0,0,0,1,0,0,0,1]
(1 untuk benar, 0 untuk salah) - ada diTrue
mana indeks mana pun dibandingkan dengan dirinya sendiri. di tempat lain salah. (melewatkan cek ini mungkin lebih efisien, tetapi lebih sulit dalam hal bermain golf)* jika senarnya memiliki panjang yang sama. selain itu mengembalikan false hanya karena catatan memiliki panjang yang berbeda
sumber
Haskell,
4541 bytePengembalian
True
atauFalse
, misalnya"ESTATE" ! "DUELED"
->True
.Menggunakan metode peta-char-to-first-index seperti yang terlihat di banyak jawaban lainnya. Daftar asosiasi berguna, karena entri sebelumnya truf.
"aba"
menjadi[(a,1),(b,2),(a,3)]
tempatlookup
selalu mengambila
->1
.Sunting: @Mauris ditemukan 4 byte untuk disimpan.
sumber
(flip lookup$zip l[1..])
dengan(`lookup`zip l[1..])
.Brainfuck,
169168162 162144140131130Kompatibel dengan bff Alex Pankratov (interpreter brainfuck digunakan pada SPOJ dan ideone) dan Thomas Cort's BFI (digunakan pada Anarchy Golf).
Input yang diharapkan adalah dua string yang dipisahkan oleh tab, tanpa baris baru setelah string kedua. Outputnya adalah
1
untuk isomorph dan0
non-isomorph, yang nyaman untuk memeriksa hasil secara visual, meskipun bukan pilihan terpendek. ( Pembaruan: versi yang lebih pendek dengan\x01
dan\x00
sebagai keluaran dan\x00
sebagai pemisah di bagian bawah jawaban.)Demonstrasi tentang ideone.
Masalah ini ternyata sangat bagus untuk brainfuck.
Ide dasar dengan pengindeksan adalah untuk mundur dari akhir awalan string saat ini. Jika karakter belum terjadi sebelumnya, kita bisa mengambil awalan string panjang. Sebagai contoh:
Pengindeksan dalam kode sebenarnya sedikit berbeda tetapi menggunakan prinsip yang sama.
Tata letak memori dalam blok 5:
c
singkatan karakter,i
untuk indeks, danp
untuk sebelumnya (indeks). Ketika string pertama sedang diproses, semuap
slot adalah nol. Sel di sebelah kiric
digunakan untuk menyimpan salinan karakter saat ini yang kami coba temukan indeksnya. Sel di sebelah kiri saati
ini digunakan untuk menahan-1
navigasi penunjuk yang mudah.Ada banyak kondisi yang perlu dipertimbangkan dengan cermat. Pada akhirnya, kami memeriksa isomorf dengan membandingkan
(i,p)
pasangan, dan kami mencapai gugus sel nol di sebelah kiri(i,p)
pasangan paling kiri jika dan hanya jika stringnya adalah isomorf. Berikut adalah versi kode yang dikomentari untuk membuatnya lebih mudah diikuti:Memperbarui:
Ini adalah versi yang mencetak
\x01
untuk isomorf dan\x00
non-isomorf. Ini bisa dibilang penafsiran yang lebih akurat tentang Truthy dan Falsey untuk brainfuck, karena cara[
dan]
kerjanya. Satu-satunya perbedaan adalah di bagian paling akhir.Tambahan: Sekarang menggunakan
\x00
sebagai pemisah untuk menghemat 10 byte.sumber
JavaScript (ES6), 62
Menggunakan fungsi aux
h
yang memetakan setiap kata ke array yang berisi posisi setiap huruf dalam kata, misalnya: LULUS -> [1,2,3,3]. Return true jika fungsi yangh
diterapkan kedua kata tersebut memberikan hasil yang sama.sumber
R, 78
De-golf:
sumber
all( (g=...)(x)==g(y))
lebih pendek dariidentical
...Ruby, 83 byte
Ini adalah fungsi
f
yang mengambil dua argumen dan mengembalikantrue
ataufalse
.Penjelasan:
sumber
t=->x{z=?`;x.chars.to_a.uniq.map{|c|x.gsub!(c,z.succ!)};x};f=->a,b{t[a]==t[b]}
t=->x{h={};i=9;x.gsub!(/./){|c|h[c]||h[c]=i+=1}};f=->a,b{t[a]==t[b]}
Jawa, 107
Memetakan setiap karakter
s
dant
ke lokasi, dan memeriksa kesetaraan.Diperluas:
sumber
Python 3, 85 byte
sumber
g
adalah fungsi utama,f
adalah helper. Ada pilihan variabel yang membingungkan dig
dalamf
, tetapi itu adalah variabel terikat yang tidak terkait .. Inig=
adalah opsional sesuai aturan yang memungkinkan fungsi anon, yang menyimpan dua karakter. 'Pyth, 9 byte
Mengambil input dalam bentuk berikut:
Jika itu tidak dapat diterima, kode berikut ini 10 byte:
dan menggunakan formulir input ini:
Menggunakan indeks char dalam representasi string.
sumber
F
kerjanya sebagai lipatan. Apa<binary>F
?<binary>F<seq>
yang<binary>
dilipat<seq>
. Ini setara dengan bersilangan<binary>
antara setiap pasangan elemen<seq>
. Dengan demikian,<binary>F
pada urutan 2 elemen cukup menerapkan fungsi ke urutan, setara dengan.*
Pyth atau*
Python.Q
jejak itu tersirat dalam Pyth?Matlab, 50 byte
Fungsi ini didefinisikan sebagai anonim untuk menghemat ruang.
Contoh:
sumber
Oktaf, 26 byte
sumber
==
adalah kesetaraan elemen-bijaksana matriks, dan karenas
dans'
ukuran yang berbeda, "penyiaran" oktaf secara otomatis mencoba untuk mendapatkan matriks dengan ukuran yang sama untuk beroperasi - yang dalam hal ini berarti mengulangi bariss
dan koloms'
05AB1E , 6 byte
Cobalah online!
Mengambil input sebagai daftar:
['ESTATE', 'DUELED']
Penjelasan:
sumber
APL (Dyalog) ,
54 byte-1 berkat petunjuk ngn.
Fungsi awalan diam-diam anonim yang mengambil daftar dua string sebagai argumen.
Cobalah secara Online!
Ini adalah produk dalam, tetapi bukan yang biasa
+
dan×
digunakan≡
kemiripan.
dan⍳
yang ɩ ndex (kejadian pertama dari setiap elemen)⍨
dengan seluruh daftar dua elemen kata yang digunakan sebagai argumenJika kita memanggil kata
A
danB
, maka kita dapat memperoleh solusi sebelumnya sebagai berikut:≡.⍳⍨ A B
A B ≡.⍳ A B
(A⍳A) ≡ (B⍳B)
(⍳⍨A) ≡ (⍳⍨B)
≡/ ⍳⍨¨ A B
Solusi sebelumnya
Fungsi awalan diam-diam anonim yang mengambil daftar dua string sebagai argumen.
Cobalah online!
≡
kemiripan/
seberang⍳
yang ɩ ndex (kejadian pertama dari setiap elemen ...)⍨
selfie (... dalam dirinya sendiri)¨
setiapsumber
Mathematica, 46 byte
sumber
Ruby, 50 byte
30 byte lebih pendek kode ruby. Ditulis sebelum saya melihat solusinya, memeriksa setiap karakter dari kedua string apakah indeks kemunculan pertama karakter itu cocok; yaitu. mengubah string ke bentuk normalnya
01121
dll dan membandingkannya.Menguji kasus pada ideone Sebagai bonus tambahan, ini mematahkan penyorotan kode ideone.
sumber
Sekam , 5 byte
Cobalah online!
Penjelasan
sumber
PCRE, 84 byte
Subjek harus dua kata yang dipisahkan oleh spasi, seperti pada OP. Berikut penjelasan sepintas:
sumber
Ruby, 31 byte
Seorang Proc yang mengambil serangkaian string dan memeriksa apakah ada isomorfik satu sama lain.
tr s,'a-z'
dengan argumen ini menormalkan strings
dengan mengganti setiap huruf dengan huruf ke-n dalam alfabet, di manan
adalah indeks terbesar dengan mana huruf itu muncul dalam string. Misalnya,estate
menjadifbedef
, seperti halnyadueled
.sumber
Cobra, 72 byte
sumber
AB CC
kasus uji False?JavaScript (ES5),
14298Cukup besar, tapi saya belum melihat versi ES5.
for(l=j=2;j--;){c=prompt();for(i=c.length;i--;)c=c.replace(RegExp(c[i],"g"),i);b=l==c;l=c}alert(b)
Cukup ganti setiap kemunculan huruf pertama dengan nilai indeks baliknya. Ulangi ini untuk setiap karakter.
Itu melakukan hal yang sama untuk kedua input dan membandingkan pola yang dihasilkan.
Perbandingannya cukup jelek, tetapi saya tidak ingin menggunakan array untuk menyimpan dan membandingkannya.
sumber
;l=c
kefor(l=j=2;j--;
dan menyimpan byte?Perl, 38 byte
Jalankan sebagai
perl -E '($_,$a)=@ARGV;eval"y/$_/$a/";say$_~~$a' RAMBUNCTIOUSLY THERMODYNAMICS
Mencetak 1 jika benar, tidak ada jika salah.
sumber
Common Lisp, 76 byte
Cobalah online!
sumber
C ++,
213196162 byte-51 byte terima kasih kepada Zacharý
Untuk memanggil lambda, Anda harus melewati 2 argumen yang merupakan
std::string
tipe dataKode untuk diuji:
untuk kode yang diuji, termasuk
iostream
danstring
file header diperlukansumber
e
argumen sebagaifind
, ya, itu berfungsiJavaScript (ES6),
525150 byteVersi ini tidak menggunakan pemahaman array, dan mengambil input menggunakan sintaks currying.
Tampilkan cuplikan kode
sumber