Kelimelerin izomorf olup olmadığını kontrol edin


63

İki kelime vardır isomorphs onlar mektup tekrarlar aynı desen varsa. Örneğin, her ikisi de ESTATEve DUELEDdesen varabcdca

ESTATE
DUELED

abcdca

çünkü 1. ve 6. harfler aynıdır, 3. ve 5. harfler aynıdır ve başka bir şey yoktur. Bu, aynı zamanda kelimelerin, burada bir eşleşme şifresiyle ilişkili olduğu anlamına gelir E <-> D, S <-> U, T <-> E, A <-> L.

İki kelime alan bir kod yazıp izomorf olup olmadıklarını kontrol eder. En az bayt kazanır.

Girdi: Boş olmayan iki büyük harf dizesi A..Z. İsterseniz, bunları iki dizeden oluşan bir koleksiyon olarak veya ayırıcı içeren tek bir dizge olarak alabilirsiniz.

Çıkış: tutarlı Truthy değeri isomorphs olan çiftleri için ve tutarlı bir Falsey değeri onlar değilse. Farklı uzunluklardaki dizeler, hiçbir zaman izomorf olmayan geçerli girdilerdir.

Test durumları:

Doğru:

ESTATE DUELED
DUELED ESTATE
XXX YYY
CBAABC DEFFED
RAMBUNCTIOUSLY THERMODYNAMICS
DISCRIMINATIVE SIMPLIFICATION

Yanlış:

SEE SAW
ANTS PANTS
BANANA SERENE
BANANA SENSES
AB CC
XXY XYY
ABCBACCBA ABCBACCAB
ABAB CD

Yararlı bulduğunuz daha fazla test senaryosu eklemek için çekinmeyin.

Liderler Sıralaması

Burada hem düzenli bir lider tablosu hem de kazananların dile göre bir genel bakışını oluşturmak için bir Stack Snippet'i var.

Cevabınızın göründüğünden emin olmak için, lütfen aşağıdaki Markdown şablonunu kullanarak cevabınızı bir başlık ile başlatın:

# Language Name, N bytes

Gönderinizin Nbüyüklüğü nerede ? Puanınızı artırmak varsa, olabilir onları içinden vurarak, başlığa eski hesapları tutmak. Örneğin:

# Ruby, <s>104</s> <s>101</s> 96 bytes


İki girişin uzunluğu aynı mıdır?
Doktor,

@Optimizer Hayır, uzunluklar farklı olabilir.
xnor

@Jakube Hayır, kodunuz teoride herhangi bir uzunlukta girdilerle çalışmalıdır. Bellek taşması veya yığın derinliği gibi sorunlar nedeniyle büyük girişler donanımda başarısız olursa sorun değil.
xnor

Tamam sonra cevabımı sileceğim.
Jakube

Önemli test durumu: ABAB CD(zip benzeri yaklaşımlar için)
Sp3000

Yanıtlar:


95

J, 4 bayt

-:&=

kullanım

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

açıklama

  • = 1 argümanı ile giriş ve nub öğelerini karşılaştıran bir eşitlik tablosu oluşturur.

    ='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
    
  • -:2 argümanla eşitliklerini kontrol eder ( ==genelde olduğu gibi ). Bu, farklı boyut matrislerinde (hatta farklı tiplerde) de işe yarar.

  • f&gHer iki girdiye ayrı olarak g uygulanır ve sonra birlikte iki sonuca f uygulanır x f&g y == f(g(x), g(y)).

  • Yani bizim durumumuzda iki eşitlik tablosunu karşılaştırıyoruz.

Burada çevrimiçi deneyin.


2
İlginç ve zarif bir yaklaşım. Buna eşdeğer olmadan &, K'de yapabileceğiniz en yakın şey muhtemelen ~/{x=/:x}'biraz daha uzun olacaktır.
JohnE

17
İsa. Bu, kod dövüş ününün ün salonu için bir rakip olmalı.
Brian Gordon

Vay, sınıflandırmanın =olayları saymaktan başka bir kullanımı olmasını beklemiyordum .
miller

37

K, 5 bayt

Bu K zarif bir şekilde zarif bir çözüme sahiptir!

~/=:'

"Grup" operatörü (monadiç =) tam olarak isomorfizm kelimesi için istediğimiz imzayı yaratır; Bir vektörün her bir elemanının indekslerinin vektörleri, görünüşe göre sıralanan gruplar ile toplanır:

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

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

