번역 표 찾기


17

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

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

유효한 사례

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

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

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

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

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

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

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

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

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

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

허위 사례

"banana", "angular" => false

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

"animal", "snails" => false

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

"can","cnn" => false

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

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

"a1", "22" => false

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


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

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


I / O 규칙

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

경고

  • 번역은 왼쪽에서 오른쪽으로 이루어져야합니다 (예 1 참조).
  • 동일하게 유지되는 문자를 출력해서는 안됩니다.
  • 귀하의 프로그램은 두 개의 문자열에 걸릴 수 있습니다 ab.
  • 각 문자는 번역의 양쪽에서 한 번만 사용할 수 있습니다. 이것이 번역 snailsanimals불가능 하게 만드는 것 입니다.
  • 재귀 교체가 발생하지 않아야합니다. 재귀 대체의 예 : "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>


작동하지 않습니다 assall이어야한다 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 ab배열입니다).
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 바이트의 비용 cancnn청구 하는 테스트 내 제안을 잊어 버려
Jörg Hülsermann
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.