ตรวจสอบว่าคำ isomorphs


63

คำสองคำคือisomorphsหากพวกเขามีรูปแบบซ้ำของตัวอักษรเดียวกัน ตัวอย่างเช่นทั้งสองESTATEและDUELEDมีรูปแบบabcdca

ESTATE
DUELED

abcdca

เพราะตัวอักษร 1 และ 6 เหมือนกันตัวอักษร 3 และ 5 เหมือนกันและไม่มีอะไรเพิ่มเติม E <-> D, S <-> U, T <-> E, A <-> Lนอกจากนี้ยังหมายคำที่เกี่ยวข้องโดยตัวเลขทดแทนที่นี่ด้วยการจับคู่

เขียนโค้ดที่ใช้สองคำและตรวจสอบว่าเป็น isomorphs หรือไม่ ไบต์ที่น้อยที่สุดจะเป็นผู้ชนะ

การป้อนข้อมูล:A..Zสองสายไม่ว่างเปล่าของตัวอักษร หากคุณต้องการคุณสามารถใช้สิ่งเหล่านี้เป็นชุดของสองสายหรือเป็นสายเดียวที่มีตัวคั่น

ผลลัพธ์: ค่าความจริงที่สอดคล้องกันสำหรับคู่ที่มี isomorphs และค่า Falsey ที่สอดคล้องกันหากไม่ได้ สตริงที่มีความยาวแตกต่างกันคืออินพุตที่ถูกต้องที่ไม่เคยมี isomorphs

กรณีทดสอบ:

จริง:

ESTATE DUELED
DUELED ESTATE
XXX YYY
CBAABC DEFFED
RAMBUNCTIOUSLY THERMODYNAMICS
DISCRIMINATIVE SIMPLIFICATION

เท็จ:

SEE SAW
ANTS PANTS
BANANA SERENE
BANANA SENSES
AB CC
XXY XYY
ABCBACCBA ABCBACCAB
ABAB CD

อย่าลังเลที่จะเพิ่มกรณีทดสอบเพิ่มเติมที่คุณคิดว่ามีประโยชน์

ลีดเดอร์บอร์ด

นี่คือตัวอย่างข้อมูลเพื่อสร้างทั้งกระดานผู้นำปกติและภาพรวมของผู้ชนะตามภาษา

เพื่อให้แน่ใจว่าคำตอบของคุณปรากฏขึ้นโปรดเริ่มคำตอบด้วยหัวข้อโดยใช้เทมเพลต Markdown ต่อไปนี้:

# Language Name, N bytes

ที่Nมีขนาดของส่งของคุณ หากคุณปรับปรุงคะแนนของคุณคุณสามารถเก็บคะแนนเก่าไว้ในบรรทัดแรกโดยการตีพวกเขาผ่าน ตัวอย่างเช่น

# Ruby, <s>104</s> <s>101</s> 96 bytes


มีการรับประกันความยาวของอินพุตทั้งสองเหมือนกันหรือไม่?
เครื่องมือเพิ่มประสิทธิภาพ

@Optimizer ไม่ความยาวอาจแตกต่างกัน
xnor

@ Jakube ไม่รหัสของคุณควรในทางทฤษฎีทำงานกับปัจจัยการผลิตใด ๆ ไม่เป็นไรแม้ว่าอินพุตขนาดใหญ่จะล้มเหลวในฮาร์ดแวร์เนื่องจากปัญหาเช่นหน่วยความจำล้นหรือความลึกของสแต็ก
xnor

ตกลงฉันจะลบคำตอบของฉัน
Jakube

กรณีทดสอบที่สำคัญ: ABAB CD(สำหรับวิธีคล้ายซิป)
Sp3000

คำตอบ:


95

J, 4 ไบต์

-:&=

การใช้

   'THERMODYNAMICS' (-:&=) 'RAMBUNCTIOUSLY'  NB. parens are optional
1 

คำอธิบาย

  • = ด้วย 1 อาร์กิวเมนต์จะสร้างตารางความเท่าเทียมกันโดยเปรียบเทียบองค์ประกอบของอินพุตและ nub ของมัน

    ='ESTATE' gives the binary matrix
    
    = | E S T A T E    
    --+------------
    E | 1 0 0 0 0 1
    S | 0 1 0 0 0 0
    T | 0 0 1 0 1 0
    A | 0 0 0 1 0 0
    
  • -:ด้วย 2 ข้อโต้แย้งตรวจสอบความเท่าเทียมกัน (เหมือน==ปกติ) สิ่งนี้ใช้ได้กับเมทริกซ์ขนาดแตกต่างกัน (หรือประเภทที่แตกต่างกัน) ด้วย

  • f&gใช้ g เพื่อป้อนข้อมูลทั้งสองแยกจากกันและจากนั้นใช้ f x f&g y == f(g(x), g(y))เพื่อทั้งสองร่วมกันเพื่อให้ผลการ

  • ในกรณีของเราเราเปรียบเทียบสองตารางความเท่าเทียมกัน

