Periksa apakah kata-kata itu isomorf

63

Dua kata adalah isomorf jika mereka memiliki pola pengulangan huruf yang sama. Misalnya keduanya ESTATEdan DUELEDpunya 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 Nukuran 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

Tidak
sumber
Apakah panjang kedua input dijamin sama?
Pengoptimal
@Optimizer Tidak, panjangnya bisa berbeda.
xnor
@Jakube Tidak, kode Anda harus secara teori bekerja dengan input berapa pun panjangnya. Tidak apa-apa jika input besar gagal pada perangkat keras karena masalah seperti kehabisan memori atau kedalaman tumpukan.
xnor
Ok Lalu saya akan menghapus jawaban saya.
Jakube
ABAB CD
Kasing

Jawaban:

95

J, 4 byte

-:&=

Pemakaian

   'THERMODYNAMICS' (-:&=) 'RAMBUNCTIOUSLY'  NB. parens are optional
1 

Penjelasan

  • = dengan 1 argumen menciptakan tabel kesetaraan yang membandingkan elemen input dan nubnya.

    ='ESTATE' gives the binary matrix
    
    = | E S T A T E    
    --+------------
    E | 1 0 0 0 0 1
    S | 0 1 0 0 0 0
    T | 0 0 1 0 1 0
    A | 0 0 0 1 0 0
    
  • -:dengan 2 argumen memeriksa kesetaraan mereka (seperti ==umumnya dilakukan). Ini berfungsi untuk matriks ukuran yang berbeda (atau bahkan tipe yang berbeda) juga.

  • f&gberlaku g untuk kedua input secara terpisah dan kemudian berlaku f untuk dua hasil secara bersamaan x f&g y == f(g(x), g(y)).

  • Jadi dalam kasus kami, kami membandingkan dua tabel kesetaraan.

Cobalah online di sini.

randomra
sumber
2
Pendekatan yang menarik dan elegan. Tanpa setara dengan itu &, hal terdekat yang bisa Anda lakukan di K mungkin ~/{x=/:x}', yang sedikit lebih baik.
JohnE
17
Yesus. Ini harus menjadi pesaing untuk aula ketenaran codegolf.
Brian Gordon
Wow, jangan berharap mengklasifikasikan =memiliki kegunaan lain selain untuk menghitung kejadian.
mil
37

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:

  ="ABBAC"
(0 3
 1 2
 ,4)

  ="DCCDF"
(0 3
 1 2
 ,4)

