Tìm bảng dịch


17

Cho hai chuỗi, tìm bảng dịch ( mật mã thay thế ) giữa hai chuỗi, nếu không thể dịch, xuất sai. Câu trả lời phải được thu nhỏ và tạo từ trái sang phải. Ký tự đầu tiên được dịch giữa các từ phải là ký tự đầu tiên trong bảng dịch. Ngoài ra, bất kỳ chữ cái nào không được dịch (ở cùng một vị trí như ban đầu), KHÔNG nên ở trong bảng dịch.

Có lẽ dễ dàng xác định nhất thông qua các ví dụ:

Các trường hợp hợp lệ

"bat", "sap" => ["bt","sp"]

Lưu ý thứ tự, một đầu ra ["tb","ps"]không hợp lệ cho thử thách này.

"sense", "12n12" => ["se","12"]

Lưu ý cách nkhông được dịch bởi vì nó là mối quan hệ 1-1.

"rabid", "snail" => ["rabd","snal"]

Lưu ý cách ikhông được dịch bởi vì nó là mối quan hệ 1-1.

"ass", "all" => ["s","l"]

A không được bao gồm, nó giữ nguyên, scó thể ánh xạ ldo khớp mẫu.

"3121212", "ABLBLBL" => ["312","ABL"]

Phù hợp với mô hình hoàn hảo.

Trường hợp giả

"banana", "angular" => false

(không cùng chiều dài, không thể).

"animal", "snails" => false

(mỗi ký tự chỉ có thể được sử dụng ONCE ở mỗi bên của bản dịch).

"can","cnn" => false

(n được sử dụng ngầm trong dịch thuật, do đó, việc xác định bảng dịch có n-> a sẽ không hợp lệ)

Do đó, [aimal,sails]là một câu trả lời không hợp lệ, làm cho sai lầm này.

"a1", "22" => false

Xem "hãy cẩn thận", điều này được liệt kê là giả. Trong trường hợp này, đó là vì a1không thể cả hai ánh xạ tới 2. (Mỗi ký tự chỉ có thể được sử dụng ONCE ở mỗi bên của bản dịch).


Câu trả lời này có vẻ là một điểm chuẩn tốt: /codegolf//a/116807/59376

Nếu bạn có câu hỏi về chức năng của hai cặp từ chưa được liệt kê, hãy trì hoãn việc thực hiện này.


Quy tắc I / O

  • Đầu vào có thể là một mảng 2 phần tử hoặc 2 đầu vào riêng biệt.
  • Đầu ra có thể là một mảng hoặc phân cách dòng / không gian mới, tương tự như cách tôi đã hiển thị.
  • Đầu ra sai có thể là 0, -1 hoặc sai. Lỗi / đầu ra trống cũng tốt.
  • Bạn được đảm bảo rằng asẽ không bằng nhau bacũng không btrống rỗng.
  • ablà các chuỗi chữ cái chỉ có thể in-ASCII.

Hãy cẩn thận

  • Các bản dịch phải xuất hiện từ trái sang phải, xem ví dụ 1.
  • Bạn không được xuất các ký tự vẫn giữ nguyên.
  • Chương trình của bạn chỉ có thể có hai chuỗi ab.
  • Mỗi ký tự chỉ có thể được sử dụng ONCE ở mỗi bên của bản dịch. Đây là những gì làm cho bản dịch từ snailsđể animalskhông thể.
  • Thay thế đệ quy không nên xảy ra. Ví dụ về thay thế đệ quy: "a1","22"->[a1,12]trong đó a được thay thế đầu tiên bằng 1, sau đó cả hai kết quả 1 được thay thế bằng 2. Điều này là không chính xác, giả sử tất cả các bản dịch xảy ra độc lập với nhau, có nghĩa là điều này là giả. Ý nghĩa: "a1" với bảng dịch của [a1,12] ước tính thành 12 (không phải 22)

Dán nhãn "bản dịch" này như một mật mã thay thế đơn giản có thể giúp làm rõ ý định.
Greg Martin

Là mảng kết hợp được phép như đầu ra? Nó có thể tiết kiệm cho tôi một số byte
Jörg Hülsermann

