Numeri mancanti nella somma aritmetica


14

Sfida

Dando una somma aritmetica valida con alcuni numeri mancanti, genera l'espressione completa.

Esempio:

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

Ingresso

  • Il formato dell'espressione può essere un array ["1#3", "45#", "579"], una stringa "1#3+45#=579"o 3 inputf("1#3","45#","579")

Produzione

  • Uguale come l'input
  • Non è necessario generare il risultato

Appunti

  • I numeri mancanti verranno rappresentati utilizzando #o qualsiasi altro carattere non numerico costante desiderato
  • Supponiamo che il risultato non abbia un numero mancante
  • Supponiamo che Input / Output consistano in 2 termini e un risultato finale
  • Assumi sia il termine> 0 sia il risultato> = 2
  • Potrebbero esserci più soluzioni. È possibile produrre chiunque purché il risultato della somma corrisponda

Casi di prova con possibili output (formato piuttosto)

    #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

Si applicano le regole standard del


Dobbiamo eliminare gli zeri iniziali?

@Mnemonico non necessariamente
Luis felipe De jesus Munoz il

posso prendere l'input con i lati intorno =scambiati? ad es.579=1#3+45#
dzaima,

2
"Si supponga sia termine> 0" significa "Presumo" significa che io ho per l'output sia in termini> 0 o che posso supporre che c'è sempre una soluzione con entrambi i> 0, ma in uscita qualsiasi altra cosa?
dzaima,

1
anche il tuo test-case aggiunto evita esattamente quello che stavo chiedendo - gli zero
iniziali

Risposte:


9

Brachylog , 22 16 byte

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

Provalo online!

-6 byte grazie a @Fatelize

Spiegazione

{Ṣ∧Ị∋|}ᵐ²ịᵐ.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è di 4 byte più breve. Non sono sicuro del motivo per cui hai fatto qualcosa di così contorto nella tua mappa.
Fatalizza il

Dato che possiamo usare qualsiasi carattere non numerico, dovresti usare, ad esempio, lo spazio con il quale invece di "#"risparmiare altri due byte.
Fatalizza il

8

JavaScript (ES6), 74 57 byte

Prende input come (a)(b)(result), dove un e b sono stringhe con .delle cifre sconosciute e risultato è un numero intero. Restituisce un array di 2 numeri interi.

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

Provalo online!

Commentate

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, ecco cosa sta succedendo. Ho cercato di capire il tuo codice senza spiegazioni ieri (e io sono cattivo in JS), ma non ho capito perché -~nnon potesse essere giusto n+1e come è F=(c,n)=>stato utilizzato. Ora che hai aggiunto una spiegazione, tutto ha un senso. cè il terzo input, nnon è definito (e ~undefineddiventa -1diverso undefined+1). Tutto chiaro ora (e non qualcosa che posso purtroppo portare su Java, motivo per cui ho cercato di capirlo xD). PS: ho già votato ieri, quindi ho appena votato una delle tue altre risposte (che non ho già votato, non molto disponibile ..); p
Kevin Cruijssen,

@KevinCruijssen FWIW, ho scritto un suggerimento su questo alcune volte fa. Ma sì ... è una cosa di JS e probabilmente non è portatile in molte altre lingue.
Arnauld,

Bene, potrei essere in grado di eseguire il semi-porting ma semplicemente creando un secondo metodo ricorsivo e usando un ternary-if per verificare null, convertendolo manualmente in -1. Tuttavia, Java ha un limite StackOverflow (molto) limitato e ricorsivo, quindi l'utilizzo di un metodo ricorsivo con casualità nella speranza che finisca correttamente entro circa 1024 chiamate ricorsive non funzionerà comunque in Java. Ah bene. Ho votato il tuo consiglio. Passa un bel weekend! :)
Kevin Cruijssen,

@KevinCruijssen Il mio primo tentativo di JS stava facendo esattamente questo: provare valori casuali con una funzione ricorsiva. E di solito stava facendo significativamente meno iterazioni rispetto a quella che utilizzava un contatore. Curiosità: anche per ###+###=999, le tue probabilità sono 1 su 1000. Quindi con 1024 iterazioni, dovresti riuscire leggermente più spesso di quanto non riesci. :)
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 grazie a @Luismendo

Provalo online


Abbastanza grande e piuttosto stupido. Sostituisce semplicemente tutto #con cifre casuali finché non trova quelle corrette.


5

R , 67 51 byte

Oscilla in modo semplice e ridimensiona in modo orribile, semplicemente grep tutte le combinazioni di somma. Uso "." per cifre sconosciute. Non troverà la stessa risposta del test case numero 4, ma fornirà a possibile risposta, che segue la lettera delle regole fornita.

-16 byte eseguendo il grepping dopo aver formato l'output e sostituito pastecon l' ?operatore.

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

Provalo online!


1
Fantastica idea, non ci avrei mai pensato. Puoi salvare qualche byte usando * al posto di grepl: tio.run/##PYzLCoMwEEX3/…
JayCe

