MATLAB, 103 99 97 95 93 byte
Saya mencoba beberapa hal berbeda, dan membuatnya berfungsi untuk menghemat beberapa byte:
eval([regexprep(input(''),{'.+?1(.+)\),','(\d)x'},{'x=str2num(''$1'');disp(~','$1\*x'}) 41]);
Jika saya dapat mengurangi itu lebih jauh, saya akan memposting penjelasan.
Kode lama penjelasan
t=sscanf(input(''),'(x^1%d),%s')';x=-t(1);disp(~eval(regexprep([t(2:end) ''],'(\d)x','$1\*x')))
Ini juga berfungsi dengan Oktaf . Anda dapat mencobanya secara online . Saya telah menyimpan program sebagai skrip bernama isFactor.m
, jadi Anda bisa langsung masuk isFactor
saat diminta. [Catatan: dalam Oktaf mengeluarkan peringatan saat berjalan - MATLAB tidak menghasilkan ini].
Masukan harus dalam format '(x^1+7),(x^2-49)'
sesuai pertanyaan. Tanda kutip ditambahkan sehingga MATLAB / Oktaf tahu itu adalah string.
Outputnya adalah a 0
atau a 1
tergantung pada apakah itu benar atau salah.
Jadi, kodenya berfungsi sebagai berikut. Pertama kita meminta input, dan kemudian menguraikannya. String parsing mengekstraksi nomor yang ditandatangani setelah yang pertama (x^1
dalam string - ini adalah nilai kami n
. Kemudian terus mengekstraksi string ( %s
) setelah ),
di input - ini adalah ekspresi kami.
t=sscanf(input(''),'(x^1%d),%s')';
Selanjutnya, kita mengekstrak nilai n
dan menyetel x
sama dengan itu - kita akan mengevaluasi apakah ekspresi sama dengan nol kapan n==x
, jadi ini sebabnya kita menyimpan nilai ke x. Kami juga meniadakan angka yang diekstraksi, karena tanda minus ketika parsing.
x=-t(1);
Kami kemudian akan menampilkan output yang merupakan boolean
disp(
Output pada dasarnya adalah negasi logis dari persamaan yang kami evaluasi. Jika f(x)
nol, ini akan mengembalikan 1, jika tidak maka akan menghasilkan nol.
~eval(
Kami sedang mengevaluasi ekspresi input, tetapi untuk melakukan ini, kita perlu memformat ulangnya sedikit agar MATLAB dapat mengerti. Ketika kita membaca string, sebenarnya itu adalah array double
tipe, jadi kita perlu mengonversinya menjadi array karakter. Sebelum konversi, kami juga menyingkirkan elemen pertama karena itulah yang kami gunakan untuk itu n
. Kita kemudian perlu mengganti kejadian x
yang didahului oleh angka (misalnya 4x
) dengan hal yang sama tetapi dengan multiplikasi ( *
) masuk di antaranya sehingga MATLAB dapat menghitungnya.
regexprep(char([t(2:end) ''],'(\d)x','$1\*x')
)
)