Знайдіть таблицю перекладу


17

Дано два рядки, знайдіть таблицю перекладу ( шифр заміни ) між ними, якщо переклад неможливий, виведіть помилково. Відповідь потрібно мінімізувати та створювати зліва направо. Перший символ, який потрібно перекласти між словами, повинен бути першим у таблиці перекладу. На додаток до цього, будь-який лист, який не перекладений (там же, де він був спочатку), НЕ повинен бути в таблиці перекладу.

Напевно, найлегше визначитись через приклади:

Дійсні справи

"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

(кожен символ може використовуватися лише ОКНЕ з кожної сторони перекладу).

"can","cnn" => false

(n неявно використовується в перекладі, тому визначення таблиці перекладу з n-> a було б недійсним)

Таким чином, [aimal,sails]є неправдивою відповіддю, що робить це хибним.

"a1", "22" => false

Дивіться "застереження", це вказано як хибні. У цьому випадку це тому, що aі 1не може обидва відобразити карту 2. (Кожен символ може використовуватися лише ОКНЕ з кожної сторони перекладу).


Ця відповідь здається хорошим орієнтиром: /codegolf//a/116807/59376

Якщо у вас виникли питання щодо функціональності двох пар, які не є в списку, перейдіть до цієї реалізації.


Правила вводу / виводу

  • Вхід може бути двома елементами або як два окремі входи.
  • Вихід може бути як обмежений масив, так і новий рядок / простір, аналогічно тому, як я показав.
  • Неправдивий вихід може бути 0, -1 або помилковим. Помилка / Порожній вихід також добре.
  • Вам гарантовано, що aне буде рівним bі ні, aі bне буде порожнім.
  • aі bє послідовностями літер лише для друку.

Коваджі

  • Переклади повинні відбуватися зліва направо (див. Приклад 1).
  • Ви не повинні виводити символи, які залишаються однаковими.
  • Ваша програма може мати лише два рядки aта b.
  • Кожен символ може використовуватися лише ОКНЕ з кожної сторони перекладу. Це те , що робить переклад з , snailsщоб animalsнеможливо.
  • Рекурсивні заміни не повинні відбуватися. Приклад рекурсивної заміни: "a1","22"->[a1,12]де a спочатку замінюється на 1, тоді обидва результуючі 1 замінюються на 2. Це невірно, припустимо, що всі переклади відбуваються незалежно один від одного, тобто це хибність. Значення: "a1" з таблицею перекладу [a1,12] оцінює до 12 (не 22)

Позначення цього "перекладу" простим шифром заміни може допомогти уточнити наміри.
— Грег Мартін

Чи дозволені асоціативні масиви як вихід? Це могло б врятувати мене декілька байтів
— Йорг Гюльсерманн,

@ JörgHülserman Я не повністю впевнений у наслідках того, щоб це дозволити, можливо, зробіть 2 версії, щоб я міг бачити різницю? Я відредагую його, якщо думаю, що це не шкідливо для виклику.
— Чарівний Восьминіг Урна

Подивіться на мій пост як перше рішення як рядок, а друге - як вихідний асоціативний масив
— Jörg Hülsermann,

@ JörgHülsermann а-а-а ... Я бачу, як ти зараз це використовуєш, я думаю, я збираюся заборонити це, не всі мови підтримують хеш-структури.
— Чарівний восьминіг Урна

Відповіді:


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 Це зіткнення імені змінної - це виправлено зараз. Вибач за це.
— Ніл

7

