Extrahieren Sie die Koeffizienten einer linearen Gleichung

8

Bei einer linearen Gleichung mx+ngeben Sie nund zurück m. Die Gleichung kann jedoch in einem der folgenden Formate vorliegen:

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

Hier sind die Formate, in denen jedes ?für eine positive Ganzzahl steht, die ohne führende Nullen geschrieben wurde

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

Alle diese Fälle müssen behandelt werden.

Spezifikationen:

  • Sie können davon ausgehen, dass die Gleichung in einem der oben genannten Formate vorliegt, dh mit dem regulären Ausdruck übereinstimmt ^(-?[123456789]\d*)?x([+-][123456789]\d*)?|-?[123456789]\d*$.

Testfälle:

-2x+3 -> -2 3
44x   -> 44 0
-123  -> 0 -123
x     -> 1 0
-1x   -> -1 0
Esolanging Obst
quelle
1
Was ist mit Ausgabeformaten? Wäre zB 1 +2eine gültige Ausgabe für 1x+2?
Peter Taylor
Die Python-Antwort ergänzt das, was @PeterTaylor gesagt hat, und fügt Lam Ende der Zahlen ein hinzu, wenn sie zu groß werden. Sollte dies erlaubt sein?
Okx
@PeterTaylor Sie können jedes gültige Ausgabeformat verwenden.
Esolanging Fruit
Ist es gültig, Konstanten als Listen der Länge 1 und echte lineare Polynome als Listen der Länge 2 auszugeben? Ist die 7xAusgabe beispielsweise so, 7 0aber 7wird sie nur ausgegeben 7?
Greg Martin
@ GregMartin Nein, Sie müssen immer beide Zahlen ausgeben.
Esolanging Fruit

Antworten:

12

Python 2 , 55 Bytes

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

Probieren Sie es online aus!

Verwendet die in Python integrierte Code-Auswertung. Die Eingabe wird wie eine komplexe Zahl formatiert, indem sie xdurch jdie komplexe Einheit von Python ersetzt wird. Da nur Literale wie 2jerkannt werden, aber nicht joder -j, wird die Variable jso zugewiesen 1j, dass sie diese abdeckt.

Leider scheint Python nicht über eine integrierte Funktion zum Konvertieren einer komplexen Zahl in ein Paar von Realzahlen zu verfügen.

xnor
quelle
1
Oh schönes Denken: D
Jonathan Allan
4

Mathematica, 16 Bytes

Inspiriert von xnors Python 2-Antwort :

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

Nimmt die Eingabe als Literalausdruck (keine Zeichenfolge) und gibt ein Zahlenpaar zurück. Es funktioniert, indem xeine komplexe Zahl erstellt und dann der Real- und der Imaginärteil genommen werden - das einzige nicht offensichtliche Bit ist zunächst das Multiplizieren mit i , um die Ausgabe in der richtigen Reihenfolge zu erhalten.

Wir können auch verwenden

