ตัวดำเนินการ“ XOR” ทศนิยม


15

ภาษาการเขียนโปรแกรมจำนวนมากจัดเตรียมโอเปอเรเตอร์สำหรับจัดการเลขฐานสอง (ฐาน -2) ของจำนวนเต็ม นี่คือวิธีหนึ่งในการสรุปผู้ประกอบการเหล่านี้ไปยังฐานอื่น ๆ :

ให้xและy ที่เป็นตัวเลขหลักเดียวในฐานB กำหนดผู้ประกอบการเอกภาค~และผู้ประกอบการไบนารี&, |และ^เช่นว่า:

  • ~ x = (B - 1) - x
  • x & y = นาที (x, y)
  • x | y = สูงสุด (x, y)
  • x ^ y = (x & ~ y) | (y & ~ x)

โปรดทราบว่าถ้า B = 2 เราได้รับตัวดำเนินการ bitwise ที่ไม่คุ้นเคย AND และ OR และ XOR

สำหรับ B = 10 เราได้รับตาราง“ ทศนิยม XOR”:

^ │ 0 1 2 3 4 5 6 7 8 9
──┼────────────────────
0 │ 0 1 2 3 4 5 6 7 8 9
1 │ 1 1 2 3 4 5 6 7 8 8
2 │ 2 2 2 3 4 5 6 7 7 7
3 │ 3 3 3 3 4 5 6 6 6 6
4 │ 4 4 4 4 4 5 5 5 5 5
5 │ 5 5 5 5 5 4 4 4 4 4
6 │ 6 6 6 6 5 4 3 3 3 3
7 │ 7 7 7 6 5 4 3 2 2 2
8 │ 8 8 7 6 5 4 3 2 1 1
9 │ 9 8 7 6 5 4 3 2 1 0

สำหรับตัวเลขหลายหลักให้ใช้โอเปอเรเตอร์หลักเดียวทีละหลัก ตัวอย่างเช่น 12345 ^ 24680 = 24655 เนื่องจาก:

  • 1 ^ 2 = 2
  • 2 ^ 4 = 4
  • 3 ^ 6 = 6
  • 4 ^ 8 = 5
  • 5 ^ 0 = 5

หากตัวถูกดำเนินการมีความยาวแตกต่างกันให้นำแผ่นที่สั้นกว่าด้วยเลขศูนย์นำหน้า

ความท้าทาย

เขียนเป็นไบต์น้อยที่สุดเท่าที่เป็นไปได้โปรแกรมหรือฟังก์ชั่นที่ใช้เป็นจำนวนเต็มสองจำนวนเต็ม (ซึ่งอาจจะอยู่ระหว่าง 0 ถึง 999 999 999 รวม) และส่งออก "ทศนิยม XOR" ของตัวเลขทั้งสองตามที่กำหนดไว้ข้างต้น

กรณีทดสอบ

  • 12345, 24680 → 24655
  • 12345, 6789 → 16654
  • 2019, 5779 → 5770
  • 0, 999999999 → 999999999
  • 0, 0 → 0

เราสามารถรับอินพุตหรือเอาต์พุตเป็นสตริงหรืออาร์เรย์ char ได้หรือไม่
ศูนย์รวมแห่งความไม่รู้

6
วิธีการเกี่ยวกับอาร์เรย์หลัก? เป็นที่ยอมรับหรือไม่?
ศูนย์รวมแห่งความไม่รู้

1
คือ09ผลที่ได้รับการยอมรับสำหรับการป้อนข้อมูลของ90, 99?
Neil

1
ฉันหวังว่าจะมีลักษณะทั่วไปที่รักษาไว้A^B^B=A
trichoplax

2
@trichoplax คุณไม่สามารถมีทั้งa^b=b^aและa^b^b=aฐานกับหารสำคัญคี่
MIK

คำตอบ:


3

เยลลี่ 14 ไบต์

