Trích xuất các hệ số của phương trình tuyến tính


8

Cho một phương trình tuyến tính mx+n, trả về nm. Tuy nhiên, phương trình có thể ở bất kỳ định dạng nào sau đây:

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

Dưới đây là các định dạng, trong đó mỗi định dạng ?cho một số nguyên dương được viết mà không có các số 0 đứng đầu

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

Tất cả những trường hợp này phải được xử lý.

Thông số kỹ thuật:

  • Bạn có thể giả sử rằng phương trình là một trong các định dạng trên, tức là nó phù hợp với biểu thức chính quy ^(-?[123456789]\d*)?x([+-][123456789]\d*)?|-?[123456789]\d*$.

Các trường hợp thử nghiệm:

-2x+3 -> -2 3
44x   -> 44 0
-123  -> 0 -123
x     -> 1 0
-1x   -> -1 0

1
Còn định dạng đầu ra thì sao? Ví dụ như 1 +2là một đầu ra hợp lệ cho 1x+2?
Peter Taylor

Thêm vào những gì @PeterTaylor nói, câu trả lời của con trăn sẽ thêm Lvào cuối con số nếu chúng quá lớn. Điều này có nên được cho phép?
Okx

@PeterTaylor Bạn có thể sử dụng bất kỳ định dạng đầu ra hợp lệ.
Esolanging Fruit

Có hợp lệ với các hằng số đầu ra dưới dạng danh sách độ dài 1 và đa thức tuyến tính thực sự dưới dạng danh sách độ dài 2 không? Vì vậy, ví dụ, 7xđầu ra là 7 0nhưng 7đầu ra là chỉ 7?
Greg Martin

@GregMartin Không, bạn phải luôn xuất cả hai số.
Quả Esolanging

Câu trả lời:


12

Python 2 , 55 byte

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

Hãy thử trực tuyến!

Sử dụng đánh giá mã tích hợp của Python. Đầu vào được định dạng như một số phức bằng cách thay thế xbằng j, đơn vị phức tạp của Python. Bởi vì chỉ những chữ như 2jđược nhận ra, nhưng không jhoặc -j, biến jđược chỉ định là 1jbao gồm những thứ đó.

Thật không may, Python dường như không tích hợp sẵn để chuyển đổi một số phức thành một cặp thực.


1
Ôi thật tuyệt vời: D
Jonathan Allan

4

Toán học, 16 byte

Lấy cảm hứng từ câu trả lời Python 2 của xnor :

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

Lấy đầu vào dưới dạng một biểu thức bằng chữ (không phải là một chuỗi) và trả về một cặp số. Nó hoạt động bằng cách tạo xmột số phức sau đó lấy phần thực và phần ảo - bit duy nhất không rõ ràng được nhân với i để bắt đầu, để có được đầu ra theo đúng thứ tự.

Chúng tôi cũng có thể sử dụng

