Temukan Tabel Terjemahan

17

Diberikan dua string, cari tabel terjemahan ( subtitle cipher ) di antara keduanya, jika terjemahan tidak memungkinkan, output salah. Jawabannya harus diminimalkan dan dibuat dari kiri ke kanan. Karakter pertama yang diterjemahkan antara kata-kata harus menjadi yang pertama dalam tabel terjemahan. Selain itu, huruf apa pun yang tidak diterjemahkan (di tempat yang sama dengan aslinya), TIDAK boleh ada dalam tabel terjemahan.

Mungkin paling mudah didefinisikan melalui contoh:

Kasus yang valid

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

Perhatikan urutannya, output dari ["tb","ps"]tidak valid untuk tantangan ini.

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

Perhatikan bagaimana ntidak diterjemahkan karena itu adalah hubungan 1 ke 1.

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

Perhatikan bagaimana itidak diterjemahkan karena itu adalah hubungan 1 ke 1.

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

A tidak termasuk, tetap sama, sdapat memetakan lkarena kecocokan pola.

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

Pola yang cocok sempurna.

Kasus Palsu

"banana", "angular" => false

(tidak sama panjang, tidak mungkin).

"animal", "snails" => false

(setiap karakter hanya dapat digunakan SEKALI di setiap sisi terjemahan).

"can","cnn" => false

(n secara implisit digunakan dalam terjemahan, oleh karena itu, mendefinisikan tabel terjemahan dengan n-> a tidak valid)

Jadi, itu [aimal,sails]adalah jawaban yang tidak valid, membuat ini salah.

"a1", "22" => false

Lihat "peringatan", ini terdaftar sebagai kepalsuan. Dalam hal ini, itu karena adan 1tidak dapat memetakan keduanya 2. (Setiap karakter hanya dapat digunakan SEKALI di setiap sisi terjemahan).


Jawaban ini tampaknya menjadi patokan yang bagus: /codegolf//a/116807/59376

Jika Anda memiliki pertanyaan tentang fungsi dua pasangan kata yang tidak terdaftar, tunda implementasi ini.


Aturan I / O

  • Input dapat berupa array elemen 2 atau sebagai 2 input terpisah.
  • Output dapat berupa array atau baris baru / ruang dibatasi, mirip dengan yang saya tunjukkan.
  • Output salah bisa 0, -1 atau salah. Kesalahan / output kosong juga baik-baik saja.
  • Anda dijamin atidak akan sama bdan tidak ajuga tidak bakan kosong.
  • adan bhanya urutan huruf yang dapat dicetak-ASCII.

Peringatan

  • Terjemahan harus muncul dari kiri ke kanan, lihat contoh 1.
  • Anda tidak boleh menampilkan karakter yang tetap sama.
  • Program Anda hanya dapat menerima dua string adan b.
  • Setiap karakter hanya dapat digunakan SEKALI di setiap sisi terjemahan. Inilah yang membuat terjemahan dari snailsmenjadi animalstidak mungkin.
  • Penggantian rekursif tidak boleh terjadi. Contoh ganti rekursif: di "a1","22"->[a1,12]mana a pertama diganti dengan 1, maka kedua resultan diganti dengan 2's. Ini tidak benar, anggap semua terjemahan terjadi secara independen satu sama lain, artinya ini palsu. Artinya: "a1" dengan tabel terjemahan [a1,12] dievaluasi menjadi 12 (bukan 22)
Guci Gurita Ajaib
sumber
Memberi label "terjemahan" ini sebagai sandi substitusi sederhana dapat membantu memperjelas maksudnya.
Greg Martin
Apakah array asosiatif diizinkan sebagai output? Ini bisa menyelamatkan saya beberapa byte
Jörg Hülsermann
@ JörgHülserman Saya tidak sepenuhnya yakin tentang implikasi mengizinkan ini, mungkin membuat 2 versi sehingga saya bisa melihat perbedaannya? Saya akan mengeditnya jika saya pikir itu tidak berbahaya bagi tantangan.
Magic Gurita Guci
Lihatlah solusi posting pertama saya sebagai string dan yang kedua sebagai output array asosiatif
Jörg Hülsermann
@ JörgHülsermann ahhh ... Saya melihat bagaimana Anda menggunakannya sekarang, saya pikir saya akan melarang itu, tidak semua bahasa mendukung struktur hash.
Guci Gurita Ajaib

Jawaban:

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>

