Kiểm tra xem các từ có phải là đẳng cấu không


63

Hai từ là đẳng cấu nếu chúng có cùng kiểu lặp lại chữ cái. Ví dụ, cả hai ESTATEDUELEDcó mẫuabcdca

ESTATE
DUELED

abcdca

bởi vì chữ 1 và 6 giống nhau, chữ 3 và 5 giống nhau và không có gì khác. Điều này cũng có nghĩa là các từ có liên quan bởi một mật mã thay thế, ở đây với sự phù hợp E <-> D, S <-> U, T <-> E, A <-> L.

Viết mã có hai từ và kiểm tra xem chúng có phải là đẳng cấu không. Ít byte nhất sẽ thắng.

Đầu vào: Hai chuỗi ký tự không trống A..Z. Nếu bạn muốn, bạn có thể lấy chúng làm tập hợp của hai chuỗi hoặc dưới dạng một chuỗi có dấu phân cách.

Đầu ra: Một giá trị Truthy nhất quán cho các cặp là đẳng cấu và giá trị Falsey nhất quán nếu không. Các chuỗi có độ dài khác nhau là các đầu vào hợp lệ không bao giờ là đẳng cấu.

Các trường hợp thử nghiệm:

Thật:

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

Sai trái:

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

Hãy thêm nhiều trường hợp thử nghiệm mà bạn thấy hữu ích.

Bảng xếp hạng

Dưới đây là Stack Snippet để tạo cả bảng xếp hạng thông thường và tổng quan về người chiến thắng theo ngôn ngữ.

Để đảm bảo rằng câu trả lời của bạn hiển thị, vui lòng bắt đầu câu trả lời của bạn bằng một tiêu đề, sử dụng mẫu Markdown sau:

# Language Name, N bytes

nơi Nlà kích thước của trình của bạn. Nếu bạn cải thiện điểm số của mình, bạn có thể giữ điểm số cũ trong tiêu đề, bằng cách đánh bại chúng thông qua. Ví dụ:

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


Độ dài của hai đầu vào có được đảm bảo giống nhau không?
Tối ưu hóa

@Optimizer Không, độ dài có thể khác nhau.
xnor

@Jakube Không, về lý thuyết, mã của bạn sẽ hoạt động với các đầu vào có độ dài bất kỳ. Mặc dù vậy, vẫn ổn nếu đầu vào lớn bị lỗi trên phần cứng do các vấn đề như tràn bộ nhớ hoặc độ sâu ngăn xếp.
xnor

Ok, tôi sẽ xóa câu trả lời của tôi.
Jakube

Trường hợp thử nghiệm quan trọng: ABAB CD(đối với các cách tiếp cận giống như zip)
Sp3000

Câu trả lời:


95

J, 4 byte

-:&=

Sử dụng

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

Giải trình

  • = với 1 đối số tạo ra một bảng bằng so sánh các phần tử của đầu vào và nub của nó.

    ='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
    
  • -:với 2 đối số kiểm tra sự bằng nhau của chúng (giống như ==thường làm). Điều này làm việc cho các ma trận kích thước khác nhau (hoặc thậm chí các loại khác nhau) quá.

  • f&gáp dụng g cho cả hai đầu vào riêng biệt và sau đó áp dụng f cho hai kết quả cùng nhau x f&g y == f(g(x), g(y)).

  • Vì vậy, trong trường hợp của chúng tôi, chúng tôi so sánh hai bảng bằng.

Hãy thử trực tuyến tại đây.


2
Một cách tiếp cận thú vị và thanh lịch. Nếu không có tương đương với điều đó &, điều gần nhất bạn có thể làm trong K có lẽ sẽ là ~/{x=/:x}', điều đó lâu hơn một chút.
JohnE

17
Chúa Giêsu. Đây phải là một ứng cử viên cho hội trường danh tiếng của codegolf.
Brian Gordon

Wow, không mong đợi phân loại =sẽ có bất kỳ sử dụng nào khác ngoài việc đếm số lần xuất hiện.
dặm

37

K, 5 byte

Điều này có một giải pháp thanh lịch thú vị trong K!

~/=:'