Mengambil sepasang string sebagai vektor, kita hanya perlu menerapkan grup ke setiap elemen ( =:') dan kemudian menguranginya dengan "match" ( ~), operator kesetaraan mendalam:

  ~/=:'("RAMBUNCTIOUSLY";"THERMODYNAMICS")
1
  ~/=:'("BANANA";"SERENE")
0
JohnE
sumber
15

Python 2, 41 byte

f=lambda a,b:map(a.find,a)==map(b.find,b)
ygramul
sumber
4
Ini adalah solusi yang menginspirasi saya untuk membuat tantangan ini!
xnor
12

CJam, 9 byte

r_f#r_f#=

Mencetak 1jika kata-katanya adalah isomorf dan 0jika tidak.

Cobalah online di juru bahasa CJam .

Bagaimana itu bekerja

r    e# Read a whitespace separated token from STDIN.
_    e# Push a copy.
f#   e# Get the indexes of all characters from the first copy in the second.
r_f# e# Repeat for the second word.
=    e# Check for equality.
Dennis
sumber
10

JavaScript, ES7, 62 55 54 52 51 byte

f=(x,y,g=z=>[for(i of z)z.search(i)]+0)=>g(x)==g(y)

Logikanya sederhana. Saya hanya mengkonversi kedua input ke nilai indeks karakter yang sesuai, mengubah array itu menjadi string dan membandingkan.

f=(x, y,                  // Create a function named f which takes two arguments x and y
   g=                     // There is a third default argument to f which equals to
     z=>                  // and arrow function which takes argument z
     [                    // Return this array which is created using array comprehension
      for(i of z)         // For each character of z
      z.search(i)         // Use the index of that character in z in place of the character
     ]+0                  // And finally type cast that array to a string
                          // Here, the array elements are automatically joined by a ','
                          // and appended by a 0.
                          // Its funny how JS type casts Array + Number to a string
   )=>                    // Now the body of function f starts
      g(x)==g(y)          // It simply returns if index map of x equals index map of y

Coba kode di atas menggunakan cuplikan di bawah ini.

2 byte disimpan berkat @ edc65

Pengoptimal
sumber
7
+1, Mencobanya, berfungsi dengan baik. +0bukan +""?
edc65
1
@ edc65 wow, mengetikkan WTF
Pengoptimal
1
Saya baru saja menyadari bahwa senar-senarnya adalah 'A-Z', sehingga Anda dapat dengan aman menggunakan pencarian alih-alih indexOf dan memotong 1 byte lebih.
edc65
pemahaman array belum dipotong es7 akhirnya? di mana kode ini bekerja? saya pikir hanya di mozilla
DanielIndie
8

Bash + coreutils, 38

[ `tr $@<<<$1``tr $2 $1<<<$2` = $2$1 ]

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:

$ for t in "ESTATE DUELED" "DUELED ESTATE" "XXX YYY" "CBAABC DEFFED" "RAMBUNCTIOUSLY THERMODYNAMICS" "DISCRIMINATIVE SIMPLIFICATION" "SEE SAW" "ANTS PANTS" "BANANA SERENE" "BANANA SENSES" "AB CC" "XXY XYY" "ABCBACCBA ABCBACCAB"; do
> ./isomorph.sh $t
> echo $t $?
> done
ESTATE DUELED 0
DUELED ESTATE 0
XXX YYY 0
CBAABC DEFFED 0
RAMBUNCTIOUSLY THERMODYNAMICS 0
DISCRIMINATIVE SIMPLIFICATION 0
SEE SAW 1
ANTS PANTS 1
BANANA SERENE 1
BANANA SENSES 1
AB CC 1
XXY XYY 1
ABCBACCBA ABCBACCAB 1
$ 
Trauma Digital
sumber
8

Haskell, 33 29

SUNTING:

ini sudah sangat terlambat, tetapi saya menemukan peningkatan ini menggunakan pelamar, yang ditambahkan ke pembuka hanya pada Maret 2015.

s%k=g s==g k
g s=(==)<$>s<*>s

Versi lama:

s%k=g s==g k
g s=[a==b|a<-s,b<-s]

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

haskeller bangga
sumber
6

Haskell, 45 41 byte

h l=map(`lookup`zip l[1..])l
x!y=h x==h y

Pengembalian Trueatau False, 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)]tempat lookupselalu mengambil a-> 1.

Sunting: @Mauris ditemukan 4 byte untuk disimpan.

nimi
sumber
Anda bisa menggantinya (flip lookup$zip l[1..])dengan (`lookup`zip l[1..]).
Lynn
6

Brainfuck, 169 168 162 162 144 140 131 130

