変換テーブルを見つける


17

2つの文字列が与えられた場合、2つの間の変換テーブル(置換暗号)を見つけ、変換が不可能な場合はfalseを出力します。答えは最小化し、左から右に作成する必要があります。単語間で翻訳される最初の文字は、翻訳テーブルの最初の文字でなければなりません。これに加えて、翻訳されていない(元の場所と同じ場所にある)手紙は、翻訳テーブルに入れないでください。

おそらく例を通して最も簡単に定義できます:

有効なケース

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

順序に注意してください。出力は["tb","ps"]このチャレンジでは無効です。

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

nは1対1の関係であるため、がどのように変換されないかに注意してください。

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

iは1対1の関係であるため、がどのように変換されないかに注意してください。

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

Aは含まれず、同じままで、パターンマッチのためにsマッピングできますl

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

パターンと完全に一致します。

偽のケース

"banana", "angular" => false

(同じ長さではなく、不可能です)。

"animal", "snails" => false

(各文字は、翻訳の両側で1回のみ使用できます)。

"can","cnn" => false

(nは変換で暗黙的に使用されるため、n-> aで変換テーブルを定義することは無効になります)

したがって、これ[aimal,sails]は無効な答えであり、これは偽物です。

"a1", "22" => false

「警告」を参照してください。これは偽物としてリストされています。ので、この場合、それはだa1の両方にマップすることはできません2。(各文字は、翻訳の両側で1回のみ使用できます)。


この答えは良いベンチマークのようです:https : //codegolf.stackexchange.com/a/116807/59376

リストにない2つの単語ペアの機能について質問がある場合は、この実装を延期してください。


I / Oルール

  • 入力は、2要素の配列または2つの個別の入力として可能です。
  • 出力は、表示方法と同様に、配列または改行/スペースで区切られています。
  • 誤った出力は、0、-1、またはfalseです。エラー/空の出力でも問題ありません。
  • あなたはa平等bでもaなくb、空でもないことを保証されます。
  • aおよびbは、印刷可能なASCIIのみの文字のシーケンスです。

注意事項

  • 翻訳は左から右に行わなければなりません。例1を参照してください。
  • 同じままの文字を出力しないでください。
  • あなたのプログラムは、二つの文字列にかかる場合がありますab
  • 各文字は、翻訳の両側で1回のみ使用できます。これが、翻訳snailsanimals不可能にするものです。
  • 再帰的な置換は発生しません。再帰的な置換の例:"a1","22"->[a1,12]aが最初に1に置換され、結果の両方の1が2に置換されます。これは正しくありません。すべての翻訳が互いに独立して行われていると仮定してください。これは偽りです。意味:[a1,12]の変換テーブルを持つ「a1」は12(22ではなく)に評価されます

この「翻訳」に単純な置換暗号としてラベルを付けると、意図が明確になる場合があります。
グレッグマーティン

連想配列は出力として許可されますか?それは私にいくつかのバイトを節約することができます
ヨルクヒュルサーマン

@JörgHülsermanこれを許可することの意味が完全にはわからないので、2つのバージョンを作成して、違いを見ることができますか?チャレンジにとって有害で​​はないと思う場合は、編集します。
魔法のタコUr

文字列として私のポスト第一溶液を見て、目は出力として連想配列を持っている
イェルクHülsermann

@JörgHülsermannahhh ...あなたは今それをどのように使用しているのかわかります。すべての言語がハッシュのような構造をサポートしているわけではないので、私はそれを拒否するつもりです。
魔法のタコUr

回答:


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
魔法のタコUr

うん、そのスニペットはトリッピンである '、また確認された、それは結構です。
魔法のタコUr

1
@carusocomputing変数名の衝突でした-修正されました。ごめんなさい
ニール

7

JavaScriptの(ES6)、108の 107 105 106バイト

編集"22" / "a1"偽のはずの入力をサポートするように修正。


02つの文字列のいずれかまたは配列を返します。

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')偽物であるべきです。
ニール

うまくいけば、今回はそれが正しかったと思います。
アーナルド

1
バグ修正がより短いものに単純化することが判明したとき、それは常に便利です!
ニール

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バイト

連想配列が許可されている場合、2番目の答えはこれに短絡することができます

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お世辞に感謝します。ちょっとしたトリックを忘れました。私はここに彼らが私より優れている多くの人々であることを知っています
ヨルクヒュルサーマン

2
解決策を見つけるのは間違いなく+1ですが、array_values()中身join()はまったく役に立たず、落とすことができます。
クリストフ

1
これはa1 22 => falseテストケースに失敗します。また、最初のプログラムはオンラインテスターでは機能しないようです。
mbomb007

1
黙れ。それは素晴らしいです。
タイタス

