それらを合計して10,000にする


26

最近、PPCGに関する10,000件の質問のしきい値に達しました。やった!これを簡単なチャレンジで祝いましょう。

入力

二つの整数との両方に、その結果、。AB[1..9999]A+B<10000

仕事

あなたの仕事は、これらの整数の1つに1桁を追加するか、ように両方に1桁を追加することです。と両方に数字を追加する場合、必ずしも同じ数字である必要はありません。A+B=10000AB

新しい数字は、元の整数の先頭、末尾、または途中のどこにでも追加できます。ただし、先行ゼロを追加することはできません。

例:

以下のために、次の変換が有効です。A=923

192392739238

しかし、これらは無効です:

09231092394273

与えられたおよび、2つの解決策があります。A=923B=72

9238+762=100009273+727=10000

出力

すべての可能なソリューションのリストを印刷または出力する必要があります。

上記の例では、予想される出力はになります[[9238,762],[9273,727]]

ルール

  • I / Oは、合理的で明確な形式で処理できます。整数の代わりに、文字列、数字のリストなどを使用できます。
  • 入力には、少なくとも1つのソリューションがあることが保証されています。
  • 出力を重複排除しないでください。ただし、テストコードが、たとえば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-コメントのハンディキャップが大声で鳴っている:P)
エリックOutgolfer

1
ゼリーのソリューションが20バイトを超える場合、それは難しい課題です!
レジスポルタレス

output a list of all possible solutions残念だ。それは私のRunic言語にとっては難しいでしょう。おそらくソリューションを出力できるプログラムを書くことができまし
Draco18s

回答:


12

Haskell99 97 82 81バイト

Delfad0rのおかげで-16バイト(入力をリストとして取得し、重複排除する必要のない虐待を使用-> nは常に[0,4]になり、input-formatとの巧妙な組み合わせを使用ap)!

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

オンラインでお試しください!


実際に私は愚かなビットを感じている:奇妙な入力形式または最近のGHCのバージョンなしの81のバイト ...
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、のように2つの挿入が行われる場合があり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:Mr Xcoderのおかげでさらに2バイト保存vされました- デフォルトでベクトル化され、その下でL使用されるmため、範囲を超えるマッピングが暗示され、U不要なものも作成されます

編集3:;FryAmTheEggmanとissacgのおかげで、2バイトを節約するために10へのアクセスを保持する演算子のグローバルな使用が導入されました。

fq^T4sT*FmvMsmXLkdUThl

編集2:合計演算子が存在することを忘れていました、恥ずかしい...

編集1:以前のバージョンは入力として整数のリストを受け入れ、27バイトの文字列変換を手動で実行しました。

fq10000+FT*FmvMsmXLk`dUThl`

1
@KevinCruijssenそれは確かに、10は通常Tですが、関数ブロックでは変数は代わりに反復変数として機能するように再利用されます-フィルターブロックでは反復変数がたまたまなのでT、使用できません。この手段10 ^ 4になります^10 4ので、ノー短く、残念ながら5バイト長である、
ソック

1
@Sokあぁ そうTではUTのために、まだ10です[0,10)範囲。しかしf...TTはフィルタの反復変数になりました。説明をありがとう、それは理にかなっています!そして、T4^以前に実行して、変数に保存し、フィルターでその変数を使用することは、もちろん(少なくとも)5バイトです。
ケビンクルイッセン

2
あなたは置き換えることができ10000^;4
FryAmTheEggman

2
;常にグローバルコンテキスト(この場合は10)で反復変数の値を持ち^;4ます。
isaacg

1
20バイト:fq^;4sT*FmvsmXLkdThl。(Pythがゼリーを破った?oO Hooray
Mr. Xcoder

4

Perl 6、64バイト

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

オンラインでお試しください!

これは、数値が有効かどうかをチェックするために正規表現を使用したGBの回答の移植版です。移植してくれたnwellnhofに感謝します。

古い回答、127 110、88バイト

nwellnhofのおかげで-22バイト!

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

オンラインでお試しください!

2つの数字のリストを受け取り、数字のペアのリストを返す匿名コードブロック。

このソリューションでは、数字を挿入するのではなく、合計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


もう少しバイトを殺しましょう-アウターは必要ありません、担当者で十分です
-JayCe

私たちはこれにフォークを突き刺そうとしていると思います!
-ngm


2

ゼリー、30バイト

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

オンラインでお試しください!

Jellyには挿入がないため、ちょっと不器用です。

説明

                                   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

デモンストレーションテストスイート(テストスイートは、先行して重複排除されます{)。

入力は、2つの文字列のリストの形式です。

XLRRTT:LとRはネストされたマップを実行します。それらは3つあるので、X関数のネストされた3つのマップを実行します。この場合、X関数は文字列の指定された位置に文字を挿入します。

文字列は入力であり、暗黙的で、firstによって配置されRます。文字の範囲は0 ... 9であるため、挿入可能なすべての数字があり、によって配置されますL。範囲はによって指定されますT。これは暗黙的にに設定され10、暗黙的にとして扱われ[0 ... 9]ます。0 ... 910番目の位置の後に数字を挿入しても役に立たないため、位置の範囲はで十分です。重複した結果は問題ありません。範囲は2番目Rに配置され、2番目に指定されTます。

v:ネストされた文字列をintにキャストします。

sM:リストの第2レベルを平坦化し、入力番号ごとに、数字の挿入後に可能なすべての番号のリストを残します。

*F:2つの可能な数のリストのデカルト積を取ります。

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バイト

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

Arnauldのおかげで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

オンラインでお試しください!

非ゴルフ

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)およびその他のいくつかの最適化を。
アーナルド

そこから、外側のループの代わりにを使用して、さらに4バイトを節約できます。注意:コールバック関数の最初のパラメーターとして使用する唯一の理由は、このスコープで定義することです。map()forj
アーナウルド

@Arnauldありがとう、本当に感謝しています、あなたは伝説の男です。あなたの答えを投稿してください、私はあなたのものを取りたくありません、私はただ楽しみのためにそれをしています。
-Asleepace

1
私は自分の挑戦に答えるつもりはありません。このコードはあなたのコードを修正したものです。心配ない!
アーナウルド

@Arnauldの提案を123バイト
Shaggy

1

ゼリー、23 バイト

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

数字のリストのリストを受け入れるモナドリンク
(たとえば、923と72の例では、入力は[[9,2,3],[7,2]]

オンラインでお試しください!(フッターは、I / Oが2つの整数のペアであり、整数のペアの[フォーマット済み]リストであるようにします)

または、テストスイートを参照してください。

どうやって?

順序を維持する「番号」から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バイト

  • set出力に重複が含まれる可能性があるため、戻り値から削除する@JackBrounsteinの提案のおかげで5バイト節約されました。
  • を7に置き換えrange(len(s))て保存しましたrange(5)
  • @Eric Duminil itertoolsがネストされたリスト内包表記に置き換える(およびスペースを削除する)提案をして、23バイト節約しました。
  • ネストされたリストの内包表記を単一のループ演算子とモジュラス演算子に置き換えるという@Jo Kingの提案のおかげで8を節約できました。

使用itertoolsし、シンプルなヘルパー関数。 入力として文字列を受け入れ、出力としてintのセットを返します。

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

Ruby、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&ソートすることです)。

説明:

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.