ลองออนไลน์ได้ที่นี่


2
วิธีการที่น่าสนใจและสง่างาม โดยไม่ต้องเท่ากับว่า&สิ่งที่ใกล้เคียงที่คุณสามารถทำใน K อาจจะเป็น~/{x=/:x}'ซึ่งเป็นบิตที่ดีอีกต่อไป
JohnE

17
พระเยซู สิ่งนี้จะต้องเป็นคู่แข่งของ codegolf hall of fame
Brian Gordon

ว้าวไม่ได้คาดหวังว่าจะจัด=ให้มีการใช้อื่นนอกเหนือจากการนับที่เกิดขึ้น
ไมล์

37

K, 5 ไบต์

นี่เป็นทางออกที่สง่างามใน K!

~/=:'

โอเปอเรเตอร์ "กลุ่ม" (monadic =) สร้างลายเซ็นที่เราต้องการสำหรับคำว่า isomorphism อย่างแม่นยำ การรวบรวมเวกเตอร์ของดัชนีของแต่ละองค์ประกอบของเวกเตอร์กับกลุ่มที่เรียงลำดับตามลักษณะที่ปรากฏ:

  ="ABBAC"
(0 3
 1 2
 ,4)

  ="DCCDF"
(0 3
 1 2
 ,4)