Bir vektör dizesini bir vektör olarak alarak, sadece her öğeye ( =:') grup uygulamamız ve daha sonra ~derin eşitlik operatörü olan "match" ( ) ile azaltmamız gerekir :

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

15

Python 2,41 bayt

f=lambda a,b:map(a.find,a)==map(b.find,b)

4
Bu, bu zorluğu yaratmam için bana ilham veren çözümdü!
xnor

12

CJam, 9 bayt

r_f#r_f#=

1Sözcükler izomorfsa ve 0olmasa da yazdırır .

CJam tercümanında çevrimiçi olarak deneyin .

Nasıl çalışır

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.

10

JavaScript, ES7, 62 55 54 52 51 bayt

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

Mantık basittir. Ben sadece her iki girişi de karşılık gelen karakter indeks değerlerine, o diziyi dizgeye çevirip karşılaştırmaya dönüştürüyorum.

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

Aşağıdaki kod parçasını kullanarak yukarıdaki kodu deneyin.

@ Edc65 sayesinde 2 bayt kaydedildi


7
+1, Denedim, iyi çalışıyor. +0yerine +""?
edc65

1
@ edc65 vay, WTF yazarak
Doktoru

1
Şimdi dizelerin 'A-Z' olduğunu fark ettim, bu yüzden indexOf yerine search işlevini güvenle kullanabilir ve 1 bayt daha kesebilirsiniz.
edc65

dizi kavrayışları sonunda es7 kesildi? bu kod nerede çalışıyor? Ben sadece mozilla düşünüyorum
DanielIndie

8

Bash + coreutils, 38

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

Burada olağan truthy / falsy kabuk fikrini kullandığımızı unutmayın - sıfır, SUCCESS veya TRUE ve sıfır olmayan, hata veya FALSE anlamına gelir:

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

8

Haskell, 33 29

DÜZENLE:

bu çok geç, ancak bu gelişmeyi yalnızca Mart 2015'te prelüde ekleyen başvuruları kullanarak buldum.

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

Eski versiyon:

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

kontrol işlevi (%)

bu, her dize için "eşitlik kaydını" oluşturarak çalışır: her iki dizin için ij, eşit karakterlere sahip olup olmadıklarını kaydeder. Kayıt, iki indeks i, j her zaman aynı yerde * olacak ve böylece kayıtların eşitliğini kontrol etmek, dizelerin aynı düzende olup olmadıklarını gösterecek şekilde sıralanır.

örneğin, "ABC" nin eşitlik kaydı [1,0,0,0,1,0,0,0,1](1 için doğru, 0 için yanlış) - Trueherhangi bir endeksin kendisiyle karşılaştırıldığı bir yer var. başka bir yerde yanlıştır. (Bu kontrolleri atlamak daha verimli olabilir, ancak golf açısından daha zordur)

* Eğer dizeleri aynı uzunlukta ise. Aksi halde kayıtlar farklı uzunluklarda olduğu için yanlış döndürür


6

Haskell, 45 41 bayt

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

Döndürür Trueveya False, örneğin "ESTATE" ! "DUELED"-> True.

Diğer birçok cevapta görüldüğü gibi harita-karakter-ilk-endeks yöntemini kullanır. Dernek listeleri işe yarayabilir, çünkü daha önceki girişler trump. her zaman aldığı yer "aba"olur -> .[(a,1),(b,2),(a,3)]lookupa1

Düzenleme: @Mauris kaydetmek için 4 bayt bulundu.


Sen değiştirebilirsiniz (flip lookup$zip l[1..])tarafından (`lookup`zip l[1..]).
Lynn

6

Brainfuck, 169 168 162 144 140 131 130

Alex Pankratov en uyumlu bff (SPOJ ve ideone kullanılan brainfuck tercüman) ve Thomas Cort en BFI (Anarşi Golf kullanılır).

Beklenen girdi, ikinci dizgiden sonra yeni satır olmadan, bir sekmeyle ayrılmış iki dizgedir. Çıktı, en kısa seçenek olmasa da, sonuçları görsel olarak kontrol etmek için uygun olan 1izomorflar ve izomorf 0olmayanlar içindir. ( Güncelleme: ile kısa versiyon \x01ve \x00çıktı olarak ve \x00cevap altındaki ayırıcı olarak.)

Gösteri ideone üzerinde.

,+
[
  -
  ---------
  >+<
  [
    >>-<
    [
      <
      [
        >+<
        <<<<-<+>>>>>-
      ]
      ++[->+]
      ->+[+<-]
      >[<<<<]
      <
    ]
    <[>+<-]
    +[->+]
    <->
    >>>
  ]
  >
  [
    [[-]<<<<<]
    >>>>
  ]
  <,+
]
>>>+>+
[
  [<->-]
  <[>>>>>]
  <<<<
]
-<[>]
+++++++[<+++++++>-]
<.

Bu problemin beyincik için çok iyi olduğu ortaya çıktı.

İndekslemeyle ilgili temel fikir, geçerli dize önekinin sonundan geriye doğru gitmek. Karakter daha önce gerçekleşmediyse, string önekinin uzunluğunu alabiliriz. Örneğin:

STATES
123255

Koddaki indeksleme aslında biraz farklıdır ancak aynı prensibi kullanır.

Hafıza düzeni 5 blokta:

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

ckarakter, idizin ve pönceki (dizin) anlamına gelir. İlk dize işlenirken, tüm pyuvalar sıfırdır. Solundaki hücre c, dizinini bulmaya çalıştığımız geçerli karakterin bir kopyasını almak için kullanılır. Akımın solundaki hücre, imleci kolayca gezinmek için ikullanılır -1.

Dikkatli göz önünde bulundurulması gereken birçok koşul vardır. Sonunda, (i,p)çiftleri karşılaştırarak izomorfları kontrol ediyoruz (i,p)ve sadece dizgiler izomorf ise ve sadece soldaki çiftin solundaki sıfır hücre kümesine ulaşıyoruz . Kodu takip etmeyi kolaylaştırmak için yorumlanmış bir sürüm:

,+
[                       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
+++++++[<+++++++>-]
<.

Güncelleme:

Burada \x01izomorf ve izomorf \x00olmayanlar için basılan bir versiyondur . Bu biçimi nedeniyle, tartışmasız brainfuck için Truthy ve Falsey daha doğru bir yorumudur [ve ]işin. Tek fark en sonunda.

Ek: Şimdi \x0010 bayt kaydetmek için ayırıcı olarak kullanıyor .

+
[
  -
  >+<
  [
    >>-<
    [
      <
      [
        >+<
        <<<<-<+>>>>>-
      ]
      ++[->+]
      ->+[+<-]
      >[<<<<]
      <
    ]
    <[>+<-]
    +[->+]
    <->
    >>>
  ]
  >
  [
    [[-]<<<<<]
    >>>>
  ]
  <,+
]
>>>+>+
[
  [<->-]
  <[>>>>>]
  <<<<
]
-<[>]
<+.

5

JavaScript (ES6), 62

hHer sözcüğü sözcükteki her harfin konumunu içeren bir diziyle eşleyen bir aux işlevi kullanma , örneğin: PASS -> [1,2,3,3]. İşlev hiki kelimeyi uygularsa aynı sonucu verir.

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>


1
Bazen, basit kısadır;)
Doktor,

5

R, 78

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

De-golfed:

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

beni yen! (+1)
shadowtalker

Sanırım all( (g=...)(x)==g(y))daha kısa identical...
Giuseppe

5

Ruby, 83 bayt

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

Bu bir fonksiyon var fiki argüman ve döner alır trueveya false.

Açıklama:

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

1
Bu işlem 4 bayttan tasarruf etmelidir: t=->x{z=?`;x.chars.to_a.uniq.map{|c|x.gsub!(c,z.succ!)};x};f=->a,b{t[a]==t[b]}ve eğer yenisini almak için bir karma kullanırsanız 68'e t=->x{h={};i=9;x.gsub!(/./){|c|h[c]||h[c]=i+=1}};f=->a,b{t[a]==t[b]}
indirebilirsin

5

Java, 107

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

Her karakterini sve tbulunduğu yeri eşler ve eşitliği kontrol eder.

Expanded:

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"));
    }
}

Dizelerin farklı uzunlukları varsa, bunun doğru çalışacağını sanmıyorum.
JohnE

@JohnE Evet, öyle.
Ypnypn

Ah, tamam- Sanırım "genişletilmiş" versiyon yanıltıcı.
JohnE,

4

Python 3, 85 bayt

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)

Bu giriş / çıkış nerede?
DJMcMayhem

@DJMcMayhem gana işlevidir, fyardımcıdır. İçinde kafa karıştırıcı bir değişken seçeneği gvar f, ancak bu ilişkisiz bir bağımlı değişken. Bu g=, iki karakter kazandıran anon işlevlerine izin veren isteğe bağlı bir seçenek. '
xnor

4

Pyth, 9 bayt

qFmmxdkdQ

Aşağıdaki biçimde girdi alır:

"ESTATE", "DUELED"

Bu kabul edilebilir değilse, aşağıdaki kod 10 bayttır:

qFmmxdkd.z

ve bu giriş formunu kullanır:

ESTATE
DUELED

Karakter dizisinde char dizinini kullanır.


İlk giriş formatı iyi. Eşitliği kontrol etmek için nasıl azalttığınızla ilgileniyorum ancak Fkatlanmanın nasıl çalıştığı konusunda net değilim . Nedir <binary>F?
xnor

@xnor <binary>F<seq>olduğu <binary>katlanır <seq>. Her <binary>eleman çifti arasında serpiştirmeye eşdeğerdir <seq>. Bu nedenle, <binary>F2 elemanlı bir sekansta, fonksiyonu .*Pyth veya *Python ile eşdeğerde olan sekansa uygular .
isaacg

Qİzin Pyth'ta gizli olduğunu sanıyordum ?
Cyoce

@Cyoce O zamanlar değil - bu özellik, neredeyse bir yıl sonra, Nisan 2016'da eklendi.
isaacg

4

Matlab, 50 bayt

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

İşlev, biraz yer kazanmak için adsız olarak tanımlanır.

Örnek:

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

4

Octave, 26 bayt

@(s,t)isequal(s==s',t==t')

3
İlgi çekici görünüyor. açıklama?
Gurkel haskeller

==matris element-bilge eşitliğidir ve farklı boyutlar olduğundan sve s'oktavın "yayıncılığı" otomatik olarak aynı boyuttaki matrisleri çalıştırmaya çalışır - bu durumda satır sve sütunu tekrarlamak anlamına gelirs'
rakslice,

@ LuisMendo'nun Matlab çözümü ile aynı yaklaşım, ancak orada genişleme açık.
rakslice

4

05AB1E , 6 bayt

εæδË}Ë

Çevrimiçi deneyin!

Girişi liste halinde alır: ['ESTATE', 'DUELED']

açıklamalar:

    εæδË}Ë   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

4

APL (Dyalog) , 5 4 bayt

-1 'nin ipucuna teşekkürler.

Argüman olarak iki dizenin bir listesini alan adsız tacit önek işlevi.

≡.⍳⍨

Çevrimiçi Deneyin!

Bu bir iç üründür, ancak bunun yerine her zamanki +ve ×kullandığı

 özdeşlik

. ve

ɩ nDex (her bir elemanın ilk geçişi),

 Her iki argüman olarak kullanılan iki elemanlı listenin tamamı ile

Kelimelerini ararsanız Ave Başağıdaki gibi, o zaman önceki çözüm elde edebilirsiniz:

≡.⍳⍨ A B
A B ≡.⍳ A B
(A⍳A) ≡ (B⍳B)
(⍳⍨A) ≡ (⍳⍨B)
≡/ ⍳⍨¨ A B

Önceki çözüm

Argüman olarak iki dizenin bir listesini alan adsız tacit önek işlevi.

≡/⍳⍨¨

Çevrimiçi deneyin!

 özdeşlik

/ karşısında

ɩ nDex (her bir elemanın ilk geçtiği ...)

 selfie (… kendi içinde)

¨ her biri için


iç ürünü görebiliyor musun? :)
ngn

@ngn Tabii ki evet. Aptal ben.
Adám

Üst bağlantının eski çözüme bağlanması mı gerekiyor?
Zacharý

Ne yazık ki, bu daha yüksek rütbeli dizilerde çalışmıyor: P
Zacharý

1
@ Zacharý'nın söz verdiği gibi: ngn.github.io/apl-codegolf-2017/readme.txt
ngn

3

Mathematica, 46 bayt

Equal@@Values@*PositionIndex/@Characters@{##}&

3

Ruby, 50 bayt

30 bayt kısa yakut kodu. Çözümlere bir göz atmadan önce yazdığımda, her iki dizinin her bir karakterini, o karakterin ilk oluşumunun indeksinin eşleşip eşleşmediğini kontrol eder; yani. Bir dize normalleştirilmiş formuna 01121vb dönüştürür ve bunları karşılaştırır.

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

İdeone ile ilgili test davaları Ek bir bonus olarak, ideone'un kod vurgulamasını bozar.


3

Kabuğu , 5 bayt

¤=´×=

Çevrimiçi deneyin!

açıklama

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

3

PCRE, 84 bayt

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

Konu OP'de olduğu gibi boşlukla ayrılmış iki kelime olmalıdır. İşte bir el yazısı açıklaması:

İlk kelimedeki her harf için X:

İkinci kelimeye bak ve ikinci kelimedeki X harfine karşılık gelen Y harfinin ne kadar boyunca olduğumuzu hatırlamak için geri referanslar oluştur.

Her kelime için, Z ilk harfle şu anki pozisyonunu geçiyor:

Yukarıdaki gibi benzer geri referanslar oluşturun.

İkinci kelimede ilgili harfe bakın ve Z = X'in ardından bir Y ile eşleşip eşleşmediğini kontrol edin, aksi takdirde Y olmayan bir harfle eşleşin.

Bu yineleme, ilk kelimedeki sondan birinciye kadar eşleşince sona erebilir. Bu noktada, başka bir onaylama gerekmediğinden geriye kalanların hepsi kelimelerin eşit uzunlukta olduklarını test etmektir (ikinci kelimenin biriken alt dizelerini içeren geri referans her zaman 1 harf arkasındadır).


2

Ruby, 31 bayt

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

Bir dizi dizgeyi alan ve birbirinin izomorfik olup olmadığını kontrol eden bir Proc. tr s,'a-z'Bu argümanlarla, sher bir harfi alfabedeki n harfi ile değiştirerek nnormalde bir dize normalleştirir ; bu harf, dizede en büyük harfle gösterilir. Örneğin , olduğu gibi estateolur .fbedefdueled


1

Kobra, 72 bayt

do(a='',b='')=(for i in a get a.indexOf(i))==for i in b get b.indexOf(i)

Bunun AB CCtest senaryosunu Yanlış olarak işaretlediğinden emin misin ?
xnor

@xnor şimdi düzeltildi
6

1

JavaScript (ES5), 142 98

Oldukça büyük bir sürüm, ancak henüz bir ES5 sürümü görmedim.

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)

Basitçe ilk harfin her tekrarını ters indeks değeri ile değiştirir. Her karakter için bunu tekrarlar.

Her iki giriş için de aynı şeyi yapar ve oluşturulan deseni karşılaştırır.

Karşılaştırma oldukça çirkin, ama saklamak ve karşılaştırmak için bir dizi kullanmak istemiyorum.


1
Eğer hareket edemiyordu ;l=ciçin for(l=j=2;j--;ve bir bayt kaydetmek?
Jonathan Frech

1

Perl, 38 bayt

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

Olarak çalıştırmak perl -E '($_,$a)=@ARGV;eval"y/$_/$a/";say$_~~$a' RAMBUNCTIOUSLY THERMODYNAMICS

Doğru ise 1, yanlış ise hiçbir şey yazdırılmaz.



1

C ++, 213 196 162 bayt

Zacharý sayesinde -51 bayt

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

Lambda'yı çağırmak için, std::stringveri tipi olan 2 argüman geçmelisiniz.

Test edilecek kod:

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

test eden kod için, dahil iostreamve stringbaşlık dosyası gereklidir


1
Dize başlığındaki herhangi bir şeyi kullanıyormuşsunuz gibi görünmüyor, bu yüzden onu kaldırabilir ve kullanıcının kendi içeriğini eklemesini sağlayabilirsiniz?
Zacharý

Bu 161 bayt için çalışıyor mu ?
Zacharý

@ Zacharý Eğer eargümanı olarak eklerseniz find, evet, işe yarıyor
HatsuPointerKun

Brainfuck tarafından dövüldüğünüz o an>> <<
Zacharý,

1

JavaScript (ES6), 52 51 50 bayt

Bu sürüm dizi anlama kullanmaz ve körleme sözdizimini kullanarak girdi alır.

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.