Toán tử "nhóm" (đơn âm =) tạo ra chính xác chữ ký mà chúng ta muốn cho từ đồng phân từ; tập hợp các vectơ của các chỉ số của từng phần tử của một vectơ, với các nhóm được sắp xếp theo ngoại hình:

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

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

Lấy một cặp chuỗi làm vectơ, chúng ta chỉ cần áp dụng nhóm cho từng phần tử ( =:') và sau đó giảm với "khớp" ( ~), toán tử đẳng thức sâu:

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

15

Python 2, 41 byte

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

4
Đây là giải pháp đã truyền cảm hứng cho tôi để tạo ra thử thách này!
xnor

12

CJam, 9 byte

r_f#r_f#=

In 1nếu các từ là đẳng cấu và 0nếu không.

Hãy thử trực tuyến trong trình thông dịch CJam .

Làm thế nào nó hoạt động

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 byte

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

Logic rất đơn giản. Tôi chỉ đơn giản chuyển đổi cả hai đầu vào thành các giá trị chỉ mục ký tự tương ứng của chúng, chuyển đổi mảng đó thành chuỗi và so sánh.

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

Hãy thử đoạn mã trên bằng đoạn trích dưới đây.

2 byte được lưu nhờ vào @ edc65


7
+1, Đã thử nó, hoạt động tốt. +0thay vì +""?
edc65

1
@ edc65 wow, typecasting WTF
Trình tối ưu hóa

1
Tôi mới nhận ra rằng các chuỗi là 'A-Z', vì vậy bạn có thể sử dụng tìm kiếm một cách an toàn thay vì indexOf và cắt thêm 1 byte.
edc65

sự hiểu biết mảng đã bị cắt của es7 cuối cùng? mã này hoạt động ở đâu? tôi nghĩ chỉ có ở mozilla
DanielIndie

8

Bash + coreutils, 38

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

Lưu ý rằng chúng tôi đang sử dụng ý tưởng shell thông thường về sự thật / giả dối ở đây - zero có nghĩa là THÀNH CÔNG hoặc TRUE và khác không có nghĩa là lỗi hoặc FALSE:

$ 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

BIÊN TẬP:

Đây là cách quá muộn, nhưng tôi đã tìm thấy sự cải thiện này bằng cách sử dụng các ứng dụng, được thêm vào khúc dạo đầu vào tháng 3 năm 2015.

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

Phiên bản cũ:

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

chức năng kiểm tra là (%)

điều này hoạt động bằng cách tạo cho mỗi chuỗi "bản ghi đẳng thức" của nó: đối với mỗi hai chỉ số ij, nó ghi lại xem chúng có các ký tự bằng nhau hay không. bản ghi được sắp xếp sao cho bản ghi cho hai chỉ số i, j luôn ở cùng một vị trí * và do đó kiểm tra sự bằng nhau của các bản ghi sẽ trả về việc các chuỗi có cùng mẫu hay không.

ví dụ: bản ghi đẳng thức của "ABC" là [1,0,0,0,1,0,0,0,1](1 cho đúng, 0 cho sai) - có Truebất kỳ chỉ số nào được so sánh với chính nó. bất cứ nơi nào khác là sai. (bỏ qua các kiểm tra này có thể hiệu quả hơn, nhưng khó hơn về mặt golf)

* nếu các chuỗi có cùng độ dài. mặt khác, nó trả về false chỉ vì các bản ghi có độ dài khác nhau


6

Haskell, 45 41 byte

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

Trả về Truehoặc False, ví dụ "ESTATE" ! "DUELED"-> True.

Sử dụng phương pháp map-char-to-First-index như đã thấy trong nhiều câu trả lời khác. Danh sách hiệp hội có ích, bởi vì các mục trước đó át chủ bài. "aba"trở thành [(a,1),(b,2),(a,3)]nơi lookupluôn tìm nạp a-> 1.

Chỉnh sửa: @Mauris tìm thấy 4 byte để lưu.


Bạn có thể thay thế (flip lookup$zip l[1..])bằng (`lookup`zip l[1..]).
Lynn

6

Brainfuck, 169 168 162 144 140 131 130

Tương thích với bff của Alex Pankratov (trình thông dịch brainfuck được sử dụng trên SPOJ và ideone) và Thomas Cort's BFI (được sử dụng trên Anarchy Golf).

Đầu vào dự kiến ​​là hai chuỗi được phân tách bằng một tab, không có dòng mới sau chuỗi thứ hai. Đầu ra là 1cho các đẳng cấu và 0cho các đồng phân không thuận, thuận tiện cho việc kiểm tra kết quả một cách trực quan, mặc dù không phải là tùy chọn ngắn nhất. ( Cập nhật: phiên bản ngắn hơn với \x01\x00là đầu ra và \x00là dấu phân cách ở cuối câu trả lời.)

Trình diễn về ideone.

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

Vấn đề này hóa ra là rất tốt cho brainfuck.

Ý tưởng cơ bản với lập chỉ mục là đi ngược từ cuối tiền tố chuỗi hiện tại. Nếu ký tự chưa xảy ra trước đó, chúng ta có thể lấy độ dài của tiền tố chuỗi. Ví dụ:

STATES
123255

Việc lập chỉ mục trong mã thực tế hơi khác nhau nhưng sử dụng cùng một nguyên tắc.

Bố cục bộ nhớ nằm trong các khối 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

clà viết tắt của ký tự, icho chỉ mục và pcho trước đó (chỉ mục). Khi chuỗi đầu tiên đang được xử lý, tất cả các pvị trí đều bằng không. Ô bên trái của cđược sử dụng để giữ một bản sao của ký tự hiện tại mà chúng ta đang cố gắng tìm chỉ mục của. Các ô ở bên trái của hiện tại iđược sử dụng để giữ một -1điều hướng con trỏ dễ dàng.

Có nhiều điều kiện cần được xem xét cẩn thận. Cuối cùng, chúng tôi kiểm tra các đồng phân bằng cách so sánh các (i,p)cặp và chúng tôi tiếp cận cụm các ô số 0 ở bên trái của (i,p)cặp ngoài cùng bên trái khi và chỉ khi các chuỗi là các đẳng cấu. Dưới đây là phiên bản nhận xét của mã để dễ theo dõi hơn:

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

Cập nhật:

Đây là một phiên bản in \x01cho các đẳng cấu và \x00cho các dạng không đẳng hình. Đây được cho là một cách giải thích chính xác hơn về Truthy và Falsey cho brainfuck, bởi vì cách thức []công việc. Sự khác biệt duy nhất là ở cuối cùng.

Bổ sung: Bây giờ sử dụng \x00như một dấu phân cách để lưu 10 byte.

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

5

JavaScript (ES6), 62

hVí dụ, sử dụng hàm phụ trợ ánh xạ từng từ vào một mảng chứa vị trí của từng chữ cái trong từ, ví dụ: PASS -> [1,2,3,3]. Trả về true nếu hàm hđược áp dụng hai từ cho kết quả giống nhau.

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
Đôi khi, đơn giản là ngắn hơn;)
Trình tối ưu hóa

