Sınırlı işlemlerle çarpma


44

Bir var 500 rep gayri resmi ödül döven mevcut en iyi cevabı .

Hedef

Amacınız, yalnızca çok sınırlı bir aritmetik işlem kümesi ve değişken ataması kullanarak iki sayıyı çarpmak.

  1. İlave x,y -> x+y
  2. Karşılıklı x -> 1/x( bölünme değilx,y -> x/y )
  3. Olumsuzluk x -> -x( çıkarma değilx,y -> x-y , iki işlem yapmanıza rağmen x + (-y))
  4. Sabit 1(işlemlerin ürettiği durumlar dışında başka sabitlere izin verilmez 1)
  5. Değişken atama [variable] = [expression]

Puanlama: Değerler değişkenlerde başlar ave b. Amacınız , mümkün olduğu kadar az işlem kullanarak ürünlerini a*bdeğişkene kaydetmek c. Her işlem ve ödev +, -, /, =bir puan alır (eşdeğer olarak, (1), (2), (3) veya (4) 'ün her kullanımı). Sabitler 1ücretsizdir. En az sayıdaki çözüm kazanır. Tiebreak en eski yazıdır.

Ödenek: Sizin ifadesi "rastgele" reals aritmetik olarak doğru olmak zorundadır ave b. Bu ölçer sıfır alt-başarısız olabilir R 2 , grafiksel olarak, eğer bir alana sahiptir, yani, bir dizi a- bKartezyen düzlemde. (Bunun nedeni olabilir ifadelerin tersinin için gerekli olması muhtemeldir 0gibi 1/a.)

Dilbilgisi:

Bu bir . Başka hiçbir işlem kullanılamaz. Özel olarak, bu, fonksiyon, koşul, döngü veya sayısal olmayan veri tipleri anlamına gelmez. İşte izin verilen işlemler için bir gramer (olasılıklar ile ayrılmıştır |). Bir program, aşağıdaki gibi verilen <statement>bir s dizisidir <statement>.

<statement>: <variable> = <expr>
<variable>: a | b | c | [string of letters of your choice]
<expr>: <arith_expr> | <variable> | <constant>
<arith_expr>: <addition_expr> | <reciprocal_expr> | <negation_expr> 
<addition_expr>: <expr> + <expr>
<reciprocal_expr>: 1/(<expr>)
<negation_expr>: -<expr>
<constant>: 1

Ne yaptığınız ve işlem sayınızın doğru olduğu açık olduğu sürece, aslında tam olarak bu dilbilgisine kod göndermek zorunda değilsiniz. Örneğin, yazabilir a-biçin a+(-b)ve iki operasyonlar gibi saymak veya kısalık için makro tanımlar.

(Önceki bir çarpma olmadan Çarpma sorusu vardı , ancak daha gevşek bir işlem kümesine izin verdi.)


4
Bu mümkün mü?
Ypnypn

1
@Ypnypn Evet ve emin olmak için bir örnek yazdım.
xnor

2
Bu, (herhangi bir çözüm bulunduktan sonra) en uygun çözümün bulunmasının muhtemel olduğu bir meydan okumaya benzer. Peki bu durumda kravat kırıcı nedir?
Martin Ender

1
@ MartinBüttner Tiebreak, bu durumda en erken gönderme yapıyor. İyileştirmeler için yeterli alan olduğunu düşünüyorum, bu yüzden işe yarayan ve onu temiz bir şekilde yazmanın bir yarış olacağını sanmıyorum. En azından, denemede bulduğum şey bu; belki birileri açıkça minimal bir çözüm bulabilir.
xnor

2
Tamam, herkes benim anwer'in benim kadar komik olduğunu düşünmemişti, onu sildim ve burada yorumladım: Sıfır ölçü ölçüsü ile ilgili kural çok akıllıca seçilmedi çünkü rasyonel sayılar, leb ölçü birimi ile ilgili sıfır ölçü ölçüsü, bunun yerine belirli bir yüzdeyi kullanarak. (Ya da başka bir tür) Ama bu meydan okuma fikrini tamamen sevdim!
kusur

Yanıtlar:


34

22 işlem

itx = 1/(1+a+b)     #4
nx = -1/(itx+itx)   #4
c = -( 1/(itx + itx + 1/(1+nx)) + 1/(1/(a+nx) + 1/(b+nx)) ) #14

Çevrimiçi deneyin!

Seçmeler 10 ekleme, 7 ters, 2 olumsuzlama ve 3 ödevdir.

Peki bunu nasıl öğrendim? Daha önce birçok denemede ortaya çıkan bir motif olan iki katlı katlı kesimin toplamının gelecek vaat eden görünüşü ile başladım.

c = 1/(1/x + 1/y) + 1/(1/z + 1/w)

Toplamı sınırladığımızda, x+y+z+w=0güzel bir iptal olur ve aşağıdakileri yapar:

c = (x+z)*(y+z)/(x+y),

bir ürün içerir. ( Birincisi 1. derece olduğu için t*u/valmaktan çok daha kolaydır t*u.)

Bu ifade hakkında düşünmenin daha simetrik bir yolu var. Kısıtlama ile x+y+z+w=0, değerleri p,q,rçift ​​toplamlarının üç parametresi ile belirtilir .

 p = x+y
-p = z+w
 q = x+z
-q = y+w
 r = x+w
-r = y+z

ve biz var c=-q*r/p. Toplam p, çiftler (x,y)ve (z,w)aynı fraksiyondaki değişkenlerin karşılığı olarak paydada olduğu gibi ayırt edilir .

Bu güzel bir ifadesidir cin p,q,r, ancak çift katlı fraksiyon olduğunu x,y,z,wbiz ikinci açısından eski ifade olmalıdır böylece:

x = ( p + q + r)/2
y = ( p - q - r)/2
z = (-p + q - r)/2
w = (-p - q + r)/2

Şimdi, biz seçmek istiyoruz p,q,rki c=-q*r/peşittir a*b. Bir seçenek:

p = -4
q = 2*a
r = 2*b

Ardından, için iki katına çıkan değerler qve rbunlar uygun şekilde yarı yarıya:

x = -2 + a + b
y = -2 - a - b
z =  2 + a - b
w =  2 - a + b

2Bir değişken olarak kaydetmek tve bunları denklem içine sokmak c24-op bir çözüm sunar.

#24 ops
t = 1+1   #2
c = 1/(1/(-t+a+b) + 1/-(t+a+b))  +  1/(1/(-b+t+a) + 1/(-a+b+t)) #1, 10, 1, 10

12 ekleme, 6 ters, 4 olumsuzlama ve 2 ödev var.

Ops Bir çok ifade harcanan edilmektedir x,y,z,waçısından 1,a,b. Op kaydetmek için, bunun yerine ifade xiçinde p,q,r(ve dolayısıyla a,b,1) ve daha sonra yazma y,z,waçısından x.

y = -x + p
z = -x + q
w = -x + r

seçme

p = 1
q = a
r = b

ve cbir olumsuzlama ile ifade c=-q*r/pedersek,

x = (1+a+b)/2
y = -x + 1
z = -x + a
w = -x + b

Ne yazık ki, yarıya indirmek xpahalı. Bunun tersine çevrilerek, sonucu kendisine ekleyerek ve tekrar ters çevirerek yapılması gerekir. Biz de inkâr üretmek nxiçin -xne anlama beri, y,z,wkullanım. Bu bize 23-op çözüm sunar:

#23 ops
itx = 1/(1+a+b)     #4
nx = -1/(itx+itx)   #4
c = -( 1/(1/(-nx) + 1/(1+nx))  +  1/(1/(a+nx) + 1/(b+nx)) ) #15

itx1 / (2 * x) ve ' nxdir -x. Son bir ifade optimizasyonu 1/xolarak itx+itxyerine şablon 1/(-nx)bir karakter keser ve 22 ops çözüm aşağı getiriyor.


21 işlem için kolay bir optimizasyon var. itx + itxiki kez meydana gelir, ancak itxbaşka bir bağlamda gerçekleşmez. Bunun yerine tanımlayın ix = (1+1)/(1+a+b)ve iki ilaveyi bir ile değiştirin.
Peter Taylor

Ve ayıklayarak m = -120 almak mümkündür:nx = (1+a+b)/(m+m); c = m/(m/nx + 1/(1+nx)) + m/(1/(a+nx) + 1/(b+nx))
Peter Taylor

3
Ah, bu optimizasyonların her ikisi de başarısız oluyor çünkü desteklenen operasyon bölünme yerine karşılıklı.
Peter Taylor,

Eğer ave bsadece bir tane varsa , ya o zaman ya a + nx = 0da b + nx = 0, çözümünüzün sıfıra bölünmesine neden olur.
MooseOnTheRocks

1
@MooseOnTheRocks Sorun değil, kodun sıfır ölçü alt kümesinde başarısız olabileceği mücadelesinde "ödeneği" görün. Bence bu zorluğun imkansız olduğunu düşünüyorum.
xnor

26

23 işlem

z = 1/(1/(1/(1/(a+1)+1/(b+1))-1+1/(a+b+1+1))-(1/a+1/b))
res = z+z

patlama kanıtı:

z = 1/(1/(1/(1/(a+1)+1/(b+1))-1+1/(a+b+1+1))-(1/a+1/b))
             1/(a+1)+1/(b+1)                            == (a+b+2) / (ab+a+b+1)
          1/(1/(a+1)+1/(b+1))                           == (ab+a+b+1) / (a+b+2)
          1/(1/(a+1)+1/(b+1))-1                         == (ab - 1) / (a+b+2)
          1/(1/(a+1)+1/(b+1))-1+1/(a+b+1+1)             == ab / (a+b+2)
       1/(1/(1/(a+1)+1/(b+1))-1+1/(a+b+1+1))            == (a+b+2) / ab
                                              1/a+1/b   == (a+b) / ab
       1/(1/(1/(a+1)+1/(b+1))-1+1/(a+b+1+1))-(1/a+1/b)  == 2 / ab
    1/(1/(1/(1/(a+1)+1/(b+1))-1+1/(a+b+1+1))-(1/a+1/b)) == ab / 2

z = ab / 2 and therefore z+z = ab

Bu güzel görüntüyü elde etmek için wolfram alpha kötüye kullandım (wolfram alpha, kaydetmek için pro üyeliğimi almaya çalıştı ama sonra ctrl-c ctrl-v ;-)):

