Thiếu số trong tổng số học


14

Thử thách

Đưa ra một tổng số học hợp lệ với một số số bị thiếu, xuất biểu thức đầy đủ.

Thí dụ:

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

Đầu vào

  • Định dạng biểu thức có thể là một mảng ["1#3", "45#", "579"], một chuỗi "1#3+45#=579"hoặc 3 đầu vàof("1#3","45#","579")

Đầu ra

  • Giống như đầu vào
  • Bạn không cần phải đưa ra kết quả

Ghi chú

  • Các số bị thiếu sẽ được biểu diễn bằng #hoặc bất kỳ ký tự không phải là số không đổi nào khác mà bạn muốn
  • Giả sử kết quả sẽ không có một số bị thiếu
  • Giả sử Đầu vào / Đầu ra bao gồm 2 thuật ngữ và kết quả cuối cùng
  • Giả sử cả hai số hạng> 0 và kết quả> = 2
  • Có thể có nhiều giải pháp. Bạn có thể xuất bất cứ ai miễn là kết quả tổng hợp khớp

Các trường hợp thử nghiệm có thể xuất ra (định dạng đẹp)

    #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

Luật tiêu chuẩn được áp dụng


Chúng ta có cần phải tước số không hàng đầu?

@Mnemonic không nhất thiết
Luis felipe De jesus Munoz

Tôi có thể lấy đầu vào với các mặt xung quanh =hoán đổi không? ví dụ579=1#3+45#
dzaima

2
"Giả sử cả hai thuật ngữ> 0" không "giả sử" có nghĩa là tôi phải xuất cả hai thuật ngữ> 0 hoặc tôi có thể giả sử rằng luôn có một giải pháp có cả> 0 nhưng xuất ra bất cứ điều gì?
dzaima

1
Ngoài ra, trường hợp thử nghiệm được thêm vào của bạn cũng tránh chính xác những gì tôi đã yêu cầu - các số 0 hàng đầu
dzaima

Câu trả lời:


9

Brachylog , 22 16 byte

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

Hãy thử trực tuyến!

-6 byte nhờ @Fatelize

Giải trình

{Ṣ∧Ị∋|}ᵐ²ịᵐ.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+~tngắn hơn 4 byte. Tôi không chắc tại sao bạn lại làm điều gì đó phức tạp trên bản đồ của bạn.
Gây tử vong vào

Vì chúng ta có thể sử dụng bất kỳ ký tự không phải là số nào, bạn nên sử dụng khoảng trắng với thay vì "#"sẽ tiết kiệm thêm hai byte.
Gây tử vong vào

8

JavaScript (ES6), 74 57 byte

Lấy đầu vào là (a)(b)(result), trong đó ab là các chuỗi có .các chữ số chưa biết và kết quả là một số nguyên. Trả về một mảng gồm 2 số nguyên.

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

Hãy thử trực tuyến!

Đã bình luậ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

Ah, vậy đó là những gì đang xảy ra. Tôi đã cố gắng hiểu mã của bạn mà không có lời giải thích ngày hôm qua (và tôi rất tệ về JS), nhưng không hiểu tại sao -~nkhông thể sử dụng n+1và làm thế nào F=(c,n)=>được sử dụng. Bây giờ bạn đã thêm một lời giải thích tất cả có ý nghĩa. clà đầu vào thứ ba, nkhông xác định (và ~undefinedtrở nên -1không giống nhau undefined+1). Bây giờ tất cả đã rõ ràng (và không phải thứ gì đó tôi có thể chuyển sang Java không may, đó chủ yếu là lý do tại sao tôi cố gắng hiểu nó xD). PS: Đã được nâng cấp ngày hôm qua, vì vậy tôi chỉ nêu lên một trong những câu trả lời khác của bạn (mà tôi chưa nêu ra, không có sẵn nhiều ..); p
Kevin Cruijssen

@KevinCruijssen FWIW, tôi đã viết một mẹo về điều này một số lần trước đây. Nhưng vâng ... đó là một điều JS và có lẽ không thể chuyển sang nhiều ngôn ngữ khác.
Arnauld

