Ada 500 perwakilan hadiah tidak resmi untuk mengalahkan jawaban terbaik saat ini .
Tujuan
Tujuan Anda adalah melipatgandakan dua angka hanya dengan menggunakan rangkaian operasi aritmatika dan penugasan variabel yang sangat terbatas.
- Tambahan
x,y -> x+y
- Timbal balik
x -> 1/x
( bukan pembagianx,y -> x/y
) - Negasi
x -> -x
( bukan penguranganx,y -> x-y
, meskipun Anda bisa melakukannya sebagai dua operasix + (-y)
) - Konstanta
1
(tidak ada konstanta lain yang diizinkan, kecuali dihasilkan oleh operasi dari1
) - Tugas variabel
[variable] = [expression]
Penilaian: Nilai mulai dalam variabel a
dan b
. Tujuan Anda adalah untuk menyimpan produk mereka a*b
ke dalam variabel c
menggunakan sesedikit mungkin operasi. Setiap operasi dan penugasan +, -, /, =
biaya satu titik (setara, setiap penggunaan (1), (2), (3), atau (4)). Konstanta 1
gratis. Solusi poin paling sedikit menang. Tiebreak adalah posting paling awal.
Kelonggaran: Ekspresi Anda harus benar secara aritmatika untuk real "acak" a
dan b
. Hal ini dapat gagal pada subset ukuran nol dari R 2 , yaitu satu set yang tidak memiliki area jika diplot di a
- b
pesawat Cartesian. (Ini mungkin diperlukan karena kebalikan dari ekspresi yang mungkin 0
seperti itu 1/a
.)
Tatabahasa:
Ini adalah atom-kode-golf . Tidak ada operasi lain yang dapat digunakan. Secara khusus, ini berarti tidak ada fungsi, kondisional, loop, atau tipe data non-numerik. Berikut adalah tata bahasa untuk operasi yang diizinkan (kemungkinan dipisahkan oleh |
). Suatu program adalah urutan <statement>
s, di mana a <statement>
diberikan sebagai berikut.
<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
Anda sebenarnya tidak harus memposting kode dalam tata bahasa yang tepat ini, asalkan jelas apa yang Anda lakukan dan jumlah operasi Anda benar. Misalnya, Anda dapat menulis a-b
untuk a+(-b)
dan menghitungnya sebagai dua operasi, atau mendefinisikan macro untuk singkatnya.
(Ada pertanyaan sebelumnya, Multiply tanpa Multiply , tetapi memungkinkan serangkaian operasi yang lebih longgar.)
Jawaban:
22 operasi
Cobalah online!
Ops adalah 10 tambahan, 7 invers, 2 negasi, dan 3 tugas.
Jadi, bagaimana saya mendapatkan ini? Saya mulai dengan template yang tampak menjanjikan dari jumlah dua fraksi bertingkat, sebuah motif yang telah muncul dalam banyak upaya sebelumnya.
c = 1/(1/x + 1/y) + 1/(1/z + 1/w)
Ketika kami membatasi jumlah
x+y+z+w=0
, pembatalan indah terjadi, memberikan:c = (x+z)*(y+z)/(x+y)
,yang mengandung produk. (Seringkali lebih mudah untuk mendapatkan
t*u/v
daripadat*u
karena yang pertama memiliki gelar 1.)Ada cara yang lebih simetris untuk memikirkan ungkapan ini. Dengan pembatasan
x+y+z+w=0
, nilainya ditentukan oleh tiga parameterp,q,r
dari jumlah berpasangannya.dan kami punya
c=-q*r/p
. Jumlahnyap
dibedakan sebagai berada dalam penyebut dengan berkorespondensi dengan pasangan(x,y)
dan(z,w)
variabel yang berada dalam fraksi yang sama.Ini adalah ekspresi yang bagus untuk
c
inp,q,r
, tetapi fraksi bertingkat ada dix,y,z,w
jadi kita harus mengekspresikan yang pertama dalam hal yang terakhir:Sekarang, kami ingin memilih
p,q,r
yangc=-q*r/p
samaa*b
. Satu pilihan adalah:Kemudian, nilai yang digandakan untuk
q
dan denganr
mudah dibagi menjadi dua:Menyimpan
2
sebagai variabelt
dan memasukkannya ke dalam persamaan untukc
memberikan solusi 24-op.Ada 12 tambahan, 6 invers, 4 negasi, dan 2 tugas.
Banyak ops dihabiskan untuk mengekspresikan
x,y,z,w
dalam hal1,a,b
. Untuk menyimpan ops, sebaliknya ungkapkanx
dalamp,q,r
(dan dengan demikiana,b,1
) lalu tulisy,z,w
dalam bentukx
.Memilih
dan mengekspresikan
c
dengan negasi seperti yangc=-q*r/p
kita dapatkanSayangnya, mengurangi separuh
x
biaya mahal. Itu perlu dilakukan dengan membalik, menambahkan hasilnya ke dirinya sendiri, dan membalikkan lagi. Kami juga meniadakan untuk memproduksinx
untuk-x
, karena itu ini apay,z,w
digunakan. Ini memberi kita solusi 23-op:itx
adalah 1 / (2 * x) dannx
adalah-x
. Optimalisasi akhir dari pengekspresian1/x
sebagaiitx+itx
ganti templated1/(-nx)
memotong karakter dan membawa solusi ke 22 ops.sumber
itx + itx
terjadi dua kali, tetapiitx
tidak terjadi dalam konteks lainnya. Tentukan sebaliknyaix = (1+1)/(1+a+b)
dan Anda mengganti dua tambahan dengan satu.m = -1
dimungkinkan untuk mendapatkan 20:nx = (1+a+b)/(m+m); c = m/(m/nx + 1/(1+nx)) + m/(1/(a+nx) + 1/(b+nx))
a
danb
hanya satu yang terpisah, maka salah satua + nx = 0
ataub + nx = 0
, menyebabkan solusi Anda membaginya dengan nol.23 operasi
bukti oleh ledakan:
Saya menyalahgunakan wolfram alpha untuk mendapatkan gambar yang indah ini (wolfram alpha mencoba membuat saya berlangganan ke pro untuk menyimpannya, tetapi kemudian ctrl-c ctrl-v ;-)):
skor (dengan ditambahkan
+
pada pengurangan):sumber
29 operasi
Tidak berfungsi untuk set {(a, b) ∈ R 2 | a + b = 0 atau a + b = -1 atau ab = 0 atau ab = -1}. Itu mungkin berukuran nol?
Struktur
rfc
(Reciprocal-Four-C) lebih jelas jika kita mendefinisikan makro:Mari kita berhitung:
s(x)
, secara matematis, adalah1/(1/x - 1/(x+1))
setelah sedikit aljabarx*(x+1)
ataux*x + x
.rfc
, itu benar-benar1/((a+b)*(a+b) + a + b - (a-b)*(a-b) - a + b + (-b) + (-b))
yang adil1/((a+b)^2 - (a-b)^2)
.rfc
adalah1/(4*a*b)
.c
adalah kebalikan dari 4 kalirfc
, jadi1/(4/(4*a*b))
menjadia*b
.sumber
s(x)
cocok dengan persyaratan pertanyaan, dari kalkulus, jadi itu berarti saya memiliki fungsi persegi. Setelah beberapa faffing tentang, saya menemukan saya bisa mendapatkana*b
istilah dengan perbedaan trik kuadrat. Setelah saya memilikinya, itu soal mencoba tugas mana yang menyelamatkan operasi.-1
tiga kali dalamrfc
, tidak bisakah Anda bermain karakter dengan menetapkannya ke variabel?27 operasi
Tidak ada teori di balik ini. Aku hanya mencoba untuk mendapatkan
(const1+a*b)/const2
dan mulai dengan(1/(1-a)+1/(1+b))
dan(-1/a+1/b)
.sumber
tmp
sebenarnya 23, membuat skor Anda 27. Namun, senang menemukan.