算術合計の欠損値


14

チャレンジ

有効な算術和にいくつかの欠損値を与えて、完全な式を出力します。

例:

    1#3                 123
+   45#     =>     +    456
--------            --------
    579                 579

入力

  • 式の形式は、配列["1#3", "45#", "579"]、文字列"1#3+45#=579"、または3つの入力にすることができますf("1#3","45#","579")

出力

  • 入力と同じ
  • 結果を出力する必要はありません

ノート

  • 不足している数字は、次を使用して表されます。 #またはその他の定数以外の定数ます
  • 結果に欠けている番号がないと仮定する
  • 入出力が2つの用語で構成され、最終結果であると仮定する
  • 用語> 0および結果> = 2の両方を想定
  • 複数の解決策があるかもしれません。合計結果が一致する限り、誰でも出力できます

出力の可能性があるテストケース(きれいな形式)

    #79                     879
+   44#         =>      +   444
--------                --------
    1323                   1323

    5#5                     555
+   3#3         =>      +   343
--------                --------
    898                     898

      #                       1
+     #         =>      +     1
--------                --------
      2                       2

    ###                     998
+   ###         =>      +     1     PD: there are a lot of possible outputs for this one
--------                --------
    999                     999


    123                     123
+     #         =>      +     1
--------                --------
    124                     124


      9                       9
+    #6         =>      +    46
--------                --------
     55                      55


    #123651                     1123651
+      #98#         =>      +      7981
------------                -----------
    1131632                     1131632

標準の規則が適用されます


先行ゼロを取り除く必要がありますか?

@ニーモニックは必ずしも
ルイス・フェリペ・デ・イエス・ムニョス

辺を=入れ替えて入力を取得できますか?例579=1#3+45#
dzaima

2
「両方の用語> 0を仮定する」とは、両方の用語> 0 を出力しなければならないこと、または両方が> 0であるが常に出力するソリューションがあると仮定できることを意味する
dzaima

1
また、追加されたテストケースは、私が求めていたものを正確に回避します-先行ゼロ
-dzaima

回答:


9

Brachylog22 16バイト

{Ṣ∧Ị∋|}ᵐ²ịᵐ.k+~t

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

@Fatelizeのおかげで-6バイト

説明

{Ṣ∧Ị∋|}ᵐ²ịᵐ.k+~t
{     }ᵐ²                   #   for each letter in each string
 Ṣ∧Ị∋                       #       if " " return a digit; else input
     |                      #
         ịᵐ                 #   cast each string to number
            k+              #   the sum of all but the last one
              ~t            #       is equal to the last one
           .                #   output that list

1
{"#"∧Ị∋|}ᵐ²ịᵐ.k+~t4バイト短くなります。マップでこの複雑な操作を行った理由がわかりません。
18

数字以外の文字を使用できるため、たとえばスペースを使用する必要"#"あります。代わりにスペースを使用すると、さらに2バイト節約できます。
18

8

JavaScript(ES6)、 74 57バイト

入力をとして受け取ります(a)(b)(result)。ここab.不明な数字の文字列で、結果は整数です。2つの整数の配列を返します。

a=>b=>F=(c,n)=>`${r=[c,n]}`.match(`^`+[a,b])?r:F(c-1,-~n)

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

コメント済み

a => b =>                // a, b = term patterns (e.g. a = ".79", b = "44.")
  F = (c,                // c = expected result (e.g. 1323)
          n) =>          // n = guessed value of b, initially undefined
    `${r = [c, n]}`      // we coerce r = [c, n] to a string (e.g. "879,444")
                         // if n is still undefined, this gives just c followed by a comma
    .match(`^` + [a, b]) // we coerce [a, b] to a string, prefixed with "^" (e.g. "^.79,44.")
    ?                    // this is implicitly turned into a regular expression; if matching:
      r                  //   return r
    :                    // else:
      F(c - 1, -~n)      //   decrement c, increment n and do a recursive call