ReIm[x=-I;I#]&

cho 14 byte (được gắn với Jelly!), nhưng cài đặt xbằng -i trước khi lấy đầu vào, thay vì chỉ thay thế xsau đó, cảm giác như gian lận


1
Giải pháp tốt đẹp. Tôi chưa bao giờ mới có ReImchức năng, tôi đã luôn luôn làm {Re[#],Im[#]}&. Bạn đã giúp đỡ rất nhiều ở đó.
Ian Miller

@IanMiller, ReImchỉ được giới thiệu trong phiên bản 10.1, vì vậy có thể bản sao Mathicala của bạn không có nó.
Không phải là một cái cây

2
Ah. Tôi có 10.1 nhưng tôi đã sử dụng các phiên bản cũ lâu hơn. Họ thêm cách quá nhiều chức năng mỗi bản cập nhật. :).
Ian Miller

3

JavaScript (ES6), 53 48 byte

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

Các trường hợp thử nghiệm


hoạt động không phải để -xthử regex của tôi
Jörg Hülsermann

@ JörgHülsermann Nếu tôi hiểu đúng các quy tắc, đó -xkhông phải là một đầu vào hợp lệ.
Arnauld

Bạn đúng xin lỗi
Jörg Hülsermann

3

sed , 44 42 byte

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

Hãy thử trực tuyến!

I / O: một trên mỗi dòng.

-2 byte nhờ @KritixiLithos.


Bạn có thể làm t:thay vì sử dụng anhãn
user41805

@KritixiLithos Có vẻ như để làm việc bằng cách nào đó, cảm ơn!
eush77

Hai sự thay thế đầu tiên có thể được kết hợp thành một.
dùng41805

2

Thạch , 18 14 byte

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

Bộ thử nghiệm tại Dùng thử trực tuyến!

Làm sao?

”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]




1

Toán học, 33 byte

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

Hàm thuần túy lấy một biểu thức ở định dạng mong đợi (lưu ý: không phải là một chuỗi, mà là một biểu thức thuần túy -2x+3) và trả về một cặp số nguyên có thứ tự với hệ số không đổi xuất hiện đầu tiên (ví dụ: -2x+3trả về {3,-2}).

Nội dung CoefficientList(hoạt động cho đa thức ở bất kỳ mức độ nào) thực hiện việc nâng vật nặng; hành vi mặc định của nó là trả về các hằng số dưới dạng danh sách độ dài 1, do đó /.{a_}:>{a,0}ghi đè lên đó và làm cho 0hệ số xxuất hiện rõ ràng.


Tôi đã tự hỏi sẽ mất bao lâu cho đến khi một câu trả lời Mathicala được đăng.
Trái cây Esolanging

0

Võng mạc , 38 byte

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

Chắc chắn có thể được cải thiện.

Có thể kéo dài làm thế nào chúng ta được phép định dạng đầu ra. Nó chỉ đưa ra một phương trình hoàn chỉnh, như trong nmcách nhau bởix+

Hãy thử trực tuyến!


Điều này không thành công cho một đầu vào như x-1
Leo

@Leo Cảm ơn, đã sửa.
Okx

Tôi khá tự tin rằng bạn có thể thay thế [^+-]*bằng\w*
user41805

0

Octave , 45 byte

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

Hãy thử trực tuyến!

Đánh giá biểu thức, với sự xthay thế bởi phức tạp j. Octave là rất linh hoạt khi nói đến biểu thức phức tạp, với j, 1j, i1itất cả tương đương (với ưu điểm là 1j1ikhông thể ghi đè bởi các biến, nhưng đó là không thích hợp cho thách thức này). Biểu thức nội tuyến được sử dụng để xây dựng một danh sách [imag(u) real(u)]với usố phức.

Ban đầu tôi muốn thử một cách tiếp cận thành ngữ hơn, sử dụng tích hợp sẵn sym2poly. Ví dụ: (đã ở mức 47 byte để đảm bảo 0*xđược xử lý):

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

Điều này tuy nhiên thất bại trong trường hợp xkhông có hệ số. Cuối cùng, một thiết lập thực / phức tạp như xnorhóa ra là tối ưu.


0

MATL , 12 byte

120'i'ZtU&Zj

Hãy thử trực tuyến!

Cổng câu trả lời Octave của tôi, nhưng tất nhiên thích nghi với sự gọn nhẹ trong MATL. Giải trình:

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.

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);}

Hãy thử trực tuyến!

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);
}

Chắc chắn có thể được rút ngắn, nhưng không nhìn thấy nó bây giờ!


1. Bạn không cần char *skhoảng trắng trong 2. Bạn không thể xóa khoảng trắng?
Trái cây Esolanging

@ Challenger5 Cảm ơn! Tôi đã sử dụng một trang web truy cập byte trực tuyến ngẫu nhiên ngày hôm qua, đã thử nó ngay bây giờ trên TIO, mã ngắn hơn rất nhiều, cảm ơn vì đã chỉ ra! :)
Abel Tom

Đề xuất printf("%d %d",s[i]-'x'?:a,s[i=L?L-s:i]-'x'?a:b);thay vì if(L!=0)i=(int)(L-s);printf("%d %d",s[i]=='x'?a:0,s[i]=='x'?b:a);index()thay vìstrchr()
trần mèo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.