5

R, 78

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

Bỏ chơi gôn:

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

đánh tôi với nó (+1)
Shadowtalker

Tôi nghĩ all( (g=...)(x)==g(y))là ngắn hơn 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]}

Đây là một hàm fcó hai đối số và trả về truehoặc false.

Giải trình:

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
Điều này sẽ tiết kiệm 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]}và bạn có thể giảm xuống còn 68 nếu bạn sử dụng hàm băm để nhận thay thế: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())

Bản đồ từng nhân vật của stđến vị trí của nó, và kiểm tra sự bình đẳng.

Mở rộng:

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

Tôi không nghĩ rằng điều này sẽ hoạt động chính xác nếu các chuỗi có độ dài khác nhau.
JohnE

@ John Có, nó có.
Ypnypn

À, ok- Tôi nghĩ phiên bản "mở rộng" là sai lệch.
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)

Đâu là đầu vào / đầu ra trên cái này?
DJMcMayhem

@DJMcMayhem glà chức năng chính, flà người trợ giúp. Có một sự lựa chọn khó hiểu về biến gbên trong f, nhưng đó là một biến ràng buộc không liên quan .. Đây g=là tùy chọn theo phán quyết cho phép các chức năng anon, giúp tiết kiệm hai ký tự. '
xnor

4