ああ、それが今起こっていることです。昨日説明なしであなたのコードを理解しようとしました(そして私はJSが苦手です)が、なぜそれ-~nができなかったのn+1か、そしてどのようF=(c,n)=>に使用されたのかを理解しませんでした。説明を追加したので、それはすべて理にかなっています。c第三の入力であり、n不定(とされている~undefinedになる-1とは異なりundefined+1)。すべてが明確になりました(残念ながらJavaに移植できるものではありません。これが主にxDを理解しようとした理由です)。PS:すでに私はちょうどあなたの他の答えの1 upvotedので、昨日upvoted(私は、まだupvoteできない多くのことをしませんでした。); P
ケビンCruijssen

@KevinCruijssen FWIW、私は数回前にこれについてのヒントを書きまし。しかし、ええ...それはJSのものであり、おそらく他の多くの言語に移植できません。
アーナウルド

まあ、私はそれを半移植できるかもしれませんが、再帰的な2番目のメソッドを作成し、確認するために三項ifを使用してnull、手動でそれをに変換し-1ます。ただし、Javaには(非常に)限られた再帰的なStackOverflowの制限があるため、Javaで約1024回の再帰呼び出し内で正しい結果が得られることを期待してランダムな再帰的メソッドを使用しても、Javaでは機能しません。まぁ。あなたのヒントを支持しました。良い週末を!:)
ケビンクルーッセン

@KevinCruijssen私の最初のJSの試みは、それを正確に行うことでした:再帰関数でランダムな値を試すこと。そして、通常はカウンターを使用するよりも大幅に少ない反復を実行していました。楽しい事実:でも###+###=999、オッズは1000分の1です。したがって、1024回の反復では、失敗するよりも少し頻繁に成功するはずです。:)
アーナウド

7

MATLAB、143の 134 132 119 115バイト

function[m]=f(x,y,r),p=@(v)str2num(strrep(v,'#',char(randi([48,57]))));m=[1,1];while sum(m)-r,m=[p(x),p(y)];end;end

@Luismendoのおかげで-4バイト

オンラインで試す


かなり大きくてかなり愚かです。#正しい数字が見つかるまで、すべてをランダムな数字に置き換えるだけです。


5

R67 51バイト

シンプルなロックと恐ろしいスケール、すべての合計の組み合わせをgrepします。使用する "。" 不明な数字の場合。テストケース番号4と同じ答えは見つかりませんが与えられたルールの手紙を以下の可能性の答えを、。

出力を形成pasteし、?演算子に置き換えた後、grepして-16バイト。

function(x,y,z,`?`=paste)grep(x?y,1:z?z:1-1,v=T)[1]

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


1
素晴らしいアイデア、私はそれを考えたことがなかったでしょう。greplの代わりに*を使用すると、数バイトを保存できます:tio.run
##

1
私はさまざまなオペレーターを探していましたが、あなたが思いついたのは?...これが最初だと思います。ところで、私はあなたに既に言ったかどうか忘れていましたが、私たちはRを今月の9月の言語にノミネートしようとしています-まだ行われていない場合は投票できます。
JayCe

優先順位の低いものを選択できました。試合をするためのより良い方法があるはずだと感じています
...-J.Doe

3

、32バイト

F²⊞υ0W⁻ζΣIυ≔E⟦θη⟧⭆κ⎇⁼μ#‽χμυ←Eυ⮌ι

オンラインでお試しください!リンクは、コードの詳細バージョンです。説明:

F²⊞υ0

whileループを実行0するには、2つの文字列を事前定義された空のリストuにプッシュします。

W⁻ζΣIυ

uを整数にキャストする合計が目的の結果と等しくないときに繰り返します。

≔E⟦θη⟧

2つの入力の配列を作成し、その上にマッピングします。

⭆κ⎇⁼μ#‽χμυ

それぞれ#をランダムな数字に置き換えて、結果をに割り当てuます。

←Eυ⮌ι

結果を右揃えで出力します。(左揃えはυ4バイトの節約になります。)



3

05AB1E(レガシー)、23 20 バイト

[²³«εð9ÝΩ:}²gôJDO¹Q#

@Emignaのおかげで-3バイト。

