Toplamı, ürünü ve iki sayı arasındaki farkı birleştiren operatör


28

Meydan okuma:

Okur sosyal ağlarda dolaşan aptalca bir bulmaca var:

8 + 2 = 16106
5 + 4 = 2091
9 + 6 = ?

Bir fonksiyon veya operatör uygulanması iki pozitif tam sayı verildiğinde, bu xve ybu şekilde x > y > 0, bir şekilde doğru yanıt veren tamsayı cevabım hane basamak vardır, x * ybasamak ardından x + ybasamak takip x - y. Çok basit.

Kurallar:

  • Standart boşluklara izin verilmez.
  • Bu yani bayt cinsinden en kısa kod kazanır.
  • Giriş verisi doğrulama gerekli değildir . Bu program geçersiz girdi verildiğinde çökebilir veya geri dönebilir.
  • Sayısal işlevler ve işleçler kullanmanıza izin verilir (tam sayı ve kayan nokta, matematik kitaplığı işlevleri ve sayıları kabul edip döndüren diğer işlevler dahil).
  • Varsa, bir sayının basamağını döndüren bir işlev kullanmanıza izin verilir.
  • Sen ediyoruz değil dizeleri veya kodunuzda birleştirme her yerde her türlü kullanmasına izin.
  • Sonuç, hangi dilde geçerli olursa, yığına iade edilebilir veya itilebilir. Sonuç bir dize değil tam sayı olmalıdır.

Basit kod:

Dyalog APL :

Aşağıdaki kod adında bir dyadic işleci oluşturur X.

X ← {(⍺-⍵) + ((⍺ + ⍵) x 10 x 1 + ⌊10⍟⍺-⍵) + ⍺ x ⍵ * 10 * (2 + ⌊10⍟⍺ + ⍵) + ⌊10⍟⍺- ⍵}

Açıklama:

  • APL'de sağdan sola doğru değerlendirirsiniz.

  • ⍺ and ⍵ sırasıyla sol ve sağ işlenen

  • ⌊10⍟⍺-⍵okur: floor of log10(⍺-⍵). İlk önce çıkarma işlemi, ardından logaritma sonra döşeme. Sağdan sola doğru. log10, rakamlarını saymak için yapılır ⍺-⍵(daha sonra 1 toplamalısınız).

  • ⍺×⍵×10*(...) okur: 10 to the (...)th power, multiplied by ⍵, multiplied by ⍺

  • Bu nedenle, ⍺×⍵×10*(2+⌊10⍟⍺+⍵)+⌊10⍟⍺-⍵toplam sayı ve fark sayısının toplamı ile sola kaydırılan üründür. 10'luk bir güçle çarpmak bir tamsayı sola kaydırır.

  • ((⍺+⍵)×10*1+⌊10⍟⍺-⍵) farkın basamak sayısı ile sola kayan toplamdır.

  • (⍺-⍵)fark. Burada kaydırma gerekmez.

  • X←{...} APL'de bir işleci nasıl tanımladığınızdır.

Örnekler:

      8 X 2
16106
      5 X 4
2091
      9 X 6
54153

GNU dc:

Aşağıdaki kod adlı bir makro oluşturur a:

[sysx10lxly-dseZdsclxly+dsd+Z1+^lxly**10lc^ld*+le+]sa

Açıklama:

  • sxve sybir öğeyi yığından çıkarın ve kayıtlara xve ysırasıyla kaydedin .

  • lxve lybir elemanı kayıt defterlerinden yükleyin xve ysırasıyla istifin üzerine itin.

  • d yığındaki son öğeyi çoğaltır.

  • ^ İki sayının gücünü hesaplar.

  • ZBir sayı açar ve sayı sayısını döndürür. Bu yapılır çünkü dclogaritma fonksiyonu yoktur.

  • [...]saMakroyu kayıt defterinde saklar a. layükler. xMakroyu yığının en üstünde yürütür.

Örnekler:

8 2 laxn
16106
5 4 laxn
2091
9 6 laxn
54153

Tamsayıdan dize dönüşüm geçersiz olduğunu kabul ediyorum?
— Anthony Pham

2
Sanırım buna benzer bir zorluk yaşadık ama hangi terimlerin dupe'yi bulacağını bilmiyorum.
— xnor

2
@AnthonyPham "Kodunuzda hiçbir yerde dizeleri veya herhangi bir birleştirme özelliğini kullanamazsınız."
— ASCII-sadece

1
Girdi olarak bir çift tamsayı alabilir miyiz?
— Conor O'Brien,