Neil
sumber
Tidak bekerja untuk assdan all, seharusnya s,l.
Guci Gurita Ajaib
Ya, cuplikan itu menjadi trippin ', juga diverifikasi, tidak apa-apa.
Magic Gurita Guci
1
@carusocomputing Itu adalah nama variabel bentrokan - sekarang sudah diperbaiki. Maaf soal itu.
Neil
7

JavaScript (ES6), 108 107 105 106 byte

Sunting : Diperbaiki untuk mendukung input seperti "22" / "a1"yang seharusnya palsu.


Mengembalikan salah satu 0atau array dari dua string.

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

Diformat dan dikomentari

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)

Uji kasus

Arnauld
sumber
f('22')('a1')harus palsu juga.
Neil
Semoga saya berhasil kali ini.
Arnauld
1
Itu selalu berguna ketika perbaikan bug Anda ternyata menyederhanakan sesuatu yang lebih pendek!
Neil
7

PHP> = 7.1, 130 Bytes

18 Bytes disimpan oleh @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;

Testcases

Diperluas

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 Bytes

mencetak 0 untuk Output salah true sebagai string

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;

Testcases

Diperluas

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 Bytes

Jawaban kedua dapat disingkat menjadi ini jika array asosiatif diizinkan

mencetak 0 untuk Output salah true sebagai array asosiatif bukan string

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

Testcases

PHP> = 7.1, 227 Bytes

mencetak 0 untuk false

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

Testcases

Diperluas

[,$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
Jörg Hülsermann
sumber
1
@carusocomputing Terima kasih atas pujiannya. Saya lupa sedikit trik. Saya tahu bahwa di sini ada banyak orang, mereka lebih baik daripada saya
Jörg Hülsermann
2
Anda pasti pandai menemukan solusi +1 tetapi array_values()di dalamnya join()sama sekali tidak berguna dan dapat dijatuhkan.
Christoph
1
Ini gagal dalam a1 22 => falseujian. Selain itu, program pertama Anda sepertinya tidak berfungsi dalam tester online.
mbomb007
1
Diam. Luar biasa.
Titus
1
Sirip dapat pergi: Simpan 18 byte dengan ($p=$x[$i])==$o?:$k[$c[$p]=$o]=$p;di loop dan $y==strtr($x,$c)untuk tes pertama.
Titus
5

Jelly , 18 byte

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

Tautan monadik yang tidak disebutkan namanya (fungsi satu input) mengambil daftar, yang mengembalikan:
daftar kosong dalam kasus falsey; atau
daftar yang berisi dua daftar karakter dalam kasus kebenaran.

Cobalah online! (footer membagi daftar dengan ruang untuk menghindari pencetakan representasi yang dihancurkan)
... atau lihat test suite .

Bagaimana?

Ạ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
Jonathan Allan
sumber
5

Retina , 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).*

Cobalah online!

Mengambil input yang ;dipisahkan. Output juga ;dipisahkan. Input palsu ditandai dengan output kosong.

Saya tahu ini sangat menyakitkan, saya masih mencoba untuk memotong byte. Sebagian besar byte ini digunakan untuk menghapus input yang salah.

Suntingan

  • Ternyata saya memiliki kelemahan yang signifikan dengan program saya. Sudah diperbaiki sekarang, tetapi dengan biaya lebih dari 40 byte.

  • Kesalahan lain ditemukan di mana program saya tidak menyatakan input a1;22salah, tetapi saya bisa menjaga program di bawah 250 byte setelah memperbaikinya

Penjelasan

(penjelasan lebih rinci akan segera hadir)

Pertama kita harus memeriksa apakah panjang string adanb sama atau tidak. Jika tidak, kami menghapus semuanya.

Gandakan input untuk mempertahankannya sementara kami melakukan beberapa pengujian panjang.

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

Sekarang dalam satu lingkaran, kita menghapus karakter pertama adan karakter pertama bhingga salah satu string menjadi kosong.

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

Sekarang ada kemungkinan untuk "ruang pola".

  • ;;abc Kedua string memiliki panjang yang sama
  • def;;abc a lebih panjang dari b
  • ;def;abc b lebih panjang dari a

Sekarang kita harus mengosongkan input jika string tidak memiliki panjang yang sama (skenario 2 dan 3). Inilah yang dilakukan subtitusi di bawah ini. Ini menghapus teks yang cocok dengan skenario 2 dan 3.

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

Ini menghapus karakter yang tidak ditransliterasikan dalam string adan b. abc;1b2=>ac;12

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

Setelah itu, kita harus menghapus karakter duplikat. sese;1212=> se;12, tetapi ini mempertahankan input sepertiaba;123

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