@ JörgHülserman Tôi không hoàn toàn chắc chắn về ý nghĩa của việc cho phép điều này, có thể tạo 2 phiên bản để tôi có thể thấy sự khác biệt? Tôi sẽ chỉnh sửa nó nếu tôi nghĩ nó không có hại cho thử thách.
Bạch tuộc ma thuật Urn

Hãy xem bài viết của tôi là giải pháp đầu tiên dưới dạng chuỗi và lần thứ hai có đầu ra là một mảng kết hợp
Jörg Hülsermann

@ JörgHülsermann ahhh ... Tôi thấy bây giờ bạn đang sử dụng nó như thế nào, tôi nghĩ rằng tôi sẽ không cho phép điều đó, không phải tất cả các ngôn ngữ đều hỗ trợ các cấu trúc giống như hàm băm.
Bạch tuộc ma thuật Urn

Câu trả lời:


7

JavaScript (ES6), 128 byte

f=
(s,t)=>!t[s.length]&&[...s].every((c,i)=>n[d=t[i]]==c||d&&!m[c]&&!n[d]&&(n[m[c]=d]=c,c==d||(a+=c,b+=d)),m={},n={},a=b='')&&[a,b]
<div oninput=o.textContent=f(s.value,t.value)><input id=s><input id=t><pre id=o>


Không làm việc cho assall, nên được s,l.
Bạch tuộc ma thuật Urn

Vâng, đoạn trích đó là trippin ', cũng được xác minh, nó ổn.
Bạch tuộc ma thuật Urn

1
@carusocomputing Đó là một cuộc đụng độ tên biến - bây giờ nó đã được sửa. Xin lỗi vì điều đó.
Neil

7

JavaScript (ES6), 108 107 105 106 byte

Chỉnh sửa : Đã sửa lỗi để hỗ trợ các đầu vào như vậy "22" / "a1"sẽ bị sai lệch.


Trả về một 0hoặc một mảng của hai chuỗi.

f=(a,b,x)=>[...a].some((c,i)=>d[C=b[i]]?d[C]!=c:(d[C]=c)!=C&&(s+=c,t+=C,!C),s=t='',d=[])?0:x||f(b,a,[s,t])

Định dạng và nhận xét

f = (                       // given:
  a,                        // - a = first string
  b,                        // - b = second string
  x                         // - x = reference result from previous iteration,
) =>                        //       or undefined
  [...a].some((c, i) =>     // for each character c at position i in a:
    d[                      //   if we already have a translation
      C = b[i]              //   of the character C at the same position in b,
    ] ?                     //   then:
      d[C] != c             //     return true if it doesn't equal c
    :                       //   else:
      (d[C] = c) != C &&    //     store the translation C -> c in the dictionary
      (                     //     if the characters are different:
        s += c, t += C,     //       append them to the translation strings s and t
        !C                  //       return true if C is undefined
      ),                    //
    s = t = '', d = []      //   initialize s, t and d  
  ) ?                       // if some() returns true:
    0                       //   there was a translation error: abort
  :                         // else:
    x ||                    //   if this is the 2nd iteration, return x
    f(b, a, [s, t])         //   else do a recursive call with (b, a)

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


f('22')('a1')nên bị giả mạo quá.
Neil

Hy vọng tôi đã nhận được nó ngay lúc này.
Arnauld

1
Nó luôn tiện dụng khi sửa lỗi của bạn đơn giản hóa thành một cái gì đó ngắn hơn!
Neil

7

PHP> = 7.1, 130 byte

18 byte được lưu bởi @Titus

for([,$x,$y]=$argv;a&$o=$y[$i];)$o==($p=$x[$i++])?:$k[$c[$p]=$o]=$p;echo$y==strtr($x,$c)&$x==strtr($y,$k)?join($k)." ".join($c):0;

Tủ thử

Mở rộng

for([,$x,$y]=$argv;a&$o=$y[$i];)
$o==($p=$x[$i++])?:$k[$c[$p]=$o]=$p; # if char string 1 not equal char string 2 make key=char1 value=char2 and key array
echo$y==strtr($x,$c) # boolean replacement string 1 equal to string 2
    &$x==strtr($y,$k) # boolean replacement string 2 equal to string 1
    ?join($k)." ".join($c) # output for true cases
