Brakujące liczby w sumie arytmetycznej

14

Wyzwanie

Podając poprawną sumę arytmetyczną z pewnymi brakującymi liczbami, wypisz pełne wyrażenie.

Przykład:

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

Wejście

  • Format wyrażenia może być tablicą ["1#3", "45#", "579"], łańcuchem "1#3+45#=579"lub 3 wejściamif("1#3","45#","579")

Wynik

  • Taki sam jak dane wejściowe
  • Nie musisz generować wyniku

Notatki

  • Brakujące liczby zostaną przedstawione za pomocą #dowolnego innego stałego znaku nienumerycznego
  • Załóżmy, że wynik nie będzie miał brakującej liczby
  • Załóżmy, że dane wejściowe / wyjściowe składają się z 2 składników i wyniku końcowego
  • Załóżmy, że zarówno> 0, jak i wynik> = 2
  • Może istnieć wiele rozwiązań. Możesz wyprowadzać dowolne, o ile wynik sumy jest zgodny

Przypadki testowe z możliwymi wyjściami (ładny format)

    #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

Obowiązują standardowe zasady

Luis Felipe De Jesus Munoz
źródło
Czy musimy usuwać wiodące zera?
@Mememonic niekoniecznie
Luis Felipe De
czy mogę pobrać dane z =zamienionymi bokami ? np.579=1#3+45#
dzaima
2
„Załóżmy, że zarówno termin> 0” oznacza „zakładać” znaczy, że mają do wyjścia oba terminy> 0 lub że mogę zakładać, że zawsze istnieje rozwiązanie zarówno z> 0, ale wyjście cokolwiek?
dzaima
1
również dodany przypadek testowy pozwala uniknąć dokładnie tego, o co prosiłem - wiodących zer
dzaima

Odpowiedzi:

9

Brachylog , 22 16 bajtów

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

Wypróbuj online!

-6 bajtów dzięki @Fatelize

Wyjaśnienie

{Ṣ∧Ị∋|}ᵐ²ịᵐ.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
Kroppeb
źródło
1
{"#"∧Ị∋|}ᵐ²ịᵐ.k+~tjest o 4 bajty krótszy. Nie jestem pewien, dlaczego zrobiłeś coś tak skomplikowanego na swojej mapie.
Fatalize
Ponieważ możemy użyć dowolnego znaku nienumerycznego, powinieneś użyć np. Spacji, zamiast "#"której zaoszczędzisz jeszcze dwa bajty.
Fatalize
8

JavaScript (ES6), 74 57 bajtów

Zajmuje wejście jak (a)(b)(result), gdzie i b są ciągi z nieznanych cyfr i wynik jest liczbą całkowitą. Zwraca tablicę 2 liczb całkowitych..

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

Wypróbuj online!

Skomentował

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
Arnauld
źródło
Ach, więc to się dzieje. Próbowałem wczoraj zrozumieć Twój kod bez wyjaśnień (i jestem zły w JS), ale nie rozumiałem, dlaczego -~nnie może być sprawiedliwy n+1i jak F=(c,n)=>został użyty. Teraz, gdy dodałeś wyjaśnienie, wszystko ma sens. cjest trzecim wejściem, njest niezdefiniowany (i ~undefinedstaje się -1niepodobny undefined+1). Wszystko jasne teraz (i nie jest to coś, co niestety mogę przenieść na Javę, dlatego głównie starałem się to zrozumieć xD). PS: Już głosowałem wczoraj, więc właśnie głosowałem jedną z twoich innych odpowiedzi (których jeszcze nie głosowałem, niewiele dostępnych ..); p
Kevin Cruijssen
@KevinCruijssen FWIW pisałem cynk o tym kilka razy wcześniej. Ale tak ... to jest sprawa JS i prawdopodobnie nie jest przenośna na wiele innych języków.
Arnauld
Cóż, być może uda mi się to częściowo przeportować, ale po prostu utworzę rekurencyjną drugą metodę i użyję trójskładnikowej opcji, jeśli to sprawdzę null, ręcznie przekonwertując ją na -1. Jednak Java ma (bardzo) ograniczony rekursywny limit StackOverflow, więc użycie metody rekurencyjnej z przypadkowością, mając nadzieję, że skończy się poprawnie w ciągu około 1024 rekurencyjnych wywołań, i tak nie zadziała. Ach tak. Głosowałem za twoim napiwkiem. Miłego weekendu! :)
Kevin Cruijssen
@KevinCruijssen Moja pierwsza próba JS polegała właśnie na tym: wypróbowaniu losowych wartości za pomocą funkcji rekurencyjnej. I zwykle robił znacznie mniej iteracji niż ten z użyciem licznika. Ciekawostka: nawet jeśli ###+###=999Twoje szanse wynoszą 1 na 1000. Więc przy 1024 iteracjach powinieneś odnieść sukces nieco częściej niż nie. :)
Arnauld
7

