Fehlende Zahlen in arithmetischer Summe


14

Herausforderung

Geben Sie eine gültige arithmetische Summe mit einigen fehlenden Zahlen aus und geben Sie den vollständigen Ausdruck aus.

Beispiel:

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

Eingang

  • Das Ausdrucksformat kann ein Array ["1#3", "45#", "579"], eine Zeichenfolge "1#3+45#=579"oder drei Eingaben seinf("1#3","45#","579")

Ausgabe

  • Wie die Eingabe
  • Sie müssen das Ergebnis nicht ausgeben

Anmerkungen

  • Die fehlenden Zahlen werden mit einem #beliebigen anderen konstanten nicht numerischen Zeichen dargestellt
  • Angenommen, das Ergebnis enthält keine fehlende Nummer
  • Angenommen, Input / Output besteht aus 2 Begriffen und einem Endergebnis
  • Es sei sowohl Term> 0 als auch Ergebnis> = 2 angenommen
  • Möglicherweise gibt es mehrere Lösungen. Sie können jeden ausgeben, solange das Summenergebnis übereinstimmt

Testfälle mit möglichen Ausgaben (hübsches 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

Standard gelten


Müssen wir führende Nullen entfernen?

@Mnemonic nicht unbedingt
Luis Felipe De Jesus Munoz

kann ich die eingabe mit =vertauschten seiten nehmen ? eg579=1#3+45#
dzaima

2
„Angenommen , sowohl Begriff> 0“ bedeutet „geht davon aus “ bedeuten , dass ich habe beiden Begriffe zur Ausgabe von > 0 , oder dass ich kann davon ausgehen , dass es immer eine Lösung sowohl mit> 0 , aber Ausgang was auch immer?
Dzaima

1
auch dein hinzugefügter Testfall vermeidet genau das, wonach ich gefragt habe - die führenden Nullen
dzaima

Antworten:


9

Brachylog , 22 16 Bytes

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

Probieren Sie es online!

-6 Bytes dank @Fatelize

Erläuterung

{Ṣ∧Ị∋|}ᵐ²ịᵐ.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+~tist 4 Bytes kürzer. Ich bin mir nicht sicher, warum Sie etwas getan haben, das sich in Ihrer Karte verwickelt hat.
Fatalize

Da wir jedes nicht numerische Zeichen verwenden können, sollten Sie z. B. Leerzeichen verwenden "#", um zwei weitere Bytes zu sparen.
Fatalize

8

JavaScript (ES6), 74.57 Byte

Nimmt die Eingabe als an (a)(b)(result), wobei a und b Zeichenfolgen mit .unbekannten Ziffern sind und result eine Ganzzahl ist. Gibt ein Array mit 2 Ganzzahlen zurück.

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

Probieren Sie es online!

Kommentiert

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, das ist es, was passiert. Ich habe gestern ohne Erklärung versucht, Ihren Code zu verstehen (und ich bin schlecht bei JS), habe aber nicht verstanden, warum -~nnicht gerecht sein kann n+1und wie F=(c,n)=>verwendet wurde. Jetzt, da Sie eine Erklärung hinzugefügt haben, macht alles Sinn. cist die dritte Eingabe, nist undefiniert (und ~undefinedwird -1unähnlich undefined+1). Jetzt ist alles klar (und etwas, das ich leider nicht nach Java portieren kann, weshalb ich hauptsächlich versucht habe, es xD zu verstehen). PS: Gestern bereits positiv bewertet, daher habe ich nur eine Ihrer anderen Antworten positiv bewertet (die ich noch nicht positiv bewertet habe, es ist nicht viel verfügbar); p
Kevin Cruijssen

@ KevinCruijssen FWIW, ich habe vor einiger Zeit einen Tipp darüber geschrieben. Aber ja ... das ist eine Sache von JS und wahrscheinlich nicht für viele andere Sprachen portierbar.
Arnauld

Nun, ich könnte es halbportieren, aber ich erstelle nur eine rekursive zweite Methode und verwende eine Ternary-If-Methode, um zu prüfen, in die ich es nullmanuell konvertiere -1. Java hat jedoch ein (sehr) begrenztes Limit für rekursiven StackOverflow. Wenn Sie also eine rekursive Methode mit Zufälligkeit verwenden und hoffen, dass sie innerhalb von etwa 1024 rekursiven Aufrufen korrekt ist, funktioniert dies in Java sowieso nicht. Ah, gut. Ich habe deinen Tipp positiv bewertet. Ein schönes Wochenende wünsche ich ihnen! :)
Kevin Cruijssen