:0; #Output false cases

PHP> = 7.1, 148 byte

in 0 cho sai Đầu ra đúng như chuỗi

for([,$x,$y]=$argv;a&$o=$y[$i];$i++)$x[$i]==$o?:$c[$x[$i]]=$o;echo$y==strtr($x,($f=array_flip)($k=$f($c)))&$x==strtr($y,$k)?join($k)." ".join($c):0;

Tủ thử

Mở rộng

for([,$x,$y]=$argv;a&$o=$y[$i];$i++)
$x[$i]==$o?:$c[$x[$i]]=$o; # if char string 1 not equal char string 2 set key=char1 value=char2
echo$y==strtr($x,($f=array_flip)($k=$f($c))) # boolean replacement string 1 equal to string 2
&$x==strtr($y,$k) # boolean replacement string 2 equal to string 1
    ?join($k)." ".join($c) # output for true cases
:0; #Output false cases

PHP> = 7.1, 131 byte

Câu trả lời thứ hai có thể được rút ngắn cho điều này nếu mảng kết hợp được cho phép

in 0 cho sai Đầu ra đúng là mảng kết hợp thay vì chuỗi

for([,$x,$y]=$argv;a&$o=$y[$i];$i++)$x[$i]==$o?:$c[$x[$i]]=$o;print_r($y==strtr($x,($f=array_flip)($f($c)))&$x==strtr($y,$k)?$c:0);

Tủ thử

PHP> = 7.1, 227 byte

in 0 sai

[,$x,$y]=$argv;echo strlen($x)==strlen($y)?strtr($x,$c=array_filter(($f=array_flip)($z=$f(array_combine(($p=str_split)($x),$p($y)))),function($v,$k){return$k!=$v;},1))==$y&$x==strtr($y,$z)?join(array_keys($c))." ".join($c):0:0;

Tủ thử

Mở rộng

[,$x,$y]=$argv; # 
echo strlen($x)==strlen($y) #compare string lengths
?strtr($x,  # replace function
$c=array_filter( # filter 
($f=array_flip)($z=$f( # # remove doubles like in testcase: a1 => 22
    array_combine(($p=str_split)($x),$p($y))  # replacement array keys string 1 values string 2 
))
    ,function($v,$k){return$k!=$v;},1)) # remove all keys that equal to values in array
    ==$y # boolean replacement string 1 equal to string 2
&$x==strtr($y,$z) # boolean replacement string 2 equal to string 1        
?join(array_keys($c))." ".join($c) # output for true cases
    :0 # Output if replacement from string 1 is not equal to string 2
:0; #Output for different lengths

1
@carusocomputing Cảm ơn bạn đã khen ngợi. Tôi đã quên một mẹo nhỏ. Tôi biết rằng ở đây có nhiều người, họ tốt hơn tôi
Jorg Hülsermann

2
Bạn chắc chắn rất giỏi trong việc tìm kiếm giải pháp +1 nhưng array_values()bên trong join()hoàn toàn vô dụng và có thể bị loại bỏ.
Christoph

1
Điều này không thành công trong a1 22 => falsetrường hợp thử nghiệm. Ngoài ra, chương trình đầu tiên của bạn dường như không hoạt động trong trình kiểm tra trực tuyến.
mbomb007

1
Câm miệng. Nó tuyệt vời.
Tít

1
Chân chèo có thể đi: Lưu 18 byte ($p=$x[$i])==$o?:$k[$c[$p]=$o]=$p;trong vòng lặp và $y==strtr($x,$c)cho lần kiểm tra đầu tiên.
Tít

5

Thạch , 18 byte

ẠaQ⁼µ€Ạ
z0EÐḟQZẋÇ$

Liên kết đơn âm chưa được đặt tên (hàm một đầu vào) lấy một danh sách, trả về:
một danh sách trống trong các trường hợp falsey; hoặc
một danh sách chứa hai danh sách các ký tự trong các trường hợp trung thực.

