ค้นหาตารางการแปล


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

หากคุณมีคำถามเกี่ยวกับการทำงานของคำศัพท์ที่ไม่แสดงคู่ที่สองให้เลื่อนไปที่การใช้งานนี้


กฎ I / O

  • อินพุตอาจเป็นอาร์เรย์ 2 องค์ประกอบหรือเป็น 2 อินพุตแยกกัน
  • เอาต์พุตสามารถเป็นอาร์เรย์หรือการขึ้นบรรทัดใหม่ / เว้นวรรคคล้ายกับที่ฉันแสดง
  • เอาต์พุตเท็จอาจเป็น 0, -1 หรือเท็จ ข้อผิดพลาด / เอาท์พุทว่างก็ดีเช่นกัน
  • คุณจะรับประกันว่าaจะไม่เท่ากันbและไม่aว่ามิได้bจะว่างเปล่า
  • aและbเป็นลำดับของตัวอักษรเท่านั้นที่พิมพ์ได้ ASCII

คำเตือน

  • การแปลจะต้องเกิดขึ้นจากซ้ายไปขวาดูตัวอย่างที่ 1
  • คุณต้องไม่ส่งออกอักขระที่ยังคงเหมือนเดิม
  • โปรแกรมของคุณอาจใช้เวลาเพียงในสองสายและab
  • อักขระแต่ละตัวสามารถใช้ได้ครั้งเดียวเท่านั้นในแต่ละด้านของการแปล นี่คือสิ่งที่ทำให้การแปลจากsnailsที่จะanimalsเป็นไปไม่ได้
  • การแทนที่แบบเรียกซ้ำไม่ควรเกิดขึ้น ตัวอย่างของการแทนที่แบบเรียกซ้ำ: "a1","22"->[a1,12]โดยที่ a ถูกแทนที่ด้วย 1 ครั้งแรกจากนั้นผลลัพธ์ทั้งสองของ 1 จะถูกแทนที่ด้วย 2 สิ่งนี้ไม่ถูกต้องถือว่าการแปลทั้งหมดเกิดขึ้นเป็นอิสระจากกันแปลว่านี่เป็นเท็จ ความหมาย: "a1" กับตารางการแปลของ [a1,12] ประเมินเป็น 12 (ไม่ใช่ 22)

การติดป้ายกำกับ "การแปล" นี้เป็นตัวเลขแทนง่ายอาจช่วยให้ความกระจ่างเจตนา
เกร็กมาร์ติน

อาเรย์เชื่อมโยงได้รับอนุญาตเป็นเอาท์พุทหรือไม่ มันสามารถช่วยฉันไบต์ได้
JörgHülsermann

@ JörgHülsermanฉันไม่แน่ใจอย่างเต็มที่เกี่ยวกับการอนุญาตให้ทำเช่นนี้อาจทำเป็น 2 เวอร์ชั่นเพื่อให้เห็นความแตกต่าง ฉันจะแก้ไขมันถ้าฉันคิดว่ามันไม่เป็นอันตรายต่อความท้าทาย
Magic Octopus Urn

ดูวิธีแก้ปัญหาแรกของฉันในโพสต์ในฐานะที่เป็นสตริงและอันที่สองมีผลลัพธ์เป็นอาเรย์แบบเชื่อมโยง
JörgHü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

ใช่ข้อมูลโค้ดนั้นเป็น trippin 'ได้รับการยืนยันแล้วเช่นกันมันก็ใช้ได้
Magic Octopus Urn

1
@carusocomputing มันเป็นการปะทะชื่อตัวแปร - ตอนนี้ได้รับการแก้ไขแล้ว ขอโทษสำหรับเรื่องนั้น.
Neil

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')ควรเป็นเท็จด้วย
Neil

หวังว่าฉันจะทำให้ถูกต้องในครั้งนี้
Arnauld

1
มันจะมีประโยชน์เสมอเมื่อ bugfix ของคุณเปลี่ยนไปทำให้บางสิ่งบางอย่างสั้นลง!
Neil

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;

Testcases