DUz0«9_ṚƊṀƊ€UḌ

ลองออนไลน์!

ตารางของคู่หลักเดียวทั้งหมด

ลิงก์ monadic ที่รับรายการจำนวนเต็มสองจำนวนเป็นอาร์กิวเมนต์และส่งคืนจำนวนเต็ม

คำอธิบาย

D               | Decimal digits
 U              | Reverse order of each set of digits
  z0            | Transpose with 0 as filler
          Ɗ€    | For each pair of digits, do the following as a monad:
    «   Ɗ       | - Minimum of the two digits and the following as a monad (vectorises):
     9_         |   - 9 minus the digits
       Ṛ        |   - Reverse the order
         Ṁ      | - Maximum
            U   | Reverse the order of the answer to restore the orignal order of digits
             Ḍ  | Convert back from decimal digits to integer

หากเมทริกซ์หลักคืออินพุต / เอาต์พุตที่ยอมรับได้:

เยลลี่ 12 ไบต์

Uz0«9_ṚƊṀƊ€U

ลองออนไลน์!


2

Pyth , 31 ไบต์

LhS,hb-9ebjkmeS,ydy_d_.t_MjRTQ0

ลองออนไลน์!

LhS,hb-9eb             # Helper function, computes the (x & ~y) part
L                      # y = lambda b:
  S                    #               sorted(                )  
   ,                   #                       [    ,        ]
    hb                 #                        b[0]
      -9eb             #                              9-b[-1]
 h                     #                                       [0] # sorted(...)[0] = minimum

jkmeS,ydy_d_.t_MjRTQ0  # Main program (example input Q: [123, 45])
                jRTQ   # convert each input to a list of digits -> [[1,2,3],[4,5]]
              _M       # reverse each -> [[3,2,1],[5,4]]
            .t      0  # transpose, padding right with 0 -> [[3,5],[2,4],[1,0]]
           _           # reverse -> [[1,0],[2,4],[3,5]]
  m                    # map that over lambda d:
    S,                 #   sorted([    ,           ])
      yd               #           y(d)
        y_d            #                 y(d[::-1])         # reversed
   e                   #                             [-1]   # sorted(...)[-1] = maximum
jk                     # ''.join( ^^^ )


1

มา (gforth) , 111 ไบต์

: m 10 /mod rot ;
: t 9 swap - min ;
: f 2dup + 0> if m m recurse 10 * -rot 2dup swap t -rot t max + 1 then * ;

ลองออนไลน์!

รหัสคำอธิบาย

: m          \ start a new word definition
  10 /mod    \ get quotient and remainder of dividing by 10
  rot        \ move item in 3rd stack position to top of stack
;            \ end word definition

\ word implementing "not" followed by "and"
: t          \ start a new word definition
  9 swap -   \ subtract top stack element from 9
  min        \ get the minimum of the top two stack elements
;            \ end word definition

: f          \ start a new word definition
  2dup +     \ duplicate top two stack elements and add them together
  0> if      \ if greater than 0
    m m      \ divide both by 10, move remainders behind quotients
    recurse  \ call self recursively
    10 *     \ multiply result by 10 (decimal left shift of 1)
    -rot     \ get remainders from original division
    2dup     \ duplicate both remainders 
    swap t   \ swap order and call t (b & !a)
    -rot t   \ move result back and call t on other pair (a & !b)
    max + 1  \ get the max of the two results and add to total. put 1 on top of stack
  then       \ end if block
  *          \ multiply top two stack results (cheaper way of getting rid of extra 0)
;            \ end word definition

1

C # (Visual C # Interactive Compiler) , 75 ไบต์

a=>b=>a.Select((x,y)=>Math.Max(9-x<(y=y<b.Count?b[y]:0)?9-x:y,9-y<x?9-y:x))

บันทึกแล้ว 6 ไบต์ขอบคุณ @someone

ลองออนไลน์!


