Nomor yang hilang dalam jumlah aritmatika


14

Tantangan

Memberikan jumlah aritmatika yang valid dengan beberapa angka yang hilang, mengeluarkan ekspresi penuh.

Contoh:

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

Memasukkan

  • Format ekspresi dapat berupa array ["1#3", "45#", "579"], string "1#3+45#=579", atau 3 inputf("1#3","45#","579")

Keluaran

  • Sama seperti yang dimasukkan
  • Anda tidak perlu menampilkan hasilnya

Catatan

  • Angka-angka yang hilang akan direpresentasikan menggunakan #atau karakter non-numerik konstan lainnya yang Anda inginkan
  • Asumsikan hasil tidak akan memiliki nomor yang hilang
  • Asumsikan Input / Output terdiri dari 2 istilah dan hasil akhir
  • Asumsikan kedua istilah> 0 dan hasil> = 2
  • Mungkin ada beberapa solusi. Anda dapat menampilkan siapa saja selama jumlah hasil cocok

Test Case dengan kemungkinan keluaran (format cantik)

    #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

Aturan standar berlaku


Apakah kita perlu melepaskan nol di depan?

@Mnemonic belum tentu
Luis felipe De jesus Munoz

dapatkah saya mengambil input dengan sisi di sekitar =ditukar? mis579=1#3+45#
dzaima

2
"Asumsikan kedua istilah> 0" apakah "berasumsi" berarti bahwa saya harus mengeluarkan kedua istilah> 0 atau saya dapat berasumsi bahwa selalu ada solusi dengan keduanya> 0 tetapi keluaran apa pun?
dzaima

1
juga test case Anda yang ditambahkan menghindari apa yang saya minta - nol terkemuka
dzaima

Jawaban:


9

Brachylog , 22 16 byte

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

Cobalah online!

-6 byte terima kasih kepada @Fatelize

Penjelasan

{Ṣ∧Ị∋|}ᵐ²ịᵐ.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+~tlebih pendek 4 byte. Saya tidak yakin mengapa Anda melakukan sesuatu yang berbelit-belit di peta Anda.
Fatalkan

Karena kita dapat menggunakan karakter non-numerik apa pun, Anda harus menggunakan mis. Spasi dengan alih - alih "#"yang akan menghemat dua byte lagi.
Fatalkan

8

JavaScript (ES6), 74 57 byte

Mengambil input sebagai (a)(b)(result), di mana a dan b adalah string .untuk digit yang tidak diketahui dan hasilnya adalah integer. Mengembalikan array 2 bilangan bulat.

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

Cobalah online!

Berkomentar

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, jadi itulah yang terjadi. Saya mencoba memahami kode Anda tanpa penjelasan kemarin (dan saya buruk di JS), tetapi tidak mengerti mengapa -~ntidak bisa adil n+1dan bagaimana F=(c,n)=>digunakan. Sekarang Anda menambahkan penjelasan, itu semua masuk akal. cadalah input ketiga, ntidak terdefinisi (dan ~undefinedmenjadi -1tidak seperti undefined+1). Semua jelas sekarang (dan bukan sesuatu yang saya dapat port ke Jawa sayangnya, yang terutama mengapa saya mencoba memahaminya xD). PS: Sudah diputuskan kemarin, jadi saya baru saja memutus salah satu jawaban anda yang lain (yang saya belum pilih, belum banyak tersedia ..); p
Kevin Cruijssen

@KevinCruijssen FWIW, saya menulis tip tentang ini beberapa waktu yang lalu. Tapi ya ... itu hal JS dan mungkin tidak mudah dibawa ke banyak bahasa lain.
Arnauld

Yah, saya mungkin bisa semi-port itu tetapi hanya menciptakan metode kedua rekursif, dan menggunakan ternary-jika untuk memeriksa null, mengubahnya secara manual ke -1. Namun, Java memiliki batas StackOverflow rekursif (sangat) terbatas, jadi menggunakan metode rekursif dengan keacakan berharap itu akan berakhir benar dalam waktu sekitar 1024 panggilan rekursif tidak akan tetap bekerja di Jawa. Baiklah Saya telah membatalkan saran Anda. Selamat berakhir pekan! :)
Kevin Cruijssen

@KevinCruijssen Upaya JS pertama saya melakukan hal itu: mencoba nilai acak dengan fungsi rekursif. Dan itu biasanya melakukan iterasi yang jauh lebih sedikit daripada yang menggunakan penghitung. Fakta menyenangkan: bahkan untuk ###+###=999, peluang Anda adalah 1 banding 1000. Jadi dengan 1024 iterasi, Anda harus berhasil sedikit lebih sering daripada gagal. :)
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 berkat @Luismendo

Cobalah secara Online


Cukup besar dan sangat bodoh. Itu hanya mengganti semua #dengan angka acak sampai menemukan yang benar.


5

R , 67 51 byte

Rock sederhana dan sisiknya mengerikan, cukup ambil semua kombinasi jumlah. Gunakan "." untuk digit yang tidak diketahui. Ini tidak akan menemukan jawaban yang sama seperti ujian nomor 4, tetapi akan memberikan sebuah jawaban yang mungkin, yang mengikuti surat aturan seperti yang diberikan.

-16 bytes dengan grepping setelah membentuk output dan mengganti pastedengan ?operator.

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

Cobalah online!


1
Ide yang luar biasa, saya tidak akan pernah memikirkan hal itu. Anda dapat menyimpan beberapa byte dengan menggunakan * sebagai pengganti grepl: tio.run/##PYzLCoMwEEX3/…
JayCe

