Sprawdź, czy słowa są izomorfami


63

Dwa słowa są izomorfami, jeśli mają ten sam wzór powtarzania liter. Na przykład, zarówno ESTATEi DUELEDmają wzórabcdca

ESTATE
DUELED

abcdca

ponieważ litery 1 i 6 są takie same, litery 3 i 5 są takie same i nic więcej. Oznacza to również, że słowa są powiązane szyfrem podstawienia, tutaj z dopasowaniem E <-> D, S <-> U, T <-> E, A <-> L.

Napisz kod, który wymaga dwóch słów i sprawdza, czy są to izomorfy. Wygrywa najmniej bajtów.

Dane wejściowe: dwa niepuste ciągi wielkich liter A..Z. Jeśli chcesz, możesz wziąć je jako zbiór dwóch ciągów lub jako pojedynczy ciąg z separatorem.

Dane wyjściowe: spójna wartość prawdy dla par, które są izomorfami , i spójna wartość Falsey, jeśli nie są. Ciągi o różnych długościach są poprawnymi danymi wejściowymi, które nigdy nie są izomorfami.

Przypadki testowe:

Prawdziwe:

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

Fałszywe:

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

Dodaj więcej przypadków testowych, które okażą się przydatne.

Tabela liderów

Oto fragment kodu, który pozwala wygenerować zarówno zwykłą tabelę wyników, jak i przegląd zwycięzców według języka.

Aby upewnić się, że twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:

# Language Name, N bytes

gdzie Njest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:

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


Czy zagwarantowane są takie same długości dwóch wejść?
Optymalizator

@Optimizer Nie, długości mogą być różne.
xnor

@Jakube Nie, twój kod powinien teoretycznie działać z danymi wejściowymi dowolnej długości. Jest to OK, jeśli ogromne wejścia nie działają na sprzęcie z powodu problemów takich jak przepełnienie pamięci lub głębokość stosu.
xnor

Ok, więc usunę moją odpowiedź.
Jakube,

Ważny przypadek testowy: ABAB CD(dla podejść typu zip)
Sp3000

Odpowiedzi:


95

J, 4 bajty

-:&=

Stosowanie

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

Wyjaśnienie

  • = z 1 argumentem tworzy tabelę równości porównującą elementy wejścia i jego wierzchołka.

    ='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
    
  • -:z 2 argumentami sprawdza ich równość (jak ==zwykle robi). Działa to również dla matryc o różnych rozmiarach (lub nawet różnych typach).

  • f&gstosuje g do obu danych wejściowych oddzielnie, a następnie stosuje f do obu wyników razem tak x f&g y == f(g(x), g(y)).

  • W naszym przypadku porównujemy dwie tabele równości.

Wypróbuj online tutaj.


2
Ciekawe i eleganckie podejście. Bez odpowiednika &, najbliższą rzeczą, którą możesz zrobić w K, byłaby prawdopodobnie ~/{x=/:x}'dłuższa.
JohnE

17
Jezus. To musi być pretendent do hali sławy codegolf.
Brian Gordon,

Wow, nie spodziewałem się, że klasyfikacja =będzie miała inne zastosowanie niż do zliczania wystąpień.
mile

37

K, 5 bajtów

To zachwycająco eleganckie rozwiązanie w K!

~/=:'

Operator „grupowy” (monadyczny =) tworzy dokładnie taki podpis, jaki chcemy w przypadku izomorfizmu słów; zbieranie wektorów indeksów każdego elementu wektora, z grupami uporządkowanymi według wyglądu:

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

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