Hãy thử trực tuyến! (phần chân trang chia danh sách với một khoảng trắng để tránh in một bản trình bày bị nhòe)
... hoặc xem bộ kiểm tra .

Làm sao?

ẠaQ⁼µ€Ạ - Link 1, valid?: mapping list
    µ€  - perform the code to the left for €ach mapping entry
Ạ       -     none of mapping entry falsey? (this & Main's z0 handle unequal input lengths)
  Q     -     deduplicate mapping entry
   ⁼    -     is equal to mapping list? (non-vectorising)
 a      -     and
      Ạ - none falsey (both mapping lists must pass that test)
        - The whole function returns 1 if the mapping list is acceptable, 0 if not

z0EÐḟQZẋÇ$ - Main link: list of strings
z0         - transpose with filler 0 (unequal lengths make pairs containing zeros)
   Ðḟ      - filter discard:
  E        -     all equal? (removes the untranslated character pairs)
     Q     - deduplicate (removes the repeated translation pairs)
      Z    - transpose (list of pairs to pair of lists)
         $ - last two links as a monad:
       ẋ   -     repeat list this many times:
        Ç  -         call last link (1) as a monad

5

Võng mạc , 194 191 185 229 225 241 byte

.+
$&;$&
+`^\w(\w*;)\w
$1
^;\w.*|.+;;.*|;;

^((.)*)(.)(.*;(?<-2>.)*(?(2)(?!)))\3
$1$4
+`((.)(.)*)\2((.)*;.*(.)(?<-3>.)*(?(3)(?!)))\6((?<-5>.)*(?(5)(?!)))$
$1$4$7
^(.)*(.)(.)*(\2)?.*;(?<-1>.)*(?(1)(?!))(.)(?<-3>.)*(?(3)(?!))(?(4)(?!\5)|\5).*

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

Đưa đầu vào ;tách biệt. Đầu ra cũng được ;tách ra. Đầu vào sai được biểu thị bằng đầu ra trống.

Tôi biết điều này rất dài dòng, tôi vẫn đang cố gắng cắt giảm byte. Hầu hết các byte này đi vào xóa các đầu vào sai.

Chỉnh sửa

  • Hóa ra tôi đã có một lỗ hổng đáng kể với chương trình của mình. Bây giờ nó đã được sửa, nhưng với chi phí hơn 40 byte.

  • Một lỗi khác được tìm thấy khi chương trình của tôi không khai báo đầu vào a1;22sai, nhưng tôi có thể giữ chương trình dưới 250 byte sau khi sửa nó

Giải trình

(một lời giải thích chi tiết hơn sẽ đến sớm)

Đầu tiên chúng ta phải kiểm tra xem độ dài của chuỗi ab đều giống nhau hay không. Nếu họ không, chúng tôi xóa tất cả mọi thứ.

Sao chép đầu vào để bảo toàn nó trong khi chúng tôi thực hiện một số thử nghiệm độ dài.

.+                      Matches everything
$&;$&                   $& indicates the match, so $&;$& will duplicate the match and separate it with a semi-colon

Bây giờ trong một vòng lặp, chúng ta xóa ký tự đầu tiên avà ký tự đầu tiên bcho đến khi một trong các chuỗi trở nên trống rỗng.

+`                     Repeatedly (until no more substitutions could be made) replace
  ^\w                   A word character (letter or number) at the beginning
     (\w*;)             Capture Group 1: matches any number of word characters and a semicolon
           \w           And a word character after the semi-colon
                       with
$1                      The result of the first capture group

Bây giờ có khả năng cho "không gian mẫu".

  • ;;abc Cả hai chuỗi có độ dài bằng nhau
  • def;;abc a dài hơn b
  • ;def;abc b dài hơn a

Bây giờ chúng ta phải làm trống đầu vào nếu các chuỗi không có cùng độ dài (kịch bản 2 và 3). Đây là những gì thay thế dưới đây làm. Nó loại bỏ văn bản phù hợp với kịch bản 2 và 3.

^;\w.*|.+;;.*|;;

Điều này loại bỏ các ký tự không được phiên âm trong chuỗi ab. abc;1b2=>ac;12

^((.)*)(.)(.*;(?<-2>.)*(?(2)(?!)))\3
$1$4

Sau đó, chúng tôi phải loại bỏ các ký tự trùng lặp. sese;1212=> se;12, nhưng điều này bảo tồn các đầu vào nhưaba;123

+`((.)(.)*)\2((.)*;.*(.)(?&lt;-3&gt;.)*(?(3)(?!)))\6((?&lt;-5&gt;.)*(?(5)(?!)))$
$1$4$7

Cuối cùng, chúng tôi xóa đầu vào nếu có các ký tự trùng lặp ánh xạ tới các ký tự khác nhau như aba;123hoặc a1;22.

^(.)*(.)(.)*(\2)?.*;(?.)*(?(1)(?!))(.)(?.)*(?(3)(?!))(?(4)(?!\5)|\5).*

Và cuối cùng, loại bỏ các ký tự trùng lặp.


Sử dụng các nhóm cân bằng tôi thấy!
Neil

@Neil Thật vậy! Tôi cũng đã sử dụng những (?(1)(?!))gì tôi học được từ câu trả lời của bạn :)
Kritixi Lithos

