Introdução
Os seres humanos são uma espécie notável, mas às vezes podemos ser muito difíceis de entender - principalmente para computadores. Em particular, parecemos gostar de escrever polinômios de uma maneira muito complicada, com regras aparentemente arbitrárias.
Qual é o programa mais curto que você pode escrever para formatar um polinômio corretamente usando essas regras?
Desafio
Entrada
Uma lista de números inteiros entre -1000 e 1000 (inclusive), representando os coeficientes de um polinômio, com a última entrada sendo o coeficiente de x ^ 0 (a constante), a segunda última sendo o coeficiente de x ^ 1, etc.
Saída
Uma string que representa esse polinômio na notação matemática corretamente formatada de humanos.
Regras:
- O sinal no coeficiente à esquerda é mostrado apenas se for negativo.
Right: -x^2+3
Wrong: +x^2+3
- Componentes com coeficiente 0 não são impressos (exceto para a caixa de canto onde todos os coeficientes são 0 *).
Right: x^5-x^2+3
Wrong: x^5+0x^4+0x^3-x^2+0x+3
- Coeficientes
-1
e+1
devem ser exibidos sem o 1, a menos que sejam a constante.
Right: x^5-x^2+1
Wrong: 1x^5-1x^2+1
- O expoente é mostrado apenas se for maior que 1 e a variável é mostrada apenas se o expoente for maior que 0.
Right: 3x^3-7x^2+2x+1
Wrong: 3x^3-7x^2+2x^1+1x^0
- * Caixa de canto: enquanto os valores zero geralmente resultam na impressão desse componente, se todos os coeficientes forem zero, a constante 0 deve ser impressa.
Right: 0
Wrong: 0x+0
Wrong: (nothing)
- Isso é código-golfe, então o vencedor será o programa com o menor número de bytes.
Exemplo de entrada e saída
Input: Output:
[0] 0
[0,0] 0
[0,-1,35,0] -x^2+35x
[5,1,7,-9] 5x^3+x^2+7x-9
[100,0,0,-1] 100x^3-1
[931,21,-11,1] 931x^3+21x^2-11x+1
Estou ansioso para ver suas soluções. Diverta-se!
EDITAR:
- Você pode cercar as operações por espaço em branco, se desejar. Então,
3x+5
e3x + 5
ambos estão bem.3x+ 5
e3x +5
não é. - Se você deseja produzir caracteres expoentes reais (digamos, em Tex), isso é permitido, pois é ainda mais próximo de como os humanos escrevem.
- Os coeficientes devem aparecer sem decimais, por exemplo,
9x^2
está correto,9.0x^2
não é.
fonte
3x^2 + 4
versus3x^2+4
?1x
->x
substituição não muda21x^2
em2x^2
.Respostas:
Retina 0.8.2 , 56 bytes
Experimente online! O link inclui casos de teste. Explicação:
Insira todos os poderes de
x
, incluindox^1
mas nãox^0
.Exclua todas as potências
x
com coeficientes zero, mas não um final0
(ainda).Exclua um multiplicador de
1
(mas não uma constante1
).Exclua o
^1
dex^1
.Exclua uma constante 0, a menos que seja a única coisa que resta.
Exclua o espaço antes de a
-
.Altere os espaços restantes para
+
s.fonte
JavaScript (ES6),
107106 bytesExperimente online!
Quão?
A saída é criada aplicando as seguintes fórmulas a cada coeficiente c da matriz de entrada a [] , mantendo o controle do expoente atual e .
1a fórmula: sinal de adição
Se o coeficiente for estritamente positivo e este não for o primeiro termo na expressão de saída, anexamos a
+
. Caso contrário, não acrescentamos nada.2a fórmula: sinal de menos e coeficiente
Se o expoente for zero ou o valor absoluto do coeficiente não for igual a 1, anexamos o coeficiente (que pode incluir um líder
-
). Caso contrário, anexamos a-
(se o coeficiente for negativo) ou nada.3a fórmula: variável e expoente
Se o expoente for 0, não anexamos nada. Se o expoente for 1, anexamos
x
. Caso contrário, acrescentamosx^
seguido pelo expoente.fonte
Stax , 37 bytes
Execute e depure on-line
Aqui está a versão descompactada e não empacotada.
Execute este
fonte
Python 3,
279277258251 bytesRecebe entrada como uma lista de seqüências de caracteres. Esta solução ainda não é altamente golfada. Isso basicamente funciona substituindo itens para se adequar ao formato de saída, o que aumenta muito a contagem de bytes.
Experimente Online!
Agradecimentos especiais a ovs e NK1406 .
fonte
if'0'!=i
eif'-1'==i
.Pari / GP , 41 bytes
Experimente online!
Se um
*
entre o coeficiente e a variável for permitido:Pari / GP , 3 bytes
Experimente online!
fonte
APL (Dyalog Classic) ,
114113109107106 bytesExperimente online!
-4 bytes graças a @dzaima!
Definitivamente, isso pode ser jogado ainda mais. Isto exige
⎕IO←0
fonte
Pip , 78 bytes
Toma os coeficientes como argumentos da linha de comando. Experimente online!
Usa
ME
(map-enumerate) eJ
(join) para gerar algo do formulário0x^3+-1x^2+35x^1+0x^0
e, em seguida, várias substituições de regex para transformar isso no formato apropriado.fonte
APL (Dyalog Classic) ,
7976 bytesExperimente online!
fonte
Python 3,
161162 bytesCorrigido um erro graças ao ovs.
Expandido:
fonte
C # , 237 bytes
fonte
Limpo , 172 bytes
Experimente online!
fonte
Wolfram Language / Mathematica, 39 bytes
Experimente online!
Acontece que há um built-in para entrar na ordem certa.
Solução anterior:
Wolfram Language / Mathematica, 93 bytes
Pelo menos para mim, isso é surpreendentemente longo para uma linguagem projetada para manipulação matemática. Parece queExpand@FromDigits[#,x]&
deve funcionar, mas a ordem padrão para os polinômios é o inverso do que a pergunta exige, portanto, é necessária alguma finagling extra.Explicação
fonte
SringReplace
serStringReplace
?Python3:
150146 bytes(implementações anteriores):
Você pode experimentá-lo online
Parabéns para: @Benjamin
fonte
f=lambda l:''.join('+-'[a<0]+str(a)[a<0:5*((abs(a)!=1)|(1>i))]+'x^'[:i]+str(i)[:i-1]for i,a in zip(range(len(l)-1,-1,-1),l)if a).lstrip('+')or '0'
Perl 5
-a
, 94 bytesExperimente online!
fonte
Retina 0.8.2 , 113 bytes
Experimente online!
Tenho certeza de que há muito para jogar golfe aqui ...
fonte
Haskell ,
166163 bytesExperimente online! Exemplo de uso:
g [0,-1,35,0]
rendimentos"-x^2+35x"
.Solução anterior de 166 bytes, que é um pouco melhor legível:
Experimente online!
fonte
Ruby , 111 bytes
Experimente online!
Resolver isso no Ruby acabou sendo um pouco frustrante, principalmente devido ao fato de que, diferentemente da maioria dos idiomas, no Ruby (quase) tudo é verdade, incluindo 0s e cadeias vazias, de modo que mesmo uma simples verificação de zero fica longe tão curto quanto
x?
.Eu brinquei com vários métodos de construção da corda e, finalmente, decidi por uma mistura de várias abordagens:
+
e-
sinais são produzidos formatando a sintaxe com sinal forçado:%+d
x^i
é selecionada usando a indexação do operador de foguete[...][i<=>1]
fonte
Casca ,
44 43 4140 bytesExperimente online!
Isso parece um pouco desajeitado; Husk não é otimizado para manipulação de strings. Peguei emprestadas algumas idéias da resposta Stax .
Explicação
fonte
Perl 6 , 97 bytes
Experimente online!
Explicação:
$!
mantém o controle do expoente atual.Adicione
+
coeficientes positivos antes, exceto se for o primeiro diferente de zero. O$_&&
curto-circuito garante que a variável de estado anônima$
seja incrementada apenas para coeficientes diferentes de zero. A&
junção é recolhida quando forçada a Bool com?
.Decremento
$!
. Pique o coeficiente 1 ou -1, a menos que seja constante.Termos lineares e constantes de casos especiais. O uso da
<< >>
construção de proteção de cotação é um byte menor que o equivalente('','x')
ou2>$!??'x'x$!!!'x^'~$!
.Oculte zero termos, mas sempre avalie a expressão anterior para o
--$!
efeito colateral.Retorne
0
se todos os coeficientes forem zero.fonte
Java 8,
202176174173 bytesExplicação:
Experimente online.
fonte
a->{String r="";int j=a.length;for(int u:a)r+=u==(j^j--)?"":"+"+u+(j<1?"":j<2?"x":"x^"+j);return r.isEmpty()?"0":r.substring(1).replace("+-","-").replaceAll("([+-])1x","$1x");}
(j^j--)
para0*j--
.Python, 165 bytes
fonte
PHP, 213 bytes
Argumento de linha de comando conforme solicitado pelo OP (argumento único entre colchetes e vírgulas).
Impressão bonita e alguma explicação:
fonte
PowerShell, 295 bytes
fonte