XOR จัดเรียงอาร์เรย์


15

ให้คีย์และอาร์เรย์ของสตริงสับเปลี่ยนอาร์เรย์เพื่อให้เรียงลำดับเมื่อแต่ละองค์ประกอบมี XOR'd ด้วยคีย์

แฮคเกอร์สองสาย

ในการ XOR สตริงโดยคีย์ XOR แต่ละค่าอักขระของสตริงโดยคู่ในคีย์โดยสมมติว่าคีย์ซ้ำตลอดไป ตัวอย่างเช่นabcde^123ดูเหมือนว่า:

       a        b        c        d        e
       1        2        3        1        2
--------------------------------------------
01100001 01100010 01100011 01100100 01100101
00110001 00110010 00110011 00110001 00110010
--------------------------------------------
01010000 01010000 01010000 01010101 01010111
--------------------------------------------
       P        P        P        U        W

การเรียงลำดับ

การเรียงลำดับควรทำตามคำย่อของสตริง XOR'd เสมอ นั่นคือ1 < A < a < ~(สมมติว่าเข้ารหัส ASCII)

ตัวอย่าง

"912", ["abcde", "hello", "test", "honk"]

-- XOR'd
["XSQ]T", "QT^U^", "MTAM", "Q^\R"]
-- Sorted
["MTAM", "QT^U^", "Q^\R", "XSQ]T"]
-- Converted back
["test", "hello", "honk", "abcde"]

หมายเหตุ

  • รหัสจะต้องมีอักขระอย่างน้อย 1 ตัวเสมอ
  • รหัสและอินพุตจะประกอบด้วย ASCII ที่พิมพ์ได้เท่านั้น
  • สตริง XOR อาจมีอักขระที่ไม่สามารถพิมพ์ได้
  • อินพุตและเอาต์พุตอาจทำได้ผ่านวิธีการที่เหมาะสม
  • ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม
  • คุณสามารถรับคีย์และอินพุตในลำดับใดก็ได้

กรณีทดสอบ

key, input -> output
--------------------
"912", ["abcde", "hello", "test", "honk"] -> ["test", "hello", "honk", "abcde"]
"taco", ["this", "is", "a", "taco", "test"] -> ["taco", "test", "this", "a", "is"]
"thisisalongkey", ["who", "what", "when"] -> ["who", "what", "when"]
"3", ["who", "what", "when"] -> ["what", "when", "who"]

นี่คืออย่างน้อยไบต์ชนะ!


ที่เกี่ยวข้องไม่มีที่ไหนเลยใกล้ล่อแม้ว่า
MD XF

มีการรับประกันสตริงที่แตกต่างกันหรือไม่?
Neil

@ Neil แม้ว่าฉันไม่สามารถจินตนาการถึงสถานการณ์ที่พวกเขาเหมือนกันจะทำให้เกิดปัญหาคุณสามารถสันนิษฐานได้ว่าสตริงทั้งหมดจะไม่ซ้ำกัน
ATaco

@ ATaco มันอาจสำคัญถ้าคุณไม่ได้ใช้การเปรียบเทียบสตริงในตัว
เดนนิส

คำตอบ:


7

เยลลี่ , 9 7 ไบต์

⁹ṁO^OµÞ

ขอบคุณ @EriktheOutgolfer สำหรับคำแนะนำที่ช่วยประหยัด 2 ไบต์!

ลองออนไลน์!

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

⁹ṁO^OµÞ  Dyadic link.
         Left argument: A (string array). Right argument: k (key string).

     µ   Combine the code to the left into a chain.
         Begin a new, monadic chain with argument A.
      Þ  Sort A, using the chain to the left as key.
         Since this chain is monadic, the key chain will be called monadically,
         once for each string s in A.
⁹            Set the return value to the right argument of the link (k).
 ṁ           Mold k like s, i.e., repeat its characters as many times as necessary
             to match the length of s.
  O          Ordinal; cast characters in the resulting string to their code points.
    O        Do the same for the chain's argument (s).
   ^         Perform bitwise XOR.

10

Python 3 , 75 73 ไบต์