JavaScript (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')також повинні бути помилковими.
— Ніл

Сподіваюся, я цього разу зрозуміла.
— Арнольд

1
Це завжди зручно, коли ваш помилка виявляється спрощеною до чогось коротшого!
— Ніл

7

PHP> = 7,1, 130 байт

18 байт, збережених @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;

Тестові шафи

Розширено

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 байт

друкує 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 байт

Друга відповідь може бути скорочена до цього, якщо дозволено асоціативні масиви

друкує 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 байт

друкує 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
Ласти можуть перейти: Збережіть 18 байт ($p=$x[$i])==$o?:$k[$c[$p]=$o]=$p;у циклі та $y==strtr($x,$c)для першого тесту.
— Тит

5

Желе , 18 байт

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

Безіменна монадійна посилання (функція з одним входом), яка приймає список, який повертає:
порожній список у випадках фальси; або
список, що містить два списки символів у справжніх випадках.

Спробуйте в Інтернеті! (колонтитул розбиває список пробілом, щоб уникнути друку розмитого подання)
... або переглянути тестовий набір .

Як?

Ạ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 байтами після її виправлення.

Пояснення

(більш детальне пояснення надійде незабаром)

Спочатку ми повинні перевірити, чи довжини струн 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 Я виявив помилку, коли мій код експериментував з цим. Я зранку загляну в неї.
— 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 - це ще один легкий і цікавий випробувати.
— Чарівний восьминога Урна

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-байтна версія в Горубі, яка є Рубі, але з прапором для гольфу, встановленим при складанні перекладача. Крім усього іншого, це дозволяє скоротити виклики методів до їх найкоротшого унікального ідентифікатора.

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

Чому б не опублікувати другу відповідь із реалізацією Горуби? Це не прийнята мова для гри в гольф?
— Magic Octopus Urn

@carusocomputing Це повністю; мені просто здалося, що він не заслуговує власної відповіді - це точно так само, як і мою основну відповідь, просто із скороченими назвами методів. Можливо, якщо я знайду спосіб скористатися більшою кількістю відмінностей Горуби, я опублікую окрему відповідь.
— Тутлеман

3

Python 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.


що ти маєш на увазі? будь ласка, перестаньте вносити небажані зміни, що не додасть жодної цінності для відповіді!
— Кеертана Прабхакаран

вкладка збережена близько 4 байтів! Дякую!
— Кеертана Прабхакаран


І я змусив вашу програму мати кожен тестовий випадок на одному рядку, що надзвичайно корисно для всіх, хто тестує вашу програму.
— mbomb007

Було б краще, якби ви могли це згадати у своєму коментарі до редагування!
— Кеертана Прабхакаран

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, який можна запустити в оболонці тут .

Ви можете протестувати без правильного замовлення виводу на 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замість False? У розділі "Caveats" сказано, що "a1" з таблицею перекладу [a1,12] оцінює до 12 .
— fergusq

1
Що ж, програма у вашому посиланні TIO повертається False. 1a 21також було б неправильно, оскільки едер має бути збережений.
— fergusq

@fergusq Виправлено. Але зауважте, що у вашому коментарі є помилка друку, якщо це тестовий випадок, на який ви посилаєтесь, оскільки ви сказали a1,12замість цього a1,22.
— mbomb007

Я неправильно тебе зрозумів. Ви посилалися на розділ Caveats у редакції запитання, але розділ Caveats насправді обробляє інший випадок, а не правило біекції. Це мене бентежило.
— 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), якщо aі bє масивами).
— fergusq

Це не дає змоги a1 22 => falseперевірити тест. "усі переклади відбуваються незалежно один від одного, це означає, що це хибність".
— mbomb007

@ mbomb007 Я не зовсім розумію, що ти кажеш? Ви маєте на увазі, що це має бути біекція, тобто. жоден символ не повинен бути відображений в одному символі?
— fergusq

Так. Ось що говорить питання. ( Кожен символ може використовуватися лише
— ОКНЕ

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
patiently awaits the explanation of this answer :P
— Magic Octopus Urn

1
@carusocomputing I'm on it.
— Adám

@carusocomputing OK?
— Adám

I missed that reply, sorry! ↓⍉↑ still has me a little confused.
— Magic Octopus Urn

1
@carusocomputing Maybe this helps? Note that in APL and J, a matrix is not the same as a list of lists.
— Adám


0

PHP (>=7.1), 165 bytes

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

prints 0 for falsy, associative array else. Run with -r or test it online.

breakdown

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

Are associative arrays as Output allowed? Could you please add that it works above version 7.1
— Jörg Hülsermann

@JörgHülsermann Output can be as an array or ..., so I´d say yes. Current PHP version is implicit for all my postings; but if I find something important to edit, I´ll add the version.
— Titus

The valid cases shows only one meaning of array output. If associative arrays are also allowed I can save a few bytes. If it is allowed and array_unique($r)!=$r is in every case array_unique($r)<$r I will upvote your post alone for this trick. In the moment I am searching for an explanation
— Jörg Hülsermann

@JörgHülsermann array_unique($t)<$t (had to change that because can to cnn is invalid) works, because array comparison (unlike string comparison) compares lengths before anything else.
— Titus

The test can to cnn cost me 17 Bytes Forget my suggestion
— Jörg Hülsermann
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.