@KevinCruijssen Mein erster JS-Versuch war genau das: Zufallswerte mit einer rekursiven Funktion ausprobieren. Dabei wurden in der Regel deutlich weniger Iterationen ausgeführt als bei Verwendung eines Zählers. Unterhaltsame Tatsache: ###+###=999Ihre Gewinnchancen sind 1 zu 1000. Mit 1024 Iterationen sollten Sie also etwas häufiger erfolgreich sein, als Sie scheitern. :)
Arnauld

7

Matlab, 143 134 132 119 115 Bytes

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 Bytes dank @Luismendo

Probieren Sie es online


Ziemlich groß und ziemlich dumm. Es ersetzt einfach alle #durch zufällige Ziffern, bis es die richtigen findet.


5

R , 67 51 Bytes

Rocke einfach und skaliere fürchterlich, greife einfach nach allen Summenkombinationen. Verwenden "." für unbekannte Ziffern. Es wird nicht die gleiche Antwort wie im Testfall Nummer 4 gefunden, aber es wird eine mögliche Antwort angezeigt, die dem Buchstaben der angegebenen Regeln folgt.

-16 Bytes durch Greifen nach dem Bilden der Ausgabe und Ersetzen pastedurch den ?Operator.

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

Probieren Sie es online!


1
Super Idee, daran hätte ich nie gedacht. Sie können ein paar Bytes sparen, indem Sie * anstelle von grepl verwenden: tio.run/##PYzLCoMwEEX3/…
JayCe

1
Ich habe nach verschiedenen Betreibern gesucht und Sie haben ?... Ich denke, dies ist eine Premiere. Übrigens habe ich vergessen, ob ich es dir bereits gesagt habe, aber wir versuchen, R für die September-Sprache des Monats nominiert zu bekommen - du kannst upvoten, wenn du es noch nicht getan hast.
JayCe

Ich hätte alles mit niedriger Priorität wählen können.
Meiner Meinung

3

Holzkohle , 32 Bytes

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

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:

F²⊞υ0

Bewegen Sie zwei Zeichenfolgen 0in die vordefinierte leere Liste u, um die while-Schleife zu aktivieren.

W⁻ζΣIυ

Wiederholen Sie diesen Vorgang, während die Summe der in uGanzzahl umgesetzten Werte nicht dem gewünschten Ergebnis entspricht.

≔E⟦θη⟧

Erstellen Sie ein Array der beiden Eingaben und ordnen Sie es zu.

⭆κ⎇⁼μ#‽χμυ

Ersetzen Sie jede #durch eine zufällige Ziffer und weisen Sie das Ergebnis wieder zu u.

←Eυ⮌ι

Drucken Sie das Ergebnis rechtsbündig aus. (Linksbündig wäre nur υfür eine 4-Byte-Speicherung.)



3

05AB1E (Legacy), 23 bis 20 Byte

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

-3 Bytes dank @Emigna .

Unbekannte Ziffern sind Leerzeichen ( ). Die Eingabereihenfolge sollte wie folgt lauten: erwartetes Ergebnis; längste Saite; kürzeste Saite.

Probieren Sie es online aus .

Erläuterung:

[                 # 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
Ersetzen Sie speichert 3 über dem wenn.
Emigna

@Emigna Ah, natürlich. Vielen Dank!
Kevin Cruijssen

3

Perl 6 , 81 74 Bytes

-7 bytes dank nwellnhof!

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

Probieren Sie es online!

Anonymer Codeblock, der Eingaben als Zeichenfolge mit einem arithmetischen Ausdruck akzeptiert, z. B. "12 # + 45 # = 579". Ersetzt jedes #durch mögliche Ziffernpermutationen, ersetzt das =mit ==und findet das erste gültige Ergebnis.

Erläuterung:

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

Sie können verwendet werden, S:g[\#]=$a[$++]anstatt transfür 74 Bytes .
Nwellnhof

@nwellnhof Ich wusste nicht, dass Sie S///diese Art von Syntax verwenden können! Vielen Dank!
Jo King


2

Java 10, 203 198 193 Bytes

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

Probieren Sie es online aus.

Erläuterung:

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

-15 Bytes dank @ceilingcat . Ich habe noch nie benutzt index.

-10 Bytes dank @Logem . Präprozessor-Magie

überarbeiteter Aufruf von exit(0)mit Puts als Parameter.

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

Probieren Sie es online!



Sie können zwei Bytes speichern, die das Makro ersetzen -DX=c=index(v durch den -DX=(c=index(vTIO-Link in meinem letzten Kommentar .
Logern

Danke Leute. Sieht nicht so aus, als hätte ich schon einmal versucht, Golf zu spielen ...
cleblanc

1

C # .NET, 225 220 196 Bytes

(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 meiner Java 10 Antwort .
(Ich bin sehr verrostet in C # .NET Golf, kann also definitiv Golf gespielt werden.)

-3 Bytes implizit dank @ user82593 und diesem neuen C # -Tipp, den er hinzugefügt hat .
-29 Bytes dank @hvd .

Probieren Sie es online aus.

Erläuterung:

(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

Sie können using System;stattdessen das reguläre verwenden, es ist kürzer als namespace System{}.
HDV

@hvd Das war's! .. Ich habe C # seit Jahren nicht mehr gemacht, lol .. Ich habe es using System.*;ähnlich wie Importe in Java versucht , aber das hat nicht funktioniert. Habe vergessen, dass ich das .*Teil entfernen musste .. Danke für die -5 Bytes.
Kevin Cruijssen

1
Es jetzt noch einmal zu lesen, das war eigentlich ein suboptimaler Vorschlag. Sie können schreiben int.Parse(-4), verwenden new System.Random()(+7) und löschen using System;(-13), um weitere 10 Bytes zu speichern. :) Auch brauchst du nicht .ToCharArray(), das zieht 14 weitere Bytes ab.
HDV

@hvd Danke! Nicht sicher , wie ich vergessen int.Parsevs System.Int32.Parse... Es ist im Grunde das gleiche wie System.Stringund string.. Und nicht wusste , war es möglich, eine Schleife über die Charaktere , ohne die .ToCharArray(). Danke für weitere -24 Bytes. : D
Kevin Cruijssen

1

Python 3 , 121 155 152 149 Bytes

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)

Probieren Sie es online!

+34 Neue Lösung mit Regex, um die Tatsache zu umgehen, dass Python keine Zahlen mit führenden Nullen unterstützt.

-3 danke an @Jonathan Frech


Die alte Lösung funktioniert nicht, wenn # das erste Zeichen in einer Zahl ist (weil eval keine führenden Nullen akzeptiert) und daher ungültig ist :(

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)

Probieren Sie es online!


1
Ich fürchte, diese Einsendung ist aus dem in der Post angegebenen Grund ungültig.
Erik der Outgolfer

2
Da Ihre Funktion keine zusammengesetzten Anweisungen enthält, können Sie sie auf nur eine Zeile komprimieren.
Jonathan Frech

0

PHP, 112 Bytes

Lahme Brute-Force-Lösung

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

Nimmt string als Eingabe, stoppt bei der ersten Lösung. Laufen Sie als Pipe mit -nRoder versuchen Sie es online .


0

Powershell, 91 Byte

Das Skript findet alle Lösungen. Die Gesamtzahl der Iterationen beträgt 10 Potenzen der Anzahl der Zeichen #. Die Rekursionstiefe entspricht der Anzahl der Zeichen #.

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

Testskript:

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, 'Angenommen, beide Begriffe> 0' sind obligatorisch, 110 Bytes

filter f{$h,$t=$_-split'#',2
if($t){0..9|%{"$h$_$t"}|f}else{$a,$b,$c=$_-split'\D'
$_|?{+$a*+$b*!(+$a+$b-$c)}}}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.