번역 표 찾기


17

두 개의 문자열이 주어지면, 둘 사이 의 변환 표 ( 대체 암호 )를 찾으십시오 . 변환이 불가능하면 false를 출력하십시오. 답을 최소화하고 왼쪽에서 오른쪽으로 만들어야합니다. 단어 사이에서 번역 될 첫 번째 문자는 번역 표에서 첫 번째 문자 여야합니다. 이 외에도 번역되지 않은 (원래와 같은 장소에있는) 문자는 번역 표에 없어야합니다.

아마도 예제를 통해 가장 쉽게 정의 할 수 있습니다.

유효한 사례

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

순서에 주목하십시오. 출력은 ["tb","ps"]이 챌린지에 유효하지 않습니다.

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

n이 관계가 일대일 관계이기 때문에 어떻게 번역되지 않는지 주목하십시오 .

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

i이 관계가 일대일 관계이기 때문에 어떻게 번역되지 않는지 주목하십시오 .

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

A는 포함되지 않고 동일하게 유지 되며 패턴 일치 s로 l인해 매핑 될 수 있습니다 .

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

패턴과 완벽하게 일치합니다.

허위 사례

"banana", "angular" => false

(같은 길이가 아니고 불가능합니다).

"animal", "snails" => false

(각 문자는 번역 양쪽에서 한 번만 사용할 수 있습니다).

"can","cnn" => false

(n은 번역에 내재적으로 사용되므로 n-> a로 번역 테이블을 정의하는 것은 유효하지 않습니다)

따라서 [aimal,sails]잘못된 답변이며,이를 허위로 만듭니다.

"a1", "22" => false

"캐비티"를 참조하십시오. 이것은 허위로 표시됩니다. 때문에이 경우의 a및 1모두에 매핑 할 수 없습니다 2. (각 문자는 번역 양쪽에서 한 번만 사용할 수 있습니다).


이 답변은 좋은 벤치 마크 인 것 같습니다 : /codegolf//a/116807/59376

나열되지 않은 두 단어 쌍의 기능에 대한 질문이있는 경우이 구현을 연기하십시오.


I / O 규칙

  • 입력은 2 요소 배열 또는 2 개의 개별 입력일 수 있습니다.
  • 출력은 배열 방식 또는 줄 바꿈 / 공백으로 구분할 수 있으며 표시 된 방식과 비슷합니다.
  • 거짓 출력은 0, -1 또는 false 일 수 있습니다. 오류 / 빈 출력도 좋습니다.
  • 당신은 a같지 않으며 비어 b있지 a않을 b것입니다.
  • a그리고 b문자의 인쇄-ASCII 전용 시퀀스입니다.

경고

  • 번역은 왼쪽에서 오른쪽으로 이루어져야합니다 (예 1 참조).
  • 동일하게 유지되는 문자를 출력해서는 안됩니다.
  • 귀하의 프로그램은 두 개의 문자열에 걸릴 수 있습니다 a와 b.
  • 각 문자는 번역의 양쪽에서 한 번만 사용할 수 있습니다. 이것이 번역 snails을 animals불가능 하게 만드는 것 입니다.
  • 재귀 교체가 발생하지 않아야합니다. 재귀 대체의 예 : "a1","22"->[a1,12]a가 먼저 1로 대체되고 결과로 생성 된 1이 모두 2로 대체됩니다. 이것은 정확하지 않습니다. 모든 번역이 서로 독립적으로 발생한다고 가정합니다. 이는 잘못된 것입니다. 의미 : [a1,12]의 번역 표가있는 "a1"은 12 (22 아님)로 평가됩니다.

이 "번역"을 간단한 대체 암호 로 표시 하면 의도를 명확히하는 데 도움이 될 수 있습니다.
— Greg Martin

연관 배열이 출력으로 허용됩니까? 그것은 약간의 바이트를 절약 할 수있다
— Jörg Hülsermann

@ JörgHülserman 나는 이것을 허용하는 의미를 완전히 확신하지 못하고, 아마도 2 버전을 만들어서 차이점을 볼 수 있습니까? 도전에 해롭지 않다고 생각되면 편집하겠습니다.
— Magic Octopus Urn

문자열로 내 게시물 최초의 솔루션 봐 두 번째는 출력으로 연관 배열을 가지고
— 요 르그 Hülsermann

@ JörgHülsermann ahhh ... 지금 어떻게 사용하고 있는지 알지만, 모든 언어가 해시와 같은 구조를 지원하는 것은 아닙니다.
— Magic Octopus Urn

답변:


7

JavaScript (ES6), 128 바이트

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>