Kompatibel 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 1untuk isomorph dan 0non-isomorph, yang nyaman untuk memeriksa hasil secara visual, meskipun bukan pilihan terpendek. ( Pembaruan: versi yang lebih pendek dengan \x01dan \x00sebagai keluaran dan \x00sebagai 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:

STATES
123255

Pengindeksan dalam kode sebenarnya sedikit berbeda tetapi menggunakan prinsip yang sama.

Tata letak memori dalam blok 5:

0 0 0 0 0 0 c 0 i p 0 c 0 i p 0 c 0 i p 0 0 0 0

csingkatan karakter, iuntuk indeks, dan puntuk sebelumnya (indeks). Ketika string pertama sedang diproses, semua pslot adalah nol. Sel di sebelah kiri cdigunakan untuk menyimpan salinan karakter saat ini yang kami coba temukan indeksnya. Sel di sebelah kiri saat iini digunakan untuk menahan -1navigasi 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:

,+
[                       while there is input
  -
  ---------
  >+<                   increment char (adjust later)
  [                     if not tab
    >>-<                set navigation flag
    [                   loop to find index
      <                 travel to copy
      [
        >+<             restore char
        <<<<-<+>>>>>-   compare chars and create copy
      ]
      ++[->+]           travel between navigation flags
      ->+[+<-]          increment index by 2 and go back
      >[<<<<]           proceed if not fallen off string
      <                 compare chars
    ]
    <[>+<-]             restore char (or no op)
    +[->+]              go back to navigation flag
    <->                 adjust char
    >>>                 alignment
  ]
  >
  [                     if tab
    [[-]<<<<<]          erase chars and go to beginning
    >>>>                alignment
  ]
  <,+
]
>>>+>+                  check string lengths and start loop
[
  [<->-]                compare indices
  <[>>>>>]              realign if not equal
  <<<<                  proceed
]
-<[>]                   cell to left is zero iff isomorphs
+++++++[<+++++++>-]
<.

Memperbarui:

Ini adalah versi yang mencetak \x01untuk isomorf dan \x00non-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 \x00sebagai pemisah untuk menghemat 10 byte.

+
[
  -
  >+<
  [
    >>-<
    [
      <
      [
        >+<
        <<<<-<+>>>>>-
      ]
      ++[->+]
      ->+[+<-]
      >[<<<<]
      <
    ]
    <[>+<-]
    +[->+]
    <->
    >>>
  ]
  >
  [
    [[-]<<<<<]
    >>>>
  ]
  <,+
]
>>>+>+
[
  [<->-]
  <[>>>>>]
  <<<<
]
-<[>]
<+.
Mitch Schwartz
sumber
5

JavaScript (ES6), 62

Menggunakan fungsi aux hyang memetakan setiap kata ke array yang berisi posisi setiap huruf dalam kata, misalnya: LULUS -> [1,2,3,3]. Return true jika fungsi yang hditerapkan kedua kata tersebut memberikan hasil yang sama.

f=(a,b,h=w=>0+[for(c of(n=k=[],w))k[c]=k[c]||++n])=>h(b)==h(a)

// TEST

;[
// True
 ['ESTATE','DUELED']
,['DUELED','ESTATE']
,['XXX','YYY']
,['CBAABC','DEFFED']
,['RAMBUNCTIOUSLY','THERMODYNAMICS']
,['DISCRIMINATIVE','SIMPLIFICATION']

// False:

,['SEE','SAW']
,['ANTS','PANTS']
,['BANANA','SERENE']
,['BANANA','SENSES']
,['XXY','XYY']
,['ABCBACCBA','ABCBACCAB']
]
.forEach(t=>(f(t[0],t[1])?OK:KO).innerHTML+=t+'\n')
Ok<br>
<pre id=OK></pre><br>
KO<br>
<pre id=KO></pre>

edc65
sumber
1
Terkadang, sederhana lebih pendek;)
Pengoptimal
5

R, 78

function(x,y)identical((g=function(z)match(a<-strsplit(z,"")[[1]],a))(x),g(y))

De-golf:

word_to_num <- function(word) {
   chars <- strsplit(word,"")[[1]]
   match(chars, chars)
}
are_isomorph <- function(word1, word2) identical(word_to_num(word1), 
                                                 word_to_num(word2))
flodel
sumber
kalahkan aku untuk itu! (+1)
shadowtalker
Saya pikir all( (g=...)(x)==g(y))lebih pendek dari identical...
Giuseppe
5

Ruby, 83 byte