1
İşlev yerine tam bir program yapabilir miyim?
— Outgolfer Erik,

Yanıtlar:


10

JavaScript (ES7), 63 61 59 bayt

Neil sayesinde 4 byte kurtarıldı .

(a,b)=>[a*b,a+b,a-b].reduce((p,c)=>p*10**-~Math.log10(c)+c)

<input id=a type=number oninput="c.innerText=((a,b)=>[a*b,a+b,a-b].reduce((p,c)=>p*10**-~Math.log10(c)+c))(+a.value,+b.value)">
<input id=b type=number oninput="c.innerText=((a,b)=>[a*b,a+b,a-b].reduce((p,c)=>p*10**-!Math.log10(c)+c))(+a.value,+b.value)">
<p id=c>


Kullanarak birkaç bayt kaydedin 10**-~Math.log10(c). (Ancak kullanmak için +1 reduce, elbette.)
— Neil

"ES7" Oh, kodlama aşkı için ... Başka bir tane mi yapıyorlar?
— Feathercrown

@Teathercrown Evet, ama "Java 9" u duymaktan gerçekten daha mı kötü? Artı kullanışlı gibi şeyler vardır async/ awaitve üs alma operatörü**
— ASCII sadece

@ ASCII-sadece **gerçekten yararlı, katılıyorum. ES6'da olmalıydı.
— Feathercrown


6

Bash, 66

  • @Chepner sayesinde 2 bayt kaydedildi.