lambda k,x:x.sort(key=lambda s:[ord(x)^ord(y)for x,y in zip(s,k*len(s))])

นี่จะเรียงลำดับรายการxในตำแหน่ง

ขอบคุณ @mercator สำหรับการตีกอล์ฟ 2 ไบต์!

ลองออนไลน์!

รุ่นสำรอง 62 ไบต์

สิ่งนี้ใช้อินพุตเป็นสตริงไบต์ซึ่งอาจไม่ได้รับอนุญาต

lambda k,x:x.sort(key=lambda s:[*map(int.__xor__,s,k*len(s))])

ลองออนไลน์!


ในสถานที่การเรียงลำดับช่วยประหยัด 2 x.sort(key=...)ไบต์:
Mercator



2

ทำความสะอาด , 101 100 94 ไบต์

-6 ไบต์ขอบคุณ Ourous!

import StdEnv
? =toInt
s k=let%s=[b bitxor?a\\a<-s&b<-[?c\\_<-s,c<-k]];@a b= %b> %a in sortBy@

ลองออนไลน์! ตัวอย่างการใช้: s ['3'] [['who'], ['what'], ['when']].

Ungolfed:

import StdEnv
sort key list = 
   let
      f string = [(toInt a) bitxor (toInt b) \\ a<-string & b<-flatten(repeat key)]
      comp a b = f a <= f b
   in sortBy comp list

? =toIntและใช้?แทนช่วยประหยัด 2 ไบต์และใช้พลิกมากกว่ามากกว่าแทนน้อยกว่าหรือเท่ากับบันทึกอีกหนึ่ง
Οurous

ยิ่งไปกว่านั้นประหยัดได้ 6 ไบต์: TIO
Decurous

1

จริงแล้ว 24 ไบต์

O╗⌠;O;l;╜@αH♀^♂cΣ@k⌡MS♂N

ลองออนไลน์!

คำอธิบาย:

O╗⌠;O;l;╜@αH♀^♂cΣ@k⌡MS♂N
O╗                        store ordinals of key in register 0
  ⌠;O;l;╜@αH♀^♂cΣ@k⌡M     for each string in array:
   ;O                       make a copy, ordinals
     ;l;                    make a copy of ordinals, length, copy length
        ╜@αH                list from register 0, cycled to length of string
            ♀^              pairwise XOR
              ♂cΣ           convert from ordinals and concatenate
                 @k         swap and nest (output: [[a XOR key, a] for a in array])
                     S♂N  sort, take last element (original string)

@ ATaco ไม่มันไม่ได้ ลองด้วย["who", "what", "when"]และ"thisisalongkey"
caird coinheringaahing

1
@cairdcoinheringaahing ที่โพสต์ก่อนแพทช์ไปที่จริงบน TIO
ATaco

1

Perl 6 , 37 ไบต์

{@^b.sort(*.comb Z~^(|$^a.comb xx*))}

ลองออนไลน์!

$^aและ@^bเป็นข้อโต้แย้งที่สำคัญและอาร์เรย์ของฟังก์ชั่นตามลำดับ @^b.sort(...)เพียงแค่เรียงลำดับอาร์เรย์อินพุตตามฟังก์ชันเพรดิเคตที่ได้รับ ฟังก์ชั่นนั้นใช้อาร์กิวเมนต์ตัวเดียวดังนั้นsortจะผ่านแต่ละองค์ประกอบในทางกลับกันและถือว่าค่าส่งคืนเป็นกุญแจสำคัญสำหรับองค์ประกอบนั้นเรียงลำดับรายการตามปุ่มขององค์ประกอบ

*.comb Z~^ (|$^a.comb xx *)ฟังก์ชั่นการเรียงลำดับคือ *เป็นอาร์กิวเมนต์สตริงเดี่ยวของฟังก์ชัน *.combคือรายการของอักขระแต่ละตัวของสตริง |$^a.comb xx *คือรายการของอักขระในคีย์การเรียงลำดับ xor ซึ่งจำลองแบบไม่สิ้นสุด ทั้งสองรายการจะถูกซิปเข้าด้วยกัน ( Z) โดยใช้ตัวดำเนินการ stringwise xor ( ~^) เนื่องจากเพรดิเคตการเรียงลำดับส่งคืนคีย์การเรียงซึ่งเป็นรายการsortสั่งสององค์ประกอบโดยการเปรียบเทียบองค์ประกอบแรกของรายการที่ส่งคืนจากนั้นองค์ประกอบที่สองหากองค์ประกอบแรกเหมือนกันและอื่น ๆ


