십진“XOR”연산자


15

많은 프로그래밍 언어는 정수의 이진수 (base-2) 숫자를 조작하는 연산자를 제공합니다. 이러한 연산자를 다른 기반으로 일반화하는 방법은 다음과 같습니다.

하자 XY는 베이스 단 자리 숫자 일 B . 단항 연산자 정의 ~와 이항 연산자 &, |그리고 ^있도록를 :

  • ~ x = (B-1)-x
  • x & y = 최소 (x, y)
  • x | y = 최대 (x, y)
  • x ^ y = (x & ~ y) | (y & ~ x)

B = 2 인 경우 익숙한 비트 NOT, 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으로 채 웁니다.

도전

가능한 한 적은 바이트로, 두 개의 정수를 입력하고 (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^aa^b^b=a홀수 주요 제수와 기지에 대한이
MIK

답변:


3

젤리 , 14 바이트

DUz0«9_ṚƊṀƊ€UḌ

온라인으로 사용해보십시오!

모든 한 자리 쌍의 그리드

두 정수 목록을 인수로 받아서 정수를 리턴하는 모나드 링크.

설명

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 # 대화식 컴파일러) , 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))

@someone 덕분에 6 바이트 절약

온라인으로 사용해보십시오!


76 바이트 . 이 질문이 Zip을 사용할 수있는 유일한 기회라고 생각합니다.
내 대명사는 monicareinstate입니다.

1
@ 누군가 감사합니다! 에 관해서는 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;

온라인으로 사용해보십시오!

테스트 : 온라인으로 사용해보십시오!

우리는 우리가 XOR에 표시 할 숫자를 호출하는 경우 $a$b, 그 발견 :

  • 시는 $a, 5 미만XOR = min(9-$a, max($a, $b))
  • 경우 $a, 동일하거나보다 5XOR = min($a, max(9-$a, 9-$b))

그래서이 논리와 길이가 다른 숫자를 처리하는 핵을 구현했습니다. I는 (네거티브 인덱스처럼 각 자리의 형태를 모두 입력 번호의 끝을 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.