puan ( +çıkarma eklendiğinde ):

z = ////++/++-+/++++-/+/
res = +

En kısa çözüm için tebrikler!
xnor

@xnor bana ilk kabul edilen cevabımı ve ilk ödülümü verdiğin için teşekkürler!
Gurur haskeller 11:14

Nitelikli olmamalı, ancak olmamalı ... (b + 1)) - 1 + 1 ... ve ... 1)) - (1 / a + ... ol ... (b + 1 )) + - 1 + 1 ... ve ... 1)) + - (sırasıyla 1 / a + ...?
tfitzger

@tfitzger Ben bu şekilde daha kolay olduğunu düşünüyorum. Soru önemli olmadığını söylüyor. Not Skoru doğru sayıyorum (Her eksi ikidir)
Gururlu haskeller

Wolfram Alpha 7 günlük ücretsiz deneme süresine sahip.
ghosts_in_the_code

13

29 işlem

{(A, b) kümesi için çalışmaz ∈ R 2 | a + b = 0 veya a + b = -1 veya ab = 0 veya ab = -1}. Muhtemelen sıfır ölçmek?

sum = a+b
nb = -b
diff = a+nb
rfc = 1/(1/(1/sum + -1/(sum+1)) + -1/(1/diff + -1/(diff+1)) + nb + nb)  # rfc = 1/4c
c = 1/(rfc + rfc + rfc + rfc)

# sum  is  2: =+
# nb   is  2: =-
# diff is  2: =+
# rfc  is 18: =///+-/++-//+-/+++
# c    is  5: =/+++
# total = 29 operations

Yapısı rfcbir makro tanımlarsak (Karşılıklı-dört-C) daha belirgindir:

s(x) = 1/(1/x + -1/(x+1))              # //+-/+ (no = in count, macros don't exist)
rfc = 1/(s(sum) + - s(diff) + nb + nb) # =/s+-s++ (6+2*s = 18)

Hadi matematik yapalım:

  • s(x)matematiksel olarak, 1/(1/x - 1/(x+1))biraz cebirden sonra olan x*(x+1)veya x*x + x.
  • Her şeyi içine soktuğun zaman rfc, gerçekten 1/((a+b)*(a+b) + a + b - (a-b)*(a-b) - a + b + (-b) + (-b))olan bu 1/((a+b)^2 - (a-b)^2).
  • Kareler, ya da sade genişleme farkı sonra, o olsun rfcolduğunu 1/(4*a*b).
  • Son olarak, c4 kez tersidir rfc, öyle 1/(4/(4*a*b))olur a*b.

2
+1, bu özdeş hesaplamayı bitiriyordum
Eric Tressler

1
Bu kesinlikle sıfır ölçüyor; bu bir çizgiler birliği.
xnor

Satırların birleşimi hakkında yorum yapmayacaksın ... @algorithmshark Bize bu kimliğe nasıl ulaştığınızı daha fazla anlatabilir misiniz? Sorunu nasıl yakladınız?
kusur

1
@flawr s(x), hesabın sorusunun gereksinimlerine uygun özelliklerin hesaptan yapıldığını hatırladım , bu yüzden kare bir işlevim vardı. Bazı tüyler ürperten sonra a*bkareler hilesiyle bir terim bulabileceğimi öğrendim . Bunu yaptıktan sonra, hangi görevlerin operasyonları kurtardığını denemek meselesiydi.
algoritmshark

-1Üç defa rfciçeri kullandığınızdan , onu bir değişkene atayarak bir karakter atamadı mı?
isaacg 02:14

9

27 işlem

tmp = 1/(1/(1+(-1/(1/(1+(-a))+1/(1+b))))+1/(1/(1/b+(-1/a))+1/(a+(-b))))
res = tmp+tmp+(-1)

# tmp is 23: =//+-//+-+/++///+-/+/+-
# res is 4: =++-

Bunun arkasında teori yok. Sadece almaya çalıştı (const1+a*b)/const2ve ile başladı (1/(1-a)+1/(1+b))ve (-1/a+1/b).


Sizin tmpde, puanınız 27. Güzel find yapım aslında 23 olduğunu.
algoritmshark
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.