ขยาย

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 สำหรับผลลัพท์ที่แท้จริงเป็นสตริง

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

ขยาย

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 ไบต์

คำตอบที่สองสามารถ shorted นี้หากอนุญาตเชื่อมโยงอาร์เรย์

พิมพ์ 0 สำหรับผลลัพธ์ที่เป็นเท็จเป็นอาร์เรย์ที่เชื่อมโยงแทนสตริง

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 ไบต์

พิมพ์ 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;

Testcases

ขยาย

[,$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örgHülsermann

2
การค้นหาโซลูชันที่ดีของคุณ +1 ได้อย่างแน่นอน แต่array_values()ข้างในjoin()นั้นไร้ประโยชน์อย่างสมบูรณ์และสามารถทิ้งได้
Christoph

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ẋÇ$

ลิงค์ monadic ที่ไม่มีชื่อ (ฟังก์ชั่นหนึ่งอินพุต) กำลังรับรายการซึ่งส่งคืน:
รายการว่างในกรณีที่ผิดพลาด หรือ
รายการที่มีตัวละครสองรายการในกรณีความจริง

ลองออนไลน์! (ส่วนท้ายแยกรายการที่มีพื้นที่ที่จะหลีกเลี่ยงการพิมพ์เป็นตัวแทน smushed)
... หรือดูชุดทดสอบ

อย่างไร?

Ạ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

Retina , 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 =>babc;1b2ac;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

สุดท้ายเราลบการป้อนข้อมูลถ้ามีตัวละครที่ซ้ำกันที่ map กับตัวละครที่แตกต่างกันเช่นหรือaba;123a1;22

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

และสุดท้ายลบอักขระที่ซ้ำกัน


ใช้กลุ่มสมดุลเหล่านั้นฉันเห็น!
Neil

@ 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

Ruby, 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 ไบต์ใน Goruby ซึ่งก็คือ 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? มันไม่ใช่ภาษากอล์ฟที่ยอมรับใช่ไหม
Magic Octopus Urn

@carusocomputing มันคือทั้งหมด; ดูเหมือนว่าฉันจะไม่ได้คำตอบของตัวเอง - มันเหมือนกับคำตอบหลักของฉันเพียงแค่ใช้ชื่อตัวย่อ บางทีถ้าฉันหาวิธีที่จะใช้ประโยชน์จากความแตกต่างของ Goruby ได้มากขึ้นฉันจะโพสต์คำตอบแยกต่างหาก
Tutleman

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

และฉันทำให้โปรแกรมของคุณมีการทดสอบแต่ละกรณีในบรรทัดเดียวซึ่งเป็นประโยชน์อย่างยิ่งสำหรับทุกคนที่ทดสอบโปรแกรมของคุณ
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)

Ungolfed:

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ใช่ไหม ภายใต้ส่วนเตือนมันก็บอกว่า"A1" ด้วยตารางการแปลของ [a1,12] ประเมินถึง 12
fergusq

1
โปรแกรมในลิงค์ TIO ของคุณจะกลับFalseมา 1a 21ก็จะผิดเพราะ oeder ต้องได้รับการเก็บรักษาไว้
fergusq

@fergusq แก้ไข แต่แจ้งให้ทราบว่าคุณมีการพิมพ์ผิดในความคิดเห็นของคุณถ้าเป็นกรณีการทดสอบที่คุณกำลังหมายถึงตั้งแต่ที่คุณกล่าวแทนa1,12 a1,22
mbomb007

ฉันเข้าใจคุณผิด คุณอ้างถึงส่วน Caveats ในการแก้ไขคำถามของคุณ แต่ส่วน Caveats จัดการกับกรณีที่แตกต่างกันจริง ๆ ไม่ใช่กฎ bijection นั่นทำให้ฉันสับสน
fergusq

มันจัดการกฎที่แตกต่างกัน แต่ก็ยังบอกว่าผลของกรณีทดสอบนั้นเป็นเท็จซึ่งเป็นสิ่งที่สำคัญ
mbomb007

2

Röda , 108 119 bytes