Akhirnya, kami menghapus input jika ada karakter rangkap yang memetakan ke karakter yang berbeda seperti aba;123atau a1;22.

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

Dan akhirnya, hapus karakter duplikat.

Kritixi Lithos
sumber
Saya melihat grup penyeimbang itu!
Neil
@Neil Memang! Saya juga menggunakan yang (?(1)(?!))saya pelajari dari jawaban Anda :)
Kritixi Lithos
Saya bertanya-tanya apakah akan lebih pendek untuk menghapus duplikat pertama dan kemudian memvalidasi set yang tersisa - seharusnya hanya ada satu dari setiap huruf yang tersisa di setiap sisi ;.
Neil
@Neil Saya menemukan kesalahan dengan kode saya bereksperimen dengan itu. Saya akan melihat lebih jauh ke dalamnya di pagi hari.
Kritixi Lithos
4

Jelly , 28 26 byte

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

Cobalah online!

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
layagyasz
sumber
1
Selamat datang di PPCG! Bagaimana sih kamu sudah tahu Jelly dengan hanya 21 poin? Sangat mengesankan!
Magic Gurita Guci
2
Terima kasih. Memandang sekeliling situs sedikit dan sepertinya bahasa yang rapi untuk dipelajari.
layagyasz
05AB1E adalah salah satu yang mudah dan menyenangkan untuk dicoba.
Guci Gurita Ajaib
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)}

Cobalah online!

Lebih mudah dibaca:

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

Hanya untuk iseng, berikut adalah versi 84 byte di Goruby, yang merupakan Ruby, tetapi dengan bendera golf yang diatur ketika mengkompilasi interpreter. Di antara hal-hal lain, ini memungkinkan Anda untuk menyingkat panggilan metode ke pengidentifikasi unik terpendek mereka.

->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)}
Pengawas
sumber
Mengapa tidak mengirim jawaban kedua dengan implementasi Goruby? Apakah ini bukan bahasa golf yang diterima?
Guci Gurita Ajaib
@carusocomputing Ini benar-benar; menurut saya sepertinya tidak pantas dengan jawabannya sendiri - itu persis sama dengan jawaban utama saya, hanya dengan nama metode yang disingkat. Mungkin jika saya menemukan cara untuk memanfaatkan lebih banyak perbedaan Goruby, saya akan mengirim jawaban terpisah.
Tutleman
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

Cobalah online!

  • -4 byte! terima kasih kepada mbomb007 untuk menyarankan penggunaan tab alih-alih ruang.

  • memodifikasi format input, sekali lagi terima kasih kepada mbomb007.

Keerthana Prabhakaran
sumber
bagaimana apanya? tolong berhentilah melakukan pengeditan yang tidak diinginkan yang tidak menambah nilai apa pun untuk dijawab!
Keerthana Prabhakaran
tab disimpan sekitar 4 byte! Terima kasih!
Keerthana Prabhakaran
Dan saya membuat program Anda memiliki setiap test case dalam satu baris, yang sangat membantu siapa pun yang menguji program Anda.
mbomb007
Saya akan lebih baik jika Anda bisa menyebutkan itu di komentar edit Anda!
Keerthana Prabhakaran
3

Python 3.6, 211 185 181 178 byte

Keluar dengan kesalahan untuk hasil palsu.

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

Ini membutuhkan Python 3.6, yang bisa Anda jalankan di shell di sini .

Anda dapat mengujinya tanpa memesan output yang benar pada TIO di sini . (TIO tidak memiliki 3,6).

Tidak Disatukan:

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

Kalau saja pesanan tidak masalah ...

mbomb007
sumber
Sebaiknya tidak a1,12kembali a1,12bukan False? Di bawah bagian Peringatan dikatakan bahwa "a1" dengan tabel terjemahan [a1,12] dievaluasi menjadi 12 .
fergusq
1
Nah, program di tautan TIO Anda kembali False. 1a 21juga akan salah, karena oeder harus dilestarikan.
fergusq
@fergusq Diperbaiki. Tetapi perhatikan bahwa Anda memiliki kesalahan ketik dalam komentar Anda jika itu adalah kasus uji yang Anda maksudkan, karena Anda mengatakan a1,12sebaliknya a1,22.
mbomb007
Saya salah paham dengan Anda. Anda merujuk ke bagian Peringatan di edit pertanyaan Anda, tetapi bagian Peringatan sebenarnya menangani kasus yang berbeda - bukan aturan bijih. Itu membingungkan saya.
fergusq
Ini menangani aturan yang berbeda, tetapi masih mengatakan bahwa hasil dari test case itu salah, yang penting.
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]}_}