ReIm[x=-I;I#]&

für 14 Bytes (mit Jelly verbunden!), aber vor dem Eingeben der Eingabe xauf -i zu setzen , anstatt nur xdanach zu ersetzen , fühlt sich an wie Betrug ...

Kein Baum
quelle
1
Schöne Lösung. Ich war nie neu, es hatte eine ReImFunktion, ich habe es immer getan {Re[#],Im[#]}&. Sie haben dort viel geholfen.
Ian Miller
@IanMiller ReImwurde erst in Version 10.1 eingeführt, daher ist es möglich, dass Ihre Kopie von Mathematica es nicht hat.
Kein Baum
2
Ah. Ich habe 10.1, aber ich benutze schon viel länger alte Versionen. Sie fügen bei jedem Update viel zu viele Funktionen hinzu. :).
Ian Miller
3

JavaScript (ES6), 53 48 Byte

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

Testfälle

Arnauld
quelle
funktioniert nicht für -xversuchen meine Regex
Jörg Hülsermann
@ JörgHülsermann Wenn ich die Regeln richtig verstehe, -xist keine gültige Eingabe.
Arnauld
Sie haben Recht, sorry
Jörg Hülsermann
3

sed , 44 42 Bytes

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

Probieren Sie es online aus!

E / A: eine pro Zeile.

-2 Bytes dank @KritixiLithos.

eush77
quelle
Sie können tund :anstatt das aEtikett zu verwenden
user41805
@KritixiLithos Scheint irgendwie zu funktionieren, danke!
Eush77
Die ersten beiden Substitutionen können zu einer kombiniert werden.
user41805
2

Gelee , 18 14 Bytes

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

Testsuite bei Try it online!

Wie?

”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
quelle
2

PHP, 73 Bytes

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

Probieren Sie es online aus!

PHP, 91 Bytes

funktioniert auch mit -x

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

Probieren Sie es online aus!

Jörg Hülsermann
quelle
2

Mathematica, 23 Bytes

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

Probieren Sie es online aus

Kopieren Sie diesen Code mit Strg-V und fügen Sie ihn ein

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

und drücken Sie Umschalt + Eingabetaste, um zu starten

J42161217
quelle
1

Mathematica, 33 Bytes

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

Reine Funktion, die einen Ausdruck im erwarteten Format verwendet (Hinweis: kein String, sondern ein reiner Ausdruck wie -2x+3) und ein geordnetes Paar von Ganzzahlen -2x+3zurückgibt, wobei der konstante Koeffizient zuerst angezeigt wird (z. B. Rückgabe {3,-2}).

Das eingebaute CoefficientList(das für Polynome jeden Grades funktioniert) erledigt das schwere Heben; Das Standardverhalten besteht darin, Konstanten als Listen der Länge 1 zurückzugeben. /.{a_}:>{a,0}Überschreibt dies also und lässt den 0Koeffizienten von xexplizit erscheinen.

Greg Martin
quelle
Ich habe mich gefragt, wie lange es dauern würde, bis eine Mathematica-Antwort veröffentlicht wird.
Esolanging Fruit
0

Netzhaut , 38 Bytes

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

Kann definitiv verbessert werden.

Möglicherweise wird erweitert, wie wir die Ausgabe formatieren dürfen. Es wird nur eine vollständige Gleichung ausgegeben, wie in nund mgetrennt durchx+

Probieren Sie es online aus!

Okx
quelle
Dies schlägt für eine Eingabe wiex-1
Leo
@ Leo Danke, behoben.
Okx
Ich bin ziemlich sicher , dass Sie ersetzen können [^+-]*mit\w*
user41805
0

Oktave , 45 Bytes

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

Probieren Sie es online aus!

Bewerten Sie den Ausdruck, wobei xer durch Komplex ersetzt wird j. Octave ist sehr flexibel , wenn es um komplexe Ausdrücke kommt, mit j, 1j, iund 1ialle gleichwertig (mit dem Vorteil , dass 1jund 1inicht durch Variablen überschrieben werden können, aber das ist irrelevant für diese Herausforderung). Inline-Ausdruck wird verwendet, um eine Liste [imag(u) real(u)]mit uder komplexen Nummer zu erstellen .

Ich wollte zunächst einen idiomatischeren Ansatz mit dem eingebauten versuchen sym2poly. Zum Beispiel (bereits bei 47 Bytes, um sicherzustellen, dass 0*xbehandelt wird):

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

Dieser scheiterte jedoch im Fall von xohne Koeffizienten. Am Ende xnorerwies sich ein reales / komplexes Setup als optimal.

Sanchises
quelle
0

MATL , 12 Bytes

120'i'ZtU&Zj

Probieren Sie es online aus!

Port meiner Octave-Antwort, aber natürlich angepasst an die Kompaktheit in MATL. Erläuterung:

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
quelle
0

C (gcc) , 145 138 112 Bytes

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

Probieren Sie es online aus!

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

Kann definitiv gekürzt werden, aber jetzt nicht sehen!

Abel Tom
quelle
1. Sie benötigen keinen Platz in char *s2. Können Sie Leerzeichen nicht entfernen?
Esolanging Fruit
@ Challenger5 Danke! Ich habe gestern eine zufällige Online-Bytezähler-Website verwendet und sie jetzt auf TIO ausprobiert. Der Code ist viel kürzer, danke für den Hinweis! :)
Abel Tom
Schlagen Sie printf("%d %d",s[i]-'x'?:a,s[i=L?L-s:i]-'x'?a:b);anstelle von if(L!=0)i=(int)(L-s);printf("%d %d",s[i]=='x'?a:0,s[i]=='x'?b:a);und index()anstelle vonstrchr()
Deckenkatze