Extrair os coeficientes de uma equação linear


8

Dada uma equação linear mx+n, retorne ne m. No entanto, a equação pode estar em qualquer um dos seguintes formatos:

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

Aqui estão os formatos, onde cada um ?representa um número inteiro positivo escrito sem zeros à esquerda

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

Todos esses casos devem ser tratados.

Especificações:

  • Você pode assumir que a equação está em um dos formatos acima, ou seja, corresponde ao regex ^(-?[123456789]\d*)?x([+-][123456789]\d*)?|-?[123456789]\d*$.

Casos de teste:

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

1
E quanto aos formatos de saída? Por exemplo, 1 +2seria uma saída válida para 1x+2?
Peter Taylor

Além do que o @PeterTaylor disse, a resposta em python adiciona um Lfinal ao número se ele for muito grande. Isso deve ser permitido?
Okx

@PeterTaylor Você pode usar qualquer formato de saída válido.
Esolanging Fruit

É válido gerar constantes como listas de comprimento 1 e polinômios lineares verdadeiros como listas de comprimento 2? Então, por exemplo, a 7xsaída é como 7 0mas 7é a saída como justa 7?
Greg Martin

@GregMartin Não, você sempre deve gerar os dois números.
Esolanging Fruit

Respostas:


12

Python 2 , 55 bytes

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

Experimente online!

Usa a avaliação de código interna do Python. A entrada é formatado como um número complexo por substituição xcom j, unidade complexa do Python. Como apenas literais como 2jsão reconhecidos, mas não jou -j, a variável jé atribuída 1jpara cobrir esses.

Infelizmente, o Python não parece ter um built-in para converter um número complexo em um par de reais.


1
Oh bom pensamento: D
Jonathan Allan

4

Mathematica, 16 bytes

Inspirado na resposta Python 2 do xnor :

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

Recebe a entrada como uma expressão literal (não uma string) e retorna um par de números. Ele funciona criando xum número complexo e depois pegando as partes reais e imaginárias - o único bit não óbvio é multiplicar por i para começar, para obter a saída na ordem certa.

Também podemos usar

ReIm[x=-I;I#]&

por 14 bytes (empatado com Jelly!), mas definir xigual -i antes de receber a entrada, em vez de apenas substituí-la xdepois, parece trapaça ...


1
Ótima solução. Eu nunca ReImsoube que tinha uma função, sempre fiz {Re[#],Im[#]}&. Você ajudou muito lá.
Ian Miller

@IanMiller, ReImfoi introduzido apenas na versão 10.1, portanto, é possível que sua cópia do Mathematica não a tenha.
Não uma árvore

2
Ah Eu tenho 10.1, mas uso versões antigas há muito mais tempo. Eles adicionam muitas funções a cada atualização. :).
Ian Miller

3

JavaScript (ES6), 53 48 bytes

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

Casos de teste


trabalha não para -xtentar a minha regex
Jörg Hülsermann

@ JörgHülsermann Se eu entendi as regras corretamente, -xnão é uma entrada válida.
Arnauld

Você está arrependido
Jörg Hülsermann 12/17

3

sed , 44 42 bytes

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

Experimente online!

E / S: um por linha.

-2 bytes graças a @KritixiLithos.


Você pode fazer te :em vez de usar o arótulo
user41805

@KritixiLithos Parece funcionar de alguma forma, obrigado!
Eush77

As duas primeiras substituições podem ser combinadas em uma.
user41805

2

Geléia , 18 14 bytes

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

Conjunto de testes em Experimente online!

Quão?

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

Experimente online

copie e cole com ctrl-v esse código

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

e pressione Shift + Enter para executar



1

Mathematica, 33 bytes

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

Função pura pegando uma expressão no formato esperado (nota: não uma sequência, mas uma expressão pura como -2x+3) e retornando um par ordenado de números inteiros com o coeficiente constante aparecendo primeiro (por exemplo, -2x+3retornos {3,-2}).

O interno CoefficientList(que funciona para polinômios de qualquer grau) faz o trabalho pesado; seu comportamento padrão é retornar constantes como listas de tamanho 1, /.{a_}:>{a,0}substituindo isso e fazendo com que o 0coeficiente xapareça explicitamente.


Fiquei me perguntando quanto tempo levaria até que uma resposta do Mathematica fosse publicada.
Esolanging Fruit

0

Retina , 38 bytes

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

Definitivamente pode ser melhorado.

Possivelmente esticando como temos permissão para formatar a saída. Ele apenas gera uma equação completa, como em ne mseparado porx+

Experimente online!


Isso falha para uma entrada comox-1
Leo

@ Leo Obrigado, fixo.
Okx

Estou bastante confiante de que você pode substituir [^+-]*com\w*
user41805

0

Oitava , 45 bytes

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

Experimente online!

Avalie a expressão xsubstituída por complex j. Octave é muito flexível quando se trata de expressões complexas, com j, 1j, ie 1itodos equivalentes (com a vantagem de que 1je 1inão podem ser substituídos por variáveis, mas isso é irrelevante para este desafio). A expressão embutida é usada para criar uma lista [imag(u) real(u)]com uo número complexo.

Inicialmente, eu queria tentar uma abordagem mais idiomática, usando o built-in sym2poly. Por exemplo (já em 47 bytes para garantir que 0*xseja tratado):

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

No entanto, este falhou no caso de xsem coeficiente. No final, uma configuração real / complexa, como xnorse mostrou ótima.


0

MATL , 12 bytes

120'i'ZtU&Zj

Experimente online!

Porto da minha resposta Oitava, mas é claro adaptado para compacidade em MATL. Explicação:

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

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

Definitivamente pode ser encurtado, mas não o veja agora!


1. Você não precisa do espaço em char *s2. Você não pode remover o espaço em branco?
Esolanging Fruit

@ Challenger5 Obrigado! Ontem eu usei um site aleatório de contadores de bytes online, tentei agora no TIO, o código é muito mais curto, obrigado por apontar! :)
Abel Tom

Sugerir em printf("%d %d",s[i]-'x'?:a,s[i=L?L-s:i]-'x'?a:b);vez de if(L!=0)i=(int)(L-s);printf("%d %d",s[i]=='x'?a:0,s[i]=='x'?b:a);e em index()vez destrchr()
tetocat 7/1118
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.