Tantangan ini tetapi dengan spek yang lebih baik.
Spec
Program Anda akan mengambil persamaan linear yang berisi variabel tunggal x
dan menghasilkan nilai x
.
Input / Parsing
- Input hanya akan berisi angka, operator, tanda kurung (
()
)x
, dan=
tanda (ini berarti tidak ada spasi). - Parenthesis akan selalu seimbang.
- Akan selalu ada setidaknya 1
x
. Suatux
dapat didahului dengan suatu angka. - Semua persamaan pasti memiliki satu hasil.
Sebuah nomor dapat didefinisikan dengan mengikuti langkah-langkah ini. Sejumlah dapat didefinisikan oleh regex: -?(\d+(\.\d+)?|\.\d+)
.
Jika Anda tidak berbicara regex: Digit didefinisikan sebagai 0-9
- Mungkin memiliki
-
di awal itu menandakan negatif - Maka mungkin ada beberapa digit. Jika tidak ada digit akan ada titik desimal
- Jika ada titik desimal, setidaknya satu digit akan mengikutinya
Angka / nilai terbesar akan ditentukan oleh kemampuan bahasa Anda.
Sebuah Operator adalah salah satu dari: +-*/
, mereka akan selalu muncul antara angka, dan atau kurung
ini berarti (5)(5)
bukan input yang valid demi kesederhanaan.
Parenthesis akan selalu berisi ekspresi yang valid (kombinasi angka dan / atau operator yang valid) di dalamnya. Tanda kurung "Seimbang" didefinisikan karena setiap (
akan memiliki penutupan terkait)
Evaluasi
- Urutan operasi harus diikuti dan prioritasnya adalah (tertinggi ke terendah):
- Parenthesis (bersarang paling dalam)
- Perkalian & Divisi
- Penambahan & Pengurangan
- Jika dua operator dengan presedensi yang sama terjadi, Anda sebaiknya memilih ke kiri -> kanan
Keluaran
Anda harus menampilkan hasilnya dengan cara tertentu. Jika Anda tidak menampilkan hasil angka saja, jelaskan jawaban Anda bagaimana output itu dihasilkan. Format output Anda harus konsisten. Output mungkin berupa desimal, tetapi akan selalu rasional, ketelitiannya terbatas pada ketepatan bahasa Anda. Hanya jika bahasa Anda tidak mendukung aritmatika floating point, Anda tidak perlu mendukungnya.
Aturan
- Built-in meremehkan tugas ini diizinkan tetapi , Anda harus menambahkan
[uses built-in]
dengan jelas ke header jawaban. Ini mengecualikan jawaban Anda dari kemenangan - "Built-in meremehkan tugas ini" adalah salah satu dari:
- Sesuatu yang mengambil persamaan dan mengeluarkan nilai untuk variabel
- Sesuatu yang sepenuhnya akan menyederhanakan persamaan
- Menggunakan
eval
atau fungsi terkait untuk melakukan parsing dalam jumlah yang signifikan. Penggunaaneval
dan fungsi terkait tidak diizinkan jika digunakan untuk (dengan modifikasi minimal pada input) menyelesaikan persamaan linear. - Jika Anda ragu, tanyakan saja dalam komentar.
- Built-in yang mem-parsing persamaan diperbolehkan
Contohnya
3+4=x
7
4+x=5
1
3+3*3=x
12
3x-4=7+2x
11
3--1=x
4
3*(2+4x)=7x-4
-2
1.2+2.3x=5.8
2
10=4x
2.5
Input tidak valid :
(5)(4)=x no operator between (5) and (4)
5(x+3)=2 no operator 5 and (...)
x=y the only variable is x
4=3 there is no x
x+3=x-7 no solution
x=x infinite solutions
+5=x + is not an unary operator. -5=x would be valid though
1/(x-3)=5 Nonlinear
3/x Nonlinear
sumber
eval
dianggap meremehkan tantangan? Juga, akankah bentuknew Function(...)
penghitungan?Jawaban:
JavaScript ES6, 246 byte
Masih ada beberapa golf yang harus dilakukan, tetapi setidaknya itu solusi!
Beri nama fungsi
n=>{n=n.split("=")...
untuk menggunakannya.Hyper-ungolfed:
Ini menggunakan pendekatan pivot. (Saya tidak yakin apakah ini yang disebut algoritme, hanya nama yang saya temukan.) Pertama-tama, mengumpulkan arah mana yang akan dicari dari nol (yaitu, ke mana kemiringan dua sisi persamaan akan berpotongan) dan mencari nilainya. Setelah menemukan titik perbedaan minimal, ia pergi ke titik itu dan mengurangi kenaikan pencarian. Ini akhirnya menghasilkan sebagai solusi tepat yang kita butuhkan.
sumber
JavaScript (Node.js) ,
10693 byteCobalah online!
-13 byte terima kasih kepada @tsh
Tidak Disatukan:
Penjelasan:
Solusi ini bekerja dengan metode Newton untuk menemukan akar. Kode mengurangi sisi kanan persamaan dari sisi kiri, sehingga ketika
f(x)=0
,x
akan sama dengan nilai yang kita pecahkan. Karena itu, ketika kita menemukan akar dari fungsi baru ini, itu akan menjadix
nilai yang kita inginkan . Kemudian ia menemukan turunanf'(x)
dengan menemukan kemiringan antara dua titik pada fungsi. Kemudian, nilai-nilai hanya dimasukkan ke dalam metode Newton yang menyatakan untuk perkiraan akarx
,x=x-(f(x)/f'(x))
(dalam kode, kita menggunakan 0 sebagaix
nilai awal ). Karena ini menemukan akarnya, ia menemukanx
nilai kita . Dan karena persamaan dijamin linier, perkiraannya akan tepat.sumber
Mathcad, [menggunakan bawaan]
Mathcad memiliki dua metode bawaan untuk menyelesaikan persamaan tersebut:
Pemecah simbolis cukup senang dengan y = x dan mengembalikan solusi x = y.
Bagi mereka yang tidak terbiasa dengan Mathcad, gambar di bawah ini diambil langsung dari buku kerja WYSIWYGish Mathcad 15. Mengubah salah satu ekspresi di mana mereka ditulis akan menyebabkan Mathcad mengevaluasi kembali jawabannya dan memperbarui tampilan yang sesuai.
sumber
Aksioma, 214 byte [menggunakan built-in]
Untuk beberapa kesalahan akan mengembalikan% i, untuk jenis kesalahan lainnya fungsi tersebut dihentikan dari sistem, sesuatu yang lain seperti 1-2 tampaknya keluar dari bahasa ... tes:
sumber