Matlab, 143 134 132 119 119 115 bajtów

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 bajty dzięki @Luismendo

Wypróbuj online


Dość duży i głupi. Po prostu zastępuje wszystkie #losowymi cyframi, dopóki nie znajdzie poprawnych cyfr.

DimChtz
źródło
5

R , 67 51 bajtów

Rock prosty i skalujący się okropnie, po prostu grepuj wszystkie kombinacje sum. Posługiwać się "." dla nieznanych cyfr. Nie znajdzie taką samą odpowiedź jak przypadek testowy numer 4, ale da się możliwą odpowiedź, która następuje po literze zasad jak podano.

-16 bajtów przez grepping po utworzeniu wyjścia i zastąpieniu pastego ?operatorem.

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

Wypróbuj online!

J.Doe
źródło
1
Świetny pomysł, nigdy bym o tym nie pomyślał. Możesz zaoszczędzić kilka bajtów, używając * zamiast grepl: tio.run/##PYzLCoMwEEX3/…
JayCe
1
Szukałem różnych operatorów, a ty ?wymyślisz ... Myślę, że to pierwszy. tak przy okazji, zapomniałem, czy już ci powiedziałem, ale staramy się uzyskać nominację R na język miesiąca we wrześniu - możesz głosować, jeśli jeszcze tego nie zrobiłeś.
JayCe
Mogłem wybrać wszystko z niskim priorytetem. Wydaje się, że powinien istnieć lepszy sposób na dopasowanie ...
J.Doe
3

Węgiel drzewny , 32 bajty

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

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

F²⊞υ0

Wciśnij dwa ciągi 0do wstępnie zdefiniowanej pustej listy, uaby uruchomić pętlę while.

W⁻ζΣIυ

Powtarzaj, gdy suma rzutowania wartości una liczbę całkowitą nie jest równa pożądanemu wynikowi.

≔E⟦θη⟧

Utwórz tablicę dwóch wejść i odwzoruj na niej.

⭆κ⎇⁼μ#‽χμυ

Zastąp każdą #cyfrą losową i przypisz wynik z powrotem do u.

←Eυ⮌ι

Wydrukuj wynik wyrównany do prawej. (Wyrównanie do lewej byłoby tylko υdla oszczędności 4-bajtowej).

Neil
źródło
3

05AB1E ( starsza wersja ), 23 20 bajtów

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

-3 bajty dzięki @Emigna .

Nieznane cyfry to spacje ( ). Kolejność wprowadzania powinna być: oczekiwany wynik; najdłuższy ciąg; najkrótszy ciąg.

Wypróbuj online .

Wyjaśnienie:

[                 # 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]
Kevin Cruijssen
źródło
1
Zastąp zapisuje 3 nad if.
Emigna
@Emigna Ah, oczywiście. Dzięki!
Kevin Cruijssen
3

Perl 6 , 81 74 bajtów

-7 bajtów dzięki nwellnhof!

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

Wypróbuj online!

Anonimowy blok kodu, który pobiera dane wejściowe jako ciąg zawierający wyrażenie arytmetyczne, np. „12 # + 45 # = 579”. Zastępuje każdą #możliwą kombinacją cyfr, zastępuje ===i znajduje pierwszy poprawny wynik.

Wyjaśnienie:

{  # 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
Jo King
źródło
Można użyć S:g[\#]=$a[$++]zamiast transdo 74 bajtów .
nwellnhof
@nwellnhof Nie zdawałem sobie sprawy, że możesz użyć S///takiej składni! Dzięki!
Jo King
2

Java 10, 203 198 193 bajtów

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

Wypróbuj online.

Wyjaśnienie:

(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
Kevin Cruijssen
źródło
2

C (gcc) , 228 213 203 172 170 bajtów

-15 bajtów dzięki @ceilingcat . Nigdy wcześniej nie korzystałem index.

-10 Bajtów dzięki @Logem . Magia preprocesora

refaktoryzowane wywołanie exit(0)z parametrami put jako parametr.

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

Wypróbuj online!

cleblanc
źródło
Możesz zapisać dwa bajty zastępując makro -DX=c=index(v, z -DX=(c=index(vlinkiem TIO w moim ostatnim komentarzu.
Logern
Dzięki chłopaki. Wygląda na to, że nawet nie próbowałem grać w golfa wcześniej ...
cleblanc
1

C # .NET, 225 220 196 bajtów

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

Port mojej odpowiedzi Java 10 .
(Jestem bardzo zardzewiały w golfie w C # .NET, więc z pewnością można grać w golfa ..)

-3 bajty domyślnie dzięki @ user82593 i tej nowej końcówce C #, którą dodał .
-29 bajtów dzięki @hvd .

Wypróbuj online.

Wyjaśnienie:

(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
Kevin Cruijssen
źródło
Zamiast tego możesz użyć zwykłego using System;, jest on krótszy niż namespace System{}.
hvd
@hvd To było to! .. Nie robiłem C # od lat, lol .. Próbowałem using System.*;podobnie jak import w Javie, ale to nie działało. Zapomniałem, że musiałem usunąć .*część. Dzięki za -5 bajtów.
Kevin Cruijssen
1
Ponowne przeczytanie go teraz było w rzeczywistości sugestią nieoptymalną. Możesz pisać int.Parse(-4), używać new System.Random()(+7) i upuszczać using System;(-13), aby zapisać kolejne 10 bajtów. :) Poza tym nie potrzebujesz .ToCharArray(), bo startuje jeszcze 14 bajtów.
hvd
@hvd Dzięki! Nie jestem pewien, jak zapomniałem o int.Parsevs System.Int32.Parse... To w zasadzie to samo, co System.Stringi string.. I nie wiedziałem, że można było zapętlić postacie bez .ToCharArray(). Dzięki za kolejne -24 bajty. : D
Kevin Cruijssen
1

Python 3 , 121 155 152 149 bajtów

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)

Wypróbuj online!

+34 Nowe rozwiązanie z wyrażeniem regularnym w celu obejścia faktu, że python nie obsługuje liczb z zerami wiodącymi.

-3 dzięki @Jonathan Frech


Stare rozwiązanie nie działa, jeśli # jest pierwszym znakiem w dowolnej liczbie (ponieważ eval nie przyjmuje wiodących zer) i dlatego jest nieprawidłowy :(

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)

Wypróbuj online!

Czarna sowa Kai
źródło
1
Obawiam się, że to zgłoszenie jest nieprawidłowe z powodu podanego w poście.
Erik the Outgolfer
2
Ponieważ twoja funkcja nie zawiera żadnych instrukcji złożonych, możesz ją skondensować tylko w jednym wierszu.
Jonathan Frech,
0

PHP, 112 bajtów

kiepskie rozwiązanie brutalnej siły

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

przyjmuje ciąg znaków jako wejście, zatrzymuje się przy pierwszym rozwiązaniu. Uruchom jako potok z -nRlub spróbuj online .

Tytus
źródło
0

PowerShell, 91 bajtów

Skrypt znajduje wszystkie rozwiązania. Całkowita liczba iteracji wynosi 10 potęgi liczby znaków #. Głębokość rekurencji jest równa liczbie znaków #.

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

Skrypt testowy:

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: „Załóż, że oba terminy> 0” jest obowiązkowe, 110 bajtów

filter f{$h,$t=$_-split'#',2
if($t){0..9|%{"$h$_$t"}|f}else{$a,$b,$c=$_-split'\D'
$_|?{+$a*+$b*!(+$a+$b-$c)}}}
mazzy
źródło