{sort *.comb »~^»$^a.comb,@^b}
แบรดกิลเบิร์ต b2gills

1

C (gcc) , 132 128 126 ไบต์

char*k;g(a,b,i,r)char**a,**b;{r=k[i%strlen(k)];(r^(i[*a]?:-1))-(r^(i[*b]?:-2))?:g(a,b,i+1);}f(c,v)int*v;{k=*v;qsort(v,c,8,g);}

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

รหัสไม่สามารถพกพาได้สูงและต้องการพอยน์เตอร์ 64- บิต, gcc และ glibc

ขอบคุณ @ceilingcat สำหรับการตีกอล์ฟขนาด 2 ไบต์!

ลองออนไลน์!


1

Python 2,  204 140 134  126 ไบต์

ขอบคุณ @Mr Xcoder สำหรับการบันทึก 64 ไบต์ขอบคุณ @ovs สำหรับการบันทึกหกไบต์และขอบคุณ @Dennis สำหรับการบันทึกแปดไบต์!

lambda k,l:[x(k,s)for s in sorted(x(k,s)for s in l)]
x=lambda k,s:''.join(chr(ord(v)^ord(k[i%len(k)]))for i,v in enumerate(s))

ลองออนไลน์!


1

x86 opcode, 57 ไบต์

0100  60 89 CD 4D 8B 74 8A FC-8B 3C AA 53 F6 03 FF 75
0110  02 5B 53 8A 23 AC 08 C0-74 0A 30 E0 32 27 47 43
0120  38 E0 74 E8 77 0A 8B 04-AA 87 44 8A FC 89 04 AA
0130  85 ED 5B 75 CE E2 CA 61-C3

    ;input ecx(length), edx(array), ebx(xor-d)
F:  pushad
L1: mov ebp, ecx
L2: dec ebp
    mov esi, [edx+ecx*4-4]
    mov edi, [edx+ebp*4]
    push ebx
L6: test [ebx], byte -1 ; t1b
    jnz L4
    pop ebx
    push ebx
L4: mov ah, [ebx]
    lodsb
    or  al, al
    jz  L7
    xor al, ah
    xor ah, [edi]
    inc edi
    inc ebx
    cmp al, ah
    jz  L6
L7: ja  L8
    mov eax, dword[edx+ebp*4]
    xchg eax, dword[edx+ecx*4-4]
    mov dword[edx+ebp*4], eax
L8: ;call debug
    test ebp, ebp
    pop ebx
    jnz L2
    loop L1
    popad
    ret            

รหัสทดสอบ:

if 1
    use32
else
    org $0100
    mov ecx, (Qn-Q0)/4
    mov edx, Q0
    mov ebx, S
    call F
    call debug
    ret

debug:pushad
    mov ecx, (Qn-Q0)/4
    mov edx, Q0
    mov ebx, S
E3:   mov esi, [edx]
    push dx
    mov ah, 2
E4:   lodsb
    cmp al, 0
    jz E5
    mov dl, al
    int $21
    jmp E4
E5:   mov dl, $0A
    int $21
    mov dl, $0D
    int $21
    pop dx
    add edx, 4
    loop E3
    ;mov ah, 1
    ;int $21
    int1
    popad
    ret
    align 128
Q0:
    dd str1, str2, str3, str4
Qn:
S     db '912', 0
str1  db 'abcde', 0
str2  db 'hello', 0
str3  db 'test', 0
str4  db 'honk', 0
    align 128
end if
    ;input ecx(length), edx(array), ebx(xor-d)
F:  pushad
L1: mov ebp, ecx
L2: dec ebp
    mov esi, [edx+ecx*4-4]
    mov edi, [edx+ebp*4]
    push ebx
L6: test [ebx], byte -1 ; t1b
    jnz L4
    pop ebx
    push ebx