t=->x{y=0;z=?`;x.gsub!(y[0],z.succ!)while y=x.match(/[A-Z]/);x};f=->a,b{t[a]==t[b]}

Ini adalah fungsi fyang mengambil dua argumen dan mengembalikan trueatau false.

Penjelasan:

test = -> str {
    y = nil  # we're just initializing this; it doesn't matter to what
             # this is the variable we use to store the `match' result
    z = '`'  # backtick is the ASCII character before `a'
    while y = str.match(/[A-Z]/) do  # while there is an uppercase letter in str
        str.gsub!(y[0], z.succ!)  # replace all instances of the uppercase letter
                                  # with the next unused lowercase letter
    end
    str  # return the new string
}
# self-explanatory
f=->a,b{test[a]==test[b]}
Gagang pintu
sumber
1
Ini akan menghemat 4 byte 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]}
:,
5

Jawa, 107

(s,t)->java.util.Arrays.equals(s.chars().map(s::indexOf).toArray(),t.chars().map(t::indexOf).toArray())

Memetakan setiap karakter sdan tke lokasi, dan memeriksa kesetaraan.

Diperluas:

class Isomorphs {
    public static void main(String[] args) {
        java.util.function.BiFunction<String, String, Boolean> f =
            (s, t) -> java.util.Arrays.equals(
                                              s.chars().map(s::indexOf).toArray(),
                                              t.chars().map(t::indexOf).toArray()
                                             )
           ;
        System.out.println(f.apply("XXY", "XYY"));
    }
}
Ypnypn
sumber
Saya tidak berpikir ini akan berfungsi dengan baik jika string memiliki panjang yang berbeda.
JohnE
@ JohnE Ya, benar.
Ypnypn
Ah, ok- saya pikir versi "diperluas" itu menyesatkan.
JohnE
4

Python 3, 85 byte

f=lambda a,b:''.join(map(lambda g:dict(zip(a,b))[g],a))==b
g=lambda a,b:f(a,b)&f(b,a)
TheNumberOne
sumber
Di mana input / output yang satu ini?
DJMcMayhem
@DJMcMayhem gadalah fungsi utama, fadalah helper. Ada pilihan variabel yang membingungkan di gdalam f, tetapi itu adalah variabel terikat yang tidak terkait .. Ini g=adalah opsional sesuai aturan yang memungkinkan fungsi anon, yang menyimpan dua karakter. '
xnor
4

Pyth, 9 byte

qFmmxdkdQ

Mengambil input dalam bentuk berikut:

"ESTATE", "DUELED"

Jika itu tidak dapat diterima, kode berikut ini 10 byte:

qFmmxdkd.z

dan menggunakan formulir input ini:

ESTATE
DUELED

Menggunakan indeks char dalam representasi string.

isaacg
sumber
Format input pertama baik-baik saja. Saya tertarik pada cara Anda mengurangi untuk memeriksa kesetaraan, tetapi saya tidak jelas tentang cara Fkerjanya sebagai lipatan. Apa <binary>F?
xnor
@xnor <binary>F<seq>yang <binary>dilipat <seq>. Ini setara dengan bersilangan <binary>antara setiap pasangan elemen <seq>. Dengan demikian, <binary>Fpada urutan 2 elemen cukup menerapkan fungsi ke urutan, setara dengan .*Pyth atau *Python.
isaacg
Saya pikir Qjejak itu tersirat dalam Pyth?
Cyoce
@Cyoce Tidak dulu - fitur itu ditambahkan pada April 2016, hampir setahun kemudian.
isaacg
4

Matlab, 50 byte

f=@(s,t)isequal(bsxfun(@eq,s,s'),bsxfun(@eq,t,t'))

Fungsi ini didefinisikan sebagai anonim untuk menghemat ruang.

Contoh:

>> f=@(s,t)isequal(bsxfun(@eq,s,s'),bsxfun(@eq,t,t'));
>> f('ESTATE','DUELED')
ans =
     1
>> f('ANTS','PANTS')
ans =
     0
