Недостающие числа в арифметической сумме


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#
дзайма

2
«Предполагать, что оба термина> 0» означает «предполагает», что я должен вывести оба термина> 0 или что я могу предположить, что всегда есть решение с обоими> 0, но вывести что-нибудь еще?
Дзайма

1
также ваш добавленный тестовый пример избегает именно того, о чем я просил - ведущих нулей
dzaima

Ответы:


9

Брахилог , 22 16 байт

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

Попробуйте онлайн!

-6 байт благодаря @Fatelize

объяснение

{Ṣ∧Ị∋|}ᵐ²ịᵐ.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+~tна 4 байта короче. Я не уверен, почему ты сделал что-то такое запутанное на своей карте.
Роковая

Поскольку мы можем использовать любой нечисловой символ, вы должны использовать, например, пробел, вместо "#"которого будет сохранено еще два байта.
Роковая

8

JavaScript (ES6), 74 57 байт

Принимает input как (a)(b)(result), где a и b - строки с .неизвестными цифрами, а result - целое число. Возвращает массив из 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: вчера уже проголосовали, так что я просто проголосовал за один из ваших других ответов (который я уже не голосовал, не так много доступно ...); p
Кевин Круйссен

@KevinCruijssen FWIW, я написал совет об этом несколько раз назад. Но да ... это вещь JS и, вероятно, не переносимая на многие другие языки.
Арно

Ну, я мог бы быть в состоянии портировать его, но просто создать рекурсивный второй метод и использовать для проверки троичный-if null, вручную преобразовав его в -1. Тем не менее, Java имеет (очень) ограниченный рекурсивный предел StackOverflow, поэтому использование рекурсивного метода со случайностью, в надежде, что он окажется правильным в течение примерно 1024 рекурсивных вызовов, не будет работать в Java в любом случае. Ах хорошо. Я проголосовал за ваш совет. Хороших выходных! :)
Кевин Круйссен

@KevinCruijssen Моя первая попытка JS была именно такой: попытка случайных значений с помощью рекурсивной функции. И обычно он выполнял значительно меньше итераций, чем счетчик. Интересный факт: даже для ###+###=999, ваши шансы равны 1 на 1000. Таким образом, с 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

-4 байта благодаря @Luismendo

Попробуйте онлайн


Довольно большой и довольно глупый. Он просто заменяет все #случайными цифрами, пока не найдет правильные.


5

R , 67 51 байт

Качайте просто и масштабно ужасно, просто соберите все комбинации сумм. Используйте "." для неизвестных цифр. Он не будет найти такой же ответ , как тест случае с номером 4, но это даст возможный ответ, который следует букве правил , как указано.

-16 байт после формирования оглавления вывода и замены pasteс ?оператором.

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

Попробуйте онлайн!


1
Потрясающая идея, я бы никогда не подумал об этом. Вы можете сохранить несколько байтов, используя * вместо grepl: tio.run/##PYzLCoMwEEX3/…
JayCe

1
Я искал разных операторов, а вы придумали ?... Я думаю, что это первое. кстати, я забыл, если уже говорил вам, но мы пытаемся выдвинуть кандидатуру R на сентябрьский язык месяца - вы можете проголосовать, если еще не сделали этого.
JayCe

Я мог бы выбрать что-нибудь с низким приоритетом. Чувствуется, что должен быть лучший способ получить матч ...
J.Doe

3

Древесный уголь , 32 байта

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

Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:

F²⊞υ0

Переместите две строки 0s в предопределенный пустой список, uчтобы запустить цикл while.

W⁻ζΣIυ

Повторите, пока сумма приведения значений в uцелое число не равна желаемому результату.

≔E⟦θη⟧

Создайте массив из двух входов и отобразите его.

⭆κ⎇⁼μ#‽χμυ

Замените каждый #случайной цифрой и присвойте результат обратно u.

←Eυ⮌ι

Вывести результат правильно выровнен. (Выравнивание по левому краю будет только υдля 4-байтового сохранения.)



3

05AB1E (наследие), 23 20 байтов

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

-3 байта благодаря @Emigna .

Неизвестные цифры - это пробелы ( ). Порядок ввода должен быть: ожидаемый результат; самая длинная строка; самая короткая строка.

Попробуйте онлайн .

Объяснение:

[                 # 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
Заменить сохраняет 3 над если.
Эминья

@ Emigna А, конечно. Благодарность!
Кевин Круйссен

3

Perl 6 , 81 74 байта

-7 байт благодаря nwellnhof!

{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

Java 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 байт

-15 байт благодаря @ceilingcat . Я никогда не использовал indexраньше.

-10 байт благодаря @Logem . Препроцессорная магия

рефакторированный вызов exit(0) с параметром put.

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 в моем последнем комментарии.
Логерн

Спасибо ребята. Не похоже, что я даже пытался
играть

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 #, который он добавил .
-29 байт благодаря @hvd .

Попробуйте онлайн.

Объяснение:

(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 Вот и все! .. Я не делал C # годами, смеется. Я пробовал using System.*;аналогично импорту в Java, но это не сработало. Забыл, я должен был удалить .*часть .. Спасибо за -5 байтов.
Кевин Круйссен,

1
Перечитав это сейчас, это было на самом деле неоптимальное предложение. Вы можете написать int.Parse(-4), использовать new System.Random()(+7) и удалить using System;(-13), чтобы сохранить еще 10 байтов. :) Кроме того, вам не нужно .ToCharArray(), что снимает еще 14 байтов.
HVd

@hvd Спасибо! Не уверен, как я забыл про int.Parsevs System.Int32.Parse... Это в основном то же самое, что System.Stringи string.. И не знал, что можно было перебрать символы без .ToCharArray(). Спасибо за еще -24 байта. : D
Кевин Круйссен

1

Python 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 Новое решение с регулярным выражением, позволяющее обойти тот факт, что python не поддерживает числа с ведущими нулями.

-3 благодаря @ Джонатану Фреху


Старое решение не работает, если # является первым символом в любом числе (потому что 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
Я боюсь, что это представление является недействительным по причине, указанной в посте.
Эрик Outgolfer

2
Поскольку ваша функция не содержит составных операторов, вы можете сжать ее до одной строки.
Джонатан Фрех

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)}}}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.