線形方程式の係数を抽出する


8

線形方程式を考えるとmx+n、返すnm。ただし、方程式は次のいずれかの形式になります。

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

ここにフォーマットがあります、それぞれ?が先行ゼロなしで書かれた正の整数を表します

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

これらのケースはすべて処理する必要があります。

仕様:

  • 方程式は上記の形式のいずれかであると想定できます。つまり、正規表現と一致し^(-?[123456789]\d*)?x([+-][123456789]\d*)?|-?[123456789]\d*$ます。

テストケース:

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

1
出力フォーマットはどうですか?たとえば1 +2の有効な出力1x+2でしょうか?
Peter Taylor

@PeterTaylorの発言に加えて、Pythonの回答では、L数値が大きくなりすぎる場合は数値の末尾にが追加されます。これは許可されるべきですか?
Okx

@PeterTaylor任意の有効な出力形式を使用できます。
Esolanging Fruit

定数を長さ1のリストとして出力し、真の線形多項式を長さ2のリストとして出力することは有効ですか?したがって、たとえば、7xとして出力される7 0が、7同じように出力されますか7
グレッグマーティン

@GregMartinいいえ、常に両方の数値を出力する必要があります。
2017

回答:


12

Python 2、55バイト

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

オンラインでお試しください!

Pythonの組み込みコード評価を使用します。入力は、Pythonの複素数単位で置き換えxられj、複素数のようにフォーマットされます。のようなリテラルのみ2jが認識され、jor は認識されないため-j、変数j1jそれらをカバーするように割り当てられます。

残念ながら、Pythonには複素数を実数のペアに変換する組み込み機能がないようです。


1
ああ、いい考えです:D
ジョナサンアラン

4

Mathematica、16バイト

xnorのPython 2の答えに触発されました

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

入力を(文字列ではなく)リテラル式として受け取り、数値のペアを返します。これはx、複素数を作成し、次に実数部と虚数部を取得することで機能します。非自明なビットは、最初にiを乗算して、正しい順序で出力を取得することです。

私たちも使用できます

ReIm[x=-I;I#]&

14バイト(Jellyで結ばれます!)ですが、入力を受け取る前に-iに設定xすると、後で置換するだけではなく、不正行為のように感じます…x


1
素晴らしい解決策。私はそれがReIm機能を持っていたことを決して新しいことはありません、私はいつもやってい{Re[#],Im[#]}&ます。あなたはそこでたくさん助けてきました。
Ian Miller

@IanMiller ReImはバージョン10.1でのみ導入されたので、Mathematicaのコピーにそれがない可能性があります。
木ではない

2
ああ。10.1はありますが、古いバージョンをずっと長く使用しています。追加する関数の数が多すぎると、更新のたびに更新されます。:)。
Ian Miller

3

JavaScript(ES6)、53 48バイト

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

テストケース


ないために働く-x私の正規表現してみてください
イェルクHülsermann

@JörgHülsermannルールを正しく理解している場合-xは、有効な入力ではありません。
アーノールド、

申し訳ありません
イェルク・ヒュルサーマン

3

sed44 42バイト

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

オンラインでお試しください!

I / O:1行に1つ。

@KritixiLithosのおかげで-2バイト。


あなたは行うことができますtし、:代わりに使用してのaラベル
user41805を

@KritixiLithosどうやら動作するようです、ありがとう!
eush77

最初の2つの置換は1つに組み合わせることができます。
user41805

2

ゼリー18 14 バイト

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

オンラインでお試しください!

どうやって?

”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

Mathematica、33バイト

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

期待される形式の式(注:文字列ではなく、のような純粋な式-2x+3)を取り、定数係数が最初に現れる順序付けられた整数のペアを返す純粋な関数(たとえば、-2x+3returns {3,-2})。

ビルトインCoefficientList(任意の次数の多項式で機能します)は重い作業を行います。そのデフォルトの動作は、定数を長さ1のリストとして返すことです。そのため、これを/.{a_}:>{a,0}オーバーライドし、0係数をx明示的に表示します。


Mathematicaの回答が投稿されるまでどのくらいかかるのかと思っていました。
Esolanging Fruit

0

網膜、38バイト

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

間違いなく改善することができます。

出力のフォーマットを許可する方法を拡張している可能性があります。それはちょうどのように、完全な方程式を出力nし、m区切らx+

オンラインでお試しください!


これは次のような入力では失敗しますx-1
Leo

@Leoありがとう、修正されました。
Okx

私はあなたが交換することができますかなり確信してい[^+-]*\w*
user41805

0

オクターブ、45バイト

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

オンラインでお試しください!

式を評価し、xcomplexに置き換えますjます。Octaveは、それが複雑な式に来るときに、非常に柔軟でj1jiおよび1iすべての(という利点と同等1j1i変数によって上書きすることはできませんが、それはこの挑戦のためには無関係です)。インライン式はリスト構築するために使用される[imag(u) real(u)]u複素数を。

最初は組み込みのを使用して、より慣用的なアプローチを試したかったのsym2polyです。たとえば(47バイトで既に0*x処理されていることを確認するため):

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

これはしかししかしの場合に失敗しました x係数ない。最終的には、実際の/複雑な設定xnorが最適であることが判明しました。


0

MATL、12バイト

120'i'ZtU&Zj

オンラインでお試しください!

私のOctave回答のポートですが、もちろんMATLのコンパクトさのために適応されました。説明:

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バイト

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

オンラインでお試しください!

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

間違いなく短くできますが、今は表示しないでください!


1. char *s2. のスペースは必要ありません。空白を削除できませんか?
Esolanging Fruit

@ Challenger5ありがとう!私は昨日、ランダムなオンラインバイトカウンターウェブサイトを使用し、TIOで今すぐ試してみました。:)
アベルトム・

提案printf("%d %d",s[i]-'x'?:a,s[i=L?L-s:i]-'x'?a:b);の代わりif(L!=0)i=(int)(L-s);printf("%d %d",s[i]=='x'?a:0,s[i]=='x'?b:a);index()代わりにstrchr()
ceilingcat
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.