Сделайте их суммой до 10000


26

Недавно мы достигли порога в 10 000 вопросов по PPCG. Ура! Давайте отпразднуем это простым вызовом.

вход

Два целых числа и , оба в , так что .AB[1..9999]A+B<10000

задача

Ваша задача - добавить одну единственную цифру к одному из этих целых чисел или одну единственную цифру к ним обоим так, чтобы . Если добавить цифру к и , она не обязательно должна совпадать.A+Взнак равно10000AВ

Новая цифра может быть добавлена ​​в начале, в конце или в любом месте в середине исходного целого числа. Однако вы не можете добавить ведущий ноль.

Пример:

Для допустимы следующие преобразования:Aзнак равно+923

1+9239273+9238

Но эти недействительны :

0+92310+92394273

Учитывая и , есть два возможных решения:Aзнак равно+923Взнак равно72

+9238+762знак равно100009273+727знак равно10000

Выход

Вы должны распечатать или вывести список всех возможных решений.

Для приведенного выше примера ожидаемый результат будет [[9238,762],[9273,727]].

правила

  • Ввод / вывод может быть обработан в любом разумном, однозначном формате. Вы можете использовать строки, списки цифр и т. Д. Вместо целых чисел.
  • На входе гарантированно найдется хотя бы одно решение.
  • Вам разрешено не дедуплицировать вывод. Однако было бы полезно, если бы тестовый код дедуплицировал его с некоторой последующей обработкой, например, в разделе нижнего колонтитула TIO.
  • Это вызов .

Контрольные примеры

Input    --> Output

934, 654 --> [[9346,654]]

737, 628 --> [[7372,2628]]

9122, 88 --> [[9122,878]]

923, 72  --> [[9238,762],[9273,727]]

998, 3   --> [[9968,32],[9987,13]]

900, 10  --> [[9900,100],[9090,910]]    NB: solutions such as [9000,1000] are NOT valid
                                            (more than one digit added to 10)

363, 632 --> [[3673,6327],[3638,6362]]

288, 711 --> [[2881,7119],[2882,7118],[2883,7117],[2884,7116],[2885,7115],[2886,7114],
              [2887,7113],[2888,7112],[2889,7111]]

365, 635 --> [[365,9635],[1365,8635],[2365,7635],[3365,6635],[4365,5635],[5365,4635],
              [6365,3635],[7365,2635],[8365,1635],[9365,635],[3065,6935],[3165,6835],
              [3265,6735],[3465,6535],[3565,6435],[3665,6335],[3765,6235],[3865,6135],
              [3965,6035],[3605,6395],[3615,6385],[3625,6375],[3635,6365],[3645,6355],
              [3655,6345],[3675,6325],[3685,6315],[3695,6305],[3650,6350]]

4
Это непростая задача, если я не могу напечатать это и быть уверенным, что это работает, пока я в машине. ; p
Quintec

16
@Quintec Я бы рекомендовал не печатать что-либо, пока ты в машине. : p
Арнаулд

