산술 합계에서 누락 된 숫자


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

표준 규칙이 적용됩니다


선행 0을 제거해야합니까?

@Mnemonic은 아닙니다
Luis felipe De jesus Munoz

측면을 =바꿔서 입력을받을 수 있습니까? 예 :579=1#3+45#
dzaima

2
"두 용어를 모두> 0으로 가정"은 두 용어를 모두> 0으로 출력 해야 하거나 항상> 0을 가진 솔루션이 있다고 가정 할 수 있지만 무엇을 출력한다고 가정 할 수 있습니까?
dzaima

1
또한 추가 된 테스트 케이스는 내가 요구했던 것을 정확하게 피합니다-최고의 제로
dzaima

답변:


9

Brachylog , 22 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 바이트 더 짧습니다. 왜 당신이지도에서이 복잡한 일을했는지 ​​모르겠습니다.
페이탈 라이즈

숫자가 아닌 문자를 사용할 수 있으므로 예를 들어 공백을 사용 "#"하는 대신 2 바이트를 더 절약 할 수 있습니다.
페이탈 라이즈

8

자바 스크립트 (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 : 이미 난 그냥 다른 답변 중 하나 upvoted 그래서 어제 upvoted (나는 이미 upvote에 사용할 수없는 많이하지 않았다 ..); P
케빈 Cruijssen

@KevinCruijssen FWIW, 나는 몇 번 전에 이것에 대한 팁을 썼습니다 . 그러나 그렇습니다 ... JS 일 것이고 다른 많은 언어로 이식 할 수 없을 것입니다.
Arnauld

글쎄, 나는 반 포트 할 수 있지만 재귀 적 두 번째 방법을 만들고 삼항-if를 사용하여를 확인하고 null수동으로 변환합니다 -1. 그러나 Java에는 (매우) 제한된 재귀 StackOverflow 제한이 있으므로 임의성이있는 재귀 메서드를 사용하면 Java에서 약 1024 개의 재귀 호출이 올바르게 작동하지 않을 것으로 기대합니다. 아 잘 나는 당신의 팁을 upvoted했습니다. 좋은 주말 되세요! :)
Kevin Cruijssen

@KevinCruijssen 내 첫 번째 JS 시도는 정확하게 수행하는 것입니다. 재귀 함수로 임의의 값을 시도하십시오. 그리고 일반적으로 카운터를 사용하는 것보다 훨씬 적은 반복을 수행했습니다. 재미있는 사실 :조차도 ###+###=999확률은 1000 분의 1입니다. 따라서 1024 번 반복하면 실패보다 약간 더 자주 성공해야합니다. :)
Arnauld

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

R , 67 51 바이트

간결하고 간단하게 스케일을 조정하고 모든 합계 조합을 잡으십시오. 사용하다 "." 알 수없는 숫자. 이 테스트 케이스 번호 4와 같은 답을 찾을 수 없을 것이다, 그러나 그것은 줄 것이다 주어진 규칙의 편지를 다음 가능한 답을.

출력을 형성 paste하고 ?작업자로 교체 한 후 접지하여 -16 바이트 .

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

온라인으로 사용해보십시오!


1
굉장한 생각입니다. grepl 대신 *를 사용하여 몇 바이트를 절약 할 수 있습니다. tio.run/##PYzLCoMwEEX3/…
JayCe

1
나는 다양한 연산자를 찾고 있었고 당신은 생각해 냈습니다 ?... 이것이 처음이라고 생각합니다. 그건 그렇고, 내가 이미 당신에게 말했지만 잊어 버렸지 만 우리는 9 월 언어로 R을 지명 하려고 노력하고 있습니다.
JayCe

우선 순위가 낮은 것을 선택할 수있었습니다. 더 좋은 방법은 경기를 얻는 것 같은 느낌이 ...
J.Doe

3

, 32 바이트

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

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 설명:

F²⊞υ0

while 루프가 진행 0되도록 두 개의 문자열 을 사전 정의 된 빈 목록 u으로 푸시하십시오 .

W⁻ζΣIυ

u을 정수 로 캐스트하는 합계가 원하는 결과와 같지 않은 동안 반복하십시오 .

≔E⟦θη⟧

두 입력의 배열을 작성하고 그 위에 맵핑하십시오.

⭆κ⎇⁼μ#‽χμυ

각각 #을 임의의 숫자로 바꾸고 결과를에 다시 할당하십시오 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

물론 @Emigna Ah. 감사!
Kevin Cruijssen

3

펄 6 , 81 74 바이트

nwellnhof 덕분에 -7 바이트!

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

온라인으로 사용해보십시오!

"12 # + 45 # = 579"와 같은 산술 표현식이 포함 된 문자열로 입력을받는 익명 코드 블록입니다. #가능한 숫자 순열로 각각 대체하고 =로 대체 ==하고 첫 번째 유효한 결과를 찾습니다.

설명:

{  # 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 바이트를 저장할 수 있습니다 .
Logern

고마워 내가 전에도 골프를 시도했던 것처럼 보이지 않습니다 ...
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 골프에서 매우 녹슨 상태이므로 확실히 골프를 칠 수 있습니다 ..)

-3 암시 감사 바이트 @ user82593그가 추가 된 새로운 C #을 끝 . @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 그게 다야! .. 몇 년 동안 C #을 해본 적이 없다. lol .. using System.*;Java의 수입품과 비슷하게 시도했지만 작동하지 않았다. .*부품 을 제거해야한다는 것을 잊었습니다 . -5 바이트를 주셔서 감사합니다.
Kevin Cruijssen

1
지금 그것을 다시 읽으면, 그것은 실제로 최적이 아닌 제안이었습니다. int.Parse(-4)를 쓰고 , new System.Random()(+7)을 사용하고 using System;(-13)을 사용하여 10 바이트를 더 절약 할 수 있습니다. :) 또한 .ToCharArray()14 바이트를 더 필요로하지 않습니다 .
hvd

감사합니다! 확실하지 내가 잊었 어떻게 int.ParseSystem.Int32.Parse그것은으로 기본적으로 동일합니다 ... System.String그리고 string.. 그리고이없는 문자를 반복 할 수 있었다 알고하지 않았다 .ToCharArray(). -24 바이트 더 감사합니다. : D
Kevin Cruijssen

1

파이썬 (3) , 121 (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 파이썬은 파이썬이 선행 0을 가진 숫자를 지원하지 않는다는 사실을 우회하는 새로운 솔루션입니다.

@Jonathan Frech 덕분에 -3


#이 어떤 숫자의 첫 번째 문자인지 (eval이 선행 0을 허용하지 않기 때문에) 이전 솔루션은 작동하지 않으므로 유효하지 않습니다.

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
이 제출이 게시물에 명시된 이유로 유효하지 않은 것 같습니다.
Outgolfer Erik

2
함수에 복합 명령문이 포함되어 있지 않으므로 한 줄로 압축 할 수 있습니다.
Jonathan Frech

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

파워 쉘, 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으로 가정하십시오.

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.