Biorąc parę ciągów za wektor, musimy po prostu zastosować grupę do każdego elementu ( =:'), a następnie zmniejszyć za pomocą „match” ( ~), operatora głębokiej równości:

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

15

Python 2, 41 bajtów

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

4
To było rozwiązanie, które zainspirowało mnie do stworzenia tego wyzwania!
xnor

12

CJam, 9 bajtów

r_f#r_f#=

Drukuje, 1jeśli słowa są izomorfami, a 0jeśli nie są.

Wypróbuj online w interpretatorze CJam .

Jak to działa

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 bajtów

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

Logika jest prosta. Po prostu przekształcam oba dane wejściowe na odpowiadające im wartości indeksu znaków, przekształcam tablicę w ciąg znaków i porównuję.

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

Wypróbuj powyższy kod, korzystając z fragmentu poniżej.

2 bajty zapisane dzięki @ edc65


7
+1, próbowałem, działa dobrze. +0zamiast +""?
edc65

1
@ edc65 wow, typowanie rzutowania WTF
Optimizer

1
Właśnie zdałem sobie sprawę, że ciągi są „A-Z”, więc możesz bezpiecznie używać wyszukiwania zamiast indexOf i wyciąć jeszcze 1 bajt.
edc65,

tablice nie zostały ostatecznie wycięte z ES7? gdzie działa ten kod? myślę tylko w
Mozilli

8

Bash + coreutils, 38

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

Zauważ, że używamy tutaj zwykłej idei powłoki - prawda / fałsz - zero oznacza SUKCES lub PRAWDA, a niezerowa oznacza błąd lub FAŁSZ:

$ 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

EDYTOWAĆ:

jest o wiele za późno, ale zauważyłem tę poprawę za pomocą aplikacji, które zostały dodane w celu preludium dopiero w marcu 2015 roku.

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

Stara wersja:

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

funkcja sprawdzania to (%)

działa to poprzez generowanie dla każdego łańcucha „rekordu równości”: dla każdego z dwóch wskaźników ij rejestruje, czy mają one równe znaki. rekord jest uporządkowany w taki sposób, że rekord dla dwóch indeksów i, j jest zawsze w tym samym miejscu *, a zatem sprawdzenie równości rekordów zwróci, czy łańcuchy będą miały ten sam wzorzec.

na przykład zapis równości „ABC” wynosi [1,0,0,0,1,0,0,0,1](1 dla prawdy, 0 dla fałszu) - tam Truegdzie jakikolwiek indeks jest porównywany z samym sobą. gdziekolwiek indziej jest fałszem. (pomijanie tych kontroli może być bardziej wydajne, ale trudniejsze pod względem golfowym)

* jeśli struny są tej samej długości. w przeciwnym razie zwraca false tylko dlatego, że rekordy mają różną długość


6

Haskell, 45 41 bajtów

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

Zwraca Truelub Falsenp. "ESTATE" ! "DUELED"-> True.

Używa metody map-char-to-first-index, jak widać w wielu innych odpowiedziach. Przydają się listy skojarzeń, ponieważ wcześniejsze wpisy są atutem. "aba"staje się [(a,1),(b,2),(a,3)]tam, gdzie lookupzawsze pobiera a-> 1.

Edycja: @ Mauris znalazł 4 bajty do zapisania.


Można zastąpić (flip lookup$zip l[1..])przez (`lookup`zip l[1..]).
Lynn

6

Brainfuck, 169 168 162 144 140 131 130

Kompatybilny z bff Alexa Pankratova (interpreter pieprzenia mózgu używany na SPOJ i ideone) oraz BFI Thomasa Corta (używany na Anarchy Golf).

Oczekiwanym wejściem są dwa ciągi znaków oddzielone tabulatorem, bez nowego wiersza po drugim ciągu. Dane wyjściowe dotyczą 1izomorfów i 0nieizomorfów, co jest wygodne do wizualnego sprawdzania wyników, chociaż nie jest to najkrótsza opcja. ( Aktualizacja: krótsza wersja z wyjściem \x01i \x00jako wyjście oraz \x00jako separator u dołu odpowiedzi).

Demonstracja na ideonie.

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

Ten problem okazuje się bardzo miły dla pieprzenia mózgu.

Podstawową ideą indeksowania jest cofanie się od końca bieżącego prefiksu łańcucha. Jeśli znak nie występował wcześniej, możemy wziąć długość prefiksu łańcucha. Na przykład:

STATES
123255

Indeksowanie w kodzie jest nieco inne, ale wykorzystuje tę samą zasadę.

Układ pamięci jest w blokach po 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

coznacza znak, iindeks i ppoprzedni (indeks). Podczas przetwarzania pierwszego ciągu wszystkie pszczeliny mają wartość zero. Komórka po lewej stronie csłuży do przechowywania kopii bieżącego znaku, dla którego próbujemy znaleźć indeks. Komórka po lewej stronie prądu isłuży do -1łatwej nawigacji wskaźnikiem.

Istnieje wiele warunków, które należy dokładnie rozważyć. Na koniec sprawdzamy izomorfy, porównując (i,p)pary, i docieramy do klastra zerowych komórek na lewo od lewej skrajnej (i,p)pary tylko wtedy, gdy ciągi są izomorfami. Oto skomentowana wersja kodu, aby ułatwić śledzenie:

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

Aktualizacja:

Oto wersja, która drukuje \x01dla izomorfów i \x00dla nie-izomorfów. Jest to prawdopodobnie dokładniejsza interpretacja Truthy i Falsey dla pieprzenia mózgu, ze względu na sposób [i ]pracę. Jedyna różnica jest na samym końcu.

Dodatkowe: Teraz używa \x00jako separatora, aby zapisać 10 bajtów.

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

5

JavaScript (ES6), 62

Korzystanie z funkcji Aux, hktóra mapuje każde słowo na tablicę zawierającą pozycję każdej litery w słowie, na przykład: PASS -> [1,2,3,3]. Zwraca wartość true, jeśli hzastosowana funkcja dwóch słów daje ten sam wynik.

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
Czasami proste jest krótsze;)
Optymalizator

