Ondalık “XOR” operatörü


15

Birçok programlama dili, tamsayıların ikili (taban-2) basamaklarını işlemek için operatörler sağlar. İşte bu operatörleri diğer üslere genellemenin bir yolu:

Let X ve Y bir baz ile, tek basamaklı sayı olduğu B . Tek terimli operatörü tanımlayın ~ve ikili operatörler &, |ve ^öyle ki:

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

B = 2 ise, tanıdık bitsel olarak NOT, AND, OR ve XOR operatörlerini elde ettiğimizi unutmayın.

B = 10 için, “ondalık XOR” tablosunu alırız:

^ │ 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

Çok basamaklı sayılar için, tek basamaklı operatörü basamak basamak uygulayın. Örneğin, 12345 ^ 24680 = 24655, çünkü:

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

Eğer işlenenler farklı uzunluklarda ise, daha kısa olanı baştaki sıfırlarla doldurun.

Meydan okuma

Mümkün olduğunca az bayt olarak, giriş iki tamsayısını (0 ile 999 999 999 arasında dahil olduğu varsayılabilir) alan ve yukarıda tanımlanan iki sayının “ondalık XOR” değerini çıkaran bir program veya işlev yazın.

Test senaryoları

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

Girdi veya çıktıyı dize veya karakter dizisi olarak alabilir miyiz?
Cehalet

6
Rakam dizisine ne dersiniz? Bu kabul edilebilir mi?
Cehalet

1
Mi 09bir giriş için, kabul edilebilir bir sonuç 90, 99?
Neil

1
Keşke bir genelleme olsaydıA^B^B=A
trichoplax

2
@trichoplax, tuhaf bir baş bölen ile hem a^b=b^ave hem de a^b^b=aüsleri olamaz
mik

Yanıtlar:


3

Jöle , 14 bayt

DUz0«9_ṚƊṀƊ€UḌ

Çevrimiçi deneyin!

Tüm tek haneli çiftlerin ızgarası

Bağımsız değişken olarak iki tamsayının listesini alan ve bir tamsayıyı döndüren monadik bir bağlantı.

açıklama

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

Bir basamak matrisi kabul edilebilir giriş / çıkış ise:

Jöle , 12 bayt

Uz0«9_ṚƊṀƊ€U

Çevrimiçi deneyin!


2

Pyth , 31 bayt

LhS,hb-9ebjkmeS,ydy_d_.t_MjRTQ0

Çevrimiçi deneyin!

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

İleri (gforth) , 111 bayt

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

Çevrimiçi deneyin!

Kod Açıklaması

: 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


0

PHP , 111 109 bayt

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;

Çevrimiçi deneyin!

Testler: Çevrimiçi deneyin!

Rakamları XOR olarak adlandırırsak $ave $bşunu buldum:

  • Ne zaman $a , 5'ten az olduğuXOR = min(9-$a, max($a, $b))
  • Zaman $a, eşit veya daha fazla 5'tirXOR = min($a, max(9-$a, 9-$b))

Bu mantığı ve farklı uzunluklardaki sayıları işlemek için bir kesmek uyguladım. Ben (negatif endeksleri gibi her basamaklı formu hem giriş numaralarının ucunu al input[-1], input[-2], ...) ve XOR hesaplamak ve sonunda basılacak bir dizede ters sırayla sonucu koydu. Rakamların sonundan rakamlar aldığımdan, XOR sonuçları ters sırada bir araya getirilmelidir. Girişlerden biri diğerinden daha uzun olduğunda, daha kısa girişteki negatif dizin 0'a eşit boş bir dizeyle sonuçlanır.


0

Retina , 85 59 bayt

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

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

Çevrimiçi deneyin! Girdiyi ayrı satırlar olarak alır, ancak bağlantı virgülle ayrılmış girdiyi yeniden biçimlendiren test paketidir. Açıklama:

^'0P`.+

Her iki satırı aynı uzunlukta sıfırlar içeren sol yastık.

N$`.
$.%`
¶

Her basamağı sütun dizinine göre sıralayın ve ardından yeni satırı silin. Bunun, rakamları bir devrik işlemle aynı şekilde eşleştirme etkisi vardır.

/../_(`

Her basamak çiftine, sonuçları birleştirerek ayrı ayrı uygulayın.

^
$"

Çifti çoğaltın.

T`d`Rd`.¶.

İlk çiftin ikinci hanesini ve ikinci çiftin ilk hanesini tersine çevirin, böylece şimdi x ~ybir satırda ve ~x ydiğerinde var.

%N`.

Her satırın rakamlarını, ilk basamak şimdi x & ~yveya ~x & yuygun olacak şekilde sıralayın .

^N`..

Çizgileri ters sırala.

L`^.

Ve istenen rakam olan ilk basamağı çıkarın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.