작동하지 않습니다 ass와 all이어야한다 s,l.
— Magic Octopus Urn

그래, 그 발췌 문장은 트립 될 것입니다. 또한 확인되었습니다.
— Magic Octopus Urn

1
@carusocomputing 변수 이름 충돌이었습니다. 이제 수정되었습니다. 미안합니다.
— Neil

7

자바 스크립트 (ES6) 108 107 105 106 바이트

편집 : "22" / "a1"허위 입력과 같은 입력을 지원하도록 수정되었습니다 .


0두 문자열의 배열을 반환합니다 .

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

형식화 및 의견

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)

테스트 사례


f('22')('a1')너무 거짓이어야합니다.
— Neil

잘만되면 나는 이번에 그것을 올바르게 얻었다.
— Arnauld

1
버그 수정이 더 짧은 것으로 단순화 될 때 항상 편리합니다!
— Neil

7

PHP> = 7.1, 130 바이트

@Titus에 의해 절약 된 18 바이트

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;

테스트 케이스

넓히는

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 바이트

false로 0을 인쇄합니다. 문자열로 true를 출력합니다.

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;

테스트 케이스

넓히는

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 바이트

연관 배열이 허용되는 경우 두 번째 대답은 이것으로 단락 될 수 있습니다

false 대신 0을 출력합니다. 문자열 대신 연관 배열로 true를 출력합니다.

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

테스트 케이스

PHP> = 7.1, 227 바이트

false로 0을 인쇄합니다