การจับคู่สตริงเป็นเวกเตอร์เราแค่ต้องใช้กลุ่มกับแต่ละองค์ประกอบ ( =:') จากนั้นลดด้วย "match" ( ~) ผู้ประกอบการที่มีความเท่าเทียมกันลึก:

  ~/=:'("RAMBUNCTIOUSLY";"THERMODYNAMICS")
1
  ~/=:'("BANANA";"SERENE")
0

15

Python 2, 41 ไบต์

f=lambda a,b:map(a.find,a)==map(b.find,b)

4
นี่คือทางออกที่เป็นแรงบันดาลใจให้ฉันสร้างความท้าทายนี้!
xnor

12

CJam, 9 ไบต์

r_f#r_f#=

พิมพ์1ถ้าคำเป็น isomorphs และ0หากไม่เป็นเช่นนั้น

ลองใช้ออนไลน์ในล่าม CJam

มันทำงานอย่างไร

r    e# Read a whitespace separated token from STDIN.
_    e# Push a copy.
f#   e# Get the indexes of all characters from the first copy in the second.
r_f# e# Repeat for the second word.
=    e# Check for equality.

10

JavaScript, ES7, 62 55 54 52 51 ไบต์

f=(x,y,g=z=>[for(i of z)z.search(i)]+0)=>g(x)==g(y)

ตรรกะนั้นง่าย ฉันเพียงแปลงทั้งอินพุตเป็นค่าดัชนีอักขระที่สอดคล้องกันแปลงอาร์เรย์นั้นเป็นสตริงและเปรียบเทียบ

f=(x, y,                  // Create a function named f which takes two arguments x and y
   g=                     // There is a third default argument to f which equals to
     z=>                  // and arrow function which takes argument z
     [                    // Return this array which is created using array comprehension
      for(i of z)         // For each character of z
      z.search(i)         // Use the index of that character in z in place of the character
     ]+0                  // And finally type cast that array to a string
                          // Here, the array elements are automatically joined by a ','
                          // and appended by a 0.
                          // Its funny how JS type casts Array + Number to a string
   )=>                    // Now the body of function f starts
      g(x)==g(y)          // It simply returns if index map of x equals index map of y

ลองโค้ดด้านบนโดยใช้ตัวอย่างด้านล่าง

บันทึก 2 ไบต์ด้วย@ edc65


7
+1 ลองใช้งานได้ดี +0แทน+""?
edc65


1
ฉันเพิ่งรู้ว่าสตริงนั้นเป็น 'A-Z' ดังนั้นคุณจึงสามารถใช้การค้นหาได้อย่างปลอดภัยแทนที่จะใช้ indexOf และตัดอีก 1 ไบต์
edc65

ความเข้าใจของอาเรย์ไม่ได้ถูกตัดในที่สุด es7? รหัสนี้ทำงานที่ไหน ฉันคิดว่าใน mozilla เท่านั้น
DanielIndie

8

Bash + coreutils, 38

[ `tr $@<<<$1``tr $2 $1<<<$2` = $2$1 ]

โปรดทราบว่าเราใช้แนวคิดเชลล์โดยทั่วไปเกี่ยวกับความจริง / เท็จที่นี่ - ศูนย์หมายถึงความสำเร็จหรือ TRUE และไม่ใช่ศูนย์หมายถึงข้อผิดพลาดหรือเท็จ:

$ for t in "ESTATE DUELED" "DUELED ESTATE" "XXX YYY" "CBAABC DEFFED" "RAMBUNCTIOUSLY THERMODYNAMICS" "DISCRIMINATIVE SIMPLIFICATION" "SEE SAW" "ANTS PANTS" "BANANA SERENE" "BANANA SENSES" "AB CC" "XXY XYY" "ABCBACCBA ABCBACCAB"; do
> ./isomorph.sh $t
> echo $t $?
> done
ESTATE DUELED 0
DUELED ESTATE 0
XXX YYY 0
CBAABC DEFFED 0
RAMBUNCTIOUSLY THERMODYNAMICS 0
DISCRIMINATIVE SIMPLIFICATION 0
SEE SAW 1
ANTS PANTS 1
BANANA SERENE 1
BANANA SENSES 1
AB CC 1
XXY XYY 1
ABCBACCBA ABCBACCAB 1
$ 

8

Haskell, 33 29

แก้ไข:

นี่มันสายเกินไปแล้ว แต่ฉันพบว่าการปรับปรุงนี้ใช้แอพพลิเคชั่นซึ่งถูกเพิ่มเข้าสู่โหมโรงเฉพาะในเดือนมีนาคม 2558

s%k=g s==g k
g s=(==)<$>s<*>s

เวอร์ชั่นเก่า:

s%k=g s==g k
g s=[a==b|a<-s,b<-s]

ฟังก์ชั่นการตรวจสอบคือ (%)

สิ่งนี้ทำงานโดยการสร้างสำหรับแต่ละสตริงของ "บันทึกความเท่าเทียมกัน": สำหรับแต่ละดัชนีสองตัว ij จะบันทึกว่าพวกเขามีอักขระเท่ากันหรือไม่ เร็กคอร์ดถูกสั่งเพื่อให้เร็กคอร์ดสำหรับสองดัชนี i, j อยู่ในตำแหน่งเดียวกันเสมอ * ดังนั้นการตรวจสอบความเท่าเทียมกันของเร็กคอร์ดจะกลับมาหรือไม่ว่าสตริงนั้นมีรูปแบบเดียวกันหรือไม่

ตัวอย่างเช่นบันทึกความเท่าเทียมกันของ "ABC" คือ[1,0,0,0,1,0,0,0,1](1 สำหรับจริง, 0 สำหรับเท็จ) - มีTrueที่ใดดัชนีจะถูกเปรียบเทียบกับตัวเอง ที่อื่นเป็นของปลอม (การข้ามการตรวจสอบเหล่านี้อาจมีประสิทธิภาพมากกว่า แต่ยากขึ้นในแง่ของการตีกอล์ฟ)

* ถ้าสตริงมีความยาวเท่ากัน มิฉะนั้นจะส่งกลับค่าเท็จเพียงเพราะบันทึกมีความยาวแตกต่างกัน


6

Haskell, 45 41 ไบต์

h l=map(`lookup`zip l[1..])l
x!y=h x==h y

ผลตอบแทนTrueหรือFalseเช่น->"ESTATE" ! "DUELED"True

ใช้วิธีการ map-char-to-first-index ดังที่เห็นในคำตอบอื่น ๆ รายการเชื่อมโยงมีประโยชน์เพราะรายการก่อนหน้ามีคนที่กล้าหาญ "aba"กลายเป็น[(a,1),(b,2),(a,3)]ที่lookupมักจะเรียก->a1

แก้ไข: @Mauris พบ 4 ไบต์เพื่อบันทึก


คุณสามารถแทนที่โดย(flip lookup$zip l[1..]) (`lookup`zip l[1..])
ลินน์

6

Brainfuck, 169 168 162 144 140 131 130

เข้ากันได้กับbffของ Alex Pankratov (ล่ามสมองที่ใช้กับ SPOJ และ ideone) และBFIของ Thomas Cort (ใช้กับ Anarchy Golf)

อินพุตที่คาดไว้คือสองสตริงคั่นด้วยแท็บโดยไม่มีการขึ้นบรรทัดใหม่หลังจากสตริงที่สอง เอาต์พุต1สำหรับ isomorphs และ0non-isomorphs ซึ่งสะดวกในการตรวจสอบผลลัพธ์ทางสายตาแม้ว่าจะไม่ใช่ตัวเลือกที่สั้นที่สุดก็ตาม ( อัปเดต:เวอร์ชันที่สั้นกว่าพร้อม\x01และ\x00เป็นเอาต์พุตและ\x00เป็นตัวคั่นที่ด้านล่างของคำตอบ)

การสาธิตเกี่ยวกับ ideone

,+
[
  -
  ---------
  >+<
  [
    >>-<
    [
      <
      [
        >+<
        <<<<-<+>>>>>-
      ]
      ++[->+]
      ->+[+<-]
      >[<<<<]
      <
    ]
    <[>+<-]
    +[->+]
    <->
    >>>
  ]
  >
  [
    [[-]<<<<<]
    >>>>
  ]
  <,+
]
>>>+>+
[
  [<->-]
  <[>>>>>]
  <<<<
]
-<[>]
+++++++[<+++++++>-]
<.

ปัญหานี้กลายเป็นเรื่องดีมากสำหรับ brainfuck

แนวคิดพื้นฐานที่มีการจัดทำดัชนีคือการย้อนกลับจากจุดสิ้นสุดของคำนำหน้าสตริงปัจจุบัน หากตัวละครไม่ได้เกิดขึ้นก่อนหน้านี้เราสามารถใช้ความยาวของคำนำหน้าสตริง ตัวอย่างเช่น:

STATES
123255

การจัดทำดัชนีในรหัสนั้นแตกต่างกันเล็กน้อย แต่ใช้หลักการเดียวกัน

เค้าโครงหน่วยความจำอยู่ในบล็อก 5:

0 0 0 0 0 0 c 0 i p 0 c 0 i p 0 c 0 i p 0 0 0 0

cย่อมาจากตัวอักษรiสำหรับดัชนีและpก่อนหน้านี้ (ดัชนี) เมื่อประมวลผลสายอักขระแรกpสล็อตทั้งหมดจะเป็นศูนย์ เซลล์ทางด้านซ้ายของcใช้เพื่อเก็บสำเนาของอักขระปัจจุบันที่เราพยายามค้นหาดัชนีของ เซลล์ทางด้านซ้ายของกระแสไฟฟ้าiถูกใช้เพื่อเก็บ-1การนำทางสำหรับตัวชี้แบบง่าย

มีเงื่อนไขมากมายที่ต้องพิจารณาอย่างรอบคอบ ในตอนท้ายเราจะตรวจสอบ isomorphs โดยการเปรียบเทียบ(i,p)คู่และเราไปถึงกลุ่มของศูนย์เซลล์ทางด้านซ้ายของ(i,p)คู่ซ้ายสุดถ้าหากสตริงนั้นเป็น isomorphs นี่คือรหัสที่แสดงความคิดเห็นเพื่อให้ง่ายต่อการติดตาม:

,+
[                       while there is input
  -
  ---------
  >+<                   increment char (adjust later)
  [                     if not tab
    >>-<                set navigation flag
    [                   loop to find index
      <                 travel to copy
      [
        >+<             restore char
        <<<<-<+>>>>>-   compare chars and create copy
      ]
      ++[->+]           travel between navigation flags
      ->+[+<-]          increment index by 2 and go back
      >[<<<<]           proceed if not fallen off string
      <                 compare chars
    ]
    <[>+<-]             restore char (or no op)
    +[->+]              go back to navigation flag
    <->                 adjust char
    >>>                 alignment
  ]
  >
  [                     if tab
    [[-]<<<<<]          erase chars and go to beginning
    >>>>                alignment
  ]
  <,+
]
>>>+>+                  check string lengths and start loop
[
  [<->-]                compare indices
  <[>>>>>]              realign if not equal
  <<<<                  proceed
]
-<[>]                   cell to left is zero iff isomorphs
+++++++[<+++++++>-]
<.

ปรับปรุง:

นี่คือเวอร์ชันที่พิมพ์\x01สำหรับ isomorphs และ\x00non-isomorphs นี่เป็นการตีความที่แม่นยำยิ่งขึ้นของ Truthy และ Falsey สำหรับ brainfuck เนื่องจากวิธีการ[และการ]ทำงาน ความแตกต่างเพียงอย่างเดียวคือท้ายที่สุด

เพิ่มเติม: ตอนนี้ใช้\x00เป็นตัวคั่นเพื่อบันทึก 10 ไบต์

+
[
  -
  >+<
  [
    >>-<
    [
      <
      [
        >+<
        <<<<-<+>>>>>-
      ]
      ++[->+]
      ->+[+<-]
      >[<<<<]
      <
    ]
    <[>+<-]
    +[->+]
    <->
    >>>
  ]
  >
  [
    [[-]<<<<<]
    >>>>
  ]
  <,+
]
>>>+>+
[
  [<->-]
  <[>>>>>]
  <<<<
]
-<[>]
<+.

5

JavaScript (ES6), 62

การใช้ฟังก์ชั่น aux hที่จับคู่แต่ละคำกับอาร์เรย์ที่มีตำแหน่งของตัวอักษรแต่ละตัวในคำเช่น: PASS -> [1,2,3,3] คืนค่าจริงถ้าฟังก์ชันที่hใช้ทั้งสองคำให้ผลลัพธ์เหมือนกัน

f=(a,b,h=w=>0+[for(c of(n=k=[],w))k[c]=k[c]||++n])=>h(b)==h(a)

// TEST

;[
// True
 ['ESTATE','DUELED']
,['DUELED','ESTATE']
,['XXX','YYY']
,['CBAABC','DEFFED']
,['RAMBUNCTIOUSLY','THERMODYNAMICS']
,['DISCRIMINATIVE','SIMPLIFICATION']

// False:

,['SEE','SAW']
,['ANTS','PANTS']
,['BANANA','SERENE']
,['BANANA','SENSES']
,['XXY','XYY']
,['ABCBACCBA','ABCBACCAB']
]
.forEach(t=>(f(t[0],t[1])?OK:KO).innerHTML+=t+'\n')
Ok<br>
<pre id=OK></pre><br>
KO<br>
<pre id=KO></pre>


1
บางครั้งง่ายสั้นกว่า))
เครื่องมือเพิ่มประสิทธิภาพ