f()(s=$[$1+$2]
d=$[$1-$2]
echo $[($1*$2*10**${#s}+s)*10**${#d}+d])

Çevrimiçi deneyin .


Değişkenlerinizi (s, d ve diğerini tanımlamadığınız çarpma için) yan yana yerleştirirseniz ve bunu aritmetik bir ifade olarak değerlendirirseniz, bunu neredeyse iki kat daha kısa yapmak mümkündür.
— Maxim Mikhaylov

3
@MaxLawnboy Evet, bu yasaklanmış dize bitiştirme gibi bana çok benziyor.
— Dijital Travma

1
Tanıtıcı isimleri içeride $[...]açık olmadan parametre genişleme tabidir $(örn dyerine $diki karakter tasarruf).
— chepner

@chepner yep - teşekkürler - Onları özlemiştim.
— Dijital Travma

Başka iki tane buldum; ((s=$1+$2,d=$1-$2))iki değişkeni intialize etmek için kullanın .
— chepner

5

EXCEL, 61 Bayt

=A1-B1+(A1+B1)*10^LEN(A1-B1)+A1*B1*10^(LEN(A1-B1)+LEN(A1+B1))

Excel, 18 Bayt geçerli değil

=A1*B1&A1+B1&A1-B1

5

Yığılmış , 36 bayt

,@A$(*+-){!A...n!}"!{%y#'10\^x*y+}#\

Çevrimiçi deneyin!

Önceden: ,@A$(-+*){!A...n!}"!:inits$#'"!$summap:pop@.10\^1\,\*sum

Bir açıklama yazmadan önce bir veya iki byte sıkmaya çalışacağım. ( #'= büyüklüğü ve ""her biri üzerinde", burada ekli dizeler yok.)

26 bayt rakip olmayan: $(*+-)#!!:{%y#'10\^x*y+}#\.



4

GNU dc, 36

mYığının en üstteki iki üyesini alan bir makro tanımlar, makroyu uygular ve sonucu yığına bırakır (söz konusu örnekte olduğu gibi):

[sadsbla-dZAr^lalb+*+dZAr^lalb**+]sm

Çevrimiçi deneyin .



3

Jöle , 27 bayt

+,ạ,.1Fl⁵Ḟ‘€Ṛ+\⁵*
ạ,+,×Fæ.ç

İle çağrılabilir bir ikili bağlantı / işlev tanımlar ç. Giriş olarak iki tamsayı alır ve bir tamsayı döndürür. Mutlak fark kullanarak x <y ya da x >y alabilen ek bir avantaja sahiptir .

Çevrimiçi deneyin!

Açıklama:

+,ạ,.1Fl⁵Ḟ‘€Ṛ+\⁵* -- Create link which computes what order of magnitude
                        to multiply the difference, sum, and product by
ạ,+,×Fæ.ç         -- Main link, applies this using dot product

Detaylar:

+,ạ,.1Fl⁵Ḟ‘€Ṛ+\⁵* -- Create dyadic like which does the following:
       l⁵Ḟ‘       -- Create operation which computes number of digits
                       (log base 10 (⁵ is the literal 10), floored, incremented)
           €      -- Apply this to each element in
+,ạ,.1F           -- ... the list [sum,difference,.1]
            R     -- Reverse the list
             +\   -- Add up first n elements to get list.
               ⁵* -- Raise 10 (⁵ is literal 10) to the power of each element

ạ,+,×Fæ.ç         -- Main link, applies above link
ạ,+,×F            -- The list [difference, sum, product]
      æ.          -- Dot product (multiply corresponding elements) with
        ç         -- The above link.

2

PHP, 79 75 bayt

iki versiyon:

[,$a,$b]=$argv;echo(10**strlen($s=$a+$b)*$a*$b+$s)*10**strlen($d=$a-$b)+$d;
[,$a,$b]=$argv;echo(10**strlen($a+$b)*$a*$b+$a+$b)*10**strlen($a-$b)+$a-$b;

komut satırı argümanlarından girdi alır; ile koş -r.

Sanırım strlen, "basamak sayısını döndürür fonksiyonu" olarak bunun yeterli olduğunu
, bir dize olarak numarasını kullanır rağmen. Olmazsa haberim olsun.


'Kodunuzun herhangi bir yerinde dizeleri veya herhangi bir birleştirme özelliğini kullanamazsınız', bu nedenle strlengeçerli olduğunu sanmıyorum .
— numbermaniac

@ sayı_maniac OP karar versin. Kısıtlama, çözümleri birbiri ardına sadece üç sonuç yazdırmak yerine bir sonuç yaratmaya zorlamaktı . Bunun ötesindeki her şey nitpicking.
— Titus

2

C (gcc) , 70 bayt

#define _ for(c=1;a+b>=(c*=10););d=c*d+a-(b=-b);
c,d;f(a,b){d=a*b;_ _}

Çevrimiçi deneyin!

Steadybox cevabını temel alan , biraz daha golf oynamak için her şeyi bir makroya koyarak.

(Not: sonucu işler dyerine abeklenmedik bir şekilde atama . Oluşturulan derleme koduna baktım ve sorun yok gibi görünüyor.)


2

Haskell, 54 bayt

a%0=a
a%b=10*a%div b 10+mod b 10
a#b=(a*b)%(a+b)%(a-b)

Bulmacanın bir ekleme işlevi aracılığıyla uygulandığı #, örneğin 8#2 = 16106. Diğer fonksiyon, %baz-10 birleştirmeyi tanımlar (RHS'nin 0'dan büyük olduğu varsayılarak).



1

PHP, 87 Bayt

[,$a,$b]=$argv;echo($s=$a-$b)+($t=$a+$b)*10**($l=strlen($s))+$a*$b*10**($l+strlen($t));

ve 37 Bayt için geçerli olmayan bir çözüm

[,$a,$b]=$argv;echo$a*$b,$a+$b,$a-$b;

1

Ruby, 61 bayt

->a,b{[a*b,a+b,a-b].reduce{|x,y|z=y;x*=10while(z>z/=10);x+y}}

Şüpheli bir şekilde bu Javascript cevap gibi görünüyor , ancak bir logaritma kullanmadan.


1

Python, 92 91 Karakter

def g(x,y):
    l=lambda x,i=0:l(x/10,i+1)if x else 10**i
    a=x-y
    a+=(x+y)*l(a)
    return x*y*l(a)+a

Sihirbazlar önerisi sayesinde;)


Siteye Hoşgeldiniz! Sen arasında boşluk gerekmez )ve if.
— Buğday Sihirbazı,

1

R (3.3.1), 104 bayt

function(x,y)Reduce(function(p,q)p*10^(floor(log10(q)+1))+q,lapply(c(`*`,`+`,`-`),function(z)z(x,y)),0)

isimsiz bir işlev döndürür.

Bu benim ilk golf denemem, bu yüzden herhangi bir geri bildirim için teşekkür ederiz.


1
Mümkünse çok fazla bayt kullanır. Sadece hesaplamayı yap.
— user11599

0

REXX, 70 bayt

f:arg a b
c=a-b
c=(a+b)*10**length(c)+c
c=a*b*10**length(c)+c
return c

Tabii ki, doğal yol çok daha kısa olurdu:

f:arg a b
return a*b||a+b||a-b

0

PowerShell, 88 Bayt

param($x,$y)$l=2;if(($a=$x+$y)-gt9){$l++};($x*$y)*[math]::Pow(10,$l)+$a*10+$x-$y

PowerShell, yardımcı olmayan bir operatöre sahip değildir. Ayrıca yapamadığımız bir dize olarak sayılmazsanız, bir tamsayının uzunluğunu sayamazsınız, bu yüzden -gtuzunluğu öğrenmek için 9 olup olmadığını kontrol ederim . Muhtemelen daha özlü olabilirdi ama işe geri dönmem gerekiyor.


0

Python 2.7, 109 96 bayt

import math
a=lambda n:10**int(math.log10(10*n))
b,c=input()
d=b-c+(b+c)*a(b-c)
print d+b*c*a(d)

Yarışma kurallarına uyarak düzeltildi. Kodu 109 bayttan 96 bayta indiren mbomb007 için krediler


1
Bu meydan okuma kurallarından -•You're not allowed to use strings or any kind of concatenation anywhere in your code.
— AdmBorkBork

aBir lambda yaparak bazı baytları kaydedebilirsiniz . a=lambda n:10**int(.... Ayrıca b,c=input()iki girişinizi virgülle ayırarak yapabilirsiniz.
— mbomb007

@ mbomb007 b, c = input (), TypeError değerini verir: 'int' nesnesi yinelenemez. Denedim. Ve lambda işlevi bayt kurtarmaz çünkü kodu iki kez çağırıyorum. Bunu da denedim. :(
— Koishore Roy

@KoishoreRoy Ne demek istediğimi aldığını sanmıyorum. 96 bayt
— mbomb007

0

J , 25 bayt

X=.10#.[:;10#.inv&.>*;+;-
  1. *;+;- Her işlemin sonuçlarını kutulayın.
  2. 10#.inv&.>Her sonucu bir 10 basamaklık basamak dizisine dönüştürün. ( involup^:_1 )
  3. [:; Kutuyu kaldırın ve dizilere katılın.
  4. 10#. Temel 10 basamak dizisini bir tamsayıya dönüştürün.
  5. X=. yukarıdakileri operatör olarak tanımlayın X .

Sonuçlar:

   8 X 2
16106
   5 X 4
2091
   9 X 6
54153

Buna gerek yokX=.
— Cyoce

@Cyoce - meydan okumadaki örnek APL kodu bir işleci tanımlar. Bu meydan okuma için tekrar kullanılabilir bir operatör tanımlamamız gerektiğinden eminim.
— Dane

"3. [:; Kutuyu kaldır ve dizilere katıl." - "Kodunuzda hiçbir yerde dizeleri veya herhangi bir birleştirme özelliğini kullanamazsınız."
— ngn

@ngn - Lütfen yorumunuzu genişletin. Hiçbir noktada dizeler kullanılmaz.
— Dane

Ben sadece "join" ("link"?) 'İn "tür bir birleşme" olabileceğini, ancak J'yi çok iyi tanımadığımı ve bu durumda sorun bildiriminin nasıl yorumlanacağından emin olamadığımı belirtmek istedim. . Kendi çözümüm de benzer soruları ortaya koyuyor - J 'nin "bağlantısı" ile aynı olabilen ama onu temsil edecek bir glif olmadan, yabancılaşmayı (APL'de isimlerin yan yana gelmesi bir vektör oluşturur) kullanıyorum.
— ngn

0

Mathematica, 67 bayt

c=Ceiling;l=Log10;#-#2+(#+#2)10^(c@l[#-#2]/. 0->1)+10^c@l[2#]10#2#&

Alır x-y, daha sonra log'unu alır10 x-y, onu yuvarlar, gücünü 10 ile hesaplar ve sonra ile çarpar x+y. Ama aynı zamanda log10(x-y)0 olmayı da düşünmeliyiz , bu yüzden 0'ı 1 ile değiştirelim. Daha sonra log10'u 2x, yuvarlatılmış, artı 1'i alırız ve bunun gücüne 10 buluruz. Şununla çarpın xyve ekleyin.


0

05AB1E , 23 22 16 bayt

-Dg°¹²+*Dg°¹²**O

Çevrimiçi deneyin!

"-+*"Her işlem için gerçekleştirilen kod aynı olduğundan, işlemleri içeren bir dize üzerinde döngü kullanarak programda (ancak hesaplamalarda değil) dizeleri kullanmamıza izin verilirse, birkaç bayt tasarruf edebilirdik .
Elbette, birleştirme kullanmamıza izin verilirse, çok daha fazla tasarruf elde ederiz.


0

R, 64 bayt

x=scan();(b=(a=diff(-x))+10^nchar(a)*sum(x))+10^nchar(b)*prod(x)

Kullanımı:

> x=scan();(b=(a=diff(-x))+10^nchar(a)*sum(x))+10^nchar(b)*prod(x)
1: 8 2
3: 
Read 2 items
[1] 16106
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.