不明な数字はスペース( )です。入力順序は次のとおりです。期待される結果。最長の文字列。最短の文字列。

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

説明:

[                 # Start an infinite loop
 ²³«              #  Take the second and third inputs, and merge them together
               #   i.e. " 79" and " 4 " → " 79 4 "
    ε     }    #  Map each character to:
     ð   :     #   Replace a space with:
      9ÝΩ      #   A random digit in the range [0,9]
               #    i.e. " 79 4 " → ['3','7','9','2','4','3']
               #    i.e. " 79 4 " → ['5','7','9','7','4','4']
²g             #  Get the length of the second input
               #   i.e. " 79" → 3
  ô            #  And split it into two numbers again
               #   i.e. ['3','7','9','2','4','3'] and 3 → [['3','7','9'],['2','4','3']]
               #   i.e. ['5','7','9','7','4','4'] and 3 → [['5','7','9'],['7','4','4']]
   J           #  Join each list together to a single number
               #   i.e. [['3','7','9'],['2','4','3']] → [379,243]
               #   i.e. [['5','7','9'],['7','4','4']] → [579,744]
    D          #  Duplicate this list
     O         #  Sum the list
               #   i.e. [379,243] → 622
               #   i.e. [579,744] → 1323
      ¹Q#      #  If it's equal to the first input: stop the infinite loop
               #  (and output the duplicate list implicitly)
               #   i.e. 1323 and 622 → 0 (falsey) → continue the loop
               #   i.e. 1323 and 1323 → 1 (truthy) → stop the loop and output [579,744]

1
置換はifよりも3を節約します。
エミグナ

@Emigna Ah、もちろん。ありがとう!
ケビンCruijssen

3

Perl 6の81の 74バイト

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

{first {try S/\=/==/.EVAL},map {$^a;S:g[\#]=$a[$++]},[X] ^10 xx.comb('#')}

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

「12#+ 45#= 579」などの算術式を含む文字列として入力を受け取る匿名コードブロック。それぞれ#を数字の可能な順列で置き換え、=with で置き換えて==、最初の有効な結果を見つけます。

説明:

{  # Anonymous code block                                                      }
 first   # Find the first of:
                                                               ^10  # The range of 0 to 9
                                                                   xx.comb('#') # Multiplied by the number #s in the code
                                                          ,[X]  # The cross-product of these lists
                          map   # Map each crossproduct to:
                              {$^a;.trans: "#"=>{$a[$++]}}  # The given string with each # translated to each element in the list
      {try S/\=/==/.EVAL}, # Find which of these is true when = are changed to == and it is eval'd

あなたは使用することができるS:g[\#]=$a[$++]代わりのtransために74バイト
-nwellnhof

@nwellnhofあなたがS///そのような構文で使用できるとは思いませんでした!ありがとう!
ジョーキング


2

ジャワ10、203の 198 193バイト

(a,b,c)->{int A=0,B=0,l=a.length();for(a+=b,b="";A+B!=c;A=c.valueOf(b.substring(0,l)),B=c.valueOf(b.substring(l)),b="")for(var t:a.getBytes())b+=t<36?(t*=Math.random())%10:t-48;return A+"+"+B;}

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

説明:

(a,b,c)->{           // Method with 2 Strings & integer parameters and String return-type
  int A=0,B=0,       //  Result-integers, starting both at 0
      l=a.length();  //  Length of the first String-input
  for(a+=b,          //  Concat the second String-input to the first
      b="";          //  Reuse `b`, and start it as an empty String
      A+B!=c         //  Loop as long as `A+B` isn't equal to the integer-input
      ;              //    After every iteration:
       A=c.valueOf(b.substring(0,l)),
                     //     Set `A` to the first String-part as integer
       B=c.valueOf(n.substring(l)),
                     //     Set `B` to the second String-part as integer
       b="")         //     Reset `b` to an empty String
    for(var t:a.getBytes())
                     //   Inner loop over the characters of the concatted String inputs
      b+=t<36?       //    If the current character is a '#':
          (t*=Math.random())%10
                     //     Append a random digit to `b`
         :           //    Else (it already is a digit):
          t-48;      //     Append this digit to `b`
  return A+"+"+B;}   //  After the loop, return `A` and `B` as result

2

C(gcc)228 213 203 172 170バイト

@ceilingcatのおかげで-15バイト。私はindex前に使用したことがありません。

@Logemのおかげで-10バイト。プリプロセッサの魔法

exit(0)パラメータとしてputsを使用するリファクタリングされた呼び出し。

char*c,*p[9],k;main(i,v)int**v;{for(i=X[1],35))||X[2],35))?p[k++]=c,main(*c=57,v):k;!c*i--;)47==--*p[i]?*p[i]=57:Y[1])+Y[2])^Y[3])?main(i,v):exit(puts(v[2],puts(v[1])));}

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