Bình thường, 9 byte

qFmmxdkdQ

Đưa đầu vào theo mẫu sau:

"ESTATE", "DUELED"

Nếu điều đó không được chấp nhận, đoạn mã sau là 10 byte:

qFmmxdkd.z

và sử dụng mẫu đầu vào này:

ESTATE
DUELED

Sử dụng chỉ số của char trong biểu diễn chuỗi.


Các định dạng đầu vào là tốt. Tôi quan tâm đến cách bạn giảm để kiểm tra sự bình đẳng nhưng tôi không rõ về cách thức Fhoạt động như thế nào . Có gì <binary>F?
xnor

@xnor <binary>F<seq>được <binary>gấp lại <seq>. Nó tương đương với xen kẽ <binary>giữa mọi cặp yếu tố <seq>. Do đó, <binary>Ftrên chuỗi 2 phần tử chỉ cần áp dụng hàm cho chuỗi, tương đương với .*trong Pyth hoặc *trong Python.
isaacg

Tôi nghĩ rằng dấu vết Qlà ẩn trong Pyth?
Cyoce

@Cyoce Không quay lại - tính năng đó đã được thêm vào tháng 4 năm 2016, gần một năm sau.
isaacg

4

Matlab, 50 byte

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

Hàm được định nghĩa là ẩn danh để tiết kiệm không gian.

Thí dụ:

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

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

3
Trông có vẻ thú vị. giải trình?
tự hào

==là sự bình đẳng của phần tử ma trận và vì ss'có kích thước khác nhau, "phát sóng" của octave sẽ tự động cố gắng lấy ma trận có cùng kích thước để hoạt động - trong trường hợp này có nghĩa là lặp lại hàng svà cộts'
rakslice

Đó là cách tiếp cận tương tự như giải pháp Matlab của @ LuisMendo, nhưng có sự mở rộng rõ ràng.
rakslice

4

05AB1E , 6 byte

εæδË}Ë

Hãy thử trực tuyến!

Đưa đầu vào dưới dạng danh sách: ['ESTATE', 'DUELED']

Giải thích:

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

-1 nhờ gợi ý của ngn.

Hàm tiền tố ẩn danh ẩn danh danh hai chuỗi làm đối số.

≡.⍳⍨

Hãy thử trực tuyến!

Đây là một sản phẩm bên trong, nhưng thay vì thông thường +×nó sử dụng

 giống hệt nhau

. và

 các ɩ Ndex (sự xuất hiện đầu tiên của mỗi phần tử)

 với toàn bộ danh sách hai yếu tố của các từ được sử dụng làm cả hai đối số

Nếu chúng ta gọi các từ AB, thì chúng ta có thể rút ra giải pháp trước đó như sau:

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

Giải pháp trước

Hàm tiền tố ẩn danh ẩn danh danh hai chuỗi làm đối số.

≡/⍳⍨¨

Hãy thử trực tuyến!

 giống hệt nhau

/ băng qua

 các ɩ Ndex (sự xuất hiện đầu tiên của mỗi phần tử ...)

 selfie (bản thân mình)

¨ của mỗi


bạn có thể thấy sản phẩm bên trong không? :)
ngn

@ngn Vâng tất nhiên rồi. Tôi thật ngốc.
Adám

Là liên kết hàng đầu được cho là liên kết đến các giải pháp cũ?
Zacharý

Quá tệ, điều này không hoạt động trên các mảng thứ hạng cao hơn mặc dù: P
Zacharý

1
@ Zacharý như đã hứa: ngn.github.io/apl-codegolf-2017/readme.txt
ngn


3

Ruby, 50 byte

Mã ruby ​​ngắn hơn 30 byte. Viết trước khi tôi xem xét các giải pháp, kiểm tra từng ký tự của cả hai chuỗi xem chỉ số của lần xuất hiện đầu tiên của nhân vật đó có khớp hay không; I E. biến đổi một chuỗi thành dạng chuẩn hóa của nó, 01121v.v. và so sánh chúng.

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

