$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Ḍ
И извлеките первую цифру, которая является желаемым результатом.