Пропущені числа в арифметичній сумі


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

Діють стандартні правила


Чи потрібно знімати провідні нулі?

@Mnemonic не обов’язково
Luis felipe De jesus Munoz

чи можу я взяти вхід зі =зміненими сторонами навколо ? наприклад579=1#3+45#
dzaima

2
"Припустимо, що обидва терміни> 0" чи "припускає" означає, що я повинен вивести обидва терміни> 0 або що я можу припустити, що завжди є рішення з обома> 0, але виводити будь-що?
dzaima

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

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

@KevinCruijssen FWIW, я написав наконечник про це кілька разів назад. Але так ... це річ JS і, мабуть, не переноситься для багатьох інших мов.
Арнольд

Що ж, я можу передати його на півпорт, але просто створити другий рекурсивний метод та використовувати трирічний, якщо для перевірки null, перетворення його вручну -1. Однак у Java є (дуже) обмежений рекурсивний ліміт StackOverflow, тому використання рекурсивного методу з випадковістю, сподіваючись, що воно виявиться правильним протягом приблизно 1024 рекурсивних дзвінків, все одно не працюватиме в Java. Ну добре. Я підтримав вашу пораду. Приємних вихідних! :)
Kevin Cruijssen

@KevinCruijssen Моя перша спроба JS робила саме це: пробувала випадкові значення з рекурсивною функцією. І зазвичай це робило значно менше ітерацій, ніж те, що використовувало лічильник. Факт забави: навіть для ###+###=999вас шанси - 1 на 1000. Тож з 1024 ітераціями вам слід домогтися успіху трохи частіше, ніж невдачі. :)
Арнольд

7

Матлаб, 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щоб перейти до циклу.

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 на if.
Емінья,

@Emigna Ах, звичайно. Спасибі!
Kevin Cruijssen

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 . Передпроцесорна магія

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

Дякую, хлопці. Не схоже на те, що я навіть раніше намагався займатися гольфом ...
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 #, яку він додав .
-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

@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

Пітон 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 завдяки @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
Оскільки ваша функція не містить складних висловлювань, ви можете конденсувати її лише до одного рядка.
Джонатан Фрех

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.