Ekstrak Koefisien Persamaan Linear

8

Diberikan persamaan linear mx+n, return ndan m. Namun, persamaannya mungkin dalam salah satu format berikut:

5x+2 -> 5 2
5x-2 -> 5 -2
5x   -> 5 0
-2   -> 0 -2
x    -> 1 0

Berikut adalah format, di mana masing-masing ?singkatan dari bilangan bulat positif ditulis tanpa nol memimpin

?x+?
?x-?
-?x+?
-?x-?
x+?
x-?
?
-?
?x
-?x
x

Semua kasus ini harus ditangani.

Spesifikasi:

  • Anda dapat mengasumsikan bahwa persamaan tersebut dalam salah satu format di atas, yaitu cocok dengan regex ^(-?[123456789]\d*)?x([+-][123456789]\d*)?|-?[123456789]\d*$.

Kasus uji:

-2x+3 -> -2 3
44x   -> 44 0
-123  -> 0 -123
x     -> 1 0
-1x   -> -1 0
Buah Esolanging
sumber
1
Bagaimana dengan format output? Apakah misalnya 1 +2akan menjadi output yang valid untuk 1x+2?
Peter Taylor
Menambahkan ke apa yang dikatakan @PeterTaylor, jawaban python menambahkan sebuah Lke akhir angka jika mereka menjadi terlalu besar. Haruskah ini dibiarkan?
Okx
@PeterTaylor Anda dapat menggunakan format output yang valid.
Buah Esolanging
Apakah valid untuk konstanta keluaran sebagai daftar panjang-1, dan polinomial linier sejati sebagai daftar panjang-2? Jadi misalnya, 7xapakah output sebagai 7 0tetapi 7apakah output itu adil 7?
Greg Martin
@GregMartin Tidak, Anda harus selalu menampilkan kedua angka.
Buah Esolanging

Jawaban:

12

Python 2 , 55 byte

j=1j
c=eval(input().replace(*'xj'))
print c.imag,c.real

Cobalah online!

Menggunakan evaluasi kode bawaan Python. Input diformat seperti bilangan kompleks dengan mengganti xdengan j, unit kompleks Python. Karena hanya literal seperti 2jyang dikenali, tetapi tidak jatau -j, variabel jditugaskan 1juntuk mencakup mereka.

Sayangnya, Python tampaknya tidak memiliki built-in untuk mengonversi bilangan kompleks menjadi sepasang real.

Tidak
sumber
1
Oh pemikiran yang bagus: D
Jonathan Allan
4

Mathematica, 16 byte

Terinspirasi oleh xnor's Python 2 jawaban :