5

R, 78

function(x,y)identical((g=function(z)match(a<-strsplit(z,"")[[1]],a))(x),g(y))

De-แข็งแรงเล่นกอล์ฟ:

word_to_num <- function(word) {
   chars <- strsplit(word,"")[[1]]
   match(chars, chars)
}
are_isomorph <- function(word1, word2) identical(word_to_num(word1), 
                                                 word_to_num(word2))

เอาชนะฉันไป! (+1)
shadowtalker

ฉันคิดว่าall( (g=...)(x)==g(y))จะสั้นกว่าidentical...
Giuseppe

5

Ruby, 83 ไบต์

t=->x{y=0;z=?`;x.gsub!(y[0],z.succ!)while y=x.match(/[A-Z]/);x};f=->a,b{t[a]==t[b]}

มันเป็นฟังก์ชั่นfที่ใช้เวลาทั้งสองมีปากเสียงและผลตอบแทนหรือtruefalse

คำอธิบาย:

test = -> str {
    y = nil  # we're just initializing this; it doesn't matter to what
             # this is the variable we use to store the `match' result
    z = '`'  # backtick is the ASCII character before `a'
    while y = str.match(/[A-Z]/) do  # while there is an uppercase letter in str
        str.gsub!(y[0], z.succ!)  # replace all instances of the uppercase letter
                                  # with the next unused lowercase letter
    end
    str  # return the new string
}
# self-explanatory
f=->a,b{test[a]==test[b]}