1
Saya mencari berbagai operator dan Anda datang dengan ?... Saya pikir ini adalah yang pertama. Ngomong-ngomong, saya lupa jika saya sudah memberi tahu Anda, tetapi kami mencoba untuk mendapatkan R dinominasikan untuk bahasa september bulan ini - Anda dapat mengambil alih suara jika belum melakukannya.
JayCe

Saya bisa memilih apa pun dengan prioritas rendah. Rasanya seperti harus ada cara yang lebih baik untuk mendapatkan pertandingan ...
J.Doe

3

Arang , 32 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

F²⊞υ0

Dorong dua string 0ke daftar kosong yang telah ditentukan uuntuk menjalankan loop sementara.

W⁻ζΣIυ

Ulangi sementara jumlah casting nilai-nilai uke integer tidak sama dengan hasil yang diinginkan.

≔E⟦θη⟧

Buat array dari dua input dan petakan di atasnya.

⭆κ⎇⁼μ#‽χμυ

Ganti masing #- masing dengan digit acak dan berikan kembali hasilnya u.

←Eυ⮌ι

Cetak hasilnya dengan benar. (Kiri dibenarkan hanya υuntuk penghematan 4-byte.)



3

05AB1E (warisan), 23 20 byte

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

-3 byte terima kasih kepada @Emigna .

Digit yang tidak dikenal adalah spasi ( ). Urutan input harus: hasil yang diharapkan; string terpanjang; string terpendek.

Cobalah online .

Penjelasan:

[                 # 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
Ganti save 3 di atas if.
Emigna

@Emigna Ah, tentu saja. Terima kasih!
Kevin Cruijssen

3

Perl 6 , 81 74 byte

-7 byte terima kasih kepada nwellnhof!

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

Cobalah online!

Blok kode anonim yang mengambil input sebagai string yang berisi ekspresi aritmatika misalnya "12 # + 45 # = 579". Mengganti masing #- masing dengan kemungkinan permutasi digit, menggantikan= dengan ==dan temukan hasil valid pertama.

Penjelasan:

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

Anda dapat menggunakan S:g[\#]=$a[$++]bukan transuntuk 74 byte .
nwellnhof

@nwellnhof Saya tidak menyadari Anda bisa menggunakan S///sintaks semacam itu! Terima kasih!
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;}

Cobalah online.

Penjelasan:

(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 Bytes berkat @ceilingcat . Saya tidak pernah menggunakanindex sebelumnya.

-10 Bytes terima kasih @Logem . Sihir preprosesor

panggilan refactored ke exit(0) dengan put sebagai 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])));}

Cobalah online!



Anda dapat menyimpan dua byte menggantikan makro -DX=c=index(v, dengan -DX=(c=index(v, tautan TIO di komentar terakhir saya.
Logern

Terima kasih kawan Tidak terlihat seperti saya pernah mencoba golf ini sebelumnya ...
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);}

Port of Java 10 saya jawab .
(Saya sangat berkarat di C # .NET golf, jadi bisa jadi golf ..)

-3 byte secara implisit berkat @ user82593 dan tip C # baru ini tambahnya .
-29 byte terima kasih kepada @hvd .

Cobalah online.

Penjelasan:

(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

Anda dapat menggunakan reguler using System;sebagai gantinya, itu lebih pendek dari namespace System{}.
hvd

@ Hvd Itu dia! .. Saya belum melakukan C # dalam tahun, lol .. Saya mencoba using System.*;mirip dengan impor di Jawa, tapi itu tidak berhasil. Lupa saya harus menghapus .*bagian .. Terima kasih untuk -5 byte.
Kevin Cruijssen

1
Membaca ulang sekarang, itu sebenarnya saran yang kurang optimal. Anda dapat menulis int.Parse(-4), menggunakan new System.Random()(+7) dan menjatuhkan using System;(-13) untuk menyimpan 10 byte lagi. :) Juga, Anda tidak perlu .ToCharArray(), yang melepas 14 byte lebih.
hvd

@ hvd Terima kasih! Tidak yakin bagaimana saya lupa tentang int.Parsevs System.Int32.Parse... Pada dasarnya sama dengan System.Stringdan string.. Dan tidak tahu itu mungkin untuk mengulang karakter tanpa .ToCharArray(). Terima kasih atas -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)

Cobalah online!

+34 Solusi baru dengan regex untuk menghindari fakta bahwa python tidak mendukung angka dengan nol terkemuka.

-3 Terima kasih kepada @Jonathan Frech


Solusi lama tidak berfungsi jika # adalah karakter pertama dalam angka berapa pun (karena eval tidak menerima angka nol di depan) dan karenanya :( tidak valid

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)

Cobalah online!


1
Saya khawatir pengiriman ini tidak valid karena alasan yang tercantum dalam pos.
Erik the Outgolfer

2
Karena fungsi Anda tidak mengandung pernyataan gabungan, Anda dapat memadatkannya menjadi hanya satu baris.
Jonathan Frech

0

PHP, 112 byte

solusi brute force lumpuh

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

mengambil string sebagai input, berhenti pada solusi pertama. Jalankan sebagai pipa dengan -nRatau coba online .


0

Powershell, 91 byte

Script menemukan semua solusi. Jumlah total iterasi adalah 10 kekuatan jumlah karakter #. Kedalaman rekursi sama dengan jumlah karakter #.

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

Skrip uji:

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, 'Asumsikan kedua istilah> 0' wajib, 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)}}}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.