1
Ero alla ricerca di vari operatori e ti è venuta in mente ?... Penso che questa sia la prima volta. tra l'altro, ho dimenticato se te l'ho già detto, ma stiamo cercando di ottenere la nomination R per la lingua del mese di settembre - puoi votare se non lo hai già fatto.
JayCe

Avrei potuto scegliere qualsiasi cosa con bassa precedenza. Sembra che ci dovrebbe essere un modo migliore per ottenere la partita ...
J.Doe

3

Carbone , 32 byte

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

Provalo online! Il collegamento è alla versione dettagliata del codice. Spiegazione:

F²⊞υ0

Spingere due stringhe 0nell'elenco vuoto predefinito uper avviare il ciclo while.

W⁻ζΣIυ

Ripeti mentre la somma del cast dei valori in unumero intero non è uguale al risultato desiderato.

≔E⟦θη⟧

Crea un array di due input e mappalo su di esso.

⭆κ⎇⁼μ#‽χμυ

Sostituisci ciascuno #con una cifra casuale e assegna il risultato a u.

←Eυ⮌ι

Stampa il risultato giustificato a destra. (Sinistra giustificata sarebbe solo υper un salvataggio di 4 byte.)



3

05AB1E (legacy), 23 20 byte

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

-3 byte grazie a @Emigna .

Le cifre sconosciute sono spazi ( ). L'ordine di input dovrebbe essere: risultato atteso; stringa più lunga; stringa più corta.

Provalo online .

Spiegazione:

[                 # 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
Sostituisci salva 3 sul if.
Emigna,

@Emigna Ah, certo. Grazie!
Kevin Cruijssen,

3

Perl 6 , 81 74 byte

-7 byte grazie a nwellnhof!

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

Provalo online!

Blocco di codice anonimo che accetta input come stringa contenente un'espressione aritmetica, ad esempio "12 # + 45 # = 579". Sostituisce ciascuno #con possibili permutazioni di cifre, sostituisce il =con ==e trova il primo risultato valido.

Spiegazione:

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

È possibile utilizzare S:g[\#]=$a[$++]anziché transper 74 byte .
nwellnhof,

@nwellnhof Non mi ero reso conto che avresti potuto usare S///in quel tipo di sintassi! Grazie!
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;}

Provalo online.

Spiegazione:

(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 grazie a @ceilingcat . Non l'ho mai usato indexprima.

-10 byte grazie a @Logem . Magia del preprocessore

chiamata refactored a exit(0)con put come parametro.

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

Provalo online!



È possibile salvare due byte sostituendo la macro -DX=c=index(v, con il -DX=(c=index(vcollegamento TIO nel mio ultimo commento.
Logern,

Grazie ragazzi. Non sembra che abbia mai provato a giocare a golf prima ...
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);}

Porta della mia risposta Java 10 .
(Sono molto arrugginito nel golf C # .NET, quindi posso sicuramente giocare a golf ..)

-3 byte implicitamente grazie a @ user82593 e a questo nuovo suggerimento C # che ha aggiunto .
-29 byte grazie a @hvd .

Provalo online.

Spiegazione:

(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

Puoi usare using System;invece il normale , è più corto di namespace System{}.
hvd,

@hvd Ecco fatto! .. Non ho fatto C # per anni, lol .. Ho provato using System.*;simili come importazioni in Java, ma non ha funzionato. Dimenticato che ho dovuto rimuovere la .*parte .. Grazie per i -5 byte.
Kevin Cruijssen,

1
Rileggendolo ora, era in realtà un suggerimento non ottimale. Puoi scrivere int.Parse(-4), usare new System.Random()(+7) e rilasciare using System;(-13) per salvare altri 10 byte. :) Inoltre, non è necessario .ToCharArray(), che decolla altri 14 byte.
hvd,

@hvd Grazie! Non sono sicuro di come mi sia dimenticato di int.Parsevs System.Int32.Parse... È praticamente lo stesso di System.Stringe string... E non sapevo che fosse possibile passare in rassegna i personaggi senza il .ToCharArray(). Grazie per altri -24 byte. : 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)

Provalo online!

+34 Nuova soluzione con regex per aggirare il fatto che Python non supporta numeri con zeri iniziali.

-3 grazie a @Jonathan Frech


La vecchia soluzione non funziona se # è il primo carattere di qualsiasi numero (perché eval non accetta gli zeri iniziali) ed è quindi non valido :(

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)

Provalo online!


1
Temo che questo invio non sia valido per il motivo indicato nel post.
Erik the Outgolfer,

2
Poiché la tua funzione non contiene alcuna istruzione composta, puoi condensarla in una sola riga.
Jonathan Frech,

0

PHP, 112 byte

soluzione di forza bruta zoppa

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

accetta la stringa come input, si ferma alla prima soluzione. Esegui come pipe -nRo provalo online .


0

Powershell, 91 byte

Lo script trova tutte le soluzioni. Il numero totale di iterazioni è 10 potenza il numero di caratteri #. La profondità di ricorsione è uguale al numero di caratteri #.

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

Script di prova:

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, 'Assumi entrambi i termini> 0' è obbligatorio, 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)}}}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.