L4: mov ah, [ebx]
    lodsb
    or  al, al
    jz  L7
    xor al, ah
    xor ah, [edi]
    inc edi
    inc ebx
    cmp al, ah
    jz  L6
L7: ja  L8
    mov eax, dword[edx+ebp*4]
    xchg eax, dword[edx+ecx*4-4]
    mov dword[edx+ebp*4], eax
L8: ;call debug
    test ebp, ebp
    pop ebx
    jnz L2
    loop L1
    popad
    ret

1

JavaScript ES 6, 113 97 95 ไบต์

k=>p=>p.sort((a,b,F=x=>[...x].map((y,i)=>1e9|y.charCodeAt()^(p=k+p).charCodeAt(i)))=>F(a)>F(b))

จาวาสคริปต์ใช้เวลานานนานแค่ไหน ...

สำหรับ [0,65536) + 1e4 เป็น 5 หลักทั้งหมดจึงสามารถเปรียบเทียบได้เหมือนสตริง

Q=
k=>p=>p.sort((a,b,F=x=>[...x].map((y,i)=>1e9|y.charCodeAt()^(p=k+p).charCodeAt(i)))=>F(a)>F(b))
;
console.log(Q("912")(["abcde", "hello", "test", "honk"]));
console.log(Q("taco")(["this", "is", "a", "taco", "test"]));
console.log(Q("thisisalongkey")(["who", "what", "when"]));
console.log(Q("3")(["who", "what", "when"]));


Threoiy ฉันสามารถใช้k+=kแทนp=k+pหน่วยความจำที่มากเกินไป แต่ใช้กับกรณีทดสอบขนาดเล็ก
l4m2



0

Perl 5, 80 + 3 ( anl) = 83 , 67 ไบต์

sub{$,=shift;sub X{$_^substr$,x y///c,0,y///c};map X,sort map X,@_}

ลองออนไลน์


การทำซ้ำคีย์ 9 ครั้งซึ่งไม่เพียงพอโดยทั่วไป ตัวอย่างเช่นผลลัพธ์จะผิดสำหรับ9; abcdeabcde abcdeabcdz(ควรให้abcdeabcdz abcdeabcde)
Lynn

@Lynn แก้ไขการเพิ่ม 3 ไบต์
Nahuel Fouilleul

สามารถบันทึก 16 ไบต์โดยใช้ subs
Nahuel Fouilleul

0

AWK , 285 284 ไบต์

{for(;z++<128;){o[sprintf("%c",z)]=z}split(substr($0,0,index($0,FS)),k,"");$1="";split($0,w);for(q in w){split(w[q],l,"");d="";for(;i++<length(l);){d=d sprintf("%c",xor(o[k[(i-1)%(length(k)-1)+1]],o[l[i]]))}a[q]=d;i=0}asort(a,b);for(j in b){for(i in a){printf(a[i]==b[j])?w[i]FS:""}}}

ลองออนไลน์!

ยอมรับอินพุตในรูปแบบของkey word word ...เช่น912 abcde hello test honk

เอาต์พุตแยกคำพื้นที่ออกจากกัน

อ่านง่ายขึ้นเล็กน้อย

{
  for (; z++ < 128;) {
    o[sprintf("%c", z)] = z
  }
  split(substr($0, 0, index($0, FS)), k, "");
  $1 = "";
  split($0, w);
  for (q in w) {
    split(w[q], l, "");
    d = "";
    for (; i++ < length(l);) {
      d = d sprintf("%c", xor(o[k[(i - 1) % (length(k) - 1) + 1]], o[l[i]]))
    }
    a[q] = d;
    i = 0;
  }
  asort(a, b);
  for (j in b) {
    for (i in a) {
      printf(a[i] == b[j]) ? w[i] FS : ""
    }
  }
}  

0

ปัจจัย, 85

[ [ dup length rot <array> concat [ bitxor ] 2map ] with
[ dup bi* <=> ] curry sort ]

ก่อนอื่นลองดูสิว่าฉันจะตีกอล์ฟต่อไปในวันพรุ่งนี้ได้ไหม

ฉันยอมรับข้อเสนอแนะ;)


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