Aritmetik toplamda eksik sayılar


14

Meydan okuma

Bazı eksik sayılarla geçerli bir aritmetik toplamı vererek tam ifadeyi çıktılar.

Misal:

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

Giriş

  • İfade biçimi bir dizi ["1#3", "45#", "579"], bir dize "1#3+45#=579"veya 3 giriş olabilirf("1#3","45#","579")

Çıktı

  • Girişi ile aynı
  • Sonucu çıkarmanıza gerek yok

notlar

  • Eksik sayılar #veya istediğiniz başka bir sayısal olmayan sabit karakter kullanılarak gösterilecektir.
  • Sonuçta eksik bir sayı olmayacağını varsayın
  • Girdi / Çıktının 2 terimden ve bir nihai sonuçtan oluştuğunu varsayın
  • Hem> 0 terimini hem de sonuç> = 2 terimini varsayalım
  • Birden fazla çözüm olabilir. Toplam sonuç eşleştiği sürece herkesi çıktı alabilirsiniz

Muhtemel çıktıları olan Test Durumları (güzel 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

Standart kuralları geçerlidir


Baştaki sıfırları çıkarmamız gerekiyor mu?

@Mnemonic zorunlu olarak
Luis felipe De jesus Munoz

girişleri kenarları =değiştirilmiş olarak alabilir miyim? ör.579=1#3+45#
dzaima

2
"Her iki terimin de> 0 olduğunu var", "her iki terimin de> 0 çıktısını almam gerektiği veya her zaman> 0 ile bir çözüm olduğunu ancak her neyse çıktı olduğunu varsayabileceğim anlamına mı geliyor?
dzaima

1
Ayrıca, eklenen test durumunuz tam olarak ne istediğimi önler - önde gelen sıfırlar
dzaima

Yanıtlar:


9

Brachylog , 22 16 bayt

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

Çevrimiçi deneyin!

@Fatelize sayesinde -6 bayt

açıklama

{Ṣ∧Ị∋|}ᵐ²ịᵐ.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+~t4 bayt daha kısadır. Haritanızda neden bu kadar kıvrımlı bir şey yaptığınızdan emin değilim.
Ağustos'ta

Biz herhangi bir sayısal olmayan karakter kullanabilirsiniz olduğundan, birlikte örneğin boşluk kullanmalısınız yerine "#"iki bayt kurtaracak olan.
Ölümcül

8

JavaScript (ES6), 74 57 bayt

Girdiyi alır (a)(b)(result), burada a ve b. bilinmeyen basamaklar için dizeler ve sonuç bir tamsayıdır. 2 tamsayıdan oluşan bir dizi döndürür.

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

Çevrimiçi deneyin!

Yorumlananlar

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, olan bu. Dün açıklama yapmadan kodunuzu anlamaya çalıştım (ve JS'de kötüyüm), ama neden -~nadil olamadığını n+1ve nasıl F=(c,n)=>kullanıldığını anlamadım . Artık bir açıklama eklediğinize göre, hepsi mantıklı. cüçüncü girdidir, ntanımsızdır (ve farklı ~undefinedhale gelir ). Şimdi hepsi açık (ve ne yazık ki Java için port olabilir bir şey değil, temelde bu yüzden xD anlamaya çalıştım). Not: Dün zaten kaldırılmıştı, bu yüzden diğer cevaplarınızdan birini henüz onayladım (ki zaten oy vermedim, çok fazla kullanılabilir değil ..); p-1undefined+1
Kevin Cruijssen

@KevinCruijssen FWIW, bu konuda birkaç kez önce bir ipucu yazdım . Ama evet ... bu bir JS meselesi ve muhtemelen diğer birçok dilde taşınabilir değil.
Arnauld

Eh, yarı-port olabilir ama sadece özyinelemeli ikinci bir yöntem oluşturmak ve kontrol etmek için bir üçlü-if kullanarak null, el ile dönüştürmek -1. Bununla birlikte, Java'nın (çok) sınırlı bir özyinelemeli StackOverflow sınırı vardır, bu nedenle rasgele bir yöntemle yaklaşık 1024 özyinelemeli çağrılar içinde doğru sonuçlanacağını ümit eden bir özyinelemeli yöntem kullanmak, yine de Java'da çalışmayacaktır. Ah güzel. Bahşişini iptal ettim. İyi hafta sonları! :)
Kevin Cruijssen

@KevinCruijssen İlk JS girişimim tam olarak bunu yapmaktı: özyinelemeli işlevle rastgele değerleri denemek. Ve genellikle bir sayaç kullanandan önemli ölçüde daha az yineleme yapıyordu. Eğlenceli gerçek: için bile ###+###=999, oranlarınız 1000'de 1'dir. Yani 1024 yinelemede, başarısız olduğunuzdan biraz daha başarılı olmalısınız. :)
Arnauld

7

Matlab, 143 134 132 119 115 bayt

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

@Luismendo sayesinde -4 bayt

Çevrimiçi Deneyin


Oldukça büyük ve oldukça aptalca. Bu sadece tüm değiştirir #doğru olanları bulana kadar rasgele basamak ile.


5

R , 67 51 bayt

Basit sallayın ve korkunç bir şekilde ölçeklendirin, sadece tüm toplam kombinasyonlarını grep. "." Kullanın. bilinmeyen basamaklar için. Test davası 4 numaralı ile aynı cevabı bulamaz, ancak verilen kuralların harfini takip eden olası bir cevap verecektir .

Çıktı oluşturulduktan ve operatör pasteile değiştirildikten sonra selamlanarak -16 bayt ?.

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

Çevrimiçi deneyin!


1
Harika bir fikir, bunu asla düşünemezdim. Grepl yerine * kullanarak birkaç bayt kaydedebilirsiniz: tio.run/##PYzLCoMwEEX3/…
JayCe

1
Çeşitli operatörler arıyordum ve siz de sizlerle birlikte ?... Sizce bu bir ilk. Bu arada, size daha önce söylemiş olup olmadığımı unuttum, ancak ayın Eylül dili için R'ye aday göstermeye çalışıyoruz - daha önce yapılmadıysa oylayabilirsiniz.
JayCe

Düşük öncelikli bir şey seçebilirdim. Maçı almak için daha iyi bir yol olmalı gibi görünüyor ...
J.Doe

3

Kömür , 32 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. Açıklama:

F²⊞υ0

While döngüsünü başlatmak için iki dizeyi 0s önceden tanımlanmış boş listeye itin u.

W⁻ζΣIυ

Değerlerin utamsayıya dökülmesi toplamı istenen sonuca eşit değilse tekrarlayın .

≔E⟦θη⟧

İki girişten oluşan bir dizi oluşturun ve eşleyin.

⭆κ⎇⁼μ#‽χμυ

Her birini #rastgele bir rakamla değiştirin ve sonucu tekrar atayın u.

←Eυ⮌ι

Sonuç doğru olarak yazdırın. (Sola yaslanmış sadece υ4 baytlık bir tasarruf için olurdu .)



3

05AB1E (eski), 23 20 bayt

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

-3 bayt sayesinde @Emigna .

Bilinmeyen basamaklar boşluktur ( ). Girdi sırası şöyle olmalıdır: beklenen sonuç; en uzun dize; en kısa dize.

Çevrimiçi deneyin .

Açıklama:

[                 # 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
Değiştir, 3'ü if üzerine kaydeder.
Emigna

@Emigna Ah, elbette. Teşekkürler!
Kevin Cruijssen

3

Perl 6 , 81 74 bayt

Nwellnhof sayesinde -7 bayt!

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

Çevrimiçi deneyin!

Aritmetik bir ifade içeren bir dizgi olarak girdi alan anonim kod bloğu, örneğin "12 # + 45 # = 579". Her birini #olası basamak permütasyonları ile değiştirir, =ile değiştirir ==ve ilk geçerli sonucu bulur.

Açıklama:

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

Sen kullanabilirsiniz S:g[\#]=$a[$++]yerine transiçin 74 bayt .
nwellnhof

@nwellnhof S///Bu tür bir sözdiziminde kullanabileceğinizin farkında değildim ! Teşekkürler!
Jo King


2

Java 10, 203 198193 bayt

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

Çevrimiçi deneyin.

Açıklama:

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

@15ilingcat sayesinde -15 Bayt . Daha önce hiç kullanmadım index.

@Logem sayesinde -10 Bayt . Önişlemci büyüsü

exit(0)parametre olarak puts ile refactored call .

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

Çevrimiçi deneyin!



İki bayt makro yerine kaydedebilirsiniz -DX=c=index(vile -DX=(c=index(vbenim son açıklamada TIO bağlantısını.
Logern

Teşekkürler beyler. Daha önce golf oynamaya bile çalışmış gibi görünmüyor ...
cleblanc

1

C # NET, 225 220 196 bayt

(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 benim Java 10 cevap .
(C # .NET golf çok paslı, bu yüzden kesinlikle golf olabilir ..)

@ User82593 ve bu yeni C # ipucu sayesinde dolaylı olarak -3 bayt ekledi . @Hvd .
Sayesinde -29 bayt .

Çevrimiçi deneyin.

Açıklama:

(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

Bunun using System;yerine normal kullanabilirsiniz , daha kısadır namespace System{}.
hvd

@hvd Öyle oldu! .. Yıllardır C # yapmadım, lol .. using System.*;Java ithalatı gibi denedim , ama işe yaramadı. .*Parça kaldırmak zorunda unuttum .. -5 bayt için teşekkürler.
Kevin Cruijssen

1
Şimdi tekrar okumak, bu aslında en uygun olmayan bir öneriydi. Başka bir 10 bayt kaydetmek için int.Parse(-4) yazabilir , new System.Random()(+7) kullanabilir ve bırakabilir using System;(-13). :) Ayrıca, ihtiyacınız yok .ToCharArray(), bu 14 bayt daha alır.
Hvd

@hvd Teşekkürler! Emin değilim unuttuk nasıl int.Parsevs System.Int32.ParseSanki temelde aynı olduğunu ... System.Stringve string.. Ve olmadan karakterden daha uzun döngü mümkün olduğunu biliyordum vermedi .ToCharArray(). Başka bir -24 bayt için teşekkürler. : D
Kevin Cruijssen

1

Piton 3 , 121 155 152 149 bayt

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)

Çevrimiçi deneyin!

+34 Python'un başında sıfır olan sayıları desteklememesini önlemek için regex ile yeni bir çözüm.

@Jonathan Frech sayesinde -3 teşekkürler


# Herhangi bir sayıdaki ilk karakter ise (eval baştaki sıfırları kabul etmediğinden) ve bu nedenle geçersizse, eski çözüm çalışmaz:

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)

Çevrimiçi deneyin!


1
Korkarım bu gönderi yazıda belirtilen nedenden dolayı geçersiz.
Outgolfer Erik

2
İşleviniz bileşik ifadeler içermediğinden, ifadeyi yalnızca bir satıra yoğunlaştırabilirsiniz.
Jonathan Frech

0

PHP, 112 bayt

topal kaba kuvvet çözümü

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

dizgiyi girdi olarak alır, ilk çözümde durur. Pipo ile çalıştırın -nRveya çevrimiçi deneyin .


0

Powershell, 91 bayt

Komut dosyası tüm çözümleri bulur. Toplam yineleme sayısı karakter sayısı 10 güçtür #. Özyineleme derinliği karakter sayısına eşittir #.

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

Test komut dosyası:

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, 'Her iki terimi de> 0 kabul et' zorunludur, 110 bayt

filter f{$h,$t=$_-split'#',2
if($t){0..9|%{"$h$_$t"}|f}else{$a,$b,$c=$_-split'\D'
$_|?{+$a*+$b*!(+$a+$b-$c)}}}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.