5

R, 78

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

Gra w golfa:

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

pobili mnie do tego! (+1)
shadowtalker

Myślę, że all( (g=...)(x)==g(y))jest krótszy niż identical...
Giuseppe

5

Rubinowy, 83 bajty

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

Jest to funkcja, fktóra pobiera dwa argumenty i zwraca truelub false.

Wyjaśnienie:

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
Powinno to zaoszczędzić 4 bajty: t=->x{z=?`;x.chars.to_a.uniq.map{|c|x.gsub!(c,z.succ!)};x};f=->a,b{t[a]==t[b]}i możesz sprowadzić go do 68, jeśli użyjesz skrótu do uzyskania zamiany:t=->x{h={};i=9;x.gsub!(/./){|c|h[c]||h[c]=i+=1}};f=->a,b{t[a]==t[b]}
blutorange

5

Java, 107

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

Mapuje każdą postać si tjej lokalizację oraz sprawdza równość.

Rozszerzony:

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

Nie sądzę, żeby to działało poprawnie, jeśli łańcuchy mają różne długości.
JohnE

@JohnE Tak, to prawda.
Ypnypn

Ach, ok- Myślę, że wersja „rozszerzona” wprowadza w błąd.
JohnE

4

Python 3, 85 bajtów

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)

Gdzie jest wejście / wyjście na tym?
DJMcMayhem

@DJMcMayhem gjest główną funkcją, fjest pomocnikiem. Jest to mylące wybór zmiennej gwewnątrz f, ale jest to niezwiązane zmienna związana .. The g=jest obowiązkowe zgodnie z orzeczeniem umożliwiający funkcje Anon, co oszczędza dwa znaki.
xnor

4

Pyth, 9 bajtów

qFmmxdkdQ

Pobiera dane w następującej formie:

"ESTATE", "DUELED"

Jeśli nie jest to możliwe, następujący kod ma 10 bajtów:

qFmmxdkd.z

i używa tego formularza wejściowego:

ESTATE
DUELED

Używa indeksu char w reprezentacji ciągu.


Pierwszy format wejściowy jest w porządku. Interesuje mnie, w jaki sposób redukujesz sprawdzanie równości, ale nie jestem pewien, jak Fdziała składanie. Co jest <binary>F?
xnor

@ xnor <binary>F<seq>jest <binary>złożony <seq>. Jest to równoważne rozproszeniu <binary>między każdą parą elementów <seq>. Zatem <binary>Fw sekwencji 2-elementowej po prostu stosuje funkcję do sekwencji, równoważną .*w Pyth lub *Python.
isaacg

Myślałem, że trailing Qbył ukryty w Pyth?
Cyoce,

@Cyoce Nie wtedy - ta funkcja została dodana w kwietniu 2016 r., Prawie rok później.
isaacg

4

Matlab, 50 bajtów

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

Funkcja jest zdefiniowana jako anonimowa w celu zaoszczędzenia miejsca.

Przykład:

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

4

Oktawa, 26 bajtów

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

3
Wygląda ciekawie. wyjaśnienie?
dumny haskeller

==jest równością elementów macierzy, a ponieważ si s'są różnych rozmiarów, „nadawanie” oktawy automatycznie próbuje uzyskać matryce o tym samym rozmiarze do działania - co w tym przypadku oznacza powtarzanie wiersza si kolumnys'
rakslice

Jest to to samo podejście, co rozwiązanie Matlab @ LuisMendo, ale w tym przypadku rozszerzenie jest wyraźne.
rakslice

4

05AB1E , 6 bajtów

εæδË}Ë

Wypróbuj online!

Pobiera dane wejściowe jako listę: ['ESTATE', 'DUELED']

Objaśnienia:

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

-1 dzięki podpowiedzi ngn.

Anonimowa funkcja ukrytego przedrostka, która przyjmuje jako argument listę dwóch ciągów.

≡.⍳⍨

Wypróbuj online!

To jest produkt wewnętrzny, ale zamiast zwykłego +i ×używa

 identyczność

. i

ɩ ndex (pierwsze wystąpienie każdego elementu)

 z całą dwuelementową listą słów użytych jako oba argumenty

Jeśli wywołamy te słowa Ai B, możemy wyprowadzić poprzednie rozwiązanie w następujący sposób:

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

Poprzednie rozwiązanie

Anonimowa funkcja ukrytego przedrostka, która przyjmuje jako argument listę dwóch ciągów.

≡/⍳⍨¨

Wypróbuj online!

 identyczność

/ przez

ɩ ndex (pierwsze wystąpienie każdego elementu ...)

 selfie (… samo w sobie)

¨ każdego


widzisz wewnętrzny produkt? :)
ngn

@ngn Tak, oczywiście. Głupi ja.
Adám

Czy górny link powinien prowadzić do starego rozwiązania?
Zacharý

Szkoda, że ​​to nie działa na tablicach wyższej rangi: P
Zacharý

1
@ Zacharý zgodnie z obietnicą: ngn.github.io/apl-codegolf-2017/readme.txt
ngn


3

Rubinowy, 50 bajtów

30 bajtów krótszego kodu ruby. Napisane przed przyjrzeniem się rozwiązaniom, sprawdzają dla każdego znaku obu ciągów, czy indeks pierwszego wystąpienia tego znaku pasuje; to znaczy. przekształca ciąg znaków w znormalizowaną formę 01121itp. i porównuje je.

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

Testowanie przypadków na ideone Jako dodatkowy bonus łamie to wyróżnianie kodu ideone.


3

Łuska , 5 bajtów

¤=´×=

Wypróbuj online!

Wyjaśnienie

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

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

Temat powinien składać się z dwóch słów oddzielonych spacją, tak jak w OP. Oto pobieżne wyjaśnienie:

Dla każdej litery X w pierwszym słowie:

Spójrz w przyszłość na drugie słowo i ustal odniesienia, aby przypomnieć sobie, jak daleko jesteśmy, a także literę Y w drugim słowie odpowiadającym X.

Dla każdej litery Z powyżej bieżącej pozycji w pierwszym słowie:

Ustal podobne referencje jak powyżej.

Spójrz w przód na odpowiednią literę w drugim słowie i sprawdź, czy Z = X, a następnie dopasuj Y, w przeciwnym razie dopasuj literę, która nie jest Y.

Ta iteracja może zakończyć się, gdy dopasujemy ją do przedostatniej litery w pierwszym słowie. W tym momencie, ponieważ nie jest konieczne dalsze sprawdzanie poprawności, pozostaje tylko sprawdzenie, czy słowa mają taką samą długość (odnośnik tylny zawierający nagromadzone podłańcuchy drugiego słowa jest zawsze za jedną literą).


2

Ruby, 31 bajtów

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

Proc, który pobiera tablicę ciągów znaków i sprawdza, czy są one względem siebie izomorficzne. tr s,'a-z'z tymi argumentami normalizuje ciąg s, zastępując każdą literę n-tą literą w alfabecie, gdzie njest największym indeksem, z którym ta litera pojawia się w ciągu. Na przykład estatestaje się fbedef, podobnie jak dueled.


1

Kobra, 72 bajty

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

Czy na pewno oznacza to AB CCprzypadek fałszywy?
xnor

@ xnor naprawiono teraz
Οurous

1

JavaScript (ES5), 142 98

Całkiem spory, ale jeszcze nie widziałem wersji 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)

Po prostu zastępuje każde wystąpienie pierwszej litery jego odwrotną wartością indeksu. Powtarza to dla każdej postaci.

Robi to samo dla obu wejść i porównuje wygenerowany wzór.

Porównanie jest dość brzydkie, ale nie chcę używać tablicy do przechowywania i porównywania.


1
Czy nie możesz przejść ;l=cdo for(l=j=2;j--;zapisanego bajtu?
Jonathan Frech,

1

Perl, 38 bajtów

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

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

Drukuje 1 jeśli prawda, nic jeśli fałsz.



1

C ++, 213 196 162 bajtów

-51 bajtów dzięki Zacharýmu

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

Aby wywołać lambda, musisz przekazać 2 argumenty std::stringtypu danych

Kod do przetestowania:

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

dla kodu testującego, w tym iostreami stringpliku nagłówkowego jest wymagany


1
Nie wygląda na to, że używasz czegokolwiek z nagłówka łańcucha, więc czy możesz to usunąć i pozwolić, aby użytkownik sam to uwzględnił?
Zacharý

Czy to działa na 161 bajtów?
Zacharý

@ Zacharý Jeśli dodasz ejako argument find, tak, to działa
HatsuPointerKun

Ten moment, w którym zostajesz pokonany przez Brainfuck>> <
Zacharý

1

JavaScript (ES6), 52 51 50 bajtów

Ta wersja nie korzysta ze zrozumienia tablic i pobiera dane wejściowe przy użyciu składni curry.

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.