1
สิ่งนี้ควรประหยัด 4 ไบต์: t=->x{z=?`;x.chars.to_a.uniq.map{|c|x.gsub!(c,z.succ!)};x};f=->a,b{t[a]==t[b]}และคุณสามารถลดลงได้ถึง 68 หากคุณใช้แฮชสำหรับการเปลี่ยน:t=->x{h={};i=9;x.gsub!(/./){|c|h[c]||h[c]=i+=1}};f=->a,b{t[a]==t[b]}
blutorange

5

Java, 107

(s,t)->java.util.Arrays.equals(s.chars().map(s::indexOf).toArray(),t.chars().map(t::indexOf).toArray())

แมปอักขระแต่ละตัวของsและtไปยังที่ตั้งและตรวจสอบความเท่าเทียมกัน

ขยาย:

class Isomorphs {
    public static void main(String[] args) {
        java.util.function.BiFunction<String, String, Boolean> f =
            (s, t) -> java.util.Arrays.equals(
                                              s.chars().map(s::indexOf).toArray(),
                                              t.chars().map(t::indexOf).toArray()
                                             )
           ;
        System.out.println(f.apply("XXY", "XYY"));
    }
}

ฉันไม่คิดว่าวิธีนี้จะทำงานได้อย่างถูกต้องหากสตริงมีความยาวต่างกัน
JohnE

@ JohnE ใช่แล้ว
Ypnypn

อ้าโอเค - ฉันคิดว่าเวอร์ชัน "ขยาย" นั้นทำให้เข้าใจผิด
JohnE

4

Python 3, 85 ไบต์

f=lambda a,b:''.join(map(lambda g:dict(zip(a,b))[g],a))==b
g=lambda a,b:f(a,b)&f(b,a)

อินพุต / เอาต์พุตของอันนี้อยู่ที่ไหน
DJMcMayhem

@DJMcMayhem gเป็นหน้าที่หลักfคือผู้ช่วย มีตัวเลือกของตัวแปรที่สับสนgอยู่ภายในfแต่มันเป็นตัวแปรที่ถูกผูกไว้ที่ไม่เกี่ยวข้อง .. g=ตัวเลือกนี้เป็นทางเลือกสำหรับการพิจารณาคดีที่อนุญาตให้ใช้ฟังก์ชั่นอานนท์ซึ่งช่วยประหยัดสองตัวอักษร '
xnor

4

Pyth, 9 ไบต์

qFmmxdkdQ

รับอินพุตในรูปแบบต่อไปนี้:

"ESTATE", "DUELED"

หากไม่เป็นที่ยอมรับรหัสต่อไปนี้คือ 10 ไบต์:

qFmmxdkd.z

และใช้แบบฟอร์มการป้อนข้อมูลนี้:

ESTATE
DUELED

ใช้ดัชนีของ char ในการแทนค่าสตริง


รูปแบบอินพุตแรกนั้นใช้ได้ ฉันสนใจว่าคุณจะลดการตรวจสอบความเท่าเทียมกันอย่างไร แต่ฉันไม่ชัดเจนเกี่ยวกับการFทำงานเป็นเท่าตัว อะไรนะ<binary>F?
xnor

@xnor <binary>F<seq>เป็นพับ<binary> <seq>มันเทียบเท่ากับ interspersing ระหว่างคู่ขององค์ประกอบของทุก<binary> <seq>ดังนั้น<binary>Fในลำดับที่ 2 องค์ประกอบเพียงแค่ใช้ฟังก์ชั่นกับลำดับที่เทียบเท่ากับ.*ใน Pyth หรือ*ใน Python
isaacg

ฉันคิดว่าการติดตามQเป็นนัยใน Pythius?
Cyoce

@Cyoce ไม่ใช่ตอนนี้ - คุณลักษณะนั้นถูกเพิ่มเข้ามาในเดือนเมษายน 2559 เกือบหนึ่งปีต่อมา
isaacg

4

Matlab, 50 ไบต์

f=@(s,t)isequal(bsxfun(@eq,s,s'),bsxfun(@eq,t,t'))

ฟังก์ชั่นถูกกำหนดให้เป็นแบบไม่ระบุชื่อเพื่อประหยัดพื้นที่

ตัวอย่าง:

>> f=@(s,t)isequal(bsxfun(@eq,s,s'),bsxfun(@eq,t,t'));
>> f('ESTATE','DUELED')
ans =
     1
>> f('ANTS','PANTS')
ans =
     0

4

อ็อกเทฟ 26 ไบต์

@(s,t)isequal(s==s',t==t')

3
ดูน่าสนใจ คำอธิบาย?
ภูมิใจ haskeller

==คือความเท่าเทียมกันขององค์ประกอบเมทริกซ์ที่ชาญฉลาดและเนื่องจากsและs'มีขนาดต่างกัน "การกระจายเสียง" ของอ็อกเทฟจะพยายามให้เมทริกซ์ขนาดเดียวกันทำงานโดยอัตโนมัติซึ่งในกรณีนี้หมายถึงการทำซ้ำแถวsและคอลัมน์s'
rakslice

มันเป็นวิธีการเดียวกับโซลูชัน Matlab ของ @ LuisMendo แต่มีการขยายตัวที่ชัดเจน
rakslice


4

APL (Dyalog) , 5 4 ไบต์

-1 ขอบคุณคำใบ้ของ ngn

ฟังก์ชั่นคำนำหน้าโดยปริยายนิรนามซึ่งรับรายการของสองสายเป็นอาร์กิวเมนต์

≡.⍳⍨

ลองออนไลน์!

นี่คือผลิตภัณฑ์ภายใน แต่แทนที่จะเป็นแบบปกติ+และ×ใช้

 identicalness

. และ

ɩ nDex (เกิดขึ้นครั้งแรกของแต่ละองค์ประกอบ)

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

หากเราเรียกคำเหล่านั้นAและBจากนั้นเราสามารถหาคำตอบก่อนหน้าได้ดังนี้:

≡.⍳⍨ A B
A B ≡.⍳ A B
(A⍳A) ≡ (B⍳B)
(⍳⍨A) ≡ (⍳⍨B)
≡/ ⍳⍨¨ A B

วิธีแก้ไขก่อนหน้า

ฟังก์ชั่นคำนำหน้าโดยปริยายนิรนามซึ่งรับรายการของสองสายเป็นอาร์กิวเมนต์

≡/⍳⍨¨

ลองออนไลน์!

 identicalness

/ ข้าม

ɩ nDex (เกิดขึ้นครั้งแรกของแต่ละองค์ประกอบ ... )

 เซลฟี่ (…ในตัวเอง)

¨ ของแต่ละคน


คุณเห็นสินค้าด้านในไหม :)
ngn

@ngn ใช่แน่นอน รับฉัน
'1717

ลิงก์ยอดนิยมควรเชื่อมโยงกับโซลูชันเก่าหรือไม่
Zacharý

น่าเสียดายที่นี่ใช้ไม่ได้กับอาร์เรย์อันดับสูงกว่า: P
Zacharý

1
@ Zacharýตามที่สัญญา: ngn.github.io/apl-codegolf-2017/readme.txt
2560


3

Ruby, 50 ไบต์

รหัสทับทิมสั้นลง 30 ไบต์ เขียนก่อนที่ฉันจะดูวิธีแก้ปัญหาตรวจสอบอักขระแต่ละตัวของสตริงทั้งสองว่าดัชนีของการปรากฏตัวครั้งแรกของตัวละครนั้นตรงกันหรือไม่ กล่าวคือ แปลงสตริงให้เป็นรูปแบบที่เป็นมาตรฐาน01121และเปรียบเทียบกับสตริงนั้น

->x,y{g=->z{z.chars.map{|c|z=~/#{c}/}};g[x]==g[y]}

กรณีทดสอบเกี่ยวกับideoneในฐานะโบนัสเพิ่มเติมการแบ่งรหัสของการเน้นสีของ ideone


3

Husk , 5 ไบต์

¤=´×=

ลองออนไลน์!

คำอธิบาย

       -- implicit input A, B (strings aka character lists)       | "ab" "12"
¤=     -- apply the following function to A & B, then compare:    | [1,0,0,1] == [1,0,0,1] -> 1
  ´×   --   Cartesian product with itself under                   | ["aa","ba","ab","bb"] ["11","21","12","22"]
    =  --   equality                                              | [ 1  , 0  , 0  , 1  ] [ 1  , 0  , 0  , 1  ]

3

PCRE, 84 ไบต์

^((.)(?=.+ (\3.|)(.))(?=((?=(\2|)?+.* \3\4(\7?(?(?=.*+\6)(?!\4).|\4))).)+ ))+. \3..$ 

หัวเรื่องควรเป็นคำสองคำที่คั่นด้วยเว้นวรรคเช่นเดียวกับใน OP นี่คือคำอธิบายคร่าวๆ:

สำหรับแต่ละตัวอักษร X ในคำแรก:

มองไปข้างหน้าถึงคำที่สองและสร้างการอ้างอิงย้อนกลับเพื่อระลึกว่าเราอยู่ไกลแค่ไหนและตัวอักษร Y ในคำที่สองที่สอดคล้องกับ X

สำหรับแต่ละตัวอักษร Z ผ่านตำแหน่งปัจจุบันในคำแรก:

สร้างการอ้างอิงกลับที่คล้ายกันดังกล่าวข้างต้น

มองไปข้างหน้าตัวอักษรที่เกี่ยวข้องในคำที่สองและตรวจสอบว่า Z = X ตรงกับ Y หรือไม่หรือไม่ตรงกับตัวอักษรที่ไม่ใช่ Y

การทำซ้ำนี้อาจสิ้นสุดลงเมื่อเราจับคู่จนถึงตัวอักษรสุดท้ายในคำแรก ณ จุดนี้เนื่องจากไม่จำเป็นต้องมีการตรวจสอบเพิ่มเติมสิ่งที่เหลืออยู่ก็คือการทดสอบว่าคำนั้นมีความยาวเท่ากัน (การอ้างอิงด้านหลังที่มีสตริงย่อยสะสมของคำที่สองอยู่ด้านหลัง 1 ตัวอักษรเสมอ)


2

Ruby, 31 ไบต์

->a{!!a.uniq!{|s|s.tr s,'a-z'}}

Proc ที่ใช้อาร์เรย์ของสตริงและตรวจสอบว่ามี isomorphic กันหรือไม่ tr s,'a-z'ด้วยข้อโต้แย้งเหล่านี้ทำให้สตริงเป็นปกติsโดยแทนที่ตัวอักษรแต่ละตัวด้วยตัวอักษรที่ n ในตัวอักษรซึ่งnเป็นดัชนีที่ยิ่งใหญ่ที่สุดที่ตัวอักษรนั้นปรากฏในสตริง ยกตัวอย่างเช่นestateจะกลายเป็นไม่fbedefdueled


1

คอบร้า, 72 ไบต์

do(a='',b='')=(for i in a get a.indexOf(i))==for i in b get b.indexOf(i)

คุณแน่ใจหรือว่านี่เป็นเครื่องหมายของAB CCการทดสอบเท็จ
xnor

@xnor ตอนนี้คง
Οurous

1

JavaScript (ES5), 142 98

ค่อนข้างใหญ่ แต่ฉันยังไม่เห็นรุ่น ES5

for(l=j=2;j--;){c=prompt();for(i=c.length;i--;)c=c.replace(RegExp(c[i],"g"),i);b=l==c;l=c}alert(b)

เพียงแทนที่ทุกจดหมายฉบับแรกที่เกิดขึ้นด้วยค่าดัชนีย้อนกลับ ทำซ้ำสิ่งนี้สำหรับตัวละครทุกตัว

มันทำเช่นเดียวกันสำหรับทั้งอินพุตและเปรียบเทียบรูปแบบที่สร้างขึ้น

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


1
คุณไม่สามารถย้าย;l=cไปยังfor(l=j=2;j--;และบันทึกไบต์ได้หรือไม่?
Jonathan Frech

1

Perl, 38 ไบต์

($_,$a)=@ARGV;eval"y/$_/$a/";say$_~~$a

ทำงานเป็น perl -E '($_,$a)=@ARGV;eval"y/$_/$a/";say$_~~$a' RAMBUNCTIOUSLY THERMODYNAMICS

พิมพ์ 1 ถ้าเป็นจริงไม่มีอะไรจะเป็นเท็จ



1

C ++, 213 196 162 ไบต์

-51 ไบต์ขอบคุณZacharý

#include<map>
#define F(X,x)for(auto&e:X){if(x.end()==x.find(e))x[e]=65+x.size();e=x[e];}
auto i=[](auto a,auto b){std::map<int,int>c,d;F(a,c)F(b,d)return a==b;};

ในการเรียกแลมบ์ดาคุณต้องผ่าน 2 อาร์กิวเมนต์ที่เป็นstd::stringประเภทข้อมูล

รหัสที่จะทดสอบ:

std::initializer_list<std::pair<std::string, std::string>> test{
    {"ESTATE","DUELED"},
    {"DUELED","ESTATE"},
    {"XXX","YYY"},
    {"CBAABC","DEFFED"},
    {"RAMBUNCTIOUSLY","THERMODYNAMICS"},
    {"DISCRIMINATIVE","SIMPLIFICATION"},
    {"SEE","SAW"},
    {"ANTS","PANTS"},
    {"BANANA","SERENE"},
    {"BANAnA","SENSES"},
    {"AB","CC"},
    {"XXY","XYY"},
    {"ABCBACCBA","ABCBACCAB"},
    {"ABAB","AC"}
};

for (const auto& a : test) {
    std::cout << "Test with " << a.first << " and " << a.second <<
        " outputs : " << (i(a.first, a.second)?"TRUE":"FALSE") << '\n';
}

สำหรับรหัสที่ต้องการทดสอบรวมถึงiostreamและstringไฟล์ส่วนหัว


1
ดูเหมือนว่าคุณจะใช้อะไรก็ตามจากส่วนหัวของสตริงดังนั้นคุณสามารถนำออกและให้ผู้ใช้รวมตัวเองได้หรือไม่
Zacharý

ไม่นี้ทำงาน 161 ไบต์?
Zacharý

@ Zacharýถ้าคุณเพิ่มeอาร์กิวเมนต์เป็นfindใช่มันใช้งานได้
HatsuPointerKun

ช่วงเวลานั้นเมื่อคุณโดน Brainfuck แม้ว่า> _ <
Zacharý

1

JavaScript (ES6), 52 51 50 ไบต์

รุ่นนี้ไม่ได้ใช้ความเข้าใจของอาเรย์และรับการป้อนข้อมูลโดยใช้รูปแบบ currying

a=>b=>(f=x=>0+[...x].map(c=>x.search(c)))(a)==f(b)

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