Luis Mendo
sumber
4

Oktaf, 26 byte

@(s,t)isequal(s==s',t==t')
alephalpha
sumber
3
Terlihat menarik. penjelasan?
haskeller bangga
==adalah kesetaraan elemen-bijaksana matriks, dan karena sdan s'ukuran yang berbeda, "penyiaran" oktaf secara otomatis mencoba untuk mendapatkan matriks dengan ukuran yang sama untuk beroperasi - yang dalam hal ini berarti mengulangi baris sdan koloms'
rakslice
Ini pendekatan yang sama dengan solusi Matlab @ LuisMendo, tetapi di sana perluasannya eksplisit.
rakslice
4

05AB1E , 6 byte

εæδË}Ë

Cobalah online!

Mengambil input sebagai daftar: ['ESTATE', 'DUELED']

Penjelasan:

    εæδË}Ë   Full program
    ε        Apply on each
     æ         Powerset
      δË       For each generated substring: 1 if all equal, 0 otherwise
        }    End for each
         Ë   1 if all equal, 0 otherwise
scottinet
sumber
4

APL (Dyalog) , 5 4 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 argumen

Jika kita memanggil kata Adan B, 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)

¨ setiap

Adm
sumber
dapatkah Anda melihat produk dalam? :)
ngn
@ ngn Ya tentu saja. Saya konyol.
Adám
Apakah tautan teratas seharusnya tertaut ke solusi lama?
Zacharý
Sayang sekali ini tidak bekerja pada array peringkat yang lebih tinggi: P
Zacharý
1
@ Zacharý seperti yang dijanjikan: ngn.github.io/apl-codegolf-2017/readme.txt
ngn
3

Mathematica, 46 byte