Chà, tôi có thể có thể bán nó nhưng chỉ cần tạo một phương thức thứ hai đệ quy và sử dụng một ternary-if để kiểm tra null, chuyển đổi thủ công thành -1. Tuy nhiên, Java có giới hạn StackOverflow đệ quy (rất) bị giới hạn, do đó, sử dụng phương thức đệ quy với tính ngẫu nhiên với hy vọng nó sẽ kết thúc đúng trong khoảng 1024 cuộc gọi đệ quy sẽ không hoạt động trong Java. À Tôi đã nâng cao tiền boa của bạn. Cuối tuần vui vẻ! :)
Kevin Cruijssen

@KevinCruijssen Nỗ lực JS đầu tiên của tôi đã thực hiện chính xác điều đó: thử các giá trị ngẫu nhiên với hàm đệ quy. Và nó thường được thực hiện ít hơn đáng kể so với lần sử dụng bộ đếm. Sự thật thú vị: ngay cả đối với ###+###=999, tỷ lệ cược của bạn là 1 trên 1000. Vì vậy, với 1024 lần lặp, bạn sẽ thành công hơn một chút so với thất bại. :)
Arnauld

7

Matlab, 143 134 132 119 115 byte

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

-4 byte nhờ @Luismendo

Dùng thử trực tuyến


Khá lớn và khá ngu ngốc. Nó chỉ đơn giản là thay thế tất cả #bằng các chữ số ngẫu nhiên cho đến khi tìm thấy đúng.


5

R , 67 51 byte

Rock đơn giản và quy mô khủng khiếp, chỉ cần grep tất cả các kết hợp tổng. Sử dụng "." cho các chữ số chưa biết. Nó sẽ không tìm thấy câu trả lời giống như trường hợp thử nghiệm số 4, nhưng nó sẽ đưa ra một câu trả lời có thể, theo sau các quy tắc như được đưa ra.

-16 byte bằng cách grepping sau khi hình thành đầu ra và thay thế pastebằng ?toán tử.

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

Hãy thử trực tuyến!


1
Ý tưởng tuyệt vời, tôi sẽ không bao giờ nghĩ về điều đó. Bạn có thể lưu một vài byte bằng cách sử dụng * thay cho grepl: tio.run/##PYzLCoMwEEX3/ Kẻ
JayCe

1
Tôi đã tìm kiếm các nhà khai thác khác nhau và bạn nghĩ ra ?... Tôi nghĩ rằng đây là lần đầu tiên. Nhân tiện, tôi đã quên nếu tôi đã nói với bạn nhưng chúng tôi đang cố gắng để được đề cử R cho ngôn ngữ tháng chín của tháng - bạn có thể nâng cấp nếu chưa hoàn thành.
JayCe

Tôi đã có thể chọn bất cứ điều gì với mức độ ưu tiên thấp. Cảm thấy như có một cách tốt hơn để có được trận đấu ...
J.Doe

3

Than , 32 byte

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

F²⊞υ0

Đẩy hai chuỗi 0s vào danh sách trống được xác định trước uđể thực hiện vòng lặp while.

W⁻ζΣIυ

Lặp lại trong khi tổng số giá trị đúc uthành số nguyên không bằng kết quả mong muốn.

≔E⟦θη⟧

Tạo một mảng của hai đầu vào và ánh xạ qua nó.

⭆κ⎇⁼μ#‽χμυ

Thay thế mỗi #bằng một chữ số ngẫu nhiên và gán kết quả trở lại u.

←Eυ⮌ι

In đúng kết quả. (Còn lại hợp lý sẽ chỉ υđể tiết kiệm 4 byte.)



3

05AB1E (di sản), 23 20 byte

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

-3 byte nhờ @Emigna .

Các chữ số không xác định là khoảng trắng ( ). Thứ tự đầu vào phải là: kết quả mong đợi; chuỗi dài nhất; chuỗi ngắn nhất.

Hãy thử trực tuyến .

Giải trình:

[                 # 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
Thay thế tiết kiệm 3 so với nếu.
Emigna

@Emigna À, tất nhiên rồi. Cảm ơn!
Kevin Cruijssen

3

Perl 6 , 81 74 byte

-7 byte nhờ nwellnhof!

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

Hãy thử trực tuyến!

Khối mã ẩn danh nhận đầu vào dưới dạng một chuỗi chứa biểu thức số học, ví dụ: "12 # + 45 # = 579". Thay thế từng #chữ số có thể hoán vị các chữ số, thay thế =bằng ==và tìm kết quả hợp lệ đầu tiên.

Giải trình:

{  # 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

Bạn có thể sử dụng S:g[\#]=$a[$++]thay vì transcho 74 byte .
nwellnhof

@nwellnhof Tôi không nhận ra bạn có thể sử dụng S///loại cú pháp đó! Cảm ơn!
Jo King


2

Java 10, 203 198 193 byte

(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;}

Hãy thử trực tuyến.

Giải trình:

(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 byte

-15 Byte nhờ @ceilingcat . Tôi chưa từng sử dụng indextrước đây.

-10 Byte nhờ @Logem . Ma thuật tiền xử lý

gọi lại cấu trúc lại exit(0)với đặt làm tham số.

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])));}

Hãy thử trực tuyến!



Bạn có thể lưu hai byte thay thế macro -DX=c=index(v, với -DX=(c=index(v, liên kết TIO trong bình luận cuối cùng của tôi.
Logern

Cảm ơn các bạn. Không có vẻ như tôi thậm chí đã cố chơi golf này trước đây ...
cleblanc

1

C # .NET, 225 220 196 byte

(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);}

Cổng câu trả lời Java 10 của tôi .
(Tôi rất khó tính khi chơi golf C # .NET, vì vậy chắc chắn có thể bị đánh gôn ..)

-3 byte hoàn toàn nhờ vào @ user82593mẹo C # mới này mà anh ấy đã thêm .
-29 byte nhờ @hvd .

Hãy thử trực tuyến.

Giải trình:

(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

Bạn có thể sử dụng thường xuyên using System;thay thế, nó ngắn hơn namespace System{}.
hvd

@hvd Đó là nó! .. Tôi đã không thực hiện C # trong nhiều năm, lol .. Tôi đã thử using System.*;tương tự như nhập khẩu trong Java, nhưng không được. Quên tôi đã phải loại bỏ .*phần .. Cảm ơn vì -5 byte.
Kevin Cruijssen

1
Đọc lại nó bây giờ, đó thực sự là một gợi ý phụ tối ưu. Bạn có thể viết int.Parse(-4), sử dụng new System.Random()(+7) và thả using System;(-13) để lưu thêm 10 byte. :) Ngoài ra, bạn không cần .ToCharArray(), mà mất thêm 14 byte.
hvd

@hvd Cảm ơn! Không chắc chắn làm thế nào tôi quên về int.Parsevs System.Int32.Parse... Về cơ bản nó giống như System.Stringstring.. Và tôi không biết có thể lặp lại các nhân vật mà không có .ToCharArray(). Cảm ơn vì -24 byte khác. : D
Kevin Cruijssen

1

Python 3 , 121 155 152 149 byte

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)

Hãy thử trực tuyến!

+34 Giải pháp mới với biểu thức chính quy để tránh sự thật rằng trăn không hỗ trợ số với các số 0 đứng đầu.

-3 cảm ơn @Jonathan Frech


Giải pháp cũ không hoạt động nếu # là ký tự đầu tiên trong bất kỳ số nào (vì eval không chấp nhận các số 0 đứng đầu) và do đó không hợp lệ :(

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)

Hãy thử trực tuyến!


1
Tôi sợ bài này không hợp lệ vì lý do được nêu trong bài.
Erik the Outgolfer

2
Vì hàm của bạn không chứa bất kỳ câu lệnh ghép nào, bạn có thể ngưng tụ nó thành một dòng.
Jonathan Frech

0

PHP, 112 byte

giải pháp vũ phu què

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

lấy chuỗi làm đầu vào, dừng lại ở giải pháp đầu tiên. Chạy như ống với -nRhoặc thử trực tuyến .


0

Powershell, 91 byte

Kịch bản tìm thấy tất cả các giải pháp. Tổng số lần lặp là 10 sức mạnh số lượng ký tự #. Độ sâu đệ quy bằng số lượng ký tự #.

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

Kịch bản thử nghiệm:

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, 'Giả sử cả hai thuật ngữ> 0' là bắt buộc, 110 byte

filter f{$h,$t=$_-split'#',2
if($t){0..9|%{"$h$_$t"}|f}else{$a,$b,$c=$_-split'\D'
$_|?{+$a*+$b*!(+$a+$b-$c)}}}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.