私の最後のコメント-DX=c=index(v-DX=(c=index(v、マクロをTIOリンクに置き換えて、2バイト保存できます。
ローガン

みんなありがとう。私もこれまでゴルフをしようとしたことがないようです
...-cleblanc

1

C#.NET、225の 220 196バイト

(a,b,c)=>{int A=0,B=0,l=a.Length;for(a+=b,b="";A+B!=c;A=int.Parse(b.Substring(0,l)),B=int.Parse(b.Substring(l)),b="")foreach(var t in a)b+=(t<36?new System.Random().Next(10):t-48)+"";return(A,B);}

私のJava 10回答の移植版。
(私はC#.NETゴルフで非常にさびているので、間違いなくゴルフをすることができます。.)

@ user82593彼が追加したこの新しいC#ヒントのおかげで、暗黙的に-3バイトになりました@hvdの
おかげで-29バイト

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

説明:

(a,b,c)=>{        // Method with 2 string & int parameters and int-tuple return-type
  int A=0,B=0,    //  Result-integers, starting both at 0
      l=a.Length; //  Length of the first string-input
  for(a+=b,       //  Concat the second string-input to the first
      b="";       //  Reuse `b`, and start it as an empty string
      A+B!=c      //  Loop as long as `A+B` isn't equal to the integer-input
      ;           //    After every iteration:
       A=int.Parse(b.Substring(0,l)),
                  //     Set `A` to the first string-part as integer
       B=int.Parse(b.Substring(l)),
                  //     Set `B` to the second string-part as integer
       b="")      //     Reset `b` to an empty string
    foreach(var t in a)
                  //   Inner loop over the characters of the concatted string inputs
      b+=(t<36?   //    If the current character is a '#':
           new System.Random().Next(10)
                  //     Use a random digit
          :       //    Else (it already is a digit):
           t-48)  //     Use this digit as is
         +"";     //    And convert it to a string so it can be appended to the string
  return(A,B);}   //  After the loop, return `A` and `B` in a tuple as result

using System;代わりに通常のものを使用できますnamespace System{}
-hvd

@hvdそれだけでしたusing System.*;.*部品を削除しなければならなかったことを忘れました。-5バイトありがとう。
ケビンクルーイッセン

1
今それを再読すると、それは実際には次善の提案でした。書き込みint.Parse(-4)、使用new System.Random()(+7)、ドロップusing System;(-13)で、さらに10バイト節約できます。:)また、必要はありません.ToCharArray()、それはさらに14バイトを取ります。
hvd

@hvdありがとう!わからない私は忘れてどのようにint.ParseSystem.Int32.Parse...それは基本的に同じだSystem.Stringstring...そして、それはせずに、文字の上にループすることが可能であった知っていませんでした.ToCharArray()。別の-24バイトをありがとう。:D
ケビンクルーッセン

1

Pythonの3121の 155 152 149バイト

import re
def f(i,k=0,S=re.sub):s=S('#','%s',i)%(*list('%0*d'%(i.count('#'),k)),);print(s)if eval(S('=','==',S('\\b0*([1-9])','\\1',s)))else f(i,k+1)

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

+34 Pythonが先行ゼロ付きの数値をサポートしないという事実を回避するための正規表現を使用した新しいソリューション。

-3 @Jonathan Frechに感謝


#が数字の最初の文字である場合(evalは先行ゼロを受け入れないため)、古いソリューションは機能せず、したがって無効です:(

def f(i,k=0):
 s=i.replace('#','%s')%(*list('%0*d'%(i.count('#'),k)),)
 print(s)if eval(s.replace('=','=='))else f(i,k+1)

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


1
この投稿は投稿に記載されている理由により無効であると思われます。
エリックアウトゴルファー

2
関数には複合ステートメントが含まれていないため、1行のみに要約できます。
ジョナサンフレッチ

0

PHP、112バイト

ラメブルートフォースソリューション

for(;$s=$argn;eval(strtr($s,['='=>'==','#'=>0]).'&&die($s);'))for($k=$n++;$k;$k=$k/10|0)$s[strpos($s,35)]=$k%10;

入力として文字列を受け取り、最初のソリューションで停止します。でパイプとして実行する-nR、オンラインで試してください


0

Powershell、91バイト

スクリプトはすべてのソリューションを見つけます。反復の合計数は、文字数の10乗#です。再帰の深さは文字数に等しくなり#ます。

filter f{$h,$t=$_-split'#',2
if($t){0..9|%{"$h$_$t"}|f}elseif($h-replace'=','-eq'|iex){$h}}

テストスクリプト:

filter f{$h,$t=$_-split'#',2
if($t){0..9|%{"$h$_$t"}|f}elseif($h-replace'=','-eq'|iex){$h}}

@(
    ,('1#3+45#=579','123+456=579')
    ,('#79+44#=1323','879+444=1323')
    ,('5#5+3#3=898','505+393=898 515+383=898 525+373=898 535+363=898 545+353=898 555+343=898 565+333=898 575+323=898 585+313=898 595+303=898')
    ,('#+#=2','0+2=2 1+1=2 2+0=2')
    ,('9+#6=55','9+46=55')
    ,('123+##=124','123+01=124')
    ,('#123651+#98#=1131632','1123651+7981=1131632')
    ,('##+##=2','00+02=2 01+01=2 02+00=2')
    ,('##+##=99','00+99=99 01+98=99 02+97=99 03+96=99 04+95=99 05+94=99 06+93=99 07+92=99 08+91=99 09+90=99 10+89=99 11+88=99 12+87=99 13+86=99 14+85=99 15+84=99 16+83=99 17+82=99 18+81=99 19+80=99 20+79=99 21+78=99 22+77=99 23+76=99 24+75=99 25+74=99 26+73=99 27+72=99 28+71=99 29+70=99 30+69=99 31+68=99 32+67=99 33+66=99 34+65=99 35+64=99 36+63=99 37+62=99 38+61=99 39+60=99 40+59=99 41+58=99 42+57=99 43+56=99 44+55=99 45+54=99 46+53=99 47+52=99 48+51=99 49+50=99 50+49=99 51+48=99 52+47=99 53+46=99 54+45=99 55+44=99 56+43=99 57+42=99 58+41=99 59+40=99 60+39=99 61+38=99 62+37=99 63+36=99 64+35=99 65+34=99 66+33=99 67+32=99 68+31=99 69+30=99 70+29=99 71+28=99 72+27=99 73+26=99 74+25=99 75+24=99 76+23=99 77+22=99 78+21=99 79+20=99 80+19=99 81+18=99 82+17=99 83+16=99 84+15=99 85+14=99 86+13=99 87+12=99 88+11=99 89+10=99 90+09=99 91+08=99 92+07=99 93+06=99 94+05=99 95+04=99 96+03=99 97+02=99 98+01=99 99+00=99')
) | % {
    $s,$e = $_
    $r = $s|f
    "$($e-eq$r): $r"
}

Powershell、「両方の用語> 0と仮定する」は必須、110バイト

filter f{$h,$t=$_-split'#',2
if($t){0..9|%{"$h$_$t"}|f}else{$a,$b,$c=$_-split'\D'
$_|?{+$a*+$b*!(+$a+$b-$c)}}}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.