[,$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;

테스트 케이스

넓히는

[,$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 칭찬에 감사드립니다. 나는 약간의 트릭을 잊었다. 나는 그들이 나보다 나은 사람이 많다는 것을 알고 있습니다.
— Jörg Hülsermann

2
해결책 +1을 찾는 데는 능숙하지만 array_values()내부 join()는 완전히 쓸모가 없으며 떨어질 수 있습니다.
— Christoph

1
a1 22 => false테스트 사례 가 실패합니다 . 또한 첫 번째 프로그램이 온라인 테스터에서 작동하지 않는 것 같습니다.
— mbomb007

1
입 닥쳐. 놀랍습니다.
— Titus

1
오리발은 갈 수 있습니다 : ($p=$x[$i])==$o?:$k[$c[$p]=$o]=$p;루프와 $y==strtr($x,$c)첫 번째 테스트 에서 18 바이트를 절약하십시오 .
— Titus

5

젤리 , 18 바이트

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

이름이없는 모나드 링크 (1 입력 기능)는 다음과
같은 목록을 가져옵니다. 또는
진실한 경우에 두 개의 문자 목록을 포함하는 목록.

온라인으로 사용해보십시오! 바닥 글은 밀린 표현을 인쇄하지 않도록 공백으로 목록을 분할합니다.
... 또는 테스트 스위트를 참조하십시오.

어떻게?

Ạ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

망막 , 194 191 185 229 225 241 바이트

.+
$&;$&
+`^\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).*

온라인으로 사용해보십시오!

입력을 ;분리합니다. 출력도 ;분리됩니다. 잘못된 입력은 빈 출력으로 표시됩니다.

나는 이것이 고통스럽게 장황하다는 것을 알고 있습니다. 나는 여전히 바이트를 줄이려고 노력하고 있습니다. 이러한 바이트의 대부분은 잘못된 입력을 삭제합니다.

편집

  • 내 프로그램에 중대한 결함이 있음이 밝혀졌습니다. 이제 수정되었지만 40 바이트가 넘습니다.

  • 내 프로그램이 입력을 a1;22false로 선언하지 않은 또 다른 실수가 발견 되었지만 프로그램을 수정 한 후 250 바이트 미만으로 유지할 수있었습니다.

설명

(더 자세한 설명은 곧 제공 될 예정입니다)

먼저 문자열의 길이 a와 길이가 b같은지 확인해야합니다 . 그렇지 않은 경우 모든 것을 삭제합니다.

우리가 길이 테스트를하는 동안 입력을 보존하기 위해 입력을 복제합니다.

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

이제 루프 에서 문자열 중 하나가 비워 질 때까지 a첫 번째 문자와 첫 번째 문자를 삭제합니다 b.

+`                     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

이제 "패턴 공간"에 대한 가능성이 있습니다.

  • ;;abc 두 줄의 길이는 같습니다
  • def;;abc a 보다 길다 b
  • ;def;abc b 보다 길다 a

문자열 길이가 같지 않으면 입력을 비워야합니다 (시나리오 2 및 3). 이것이 아래의 대체물입니다. 시나리오 2 및 3과 일치하는 텍스트를 제거합니다.

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

문자열 a및로 음역되지 않은 문자를 제거합니다 b. abc;1b2=>ac;12

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

그런 다음 중복 문자를 제거해야합니다. sese;1212=> se;12이지만 이것은 다음과 같은 입력을 유지합니다.aba;123

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

같은 다른 문자에 매핑 중복 문자가있는 경우 마지막으로, 우리는 입력을 삭제 aba;123하거나 a1;22.

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

마지막으로 중복 문자를 제거하십시오.


내가 본 균형 그룹을 사용!
— Neil

@ 닐 참으로! 나는 또한(?(1)(?!)) 당신의 대답에서 배운 것을 :)
— Kritixi Lithos

중복을 먼저 제거한 다음 나머지 세트의 유효성을 검사하는 것이 더 짧은 지 궁금합니다 ;.
— Neil

@Neil 나는 그것을 실험하는 코드에서 오류를 발견했다. 아침에 더 자세히 살펴볼 것입니다.
— Kritixi Lithos

4

젤리 , 28 26 바이트

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

온라인으로 사용해보십시오!

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
PPCG에 오신 것을 환영합니다! 어떻게 도대체 당신은 이미에만 21 점 젤리를 알 수 있습니까? 매우 인상적!
— Magic Octopus Urn

2
감사. 사이트 주위를 조금만 살펴보면 배우는 깔끔한 언어처럼 보였습니다.
— layagyasz

05AB1E는 또 다른 쉽고 재미있는 방법입니다.
— Magic Octopus Urn

3

루비, 133 바이트

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

온라인으로 사용해보십시오!

더 읽기 쉽게 :

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

킥을 위해 여기에 Ruby 인 84 바이트 버전의 Goruby가 있지만, 인터프리터를 컴파일 할 때 골프 플래그가 설정되어 있습니다. 무엇보다도 메소드 호출을 가장 짧은 고유 식별자로 축약 할 수 있습니다.

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

Goruby 구현으로 두 번째 답변을 게시하지 않겠습니까? 허용되는 골프 언어가 아닙니까?
— Magic Octopus Urn

@carusocomputing 그것은 완전히; 그것은 그 자체의 답을 얻지 못한 것처럼 보였습니다. 메서드 이름과 단축 된 메서드 이름만으로 내 대답과 정확히 동일합니다. 어쩌면 Goruby의 더 많은 차이점을 활용할 수있는 방법을 찾으면 별도의 답변을 게시 할 것입니다.
— Tutleman

3

파이썬 2 , 198,193,189,182,179,175,169, 165 바이트

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

온라인으로 사용해보십시오!

  • -4 바이트! 공간 대신 ​​탭 사용을 제안 해 주신 mbomb007에게 감사합니다.

  • mbomb007 덕분에 입력 형식이 수정되었습니다.


그게 무슨 뜻 이니? 응답 할 가치가없는 원치 않는 편집을 중지하십시오!
— Keerthana Prabhakaran

탭이 약 4 바이트 절약되었습니다! 감사합니다!
— Keerthana Prabhakaran


또한 프로그램마다 각 테스트 사례를 한 줄로 작성하여 프로그램을 테스트하는 모든 사람에게 매우 유용합니다.
— mbomb007

편집 의견에서 언급 할 수 있다면 더 좋을 것입니다!
— Keerthana Prabhakaran

3

파이썬 3.6, 211 185 181 178 바이트

잘못된 결과에 대한 오류와 함께 종료합니다.

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

셸에서 실행할 수있는 Python 3.6이 필요합니다. 에서 .

TIO 에서 올바른 출력 순서없이 테스트 할 수 있습니다 . (TIO에는 3.6이 없습니다).

언 골프 드 :

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

주문 만 중요하지 않은 경우 ...


대신에 a1,12반환 해서는 안 됩니까? 주의 사항 섹션 에서 [a1,12]의 변환 표 가있는 "a1"은 12로 평가됩니다 . a1,12False
— fergusq

1
TIO 링크의 프로그램은를 반환합니다 False. 1a 21oeder를 보존해야하므로 잘못된 것입니다.
— fergusq

@fergusq 수정되었습니다. 하지만 그건 당신이 말한 이후, 당신이 언급하고있는 테스트 케이스의 경우 귀하의 코멘트에 오타가 통지 것을 a1,12대신 a1,22.
— mbomb007

나는 당신을 오해했다. 질문 편집에서주의 사항 섹션을 참조했지만주의 사항 섹션은 실제로는 사법 규칙이 아닌 다른 경우를 처리합니다. 그것은 나를 혼란스럽게했다.
— fergusq

다른 규칙을 처리하지만 여전히 테스트 사례의 결과가 거짓이라고 말합니다.
— mbomb007

2

로다 , 108 119 바이트

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

온라인으로 사용해보십시오!

스트림에서 두 개의 문자 목록을 가져와 두 개의 목록을 스트림으로 푸시하는 기능입니다.

내가 쌍을 반환하도록 허용 된 경우 분류 기가 될 수 있습니다.

설명 (날짜) :

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

변수가없는 밑줄 솔루션은 다음과 같습니다 (114 바이트).

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

그것은 많은 밑줄입니다.


무엇을 <>합니까?
— Kritixi Lithos

@KritixiLithos 인터리브 연산자입니다. a() <> b()와 동일합니다 interleave([a()], [b()])(또는 interleave(a, b)if a및 b배열입니다).
— fergusq

a1 22 => false테스트 사례 가 실패합니다 . "모든 번역은 서로 독립적으로 발생하며 이는 허위임을 의미합니다."
— mbomb007

@ mbomb007 당신이 무슨 말을하는지 잘 모르겠습니까? 그것이 bijection이어야한다는 것을 의미합니까? 두 문자를 동일한 문자에 매핑하면 안됩니까?
— fergusq

예. 이것이 바로 질문입니다. ( 각 문자는 번역의 양쪽에서 한 번만 사용할 수 있습니다 )
— mbomb007

1

AWK, 140 바이트

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}

