使它们总计为10,000


26

最近,我们在PPCG上已达到10,000个问题的门槛。万岁!让我们用一个简单的挑战来庆祝这一点。

输入项

两个整数和都在,因此。AB[1..9999]A+B<10000

任务

您的任务是将一个数字加到这些整数之一,或者将一个数字加到两个整数,使得。如果将数字添加到和,则不必一定是相同的数字。A+B=10000AB

可以在原始整数的开头,结尾或中间的任意位置添加新数字。但是,您不能添加前导零。

例:

对于,以下转换有效:A=923

192392739238

但是这些是无效的

09231092394273

给定和,有两种可能的解决方案:A=923B=72

9238+762=100009273+727=10000

输出量

您必须打印或输出所有可能解决方案的列表。

对于上述示例,预期输出为[[9238,762],[9273,727]]

规则

  • I / O可以以任何合理,明确的格式进行处理。您可以使用字符串,数字列表等代替整数。
  • 保证输入至少有一个解决方案。
  • 不允许您对输出进行重复数据删除。但是,如果测试代码通过某些后期处理(例如在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
Arnauld

1
@Arnauld他没有说他是司机。;-)(P严重的注意:4题外话评论到目前为止,我对那些目的3注释差点大声发出蜂鸣声。)
埃里克Outgolfer

1
当果冻解决方案占用20多个字节时,这将是一个艰巨的挑战!
Regis Portalez '18

output a list of all possible solutions真可惜 这对于我的符文语言来说很难。我大概可以写一个程序,可以输出一个解决方案!
Draco18s

Answers:



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<-dpaste调用内进行内联分配,这是我们无法用除之外的任何其他运算符来完成的?,因为它的优先级低于<-

现在,正如@JoKing所指出的那样,在某些情况下900 10可能会发生两次插入,例如9100 8100。因此,我们过滤掉其中两个字符中的字符数增加了1个以上的匹配项。实现此目的的快捷方法是绑定到的Levenshtein编辑距离adist+


感谢您的检查!我现在过滤掉每个数字有多个插入的匹配项。
J.Doe

7

Pyth,28 27 25 24 22 20字节

fq^;4sT*FmvsmXLkdThl