Tôi tự hỏi liệu nó sẽ ngắn hơn để loại bỏ các bản sao đầu tiên và sau đó xác nhận các bộ còn lại - chỉ nên có một trong mỗi chữ cái còn lại ở mỗi bên của ;.
Neil

@Neil Tôi đã tìm thấy một lỗi với mã của tôi đang thử nghiệm điều đó. Tôi sẽ nhìn xa hơn vào buổi sáng.
Kritixi Lithos

4

Thạch , 28 26 byte

QL$€⁼L€
EÐḟQZK0Ç?
ZÇ0L€E$?

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

QL$€⁼L€      Checks validity of mapping
QL$€          number of unique characters in mapping
    ⁼         equals
     L€       number of characters in mapping

EÐḟQZK0Ç?  Writes valid mapping or 0
EÐḟ           filter maps where a = b
   Q          filter duplicate maps
    Z         zip by column [["ac"],["bd"]] => ["ab","cd"]
     K0Ç?   print if valid map, else print 0

ZÇ0L€E$?      main link: takes an array of 2 strings
Z              zip by column: ["ab", "cd"] => [["ac"],["bd"]]
 Ç     ?       print mapping if
   L€E$         all pairs are same length (returns 0 if initial strings were
  0             else 0

1
Chào mừng đến với PPCG! Làm thế quái nào bạn biết Jelly chỉ với 21 điểm? Rất ấn tượng!
Bạch tuộc ma thuật Urn

2
Cảm ơn. Nhìn xung quanh trang web một chút và nó có vẻ như là một ngôn ngữ gọn gàng để học.
layagyasz

05AB1E là một cách dễ dàng và thú vị khác để thử.
Bạch tuộc ma thuật Urn

3

Ruby, 133 byte

->a,b{a.size!=b.size||(m=a.chars.zip b.chars).any?{|i,j|m.any?{|k,l|(i==k)^(j==l)}}?0:m.select{|x,y|x!=y}.uniq.transpose.map(&:join)}

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

Dễ đọc hơn:

->a, b{
    # Pair the letters in each string - [AB, AB, AB,...]
    pairs = a.chars.zip(b.chars)

    # If there's any combination of two pairs that share one character but not both,
    # or if the strings have different lengths, then the input's invalid.
    if a.size != b.size || pairs.any?{|i,j| pairs.any? {|k, l| (i==k)!=(j==l) }} 
        return 0 # 0 isn't actually falsy in Ruby, but this challenge allows it anyway
    end
    return pairs.select{|x,y| x != y} # Remove unchanged letters
                .uniq                 # Remove duplicates
                .transpose            # Change [AB, AB, AB] form to [AAA, BBB] form.
                .map(&:join)          # Convert the arrays back into strings
}

Chỉ để đá, đây là phiên bản 84 byte trong Goruby, là Ruby, nhưng với cờ golf được đặt khi biên dịch trình thông dịch. Trong số những thứ khác, nó cho phép bạn viết tắt các cuộc gọi phương thức đến định danh duy nhất ngắn nhất của chúng.

->a,b{a.sz!=b.sz||(m=a.ch.z b).ay?{|i,j|m.y?{|k,l|(i==k)^(j==l)}}?0:m.rj{|x,y|x==y}.u.tr.m(&:j)}

Tại sao không đăng một câu trả lời thứ hai với việc thực hiện Goruby? Nó không phải là một ngôn ngữ chơi golf được chấp nhận?
Bạch tuộc ma thuật Urn

@carusocomputing Nó hoàn toàn là; đối với tôi có vẻ như nó không xứng đáng với câu trả lời của chính nó - nó giống hệt như câu trả lời chính của tôi, chỉ với tên phương thức được viết tắt. Có lẽ nếu tôi tìm ra cách tận dụng sự khác biệt của Goruby, tôi sẽ đăng một câu trả lời riêng.
Người hướng dẫn

3

Python 2 , 198,193,189,182,179,175,169, 165 byte

def f(a,b):
 r=([""]*2,0)[len(a)!=len(b)]
 for u,v in zip(a,b):
	if r:
		q,w=r
		f=q.find(u)
		if u!=v:r=(([q+u,w+v],r)[f>-1 and w[f]==v],0)[f<0 and v in w]
 print r

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

  • -4 byte! cảm ơn mbomb007 đã gợi ý sử dụng tab thay vì không gian.

  • sửa đổi định dạng đầu vào, một lần nữa nhờ mbomb007.


ý bạn là như thế nào? vui lòng ngừng thực hiện các chỉnh sửa không mong muốn không thêm bất kỳ giá trị nào để trả lời!
Keerthana Mitchhakaran

tab được lưu khoảng 4 byte! Cảm ơn bạn!
Keerthana Mitchhakaran


Và tôi đã làm cho chương trình của bạn có mỗi trường hợp thử nghiệm trên một dòng duy nhất, điều này cực kỳ hữu ích cho bất kỳ ai thử nghiệm chương trình của bạn.
mbomb007

Tôi sẽ tốt hơn nếu bạn có thể đề cập đến điều đó trong bình luận chỉnh sửa của bạn!
Keerthana Mitchhakaran

3

Python 3.6, 211 185 181 178 byte

Thoát với một lỗi cho kết quả giả.

def f(x,y,d={}):
    for a,b in zip(x,y):1/(a not in d or b==d[a]or len(x)-len(y));d[a]=b;1/([*d.values()].count(b)<2)
    return map(''.join,zip(*[x for x in d.items()if x[0]!=x[1]]))

Điều này đòi hỏi Python 3.6, mà bạn có thể chạy trong shell ở đây .

Bạn có thể kiểm tra nó mà không có thứ tự đầu ra chính xác trên TIO tại đây . (TIO không có 3.6).

Ung dung:

from collections import*
d=OrderedDict()                     # keep order
x,y=input()
if len(x)!=len(y):1/0               # equal lengths
for a,b in zip(x,y):
    if a in d and d[a]!=b:1/0       # no duplicate keys
    else:d[a]=b
    if d.values().count(b)>1:1/0    # no duplicate values
print map(''.join,zip(*[x for x in d.items()if x[0]!=x[1]])) # format, no no-ops

Nếu chỉ đặt hàng không thành vấn đề ...


Không nên a1,12quay lại a1,12thay vì False? Trong phần Caveats, người ta nói rằng "a1" với bảng dịch của [a1,12] ước tính thành 12 .
fergusq

1
Vâng, chương trình trong liên kết TIO của bạn trở lại False. 1a 21cũng sẽ sai, vì oeder phải được bảo tồn.
fergusq

@fergusq Đã sửa. Nhưng lưu ý rằng bạn có một lỗi đánh máy trong bình luận của bạn nếu đó là trường hợp thử nghiệm mà bạn đang đề cập, vì bạn đã nói a1,12thay vì a1,22.
mbomb007

Tôi hiểu lầm bạn. Bạn đã tham khảo phần Caveats trong phần chỉnh sửa câu hỏi của mình, nhưng phần Caveats thực sự xử lý một trường hợp khác - không phải là quy tắc bijection. Điều đó làm tôi bối rối.
fergusq

Nó xử lý một quy tắc khác, nhưng nó vẫn nói rằng kết quả của trường hợp thử nghiệm đó là sai, đó mới là vấn đề.
mbomb007

2

Röda , 108 119 byte

{c=[{_<>_|[[_,_]]|orderedUniq}()]d=[]e=[]c|_|{{d+=a;e+=b}if[a!=b]}for a,b[d,e]if[0,1]|{|n|c|[_[n]]|sort|count|[_2=1]}_}

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

Đây là chức năng lấy hai danh sách các ký tự từ luồng và đẩy hai danh sách vào luồng.

Điều này có thể được sắp xếp nếu tôi được phép trả lại các cặp.

Giải thích (lỗi thời):

{
    c=[{
        _<>_|       /* pull two lists and interleave them */
        [[_,_]]|    /* "unflat", create lists from pairs */
        orderedUniq /* remove duplicates */
    }()]            /* c is a list of the pairs */
    d=[]
    e=[]
    c| /* push the pairs to the stream */
    _| /* flat */
    {  /* for each pair (a, b): */
        { /* if a != b (remove "1-to-1 relations"):  */
            d+=a;
            e+=b
        }if[a!=b]
    }for a,b
    /* return d and e if no character is mapped to more than one character */
    [d,e]if c|[_[0]]|sort|count|[_2=1]
}

Đây là một giải pháp gạch dưới không chứa biến (114 byte):

{[[{_<>_}()|[[_,_]]|unorderedUniq]]|[[_()|_|[_]if[_1!=_2]],[_1()|_|[_2]if[_1!=_2]]]if[[_1()|_][::2],[_1()|_][1::2]]|[sort(_)|count|[_2=1]]}

Đó là rất nhiều dấu gạch dưới.


Làm gì <>?
Kritixi Lithos

@KritixiLithos Đó là toán tử xen kẽ. a() <> b()giống như interleave([a()], [b()])(hoặc chỉ interleave(a, b), nếu ablà mảng).
fergusq

Điều này không thành công trong a1 22 => falsetrường hợp thử nghiệm. "tất cả các bản dịch xảy ra độc lập với nhau, có nghĩa là điều này là sai lệch."
mbomb007

@ mbomb007 Tôi không hiểu bạn nói gì? Bạn có nghĩa là nó phải là một bijection, tức là. không có hai nhân vật phải được ánh xạ đến cùng một nhân vật?
fergusq

Đúng. Đó là những gì câu hỏi nói. ( Mỗi ký tự chỉ có thể được sử dụng ONCE ở mỗi bên của bản dịch )
mbomb007

1

AWK, 140 byte

BEGIN{RS="(.)"}RT~/\W/{S=1}RT~/\w/&&S{if(RT!=x=A[++b]){if(B[z=RT]==""){B[z]=x
c=c x
d=d z}a=B[z]!=x?0:a}}!S{A[++a]=RT}END{if(a==b)print c,d}

Cách sử dụng: Đặt mã vào FILEsau đó:

awk -f FILE <<< "string1 string2"

Các chuỗi đầu vào cần phải được phân tách khoảng trắng.

Đầu ra trống nếu chúng thất bại hoặc 2 chuỗi cách nhau bởi một khoảng trắng.


1

k, 28 byte

{$[(y?y)~x?x;+?(~=/)#x,'y;]}

Giải trình:

{                          } /function that takes in two strings, x and y
 $[         ;            ;]  /if statement (to check if there is a mapping)
         x?x                 /first index of [each letter in x] in x
   (y?y)                     /first index of [each letter in y] in y
        ~                    /make sure they match
                     x,'y    /zip together the two strings
               (~=/)#        /remove equal pairs
              ?              /unique pairs only
             +               /transpose ("unzip", in a way)

1

APL (Dyalog) với AGL , 22 byte

{≡/⍳⍨¨⍺⍵:↓⍉↑∪⍺(≠é,¨)⍵}

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

{... } chức năng ẩn danh:

 Nếu…

  ⍺⍵ các đối số

  ⍳⍨¨ khi tự lập chỉ mục (tức là lần đầu tiên xuất hiện các yếu tố của chúng)

  ≡/ tương đương

: sau đó:

  ⍺(... )⍵ áp dụng các chức năng ngầm sau đây để các đối số:

    nối các phần tử tương ứng (lỗi về độ dài không khớp)

   é sau đó lọc theo ( échỉ là hàm nguyên thủy /)

    nơi các chuỗi khác nhau

   duy nhất (loại bỏ trùng lặp)

  ↓⍉↑ chuyển đổi danh sách các cặp thành cặp danh sách (lit. trộn vào bảng, bảng chuyển đổi, chia thành các danh sách)

 khác, không làm gì cả


1
kiên nhẫn chờ đợi lời giải thích của câu trả lời này : P
Bạch tuộc ma thuật Urn

1
@carusocomputing Tôi đang ở trên đó.
Adám

@carusocomputing OK?
Adám

Tôi đã bỏ lỡ câu trả lời đó, xin lỗi! ↓⍉↑vẫn còn một chút bối rối.
Bạch tuộc ma thuật Urn

1
@carusocomputing Có lẽ điều này giúp? Lưu ý rằng trong APL và J, một ma trận không giống như một danh sách các danh sách.
Adám

0

CJam, 38 byte

{_:,~={1\/;}:K~z{)\c=!},L|z_{_L|=K}%;}

Đầu vào và đầu ra là các mảng trên ngăn xếp.


0

PHP (> = 7.1), 165 byte

for([,$x,$y]=$argv;a&$c=$x[$i];$t[$c]=$d)$z+=($d=$y[$i++])&&$d==($t[$c]??$d);foreach($t as$a=>$b)$a==$b?:$r[$a]=$b;print_r($z<$i|array_unique($r)<$t||a&$y[$i]?0:$t);

in 0cho giả, mảng kết hợp khác. Chạy với -rhoặc kiểm tra trực tuyến .

phá vỡ

for([,$x,$y]=$argv;         # import arguments to $x and $y
    a&$c=$x[$i];            # loop through $x
    $t[$c]=$d)                  # 2. add pair to translation
$z+=                            # 1. increment $z if
    ($d=$y[$i++])&&             # there is a corresponding character in $y and
    $d==($t[$c]??$d);           # it equals a possible previous replacement
                            # remove identities from translation
foreach($t as$a=>$b)$a==$b?:$r[$a]=$b;
print_r(
    $z<$i                   # if not all tests passed
    |array_unique($t)<$t    # or there are duplicates in the translation
    ||a&$y[$i]              # or $y has more characters
    ?0                      # then print 0
    :$r                     # else print translation
);

Là mảng kết hợp như đầu ra cho phép? Bạn có thể vui lòng thêm rằng nó hoạt động trên phiên bản 7.1
Jörg Hülsermann

@ JörgHülsermann Output can be as an array or ..., vì vậy tôi nói là có. Phiên bản PHP hiện tại là ẩn cho tất cả các bài đăng của tôi; nhưng nếu tôi tìm thấy thứ gì đó quan trọng để chỉnh sửa, tôi sẽ thêm phiên bản.
Tít

Các trường hợp hợp lệ chỉ hiển thị một ý nghĩa của đầu ra mảng. Nếu mảng kết hợp cũng được cho phép, tôi có thể lưu một vài byte. Nếu nó được cho phép và array_unique($r)!=$rtrong mọi trường hợp array_unique($r)<$rtôi sẽ nâng cấp bài viết của bạn một mình cho thủ thuật này. Trong khoảnh khắc tôi đang tìm kiếm một lời giải thích
Jörg Hülsermann

@ JörgHülsermann array_unique($t)<$t(phải thay đổi mà vì canđể cnnkhông hợp lệ) hoạt động, vì mảng so sánh (không giống như so sánh chuỗi) so sánh độ dài trước khi bất cứ điều gì khác.
Tít

Xét nghiệm này canđể cnnchi phí cho tôi 17 Bytes Quên gợi ý của tôi
Jörg Hülsermann
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.