1
@Arnauld Он не сказал, что он водитель. ;-) (Серьезное примечание: пока 4 комментария не по теме, мой гандикап из 3 комментариев для этих целей громко
издает

1
Когда желейные решения занимают более 20 байтов, это сложная задача!
Реджис Порталез,

output a list of all possible solutionsО, облом. Это было бы трудно для моего рунического языка. Я мог бы написать программу , которая может выход на решение!
Draco18s

Ответы:


12

Haskell , 99 97 82 81 байт

-16 байт благодаря Delfad0r (принимая входные данные в виде списка, используя злоупотребления, которые нам не нужно дедуплицировать -> всегда может быть в [0,4] и используя умную комбинацию формата ввода и ap)!

filter((==1e4).sum).mapM([read.(take n<>(c:).drop n)|c<-['0'..'9'],n<-[0..4]]<*>)

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


На самом деле я чувствую себя немного глупо: 81 байт без странных форматов ввода или последних версий GHC ...
Delfad0r

8

R , 96 байт

function(a,b)(w<-grep(gsub("",".?",a?b),1:1e4?9999:0)?r<-1e4-w)[w+a<2&r+b<2]
"?"=paste
"+"=adist

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

Объяснение (без золота)

function(a,b){
    # Regex inserting ".*": (998,3) => ".?9.?9.?8.? .?3.?"
  regex <- gsub("",".?",paste(a,b)) 
    # Positions matching in the whole vector of strings that add to 10K ("1 9999", "2 9998", "3 9997", "4 9996", ...)
  w <- grep(regex,paste(1:1e4,9999:0)) 
    # 10K minus these matching positions
  r <- 1e4-w 
    # Form position-string vector of ('pos1 10K-pos1', 'pos2 10K-pos2', ...)
  paste(w,r)[
  # Filter only those positions where the edit distance between the matched numbers and the originals are less than 2
    adist(w,a)<2 & adist(r,b)<2 
  ]
}

Зададим ?в paste. Это позволяет нам делать что-то классное: выполнять a<-b?c<-dвстроенные присваивания в pasteвызове, чего мы не могли сделать ни с каким другим оператором ?, поскольку он имеет более низкий приоритет, чем <-.

Теперь, как любезно указал @JoKing, могут быть случаи, 900 10когда могут иметь место две вставки, например 9100 8100. Таким образом, мы отфильтровываем совпадения, в которых количество символов в любом числе увеличилось более чем на 1. Быстрый способ сделать это с помощью расстояния редактирования Левенштейна, с adist которым мы связываемся +.


Спасибо за проверку! Теперь я отфильтровываю совпадения, в которых имеется более одной вставки на число.
Дж. Доу

7

Pyth, 28 27 25 24 22 20 байт

fq^;4sT*FmvsmXLkdThl

Попробуйте онлайн здесь или проверьте все тестовые примеры здесь - набор тестов дедуплицирует результат, добавляя a {.

Ввод в виде списка строк.

fq^;4sT*FmvsmXLkdThldQ   Implicit: Q=eval(input()), T=10
                         Trailing d, Q inferred
         m           Q   Map each input string, as d, using:
                   ld      Take the length of d
            m     h        Map 0 to the above (inclusive), as k, using:
             X  d            Insert into d...
               k             ... at position k...
              L  T           ... each number [0-9]
           s               Flatten the result
          v                Convert each back to an integer
       *F                Take the cartesian product of the result
                         (this generates all possible pairs of mutated numbers)
f                        Keep the pairs, as T, where...
     sT                  ... the sum of the pair...
 q                       ... is equal to...
  ^;4                    ... 10,000 (; == 10 here, so this is 10^4)

Редактировать 4: Сохранено еще 2 байта, благодаря г-ну Xcoder - vпо умолчанию векторизовано и Lиспользуется mпод ним, поэтому подразумевается отображение по диапазону, что делает Uненужным слишком

Редактировать 3: Представлено глобальное использование ;оператора, чтобы сохранить доступ к 10, чтобы сохранить 2 байта, благодаря FryAmTheEggman и issacg:

fq^T4sT*FmvMsmXLkdUThl

Редактировать 2: я забыл, что существует оператор сумм, как неловко ...

Редактировать 1: Предыдущая версия принимала список целых чисел в качестве входных данных, выполняя преобразование строк вручную, для 27 байтов:

fq10000+FT*FmvMsmXLk`dUThl`

1
@KevinCruijssen это действительно так, обычно 10 T, но в функциональных блоках переменные переопределяются, чтобы действовать вместо них как итерационные переменные - в блоке фильтра итерационная переменная просто так происходит T, поэтому ее нельзя использовать. Это означает, что 10 ^ 4это будет ^10 4длиной 5 байтов, поэтому, к сожалению, не короче
Sok

1
@ Так хорошо. Таким образом, Tв UTеще 10, для [0,10)диапазона. Но в стала переменной итерации для фильтра. Спасибо за объяснение, это имеет смысл! И делать это раньше, сохраняя его в переменной и используя эту переменную в фильтре, тоже (как минимум) 5 байт. f...TTT4^
Кевин Круйссен,

2
Вы можете заменить 10000на ^;4.
FryAmTheEggman

2
;всегда имеет значение переменной итерации в глобальном контексте, в данном случае 10. Так ^;4что вы ищете.
Исаак

1
20 байт: fq^;4sT*FmvsmXLkdThl. ( Pyth избивает Jelly? OO Ура )
г-н Xcoder

4

Perl 6 , 64 байта

->\a{grep {all (a Z~$_)X~~/^(.*)(.*)$0.?$1$/},(^1e4 Z(1e4...1))}

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

Это порт ответа GB, использующий регулярное выражение для проверки правильности чисел. Спасибо nwellnhof за его перенос.

Старый ответ, 127 110 , 88 байт

-22 байта благодаря nwellnhof!

->\a{grep {all ~<<a Z∈.map:{.comb.combinations(.comb-1..*)>>.join}},(^1e4 Z(1e4...1))}

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

Блок анонимного кода, который принимает список из двух чисел и возвращает список пар чисел.

Вместо того, чтобы возиться со вставкой цифр, это решение проверяет каждую комбинацию чисел, которые составляют 10000, и фильтрует, что данные числа являются частью пары.

Объяснение:

->\a{  # Anonymous code block that takes an argument a
     grep ... ,(^1e4 Z(1e4...1))    # Filter from all pairs that add to 10000
         {      ~<<a     # Stringify the contents of a
                     .map:{      # Map the pair to
                           .comb  # The digits of the number
                           .combinations(.comb-1..*)  # The combinations of the digits
                           >>.join  # Each combination joined
                           # Note that combinations preserve order
                           # "123" -> (12,13,123)
                          }
          all       Z   # Zip that each element of a is an element of the combination
         }
}

Просто любопытно: разве вы не можете использовать тот факт, что пары могут быть записаны как (i,1e4-i)вместо итерации по каждому (i,j)и их фильтрации?
Эрик Думинил,

3

R , 179 161 150 144 байт

function(a,b,w=g(a),r=rep(g(b),e=1e4))paste(w,r)[w+r==1e4]
g=function(x,n=sum(x|1)){for(i in 0:n)for(j in 0:9)F=c(F,append(x,j,i)%*%10^(n:0));F}

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

35 байтов сохранено @JayCe и @Giuseppe.

объяснение

Вспомогательная функция g получает все возможные вставки.

g <- function(x,            # Input vector of digits
              n=sum(x|1)    # Length of x
              ) {
  for(i in 0:n)             # i is the insertion point
    for(j in 0:9)           # j is a digit from 0 to 9
      # Dot product of vector of digits with insert and 10^(n:0) performs the
      # conversion to integer (and gets rid of the leading 0s)
      F=c(F,append(x,j,i)%*%10^(n:0))  # F is a non-reserved built-in alias to FALSE (numerically 0)
  F
}

Основная функция.

f <- 
function(a,                 # Input vectors of digits
         b,
         w=g(a),            # Get all possible insertions for a
         r=rep(g(b),e=1e4)  # Insertions for b replicated 1e4 times each
         )
  paste(w,r)[w+r==1e4]      # paste and w+r recycle w to match length of r
                            # Lots of duplication!

После того, как я заметил, я заметил, что это по сути та же логика, что и в ответе Пита



@JayCe Экономит более 10 байтов! Дедупликация допускается за пределами кода вызова.
НГМ


давайте убьем еще несколько байтов - не нужно для внешнего, достаточно повторений
JayCe

Я думаю, что мы близки к тому, чтобы воткнуть вилку в этот!
НГМ


2

Желе , 30 байт

DµJṬ€k€jþ9Ż¤;9R¤;€$ḌF)ŒpS=ȷ4ƊƇ

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

Вид неуклюжий, потому что у желе нет вставки.

объяснение

                                   Given [a, b].
Dµ                   )             Get [digits(a), digits(b)] then map:
  JṬ€k€jþ9Ż¤;9R¤;€$ḌF                Generate all the insertions.
                      Œp           Cartesian product: get all pairs.
                        S=ȷ4ƊƇ     Filter for: sum equal to ȷ4 (10000).

                       Given e.g. [6,3,5]:
J                      Get [1,2,3].
 Ṭ€                    Get [[1], [0,1], [0,0,1]].
   k€                  Split input with these: gets us
                         [[6],[3,5]] , [[6,3],[5]] , [[6,3,5],[]]
     jþ9Ż¤             Join table-wise with [0..9]
                         → [[[6,0,3,5], [6,3,0,5], [6,3,5,0]],
                            [[6,1,3,5], [6,3,1,6], [6,3,5,1]], …]
          ;9R¤;€$      Append the prefixings of the input by [1..9].
                           [[1,6,3,5], [2,6,3,5], [3,6,3,5]]…
                 ḌF    Undigits all, and flatten.

2

PHP, 162 159 байт

Прекрасный пример для функции генератора!

function f($n){for($n+=.1;$n>=1;$n/=10)for($d=-1;$d++<9;)yield strtr($n,".",$d)/10|0;}foreach(f($argv[1])as$x)foreach(f($argv[2])as$y)$x+$y-1e4||print"$x+$y\n";

принимает входные данные из аргументов командной строки; печатает дубликаты. Запустите -nr '<code>или попробуйте онлайн .


2

Pyth, 18 байт

fqsT^;4*FsMvXLRRTT

Демонстрация , набор тестов ( набор тестов дедуплицируется с ведущими {).

Ввод в виде списка из двух строк.

XLRRTT: L и R выполняют вложенные карты. Поскольку их 3, мы выполним тройную вложенную карту Xфункции. В этом случае Xфункция вставит символ в указанной позиции в строку.

Строка является вводом, который является неявным и размещается первым R. Символ находится в диапазоне 0 ... 9, поэтому у нас есть все возможные вставленные цифры, и он помещается в L. Диапазон задается с помощью T, который неявно установлен на 10, который неявно рассматривается как [0 ... 9]. Позиция варьируется 0 ... 9, что достаточно, потому что вставка числа после 10-й позиции никогда не будет полезной. Дублирующие результаты в порядке. Диапазон помещается вторым Rи задается вторым T.

v: Вложенные литые строки в целые.

sM: Свести второй уровень списков, оставив нам список всех возможных чисел после вставки цифр для каждого из введенных чисел.

*F: Возьмите декартово произведение двух списков возможных чисел.

fqsT^;4: Фильтр по парам, чей продукт 10000. ;принимает значение 10здесь, Tкоторое используется в качестве переменной фильтра и ;всегда в качестве значения используемой переменной.


2

Japt , 30 29 25 23 байта

Принимает ввод как массив строк, выводит массив массивов строк.

£L²ôs f_à øX
rï k@L²aXx

Попытайся


объяснение

£L²ôs f_à øX
£                :Map each X
 L               :  100
  ²              :  Squared
   ô             :  Range [0,L²]
    s            :  Convert each to a string
      f_         :  Remove elements that return false
        à        :    All combinations of current element
          øX     :    Contains X?
rï k@L²aXx
r                :Reduce by
 ï               : Cartesian product
   k@            :Remove each X that returns true (not 0)
     L²          :  100 squared
      a          :  Absolute difference with
        Xx       :   X reduced by addition

2

Javascript (Node) - 183 136 123 байта

123 байта благодаря Shaggy

a=>b=>(o={},g=(s,h)=>[...s+0].map((y,x)=>{for(y=10;y--;)h(s.slice(0,x)+y+s.slice(x))}))(a,x=>g(b,y=>1e4-x-y?0:o[+x]=+y))&&o

136 байт благодаря Арно

e=(h,c,i=h.length+1,j)=>{for(;i--;)for(j=10;j--;)c(h.slice(0,i)+j+h.slice(i))}
f=(a,b,c=[])=>e(a,n=>e(b,m=>1E4-n-m||c.push([+n,+m])))||c

Старый код

Не горжусь этим, но решил, что я все равно отправлю. Создает функцию-прототип строки, похожую на map, которая занимает большую часть байтов. Функция просто перебирает обе перестановки и находит, когда 1000-ab равен 0. Принимает ввод в виде строк.

String.prototype.e=function(c){let h=this,L=h.length,i,j;for(i=0;i<=L;i++)for(j=0;j<=9;j++)c(h.slice(0,i)+j+h.slice(i,L));}
f=(a,b,c=[])=>a.e(n=>b.e(m=>1E4-n-m?c:c.push([+n,+m])))?c:c

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

Ungolfed

String.prototype.e=function(c) {
  let h=this,L=h.length,i,j;
  for(i=0;i<=L;i++)
    for(j=0;j<=9;j++)
      c(h.slice(0,i)+j+h.slice(i,L));
}
f=(a, b, c=[]) =>
  a.e(n =>
    b.e(m =>
      1E4-n-m ? c : c.push([+n,+m])
    )
  ) ? c : c

Вот несколько быстрых побед . Это в основном тот же код без «гольф-недружественных» заявления ( String.prototype, function, let, this) и с несколькими другими оптимизаций.
Арно

Оттуда вы можете сохранить еще 4 байта , используя map()вместо внешнего forцикла. Примечание: единственная причина, по которой мы используем jв качестве первого параметра функции обратного вызова, заключается в том, что мы хотим, чтобы она была определена в этой области.
Арно

@ Arnauld спасибо, я действительно ценю это, ты человек легенды. Опубликуйте свой ответ, я не хочу принимать ваш, я просто делаю это для развлечения.
Спит

1
Я не собираюсь отвечать на свой собственный вызов, и этот код является лишь вашей модификацией, поэтому не стесняйтесь использовать его. Не стоит беспокоиться!
Арно

Сбил предложения Арнаулда до 123 байтов
Лохматый

1

Желе , 23 байта

œcL’$$€ċ"⁹o⁼"Ạ
ȷ4ḶṚĖDçƇ

Монадическая ссылка, принимающая список списков цифр
(например, для 923 и 72 ввод [[9,2,3],[7,2]])

Попробуйте онлайн! (нижний колонтитул делает так, чтобы I / O представлял собой пару из двух целых чисел и [форматированный] список пар целых чисел)

Или посмотрите набор тестов .

Как?

Проверяет все пары «чисел» (списков цифр), которые составляют 10000 для достоверности, формируя все способы выбора n-1 цифр из этих «чисел», поддерживающих порядок; и сохраняет те, которые являются действительными (где валидность также позволяет тестируемому «числу» быть равным исходному «числу»).

œcL’$$€ċ"⁹o⁼"Ạ - Link 1, is piar valid?: pairToCheck, originalInputPair
      €        - for each list of digits in pairToCheck: e.g. [9,2,3]
     $         -   last two links as a monad:
    $          -     last two links as a monad:
  L            -       length                                 3
   ’           -       decremented                            2
œc             -     choices of that many items               [[9,2],[9,3],[2,3]]
         ⁹     - chain's right argument (originalInputPair)
        "      - zip with: (i.e. apply the following f(x,y) *respectively* across the results above and the originalInputPair)
       ċ       -   count occurrences
            "  - zip with (this time with an implicit right argument of originalInputPair)
           ⁼   -   equal (non-vectorising version)
          o    - locgical OR (vectorising version) i.e. we now have: [OR(isOneDigitLonger(item1),isEqual(item1)), OR(isOneDigitLonger(item2),isEqual(item2))]
             Ạ - all?

ȷ4ḶṚĖDçƇ - Main Link: list (pair) of lists of digits
ȷ4       - literal 10^4 -> 10000
  Ḷ      - lowered range -> [0,1,2,...,9998,9999]
   Ṛ     - reversed -> [9999,9998,...,2,1,0]
    Ė    - enumerate -> [[1,9999],[2,9998],...,[9998,2],[9999,1],[10000,0]] (N.B. last is redundant, but this does not matter)
     D   - to decimals -> [[[1],[9,9,9,9]],[[2],[9,9,9,8]],...,[[9,9,9,8],[2]],[[9,9,9,9],[1]],[[1,0,0,0,0],[0]]]
       Ƈ - filter keep those for which this is truthy:
      ç  -   call last link as a dyad (with a right argument of the pair of lists of digits)


1

Древесный уголь , 33 байта

ΦE×χφI⟦ι⁻×χφι⟧⌊Eι№E⊕LλΦλ⁻ξρ§⟦θη⟧μ

Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:

   χ                                10
    φ                               1000
  ×                                 Multiply
 E                                  Map over implicit range
       ι    ι                       Current value
        ⁻×χφ                        Subtract from 10000
      ⟦      ⟧                      Pair of values
     I                              Cast to string
Φ                                   Filter
                ι                   Current pair
               E                    Map
                     λ              Current value
                    L               Length
                   ⊕                Increment
                  E                 Map over implicit range
                       λ            Current value
                      Φ             Filter over characters
                         ξ          Range value
                          ρ         Character index
                        ⁻           Subtract
                            ⟦θη⟧    Original inputs as a list
                                μ   Index of current value
                           §        Get input at that index
                 №                  Count matching values
              ⌊                     Minimum
                                    Implicitly print each pair double-spaced

Если вы этого не поняли, он пробегает все пары значений, которые добавляют к 10000 (в виде строк), а затем подсчитывает, сколько раз каждый ввод совпадает с результатом удаления до 1 символа из соответствующего значения. Если минимальное количество не равно нулю, то оба входа совпадают, и это возможное решение.


1

Python 3, 165 160 153 125 117 байт

  • Сохранено 5 байтов благодаря предложению @JackBrounstein удалить setиз возвращаемого значения, поскольку выходные данные могут содержать дубликаты.
  • Сохранено 7 путем замены range(len(s))на range(5).
  • Сохранено 23 байта благодаря предложению @Eric Duminil заменить itertoolsвложенными списками (и удалить пробел).
  • Сохранено 8 благодаря предложению @Jo King о замене понимания вложенного списка одним оператором цикла и модуля.

Использование itertoolsи простая вспомогательная функция. Принимает строки в качестве входных данных, возвращает набор целых чисел в качестве выходных данных.

c=lambda s:[int(s[:i%5]+str(i//5)+s[i%5:])for i in range(50)]
lambda a,b:{(i,j)for i in c(a)for j in c(b)if i+j==1e4}

1
Поскольку выходные данные могут содержать дубликаты, вам не нужно вызывать setв последней строке -5 байт.
Джек Браунштейн

@JackBrounstein, спасибо. Я пропустил эту часть правил.
user2699

@EricDuminil, спасибо. Я не знал о заданном понимании, это хитрый трюк.
user2699


1
@ JoKing Clever. После всех этих предложений решение едва напоминает то, с чего я начал.
user2699

1

Рубин , 110 байт

Принимает строки в качестве входных данных, возвращает массив массивов целых чисел.

На основе версии Python . Для заданного целого числа Cсоздает массив чисел, который можно создать, добавив цифру.

Лямбда перебирает каждую возможную пару и выбирает ту, чья сумма равна 10000.

C=->n{(0..49).map{|i|([n[0...i%5],i/5,n[i%5..-1]]*'').to_i}}
->(a,b){C[a].product(C[b]).select{|i,j|i+j==1e4}}

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


1

05AB1E (наследие) , 36 байтов

0ìε.œʒg3‹}εU9ÝεXDgiìësý}}}˜}`âʒOT4mQ

Без сомнения, можно играть в гольф существенно. Особенно, вставляя цифры, в том числе начальные / конечные.

Попробуйте онлайн или проверьте все тестовые случаи ( êв нижнем колонтитуле Uniquify & Sort).

Объяснение:

0ì                            # Prepend a 0 before each of the input numbers
  ε                        }  # Map each to:
                            #  Take all possible partitions
     ʒg3‹}                    #  Only keep those of length 1 or 2
          ε              }    #  Map each partition to:
           U                  #   Pop and store the partition in variable `X`
            9Ý                #   List in the range [0, 9]
              ε         }     #   Map each of those digits to:
               X              #    Get the variable `X`
                Dgi           #    If it's a single number (length == 1):
                   ì          #     Prepend `X` before this digit
                  ë           #    Else (length == 2):
                   sý         #     Join both numbers in `X` with the current digit
                  }           #    Close the if-else
                          ˜   #   Flatten the list of lists
`                             # Now push both lists to the stack
 â                            # Create all possible pairs (cartesian product)
  ʒ                           # Filter this list of pairs by:
   O                          #  Take the sum of the two numbers
    T4m                       #  Push 10000 (10^4)
       Q                      #  And check if they are equal

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.