1
足ひれは行くことができます:($p=$x[$i])==$o?:$k[$c[$p]=$o]=$p;ループ内で$y==strtr($x,$c)最初のテストのために18バイトを保存します。
タイタス

5

ゼリー、18 バイト

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

名前のないモナ
ドリンク(1入力関数)がリストを取得し、次を返します。偽の場合は空のリスト。または
、真実の場合の文字の2つのリストを含むリスト。

オンラインでお試しください!(フッターは、リストをスペースで分割して、表現が不鮮明になるのを防ぎます)
...またはテストスイートを表示します

どうやって?

Ạ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;22偽と宣言しなかった別の間違いが見つかりましたが、修正した後、プログラムを250バイト未満に保つことができました

説明

(詳細な説明は近日中に提供されます)

最初に、文字列の長さab同じか。そうでない場合、すべてを削除します。

入力を複製して、長さのテストを行っている間、それを保持します。

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

ループ内で、文字列の1つが空になるまで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およびで音訳されていない文字が削除されますbabc;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 Indeed!私も(?(1)(?!))あなたの答えから学んだことを使用しました:)
Kritixi Lithos

最初に重複を削除して残りのセットを検証する方が短いのかなと思ってい;ます。
ニール

@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点でゼリーを知っていますか?非常に印象的!
魔法のタコUr

2
ありがとう。サイトを少し見て回ると、学習するのにきちんとした言語のように見えました。
layagyasz

05AB1Eはもう1つの簡単で楽しいものです。
魔法のタコUr

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
}

キックのために、ゴルビーの84バイトバージョンを紹介します。これはRubyですが、インタープリターのコンパイル時にゴルフフラグが設定されています。特に、メソッド呼び出しを最短の一意の識別子に短縮できます。

->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実装で2番目の回答を投稿してみませんか?受け入れられているゴルフ言語ではありませんか?
魔法のタコUr

@carusocomputing完全にそうです。それは自分の答えに値しないように思えました-メソッド名が省略されているだけで、私の主な答えとまったく同じです。おそらく、Gorubyの違いをもっと活用する方法を見つけたら、別の回答を投稿します。
Tutleman

3

パイソン2198,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


また、各テストケースを1行で作成するプログラムを作成しました。これは、プログラムをテストする人にとって非常に役立ちます。
mbomb007

あなたが編集コメントでそれを言及できたらもっといいと思います!
Keerthana Prabhakaran

3

Pythonの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が必要です。Python3.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リンクのプログラムはを返しますFalse1a 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]}_}

オンラインでお試しください!

これは、ストリームから文字の2つのリストを取得し、2つのリストをストリームにプッシュする関数です。

ペアを返すことが許可されている場合、これはソーターになる可能性があります。

説明(期限切れ):

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

それは多くのアンダースコアです。


何をし<>ますか?
クリチキシリトス

@KritixiLithosこれはインターリーブ演算子です。a() <> b()interleave([a()], [b()])(とが配列のinterleave(a, b)場合a、単に)と同じbです。
fergusq

これはa1 22 => falseテストケースに失敗します。「すべての翻訳は互いに独立して行われるため、これは偽りです。」
mbomb007

@ mbomb007私はあなたの言うことをよく理解できませんか?つまり、全単射でなければならないということですか?2つの文字を同じ文字にマッピングする必要はありませんか?
-fergusq

はい。それが質問の答えです。(各文字は、翻訳の両側で1回のみ使用できます
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
マジックタコ壺

1
@carusocomputing私はそれに取り組んでいます。
アダム

@carusocomputing OK?
アダム

返信がありませんでした、ごめんなさい!↓⍉↑まだ少し混乱しています。
魔法のタコUr

1
@carusocomputing たぶんこれは役立ちますか?APLおよびJでは、マトリックスはリストのリストと同じではないことに注意してください。
アダム


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偽の連想配列elseを出力します。オンラインで実行する-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の上に動作することを追加してくださいでした
イェルクHülsermann

@JörgHülsermann Output can be as an array or ...、だから私はイエスと言うでしょう。現在のPHPバージョンは、すべての投稿に対して暗黙的です。しかし、編集する重要な何かを見つけたら、バージョンを追加します。
タイタス

有効なケースは、配列出力の1つの意味のみを示しています。連想配列も許可されている場合、数バイトを節約できます。それが許可さarray_unique($r)!=$rれ、すべての場合において、array_unique($r)<$r私はこのトリックのためにあなたの投稿を単独で支持します。現在、私は説明を探しています
ヨルクヒュルサーマン

@JörgHülsermann array_unique($t)<$tcanto cnnが無効であるため、これを変更する必要があります)は機能します。これは、配列比較(文字列比較とは異なります)が他の何よりも前に長さを比較するためです。
タイタス

テストcanするためにcnn私に17バイトの費用は私の提案忘れ
イェルクHülsermann
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.