Cobalah online!

Ini adalah fungsi yang mengambil dua daftar karakter dari aliran dan mendorong dua daftar ke aliran.

Ini bisa menjadi penyortir jika saya diizinkan untuk mengembalikan pasangan.

Penjelasan (kedaluwarsa):

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

Inilah solusi garis bawah yang tidak mengandung variabel (114 byte):

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

Itu banyak garis bawah.

fergusq
sumber
Apa yang <>dilakukan?
Kritixi Lithos
@KritixiLithos Ini adalah operator interleave. a() <> b()sama dengan interleave([a()], [b()])(atau hanya interleave(a, b), jika adan badalah array).
fergusq
Ini gagal dalam a1 22 => falseujian. "Semua terjemahan terjadi secara independen satu sama lain, artinya ini salah."
mbomb007
@ mbomb007 Saya tidak mengerti apa yang Anda katakan? Apakah yang Anda maksudkan itu harus merupakan suatu penipisan, yaitu. tidak ada dua karakter yang harus dipetakan ke karakter yang sama?
fergusq
Iya. Itulah yang dikatakan pertanyaan itu. ( Setiap karakter hanya dapat digunakan SEKALI pada setiap sisi terjemahan )
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}

Penggunaan: Masukkan kode di FILE:

awk -f FILE <<< "string1 string2"

String input harus dipisahkan dengan spasi.

Output kosong jika gagal, atau 2 string dipisahkan oleh spasi.

Robert Benson
sumber
1

k, 28 byte

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

Penjelasan:

{                          } /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)
zgrep
sumber
1

APL (Dyalog) dengan AGL , 22 byte

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

Cobalah online!

{... } fungsi anonim:

 Jika…

  ⍺⍵ argumen

  ⍳⍨¨ ketika diindeks sendiri (yaitu kejadian pertama dari elemen mereka dalam diri mereka sendiri)

  ≡/ adalah setara

: kemudian:

  ⍺(...)⍵  terapkan fungsi diam-diam berikut ke argumen:

    menggabungkan elemen yang sesuai (kesalahan pada panjang yang tidak cocok)

   é kemudian disaring oleh ( éhanya fungsi primitif/ )

    di mana string berbeda

   unik (hapus duplikat)

  ↓⍉↑ transpos daftar-pasangan-ke-daftar-daftar (lit. campuran menjadi tabel, tabel transpos, dibagi menjadi daftar)

 selain itu, jangan lakukan apa pun

Adm
sumber
1
dengan sabar menunggu penjelasan dari jawaban ini : P
Magic Octopus Urn
1
@computer saya di atasnya.
Adám
@carus melakukan komputasi OK?
Adám
Saya melewatkan balasan itu, maaf! ↓⍉↑masih membuat saya sedikit bingung.
Magic Octopus Mm
1
@carusocomputing Mungkin ini membantu? Perhatikan bahwa dalam APL dan J, sebuah matriks tidak sama dengan daftar daftar.
Adám
0

CJam, 38 byte

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

Input dan output adalah array pada stack.

Buah Esolanging
sumber
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);

mencetak 0untuk array falsy, asosiatif. Jalankan dengan -ratau coba online .

kerusakan

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
);
Titus
sumber
Apakah array asosiatif sebagai Output diizinkan? Bisakah Anda menambahkan bahwa ini berfungsi di atas versi 7.1
Jörg Hülsermann
@ JörgHülsermann Output can be as an array or ..., jadi saya katakan ya. Versi PHP saat ini tersirat untuk semua posting saya; tetapi jika saya menemukan sesuatu yang penting untuk diedit, saya akan menambahkan versinya.
Titus
Kasus yang valid hanya menunjukkan satu arti dari keluaran array. Jika array asosiatif juga diizinkan, saya dapat menyimpan beberapa byte. Jika diizinkan dan array_unique($r)!=$rdalam setiap kasus array_unique($r)<$rsaya akan mengunggah posting Anda sendiri untuk trik ini. Saat ini saya sedang mencari penjelasan
Jörg Hülsermann
@ JörgHülsermann array_unique($t)<$t(harus perubahan itu karena canuntuk cnntidak valid) bekerja, karena berbagai perbandingan (tidak seperti perbandingan string) membandingkan panjang sebelum hal lain.
Titus
Tes canuntuk cnnsaya 17 Bytes Lupakan saran saya
Jörg Hülsermann