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.
- İlave
x,y -> x+y
- Karşılıklı
x -> 1/x
( bölünme değilx,y -> x/y
) - Olumsuzluk
x -> -x
( çıkarma değilx,y -> x-y
, iki işlem yapmanıza rağmenx + (-y)
) - Sabit
1
(işlemlerin ürettiği durumlar dışında başka sabitlere izin verilmez1
) - Değişken atama
[variable] = [expression]
Puanlama: Değerler değişkenlerde başlar a
ve b
. Amacınız , mümkün olduğu kadar az işlem kullanarak ürünlerini a*b
değ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 a
ve 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
- b
Kartezyen düzlemde. (Bunun nedeni olabilir ifadelerin tersinin için gerekli olması muhtemeldir 0
gibi 1/a
.)
Dilbilgisi:
Bu bir atom kodlu golf . 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-b
iç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.)