Operator "XOR" desimal

15

Banyak bahasa pemrograman menyediakan operator untuk memanipulasi bilangan bulat biner (basis-2). Berikut adalah salah satu cara untuk menggeneralisasi operator ini ke pangkalan lain:

Biarkan x dan y menjadi nomor satu digit dalam basis B . Tentukan operator unary ~dan operator biner &,| dan ^sehingga:

  • ~ x = (B - 1) - x
  • x & y = mnt (x, y)
  • x | y = maks (x, y)
  • x ^ y = (x & ~ y) | (y & ~ x)

Perhatikan bahwa jika B = 2, kita mendapatkan operator TIDAK bitwise, AND, OR, dan XOR yang familiar.

Untuk B = 10, kita mendapatkan tabel “desimal 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

Untuk nomor multi-digit, terapkan operator satu digit digit-demi-digit. Misalnya, 12345 ^ 24680 = 24655, karena:

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

Jika operan memiliki panjang yang berbeda, maka masukkan yang lebih pendek dengan nol di depannya.

Tantangan

Tulis, sesedikit mungkin byte, suatu program atau fungsi yang mengambil input dua bilangan bulat (yang dapat diasumsikan antara 0 dan 999 999 999, inklusif) dan mengeluarkan "XOR desimal" dari dua angka sebagaimana didefinisikan di atas.

Uji kasus

  • 12345, 24680 → 24655
  • 12345, 6789 → 16654
  • 2019, 5779 → 5770
  • 0, 999999999 → 999999999
  • 0, 0 → 0
dan04
sumber
Bisakah kita mengambil input atau output sebagai string atau array char?
Perwujudan Ketidaktahuan
6
Bagaimana dengan array digit? Apakah itu dapat diterima?
Perwujudan Ketidaktahuan
1
Apakah 09hasil yang dapat diterima untuk input 90, 99?
Neil
1
Saya berharap ada generalisasi yang dipertahankanA^B^B=A
trichoplax
2
@trichoplax, Anda tidak dapat memiliki keduanya a^b=b^adan a^b^b=auntuk pangkalan dengan pembagi utama yang aneh
mik

Jawaban:

3

Jelly , 14 byte

DUz0«9_ṚƊṀƊ€UḌ

Cobalah online!

Kisi semua pasangan digit tunggal

Tautan monadik mengambil daftar dua bilangan bulat sebagai argumennya dan mengembalikan bilangan bulat.

Penjelasan

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

Jika matriks digit adalah input / output yang dapat diterima:

Jelly , 12 byte

Uz0«9_ṚƊṀƊ€U

Cobalah online!

Nick Kennedy
sumber
2

Pyth , 31 byte

LhS,hb-9ebjkmeS,ydy_d_.t_MjRTQ0

Cobalah online!

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( ^^^ )
ar4093
sumber
1

Keempat (gforth) , 111 byte

: 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 * ;

Cobalah online!

Penjelasan Kode

: 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
reffu
sumber
1

C # (Visual C # Interactive Compiler) , 75 byte

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

Disimpan 6 byte berkat @someone

Cobalah online!

Perwujudan Ketidaktahuan
sumber
76 byte . Saya pikir pertanyaan ini mungkin merupakan kesempatan unik untuk menggunakan Zip.
kata ganti saya adalah monicareinstate
1
@ seseorang Terima kasih! Mengenai Zip, Anda tidak dapat menggunakannya karena secara otomatis memotong koleksi yang lebih panjang dengan yang lebih pendek
Perwujudan Ketidaktahuan
0

PHP , 111 109 byte

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;

Cobalah online!

Tes: Coba online!

Jika kita memanggil digit yang ingin kita XOR, $adan $b, saya menemukan bahwa:

  • Kapan $a kurang dari 5,XOR = min(9-$a, max($a, $b))
  • Kapan $asama dengan atau lebih dari 5,XOR = min($a, max(9-$a, 9-$b))

Jadi saya menerapkan logika ini ditambah peretasan untuk menangani angka dengan panjang yang berbeda. Saya mengambil setiap digit dari akhir kedua nomor input (dengan indeks negatif seperti input[-1],, input[-2]...) dan menghitung XOR dan menempatkan hasilnya dalam urutan terbalik dalam sebuah string yang akan dicetak di akhir. Karena saya mengambil angka dari akhir angka, hasil XOR harus disatukan dalam urutan terbalik. Ketika salah satu input lebih panjang dari yang lain, indeks negatif pada input yang lebih pendek menghasilkan string kosong yang sama dengan 0.

Night2
sumber
0

Retina , 85 59 byte

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

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

Cobalah online!Mengambil input sebagai baris terpisah, tetapi tautannya adalah untuk menguji suite yang memformat ulang input yang dipisahkan koma. Penjelasan:

^'0P`.+

Pad kiri dengan nol kedua garis dengan panjang yang sama.

N$`.
$.%`
¶

Urutkan setiap digit berdasarkan indeks kolomnya, lalu hapus baris baru. Ini memiliki efek memasangkan digit bersama-sama dengan cara yang sama seperti transpos.

/../_(`

Terapkan secara terpisah untuk masing-masing pasangan digit, gabungkan hasil bersama

^
$"

Gandakan pasangan.

T`d`Rd`.¶.

Membalikkan digit kedua dari pasangan pertama dan digit pertama dari pasangan kedua, jadi sekarang kita memiliki x ~ysatu baris dan ~x ylainnya.

%N`.

Urutkan digit setiap baris secara berurutan, sehingga digit pertama sekarang x & ~yatau yang ~x & ysesuai.

^N`..

Balikkan urutan garis.

L`^.

Dan ekstrak digit pertama, yang merupakan hasil yang diinginkan.

Neil
sumber