ReIm[I#/.x->-I]&

Mengambil input sebagai ekspresi literal (bukan string), dan mengembalikan sepasang angka. Ia bekerja dengan membuat xbilangan kompleks kemudian mengambil bagian-bagian nyata dan imajiner - satu-satunya bit yang tidak jelas adalah mengalikan dengan i untuk memulainya, untuk mendapatkan output dalam urutan yang benar.

Kita juga bisa menggunakan

ReIm[x=-I;I#]&

untuk 14 byte (diikat dengan Jelly!), tetapi pengaturan xke -i yang sama sebelum mengambil input, alih-alih hanya mengganti xsetelahnya, terasa seperti curang…

Bukan pohon
sumber
1
Solusi yang bagus. Saya tidak pernah baru memiliki ReImfungsi, saya selalu lakukan {Re[#],Im[#]}&. Anda telah banyak membantu di sana.
Ian Miller
@IanMiller, ReImhanya diperkenalkan di versi 10.1, jadi mungkin saja salinan Mathematica Anda tidak memilikinya.
Bukan pohon
2
Ah. Saya memiliki 10.1 tetapi saya telah menggunakan versi lama lebih lama. Mereka menambahkan terlalu banyak fungsi setiap pembaruan. :)
Ian Miller
3

JavaScript (ES6), 53 48 byte

s=>([a,b]=s.split(/x\+?/),1/b?[a||1,b||0]:[0,s])

Uji kasus

Arnauld
sumber
bekerja bukan untuk -xmencoba regex saya
Jörg Hülsermann
@ JörgHülsermann Jika saya memahami aturan dengan benar, -xbukan input yang valid.
Arnauld
Anda benar-benar minta maaf
Jörg Hülsermann
3

sed , 44 42 byte

s:+::
s:x: :
t
s:^:0 :
:
s:^ :1 :
s: $: 0:

Cobalah online!

I / O: satu per baris.

-2 byte berkat @KritixiLithos.

eush77
sumber
Anda dapat melakukan tdan :alih-alih menggunakan alabel
user41805
@KritixiLithos Sepertinya berhasil, terima kasih!
eush77
Dua pergantian pertama dapat digabungkan menjadi satu.
user41805
2

Jelly , 18 14 byte

”x;ṣ”xVṫ-µ¬ṂW+

Test suite di Coba online!

Bagaimana?

”x;ṣ”xVṫ-µ¬ṂW+ - Main link: list of characters s  examples: "5x-2"         "x"       "-123"
”x             - literal 'x'
  ;            - concatenate with s                        "x5x-2"        "xx"      "x-123"
   ṣ”x         - split on 'x's                        ["","5","-2]  ["","",""]  ["","-123"]
      V        - evaluate as Jelly code (vectorises)      [0,5,-2]     [0,0,0]     [0,-123]
       ṫ-      - tail from index -1 inclusive               [5,-2]       [0,0]     [0,-123]
         µ     - monadic chain separation (call that z)
          ¬    - not z                                       [0,0]       [1,1]        [1,0]
           Ṃ   - minimum                                         0           1            0
            W  - wrap in a list                                [0]         [1]          [0]
             + - add to z (vectorises)                      [5,-2]       [1,0]     [0,-123]
Jonathan Allan
sumber
2

PHP, 73 Bytes

preg_match("#((.*)x)?\+?(.*)#",$argn,$t);echo$t[1]?$t[2]?:1:0," ",+$t[3];

Cobalah online!

PHP, 91 Bytes

bekerja juga dengan -x

preg_match("#((-)?(\d+)?x)?\+?(-?\d+)?#",$argn,$t);echo$t[2],$t[1]?$t[3]?:1:0," ",$t[4]?:0;

Cobalah online!

Jörg Hülsermann
sumber
2

Mathematica, 23 byte

Coefficient[#,x,{1,0}]&

Cobalah online

salin dan tempel dengan ctrl-v kode ini

Coefficient[#,x,{1,0}]&[-2x+3]

dan tekan shift + enter untuk menjalankan

J42161217
sumber
1

Python 2 , 71 byte

lambda s:([0,]+[int(x or`1-i`)for i,x in enumerate(s.split('x'))])[-2:]

Cobalah online!

tongkat
sumber
1

Mathematica, 33 byte

#~CoefficientList~x/.{a_}:>{a,0}&

Fungsi murni mengambil ekspresi dalam format yang diharapkan (catatan: bukan string, tetapi ekspresi murni seperti -2x+3), dan mengembalikan pasangan bilangan bulat yang dipesan dengan koefisien konstan yang muncul terlebih dahulu (misalnya, -2x+3pengembalian {3,-2}).

The builtin CoefficientList(yang berfungsi untuk polinomial tingkat apa pun) melakukan pengangkatan berat; perilaku default-nya adalah mengembalikan konstanta sebagai daftar panjang-1, sehingga /.{a_}:>{a,0}mengesampingkannya dan membuat 0koefisien xmuncul secara eksplisit.

Greg Martin
sumber
Saya bertanya-tanya berapa lama sampai jawaban Mathematica diposting.
Buah Esolanging
0

Retina , 38 byte

x$
x+0
^[^+-]*$
0x+$+
^[^-\d]
1$+
-
+-

Pasti bisa diperbaiki.

Mungkin meregangkan bagaimana kita diizinkan untuk memformat output. Ini hanya menghasilkan persamaan lengkap, seperti dalam ndan mdipisahkan olehx+

Cobalah online!

Okx
sumber
Ini gagal untuk input sepertix-1
Leo
@ Leo Terima kasih, sudah diperbaiki.
Okx
Saya cukup yakin Anda dapat mengganti [^+-]*dengan\w*
user41805
0

Oktaf , 45 byte

@(a)[imag(u=eval(strrep(a,'x','j'))),real(u)]

Cobalah online!

Mengevaluasi ekspresi, dengan xdigantikan oleh kompleks j. Oktaf sangat fleksibel ketika datang ke ekspresi kompleks, dengan j, 1j, idan 1isemua setara (dengan keuntungan yang 1jdan 1itidak dapat ditimpa oleh variabel, tapi itu tidak relevan untuk tantangan ini). Ekspresi sebaris digunakan untuk membuat daftar [imag(u) real(u)]dengan ubilangan kompleks.

Saya awalnya ingin mencoba pendekatan yang lebih idiomatis, menggunakan built-in sym2poly. Misalnya (sudah di 47 byte untuk memastikan 0*xditangani):

@(a)sym2poly([strrep(a,'x','*x') '+x^2']))(2:3)

Namun yang satu ini gagal pada kasus xtanpa koefisien. Pada akhirnya setup nyata / kompleks seperti xnorternyata menjadi optimal.

Sanchises
sumber
0

MATL , 12 byte

120'i'ZtU&Zj

Cobalah online!

Port jawaban Octave saya, tetapi tentu saja disesuaikan untuk kekompakan dalam MATL. Penjelasan:

120'i'Zt     % Replace character 120 ('x') by 'i' in input (implicit).
             % (Used 120 instead of 'x' to save a separator between 'x' and 'i')
        U    % Convert string to complex number
         &Zj % Split complex number in real and imaginary part. Implicit display.
Sanchises
sumber
0

C (gcc) , 145 138 112 byte

f(char*s){int a,b,i=0;sscanf(s,"%dx%d",&a,&b);if(L!=0)i=(int)(L-s);printf("%d %d",s[i]=='x'?a:0,s[i]=='x'?b:a);}

Cobalah online!

void f(char*s)
{
    int a,b,i=0;
    sscanf(s,"%dx%d",&a,&b);

    if(L!=0)
      i=(int)(L-s);

    printf("%d %d",s[i]=='x'?a:0,s[i]=='x'?b:a);
}

Pasti bisa dipersingkat, tapi jangan melihatnya sekarang!

Abel Tom
sumber
1. Anda tidak membutuhkan ruang dalam char *s2. Tidak bisakah Anda menghapus spasi putih?
Buah Esolanging
@ Challenger5 Terima kasih! Saya menggunakan situs penghitung byte online acak kemarin, mencobanya sekarang di TIO, kode jauh lebih pendek, terima kasih telah menunjukkan! :)
Abel Tom
Sarankan printf("%d %d",s[i]-'x'?:a,s[i=L?L-s:i]-'x'?a:b);alih-alih if(L!=0)i=(int)(L-s);printf("%d %d",s[i]=='x'?a:0,s[i]=='x'?b:a);dan index()bukannyastrchr()
ceilingcat