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

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.


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 ...


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


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.


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]


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



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.


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!


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.


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.

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!


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.