{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 มันเป็นโอเปอเรเตอร์ interleave a() <> b()เหมือนกับinterleave([a()], [b()])(หรือเพียงแค่interleave(a, b)ถ้าaและbเป็นอาร์เรย์)
fergusq

กรณีนี้ล้มเหลวในa1 22 => falseการทดสอบ "การแปลทั้งหมดเกิดขึ้นเป็นอิสระจากกันแปลว่านี่เป็นความเท็จ"
mbomb007

@ mbomb007 ฉันไม่เข้าใจสิ่งที่คุณพูด? คุณหมายความว่าจะต้องมีการให้ความเห็นทางชีวภาพหรือไม่ ต้องมีการแมปสองอักขระกับอักขระเดียวกันใช่หรือไม่
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 ไบต์

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

ลองออนไลน์!

{...}  ฟังก์ชั่นที่ไม่ระบุชื่อ:

 ถ้า…

  ⍺⍵ ข้อโต้แย้ง

  ⍳⍨¨ เมื่อจัดทำดัชนีตนเอง (เช่นการเกิดขึ้นครั้งแรกขององค์ประกอบในตัวเอง)

  ≡/ เทียบเท่า

: แล้ว:

  ⍺(... )⍵ ใช้ฟังก์ชัน tacit ต่อไปนี้กับอาร์กิวเมนต์:

    เรียงต่อกันองค์ประกอบที่สอดคล้องกัน (ข้อผิดพลาดเกี่ยวกับความยาวไม่ตรงกัน)

   é จากนั้นกรองโดย ( éเป็นเพียงฟังก์ชันดั้งเดิม/)

    ที่สตริงจะแตกต่างกัน

   ที่ไม่ซ้ำกัน (ลบรายการที่ซ้ำกัน)

  ↓⍉↑ ย้ายรายการของคู่เพื่อคู่ของรายการ (จุดไฟผสมลงในตารางตารางสลับรายการแยกออกเป็นรายการ)

 ไม่ทำอะไรเลย


1
อดทนรอคำอธิบายของคำตอบนี้ : P
Magic Octopus Urn

1
@carusocomputing ฉันอยู่กับมัน
Adám

@carusocomputing ตกลงหรือไม่
Adám

ฉันพลาดคำตอบนั้นขอโทษ! ↓⍉↑ยังมีฉันสับสนเล็กน้อย
Magic Octopus Urn

1
@carusocomputing อาจช่วยได้ไหม โปรดทราบว่าใน APL และ J เมทริกซ์จะไม่เหมือนกับรายการ
2560


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örgHülsermann

@ JörgHülsermann Output can be as an array or ...ดังนั้นฉันจะบอกว่าใช่ เวอร์ชัน PHP ปัจจุบันเป็นนัยสำหรับการโพสต์ของฉันทั้งหมด แต่ถ้าฉันพบสิ่งที่สำคัญที่จะแก้ไขฉันจะเพิ่มรุ่นนั้น
ติตัส

กรณีที่ถูกต้องแสดงความหมายเพียงอย่างเดียวของการส่งออกอาร์เรย์ หากอนุญาตให้ใช้อาร์เรย์แบบเชื่อมโยงฉันสามารถบันทึกได้สองสามไบต์ หากได้รับอนุญาตและarray_unique($r)!=$rอยู่ในทุกกรณีarray_unique($r)<$rฉันจะอัปโหลดโพสต์ของคุณคนเดียวสำหรับเคล็ดลับนี้ ในขณะที่ฉันกำลังค้นหาคำอธิบาย
JörgHülsermann

@ JörgHülsermann array_unique($t)<$t(มีการเปลี่ยนแปลงเพราะcanจะcnnไม่ถูกต้อง) ทำงานเพราะการเปรียบเทียบ array (ซึ่งแตกต่างจากการเปรียบเทียบสตริง) เปรียบเทียบความยาวก่อนสิ่งอื่นใด
ติตัส

การทดสอบcanทำให้cnnฉันต้องเสียค่าใช้จ่ายไป17 ไบต์ลืมคำแนะนำของฉัน
JörgHülsermann
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.