Codegolf — Десятичный Оператор «Xor»

  • Автор темы Tarik81
  • Обновлено
  • 23, Oct 2024
  • #1

Многие языки программирования предоставляют операторы для управления двоичными цифрами целых чисел (по основанию 2). Вот один из способов обобщить эти операторы на другие базы:

Позволять х и й быть однозначными числами по основанию Б. Определить унарный оператор

 ^ │ 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
 
and binary operators ^ , | , and & такой, что:

  • ~х = (В - 1) - х
  • х и у = мин (х, у)
  • х | у = макс(х, у)
  • х ^ у = (х & ~y) | (у и ~х)

Обратите внимание: если B=2, мы получаем знакомые побитовые операторы NOT, AND, OR и XOR.

Для B=10 мы получаем таблицу «десятичного исключающего ИЛИ»:

~

Для многозначных чисел примените однозначный оператор поразрядно. Например, 12345^24680=24655, потому что:

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

Если операнды имеют разную длину, дополните более короткий операнд ведущими нулями.

Задача

Напишите как можно меньше байтов программу или функцию, которая принимает на вход два целых числа (которые можно предположить в диапазоне от 0 до 999 999 999 включительно) и выводит «десятичное исключающее ИЛИ» двух чисел, как определено выше.

Тестовые случаи

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

#код-гольф #математика #число

Tarik81


Рег
15 Jul, 2015

Тем
84

Постов
200

Баллов
620
  • 26, Oct 2024
  • #2

Желе, 14 байт

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 L`^.
 

Попробуйте онлайн!

Сетка всех однозначных пар

Монадическая ссылка, принимающая в качестве аргумента список из двух целых чисел и возвращающая целое число.

Объяснение

^N`..

Если цифровая матрица является приемлемым вводом/выводом:

Желе, 12 байт

~x & y

Попробуйте онлайн!

 

Igor515


Рег
30 Sep, 2006

Тем
89

Постов
177

Баллов
642
  • 26, Oct 2024
  • #5

PHP, 111 109 байт

/../_(`

Попробуйте онлайн!

Тесты: Попробуйте онлайн!

Если мы вызовем цифры, которые хотим выполнить XOR, N$`. $.%` ¶ and ^'0P`.+ , я обнаружил, что:

  • Когда ^'0P`.+ N$`. $.%` ¶ /../_(`^ $" T`d`Rd`.¶. %N`. ^N`.. L`^. is less than 5, input[-2]
  • Когда input[-1] is equal to or more than 5, XOR = min($a, max(9-$a, 9-$b))

Поэтому я реализовал эту логику плюс хак для обработки чисел разной длины. Я беру каждую цифру из конца обоих входных чисел (с отрицательными индексами, например $a , XOR = min(9-$a, max($a, $b)) , ...) и вычислите XOR и поместите результат в обратном порядке в строку, которая будет напечатана в конце. Поскольку я беру цифры с конца чисел, результаты XOR должны складываться в обратном порядке. Когда один из входных данных длиннее другого, отрицательный индекс для более коротких входных данных приводит к пустой строке, равной 0.

 

A_First


Рег
13 Feb, 2008

Тем
67

Постов
195

Баллов
540
  • 26, Oct 2024
  • #6

сетчатка, 85 59 байт

$a

Попробуйте онлайн! Принимает ввод в виде отдельных строк, но ссылка ведет на набор тестов, который переформатирует ввод, разделенный запятыми. Объяснение:

$b

Левая панель с нулями на обеих линиях одинаковой длины.

$a

Отсортируйте каждую цифру по индексу столбца, затем удалите новую строку. Это приводит к объединению цифр в пары почти так же, как и при транспонировании.

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.Select((x,y)=>Math.Max(9-x<(y=y<b.Count?b[y]:0)?9-x:y,9-y<x?9-y:x))

Дублируйте пару.

: 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

Поменяйте местами вторую цифру первой пары и первую цифру второй, и теперь мы имеем : 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 * ; on one line and f=lambda n,m,T=10:n+m and max(min(n%T,~m%T),min(m%T,~n%T))+f(n/T,m/T)*T с другой.

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

Отсортируйте цифры каждой строки по порядку, чтобы первая цифра теперь была LhS,hb-9ebjkmeS,ydy_d_.t_MjRTQ0 or Uz0«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

Обратная сортировка строк.

DUz0«9_ṚƊṀƊ€UḌ

И извлеките первую цифру, которая является желаемым результатом.

 

Alx77


Рег
08 May, 2011

Тем
68

Постов
202

Баллов
552
Тем
403,760
Комментарии
400,028
Опыт
2,418,908