사용법 : 다음에 코드를 FILE넣습니다.

awk -f FILE <<< "string1 string2"

입력 문자열은 공백으로 구분해야합니다.

실패하면 출력이 비어 있거나 공백으로 구분 된 2 개의 문자열입니다.


1

k, 28 바이트

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

설명:

{                          } /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) 와 AGL 22 바이트

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

온라인으로 사용해보십시오!

{… } 익명 기능 :

 만약…

  ⍺⍵ 논쟁

  ⍳⍨¨ 자체 색인 생성 된 경우 (즉, 해당 요소의 첫 번째 항목)

  ≡/ 동등하다

 : 그때:

  ⍺(… )⍵ 다음 암묵적 기능을 인수에 적용하십시오.

   ,¨ 해당 요소를 연결 (길이 불일치 오류)

   é 그런 다음 필터링 기준 ( é원시 기본 기능 /임)

   ≠ 문자열이 다른 곳

  ∪ 고유 (중복 제거)

  ↓⍉↑ 쌍의 목록을 쌍의 목록으로 전치 (테이블로 혼합, 테이블 전치, 목록으로 분할)

 그렇지 않으면 아무것도 하지마


1
이 답변에 대한 설명을 참을성있게 기다리고 있습니다 : P
— Magic Octopus Urn

1
@ carusocomputing 나는 그것에있어.
— Adám

@carusocomputing OK?
— Adám

답장을 놓쳤습니다. 죄송합니다. ↓⍉↑아직도 조금 혼란스러워합니다.
— Magic Octopus Urn

1
@carusocomputing 어쩌면 이것이 도움이 될까요? APL 및 J에서 행렬은 목록 목록과 동일하지 않습니다.
— Adám

0

CJam, 38 바이트

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

입력 및 출력은 스택의 배열입니다.


0

PHP (> = 7.1), 165 바이트

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

0거짓, 연관 배열을 인쇄 합니다. 온라인으로 실행 -r또는 테스트 .

고장

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

연관 배열이 출력으로 허용됩니까? 버전 7.1 이상에서 작동 함을 추가 할 수 있습니까?
— Jörg Hülsermann

@ JörgHülsermann Output can be as an array or ...이므로 그렇습니다. 현재 PHP 버전은 모든 게시물에 내재되어 있습니다. 하지만 편집해야 할 중요한 것이 있으면 버전을 추가하겠습니다.
— Titus

유효한 경우는 배열 출력의 한 가지 의미 만 보여줍니다. 연관 배열도 허용되면 몇 바이트를 절약 할 수 있습니다. 그것이 허용되고 array_unique($r)!=$r모든 경우 array_unique($r)<$r에이 트릭을 위해 당신의 게시물을 혼자서 투표 할 것입니다. 지금 설명을 찾고 있습니다
— Jörg Hülsermann

JörgHülsermann @ array_unique($t)<$t(그 때문에 변화했다 can에가 cnn(문자열 비교는 달리) 배열 비교 아무것도하기 전에 길이를 비교하기 때문에, 작동 무효).
— Titus

17 바이트의 비용 can을 cnn청구 하는 테스트 내 제안을 잊어 버려
— Jörg Hülsermann
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.