Equal@@Values@*PositionIndex/@Characters@{##}&
alephalpha
sumber
3

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 normalnya01121 dll dan membandingkannya.

->x,y{g=->z{z.chars.map{|c|z=~/#{c}/}};g[x]==g[y]}

Menguji kasus pada ideone Sebagai bonus tambahan, ini mematahkan penyorotan kode ideone.

blutorange
sumber
3

Sekam , 5 byte

¤=´×=

Cobalah online!

Penjelasan

       -- implicit input A, B (strings aka character lists)       | "ab" "12"
¤=     -- apply the following function to A & B, then compare:    | [1,0,0,1] == [1,0,0,1] -> 1
  ´×   --   Cartesian product with itself under                   | ["aa","ba","ab","bb"] ["11","21","12","22"]
    =  --   equality                                              | [ 1  , 0  , 0  , 1  ] [ 1  , 0  , 0  , 1  ]
ბიმო
sumber
3

PCRE, 84 byte

^((.)(?=.+ (\3.|)(.))(?=((?=(\2|)?+.* \3\4(\7?(?(?=.*+\6)(?!\4).|\4))).)+ ))+. \3..$ 

Subjek harus dua kata yang dipisahkan oleh spasi, seperti pada OP. Berikut penjelasan sepintas:

Untuk setiap huruf X dalam kata pertama:

Lihatlah ke depan untuk kata kedua dan buat kembali referensi untuk mengingat seberapa jauh kita serta huruf Y pada kata kedua yang sesuai dengan X.

Untuk setiap huruf Z, lewati posisi saat ini di kata pertama:

Buat referensi belakang yang sama seperti di atas.

Lihatlah ke depan ke huruf yang sesuai di kata kedua dan periksa apakah Z = X kemudian cocok dengan Y, jika tidak cocok dengan huruf yang bukan Y.

Iterasi ini dapat berakhir setelah kami mencocokkan hingga huruf kedua dari belakang di kata pertama. Pada titik ini, karena tidak diperlukan validasi lebih lanjut, yang tersisa hanyalah menguji bahwa kata-kata tersebut memiliki panjang yang sama (referensi belakang yang mengandung akumulasi substring dari kata kedua selalu tertinggal dengan 1 huruf).

jaytea
sumber
2

Ruby, 31 byte

->a{!!a.uniq!{|s|s.tr s,'a-z'}}

Seorang Proc yang mengambil serangkaian string dan memeriksa apakah ada isomorfik satu sama lain. tr s,'a-z'dengan argumen ini menormalkan string sdengan mengganti setiap huruf dengan huruf ke-n dalam alfabet, di mana nadalah indeks terbesar dengan mana huruf itu muncul dalam string. Misalnya, estatemenjadi fbedef, seperti halnya dueled.

histokrat
sumber
1

Cobra, 72 byte

do(a='',b='')=(for i in a get a.indexOf(i))==for i in b get b.indexOf(i)
Suram
sumber
Apakah Anda yakin ini menandai AB CCkasus uji False?
xnor
@xnor diperbaiki sekarang
Οurous
1

JavaScript (ES5), 142 98

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

C5H8NNaO4
sumber
1
Bisakah Anda tidak pindah ;l=cke for(l=j=2;j--;dan menyimpan byte?
Jonathan Frech
1

Perl, 38 byte

($_,$a)=@ARGV;eval"y/$_/$a/";say$_~~$a

Jalankan sebagai perl -E '($_,$a)=@ARGV;eval"y/$_/$a/";say$_~~$a' RAMBUNCTIOUSLY THERMODYNAMICS

Mencetak 1 jika benar, tidak ada jika salah.

Gabriel Benamy
sumber
1

Common Lisp, 76 byte

(lambda(a b)(equal #1=(map'list(lambda(x)(position x a))a)(setf a b a #1#)))

Cobalah online!

Renzo
sumber
1

C ++, 213 196 162 byte

-51 byte terima kasih kepada Zacharý

#include<map>
#define F(X,x)for(auto&e:X){if(x.end()==x.find(e))x[e]=65+x.size();e=x[e];}
auto i=[](auto a,auto b){std::map<int,int>c,d;F(a,c)F(b,d)return a==b;};

Untuk memanggil lambda, Anda harus melewati 2 argumen yang merupakan std::stringtipe data

Kode untuk diuji:

std::initializer_list<std::pair<std::string, std::string>> test{
    {"ESTATE","DUELED"},
    {"DUELED","ESTATE"},
    {"XXX","YYY"},
    {"CBAABC","DEFFED"},
    {"RAMBUNCTIOUSLY","THERMODYNAMICS"},
    {"DISCRIMINATIVE","SIMPLIFICATION"},
    {"SEE","SAW"},
    {"ANTS","PANTS"},
    {"BANANA","SERENE"},
    {"BANAnA","SENSES"},
    {"AB","CC"},
    {"XXY","XYY"},
    {"ABCBACCBA","ABCBACCAB"},
    {"ABAB","AC"}
};

for (const auto& a : test) {
    std::cout << "Test with " << a.first << " and " << a.second <<
        " outputs : " << (i(a.first, a.second)?"TRUE":"FALSE") << '\n';
}

untuk kode yang diuji, termasuk iostreamdan stringfile header diperlukan

HatsuPointerKun
sumber
1
Tampaknya Anda tidak menggunakan apa pun dari header string, jadi bisakah Anda menghapusnya dan meminta pengguna untuk memasukkannya sendiri?
Zacharý
Apakah ini berfungsi untuk 161 byte?
Zacharý
@ Zacharý Jika Anda menambahkan eargumen sebagai find, ya, itu berfungsi
HatsuPointerKun
Saat itu ketika Anda dikalahkan oleh Brainfuck> _ <
Zacharý
1

JavaScript (ES6), 52 51 50 byte

Versi ini tidak menggunakan pemahaman array, dan mengambil input menggunakan sintaks currying.

a=>b=>(f=x=>0+[...x].map(c=>x.search(c)))(a)==f(b)

kamoroso94
sumber