在线试用这里,或验证所有的测试用例这里 -测试套件前面加上一个重复数据删除的结果{

输入是字符串列表。

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:多亏了Xcoder先生,又节省了2个字节- v默认情况下矢量化并在其下L使用m,因此隐含了跨范围的映射,也使U不必要

编辑3:;由于FryAmTheEggman和issacg,引入了对运算符的全局使用以保留对10的访问权以节省2个字节:

fq^T4sT*FmvMsmXLkdUThl

编辑2:我忘记了求和运算符的存在,多么令人尴尬...

编辑1:先前版本接受整数列表作为输入,手动执行字符串转换,共27个字节:

fq10000+FT*FmvMsmXLk`dUThl`

1
@KevinCruijssen实际上确实是10 T,但是在功能块中,变量被重新指定为充当迭代变量-在过滤器块中,迭代变量恰好是T,因此不能使用。这意味着10 ^ 4它将是^10 4,这是5个字节长,因此不幸的是没有缩短
Sok Sok

1
@好啊好。因此,对于该范围,Tin UT仍为10 [0,10)。但是,f...TT已成为过滤器的迭代变量。感谢您的解释,这很有道理!并做得T4^更早,将其保存在变量中,并在过滤器中使用该变量也是(至少)5个字节。
凯文·克鲁伊森

2
您可以替换10000^;4
FryAmTheEggman

2
;在全局上下文中,总是具有迭代变量的值,在本例中为10。因此^;4,您正在寻找什么。
isaacg '18

1
20个字节:fq^;4sT*FmvsmXLkdThl。(Pyth跳动果冻OO万岁?
Xcoder先生

4

Perl 6、64字节

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

在线尝试!

这是GB使用正则表达式检查数字是否有效的答案。感谢nwellnhof移植它。

旧答案,127110,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

R179161150144字节

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}

在线尝试!

@JayCe和@Giuseppe保存了35个字节。

说明

辅助函数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!

我注意到这实际上与Pyth答案是相同的逻辑。



@JayCe保存超过10个字节!允许在质询代码之外进行重复数据删除。
ngm


让我们杀死更多的字节-不需要外部字节,rep就足够了
JayCe

我想我们快要把叉子塞进去了!
ngm

3

红宝石93 91字节

->a,b{(1..r=10000).map{|x|/^(.*)(.*:)\1.?\2(.*)(.*):\3.?\4$/=~[a,x,b,y=r-x]*?:&&[x,y]}-[p]}

在线尝试!

尝试每个最大为10000的数字,并使用正则表达式检查数字是否匹配。


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

演示测试套件(测试套件已与Lead重复数据删除{)。

输入采用两个字符串列表的形式。

XLRRTT:L和R执行嵌套映射。由于其中有3个,我们将执行该X函数的三重嵌套映射。在这种情况下,该X函数将在指定位置的字符插入字符串。

字符串是输入,它是隐式的,并由first放置R。字符范围超过0 ... 9,因此我们有所有可能的插入数字,并由放置L。范围由给出T,隐式设置为10,隐式视为[0 ... 9]。位置的范围是over 0 ... 9,这是足够的,因为在第10个位置之后插入数字永远不会有用。重复结果很好。范围以秒为单位R,并以秒为单位T

v:将强制转换的字符串嵌套为int。

sM:展平第二级列表,在数字插入后为我们提供每个输入数字的所有可能数字的列表。

*F:取两个可能数字列表的笛卡尔乘积。

fqsT^;4:过滤产品为的对10000;接受10此处的值,将其T用作过滤器变量,并且;始终将其用作所使用的变量的值。


2

Japt30 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(节点) - 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字节归功于Arnauld

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

旧密码

对此不感到骄傲,但我还是想提交。创建类似于映射的字符串原型函数,该函数将占用大量字节。函数仅遍历两个排列,然后查找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

在线尝试!

不打高尔夫球

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.prototypefunctionletthis),并与其他一些优化。
Arnauld

从那里,您可以通过使用a 而不是外部循环来再保存4个字节。注意:我们用作回调函数的第一个参数的唯一原因是我们希望在此范围内对其进行定义。map()forj
Arnauld

@Arnauld非常感谢,您是一位传奇人物。发表您的答案,我不想接受您的答案,我只是为了好玩而已。
Asleepace

1
我不会回答自己的挑战,此代码只是您的修改,因此随时可以使用它。别担心!
Arnauld

将@Arnauld的建议压缩到123个字节
Shaggy

1

果冻,23 个字节

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

接受数字列表的单子链接
(例如,对于923和72的输入为[[9,2,3],[7,2]]

在线尝试!(页脚使得I / O是一对两个整数对和一个[格式化]整数对列表)

或查看测试套件

怎么样?

通过形成所有从这些“数字”保持顺序中选择n-1个数字的方式,检查总计为10000的所有“数字”对(数字列表)是否有效;并保留有效的密码(此处的有效性还允许被测“数字”等于原始“数字”)。

œ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字节

  • 由于@JackBrounstein建议set从返回值中删除,因此节省了5个字节,因为输出可以包含重复项。
  • 替换为range(len(s)),保存了7 range(5)
  • 由于@Eric Duminil的建议将其替换itertools为嵌套列表推导(并删除了空格),因此节省了23个字节。
  • 由于@Jo King的建议用单个循环和模运算符代替嵌套列表推导,因此节省了8。

使用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聪明。在提出所有这些建议之后,该解决方案与我刚开始时的解决方案几乎不相似。
user2699

1

红宝石,110字节

接受字符串作为输入,返回整数数组。

基于python版本。对于给定的整数,C创建一个数字数组,可以通过添加数字来创建数字数组。

Lambda遍历每对可能的对,并选择总和为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

毫无疑问可以充分打高尔夫球。特别是插入数字,包括前/后数字。

在线尝试验证所有测试用例ê在页脚中为“统一和排序”)。

说明:

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

0

果冻,25个字节

LŻœṖ€z⁶ZjþØDVẎṢḊ)p/S⁼ȷ4ƊƇ

在线尝试!

不是这里最短的果冻解决方案,但也许有人可以打高尔夫球吗?我很沮丧

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.