Các trường hợp thử nghiệm trên ideone Là một phần thưởng bổ sung, điều này phá vỡ việc làm nổi bật mã của ideone.


3

Husk , 5 byte

¤=´×=

Hãy thử trực tuyến!

Giải trình

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

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

Chủ đề phải là hai từ được phân tách bằng dấu cách, như trong OP. Đây là một lời giải thích cursory:

Đối với mỗi chữ X trong từ đầu tiên:

Nhìn về phía trước từ thứ hai và thiết lập lại các tham chiếu để nhớ lại khoảng cách chúng ta cũng như chữ Y trong từ thứ hai tương ứng với X.

Đối với mỗi chữ Z vượt qua vị trí hiện tại trong từ đầu tiên:

Thiết lập các tài liệu tham khảo trở lại tương tự như trên.

Nhìn về phía trước chữ cái tương ứng trong từ thứ hai và kiểm tra xem Z = X có khớp với chữ Y không, nếu không thì khớp với chữ cái không phải là Y.

Lặp đi lặp lại này có thể kết thúc một khi chúng ta khớp với nhau cho đến chữ áp chót trong từ đầu tiên. Tại thời điểm này, vì không cần xác nhận thêm, tất cả những gì còn lại là kiểm tra xem các từ có độ dài bằng nhau không (tham chiếu phía sau có chứa các chuỗi con tích lũy của từ thứ hai luôn đứng sau 1 chữ cái).


2

Ruby, 31 byte

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

Một Proc lấy một chuỗi các chuỗi và kiểm tra xem có bất kỳ đẳng cấu nào với nhau không. tr s,'a-z'với các đối số này bình thường hóa một chuỗi sbằng cách thay thế từng chữ cái bằng chữ thứ n trong bảng chữ cái, đây nlà chỉ số lớn nhất mà chữ cái đó xuất hiện trong chuỗi. Ví dụ, estatetrở thành fbedef, như là dueled.


1

Rắn hổ mang, 72 byte

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

Bạn có chắc chắn điều này đánh dấu AB CCtrường hợp thử nghiệm Sai?
xnor

@xnor đã sửa ngay bây giờ
Οurous

1

JavaScript (ES5), 142 98

Khá lớn, nhưng tôi chưa thấy phiên bản 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)

Chỉ cần thay thế mọi lần xuất hiện của chữ cái đầu tiên bằng giá trị chỉ mục ngược của nó. Lặp lại điều này cho mọi nhân vật.

Nó làm tương tự cho cả hai đầu vào và so sánh các mẫu được tạo.

Sự so sánh này khá xấu xí, nhưng tôi sẽ không sử dụng một mảng để lưu trữ và so sánh nó.


1
Bạn có thể không di chuyển ;l=cđến for(l=j=2;j--;và lưu một byte?
Jonathan Frech

1

Perl, 38 byte

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

Chạy như perl -E '($_,$a)=@ARGV;eval"y/$_/$a/";say$_~~$a' RAMBUNCTIOUSLY THERMODYNAMICS

In 1 nếu đúng, không có gì nếu sai.



1

C ++, 213 196 162 byte

-51 byte nhờ 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;};

Để gọi lambda, bạn cần truyền 2 đối số là std::stringkiểu dữ liệu

Mã để kiểm tra:

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

đối với mã kiểm tra, bao gồm iostreamstringtệp tiêu đề là bắt buộc


1
Nó không giống như bạn sử dụng bất cứ thứ gì từ tiêu đề chuỗi, vì vậy bạn có thể loại bỏ nó và người dùng có tự bao gồm nó không?
Zacharý

Liệu này làm việc cho 161 byte?
Zacharý

@ Zacharý Nếu bạn thêm eđối số làm find, vâng, nó hoạt động
HatsuPulumKun

Khoảnh khắc đó khi bạn bị Brainfuck đánh bại mặc dù> _ <
Zacharý

1

JavaScript (ES6), 52 51 50 byte

Phiên bản này không sử dụng khả năng hiểu mảng và lấy đầu vào bằng cú pháp currying.

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.