76 ไบต์ ฉันคิดว่าคำถามนี้อาจเป็นโอกาสที่ไม่ซ้ำกันในการใช้งาน Zip
สรรพนามของฉันคือ monicareinstate

1
@someone ขอบคุณ! เกี่ยวกับZipคุณไม่สามารถใช้งานได้เนื่องจากจะตัดทอนการเก็บสะสมอีกต่อไปตามความยาวของอันที่สั้นกว่าโดยอัตโนมัติ
ศูนย์รวมของความไม่รู้

0

PHP , 111 109 ไบต์

for(;''<($a=$argv[1][-++$i]).$b=$argv[2][-$i];)$s=min($a<5?9-$a:$a,max($a<5?$a:9-$a,$a<5?$b:9-$b)).$s;echo$s;

ลองออนไลน์!

การทดสอบ: ลองออนไลน์!

หากเราเรียกตัวเลขที่เราต้องการให้เป็นแฮคเกอร์$aและ$bพบว่า:

  • เมื่อ$aน้อยกว่า 5XOR = min(9-$a, max($a, $b))
  • เมื่อ$aเท่ากับหรือมากกว่า 5XOR = min($a, max(9-$a, 9-$b))

ดังนั้นฉันจึงใช้ตรรกะนี้บวกกับการแฮ็คเพื่อจัดการตัวเลขที่มีความยาวต่างกัน ฉันใช้แต่ละจุดสิ้นสุดของตัวเลขที่ป้อนทั้งสอง (พร้อมดัชนีลบเช่นinput[-1],, input[-2]... ) และคำนวณ XOR และใส่ผลลัพธ์ในลำดับที่ตรงกันข้ามในสตริงที่จะพิมพ์ในตอนท้าย เนื่องจากฉันใช้ตัวเลขจากจุดสิ้นสุดของตัวเลขผลลัพธ์ XOR ควรรวมเข้าด้วยกันในลำดับที่กลับกัน เมื่ออินพุตตัวใดตัวหนึ่งยาวกว่าอีกตัวหนึ่งดัชนีเชิงลบของอินพุตที่สั้นลงจะส่งผลให้เกิดสตริงว่างซึ่งเท่ากับ 0


0

เรติน่า , 85 59 ไบต์

^'0P`.+
N$`.
$.%`
¶

/../_(`^
$"
T`d`Rd`.¶.
%N`.
^N`..
L`^.

ลองออนไลน์! รับอินพุตเป็นบรรทัดแยกกัน แต่ลิงก์คือทดสอบชุดที่ฟอร์แมตอินพุตที่คั่นด้วยเครื่องหมายคอมม่า คำอธิบาย:

^'0P`.+

แผ่นซ้ายที่มีศูนย์ทั้งสองเส้นมีความยาวเท่ากัน

N$`.
$.%`
¶

จัดเรียงแต่ละหลักตามดัชนีคอลัมน์จากนั้นลบบรรทัดใหม่ นี่เป็นผลของการจับคู่ตัวเลขเข้าด้วยกันในลักษณะเดียวกับการถ่ายโอน

/../_(`

ใช้แยกกันกับตัวเลขแต่ละคู่โดยรวมผลลัพธ์เข้าด้วยกัน

^
$"

ทำซ้ำทั้งคู่

T`d`Rd`.¶.

กลับตัวเลขที่สองของคู่แรกและหลักแรกของที่สองดังนั้นตอนนี้เรามีx ~yหนึ่งบรรทัดและ~x yอีกคู่

%N`.

เรียงลำดับตัวเลขของแต่ละบรรทัดตามลำดับเพื่อให้ตัวเลขตัวแรกอยู่ในขณะนี้x & ~yหรือ~x & yตามความเหมาะสม

^N`..

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

L`^.

และแยกตัวเลขตัวแรกซึ่งเป็นผลลัพธ์ที่ต้องการ

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