Se você ainda não sabe, um quaternion é basicamente um número de 4 partes. Para os propósitos deste desafio, ele possui um componente real e três componentes imaginários . Os componentes imaginários são representados pelo sufixo i
, j
, k
. Por exemplo, 1-2i+3j-4k
é um Quatérnion com 1
sendo a componente real e -2
, 3
, e -4
sendo os componentes imaginárias.
Neste desafio, você deve analisar a forma de string de um quaternion (ex. "1+2i-3j-4k"
) Em uma lista / matriz de coeficientes (ex. [1 2 -3 -4]
). No entanto, a cadeia de quaterniões pode ser formatada de várias maneiras diferentes ...
- Pode ser normal:
1+2i-3j-4k
- Ele pode ter termos ausentes:
1-3k
,2i-4k
(Se você tem termos ausentes, a saída0
para esses termos) - Pode ter coeficientes faltando:
i+j-k
(Neste caso, isso é equivalente a1i+1j-1k
Em outras palavras, a.i
,j
Ouk
sem um número na frente Assume-se que um1
em frente por padrão) - Pode não estar na ordem correta:
2i-1+3k-4j
- Os coeficientes podem ser simplesmente números inteiros ou decimais:
7-2.4i+3.75j-4.0k
Há algumas coisas a serem observadas ao analisar:
- Sempre haverá um
+
ou-
entre termos - Você sempre receberá entrada válida com pelo menos 1 termo e sem letras repetidas (no
j-j
s) - Todos os números podem ser considerados válidos
- Você pode mudar os números em uma outra forma após a análise se você quiser (ex.
3.0 => 3
,0.4 => .4
,7 => 7.0
)
Os recursos de análise / quaternião e brechas padrão não são permitidos. Isso inclui eval
palavras-chave e funções. A entrada será uma única sequência e a saída será uma lista, uma matriz, valores separados por espaços em branco, etc.
Como esse é o código-golfe , o código mais curto em bytes vence.
Toneladas de casos de teste
1+2i+3j+4k => [1 2 3 4]
-1+3i-3j+7k => [-1 3 -3 7]
-1-4i-9j-2k => [-1 -4 -9 -2]
17-16i-15j-14k => [17 -16 -15 -14]
7+2i => [7 2 0 0]
2i-6k => [0 2 0 -6]
1-5j+2k => [1 0 -5 2]
3+4i-9k => [3 4 0 -9]
42i+j-k => [0 42 1 -1]
6-2i+j-3k => [6 -2 1 -3]
1+i+j+k => [1 1 1 1]
-1-i-j-k => [-1 -1 -1 -1]
16k-20j+2i-7 => [-7 2 -20 16]
i+4k-3j+2 => [2 1 -3 4]
5k-2i+9+3j => [9 -2 3 5]
5k-2j+3 => [3 0 -2 5]
1.75-1.75i-1.75j-1.75k => [1.75 -1.75 -1.75 -1.75]
2.0j-3k+0.47i-13 => [-13 0.47 2.0 -3] or [-13 .47 2 -3]
5.6-3i => [5.6 -3 0 0]
k-7.6i => [0 -7.6 0 1]
0 => [0 0 0 0]
0j+0k => [0 0 0 0]
-0j => [0 0 0 0] or [0 0 -0 0]
1-0k => [1 0 0 0] or [1 0 0 -0]
fonte
+
sinais desnecessários na entrada? Como+1k
:?+
.-0
parte da produção legal dos dois últimos exemplos?eval
restrição a ser aceita em uma string, interpreta como código e / ou entrada. Todas as conversões não contam com isso porque você não pode passar, por exemplo, a string"test"
para uma função de conversão de número inteiro para receber um número inteiro, mastest
seria interpretada como código em umaeval
função normal . TLDR: eval: não, digite conversões: sim.Respostas:
Pitão, 48 bytes
Conjunto de teste de demonstração
O formato de saída é separado por nova linha. O código do conjunto de testes usa separação de espaço, para facilitar a leitura, mas é o mesmo.
Saídas a
-0
nos dois últimos casos, o que espero que seja bom.Explicação a seguir.
fonte
Retina, 115
Experimente online!
1 byte economizado graças a @Chris Jester-Young .
Um bug corrigido e 6 bytes salvos graças a @Martin Büttner
Encontrei alguns bugs envolvendo alguns casos extremos, aumentamos bastante a contagem de bytes.
Retorna os números nova linha separados. Enfim, isso tem uma solução bastante elegante que é arruinada por casos extremos, mas ei, eu usei o modo de classificação, isso significa que usei a ferramenta certa para o trabalho, certo?
Explicação:
Estágio por estágio, como sempre.
Os únicos caracteres na entrada que podem criar limites de palavras são
-+.
. Isso significa que, se encontrarmos um limite seguido por uma letra, teremos um implícito1
que adicionamos à substituição.$&
é um sinônimo para$0
.Muito obrigado a Martin por este, este acrescenta o implícito
0
para a parte real, se estava faltando na entrada. Garantimos que não conseguimos encontrar um número seguido por um sinal de mais ou menos, ou o fim da sequência. Todos os números complexos terão uma letra após eles.As próximas três etapas são praticamente as mesmas, exceto em qual letra elas impactam. Todos eles procuram ver se não conseguimos corresponder à letra e, se não podemos, podemos adicionar um
0
termo para ela. O único motivoi
tem um extra+
antes de impedir que o valor real seja ilegível com oi
coeficiente s, os outros números são todos separados por sua variável complexa.Ah, a parte divertida. Isso usa o estágio de classificação newish, indicado pelo
O
backtick separador antes da opção. O truque aqui é pegar o número inteiro seguido opcionalmente por um caractere de palavra, que neste caso só corresponderá a um dosijk
. A outra opção usada é o$
que faz com que o valor usado para classificar essas correspondências seja a substituição. Aqui, apenas usamos a letra opcional restante como nosso valor de classificação. Como a Retina classifica lexicograficamente por padrão, os valores são classificados como se estivessem em um dicionário, ou seja, ordenamos as correspondências"", "i", "j", "k"
.Esse estágio coloca um
+
sinal na frente de todos os sinais de menos, isso é necessário se tivermos um valor negativo parai
no estágio dividido posteriormente.Removemos o líder
+
para garantir que não tenhamos uma nova linha de líder extra.Divida as linhas restantes nas execuções das variáveis complexas ou no sinal de mais. Isso nos dá um valor por linha.
fonte
Perl 5, 125 bytes
fonte
\a
correspondências de Perl no "alarme", não no alfabético. Há\w
caracteres de palavras (alfanuméricos e sublinhados), mas isso não funciona aqui; precisamos que ele não corresponda a um número.Lua ,
185187195183166 bytes ( experimente online ) [regex usado]Obrigado a @Chris Jester-Young pelo aprimoramento da regex.
Obrigado a @Katenkyo por reduzi -lo a 166 bytes.
Golfe:
Ungolfed:
fonte
n
neste caso); portanto, você deve adicionar o código para ler a entrada.io.read()
usar(...)
. Ele apontará para o primeiro argumento da linha de comando e permitirá que você salve mais 4 bytes :) #r={0,0,0,0}for u in(...):gsub("([+-])(%a)","%11%2"):gmatch("-?[%d.]+%a?")do n,i=u:match("(.+)(%a)")r[i and(" ijk"):find(i)or 1]=(n or u)end print(table.concat(r," "))
C, 236 bytes
(Para valores como -0 ou -0,0, o sinal de menos também é impresso na saída,
mas como o desafio afirma que "você pode alterar números para outro formulário após a análise, se desejar" e se -0 aparecer na entrada, segue-se que também é aceitável na saída.@GamrCorps agora esclareceu que está tudo bem.)fonte
JavaScript (ES6),
103100 bytesEditar: salvou 3 bytes mudando de
parseInt
paracharCodeAt
, o que convenientemente só precisa&3
do índice de matriz correto.fonte
JavaScript (ES6) 106
Teste
fonte
PowerShell, 178 bytes
Ungolfed with Explanation
Não estou impressionado, mas é um resultado.
fonte
PHP, 179 bytes
Experimente a suíte de testes .
fonte
Python 3.5 - 496 bytes [usando expressões regulares]:
Pode demorar, mas, em minha defesa, funciona perfeitamente ao fazer o que o OP deseja, pois todos os casos de teste fornecidos foram bem-sucedidos usando meu código.
Versão ungolfed com explicação incluída:
Se o acima é um pouco difícil de ler, basicamente o que está acontecendo é o seguinte:
Se houver algum, todos os sinais + ou - NÃO seguidos de um número são substituídos por um "+1" / "- 1", respectivamente.
lambda
É definida uma função que, quando usada em umasorted
função como chave, classifica a lista de acordo com a colocação do número inteiro em primeiro lugar e, em seguida, solicita o restante no aumento do valor da letra ("i", depois "j" e "k" Neste caso).O Quaternion, agora com todos os sinais +/- substituídos por 1, se necessário, é pesquisado, usando Expressões regulares, para TODAS as letras NÃO precedidas por pelo menos um número, e as letras correspondentes são substituídas por um "+1" seguido de "+1" essa carta.
A instrução "if" substitui ALL +/- por um espaço e, em seguida, o Quaternion modificado agora é "dividido" nesses espaços e retornado em uma lista. Em seguida, a lista é classificada de acordo com a função lambda explicada anteriormente. Finalmente, o primeiro item dessa lista é verificado para garantir que seja um número, já que deveria ser, e se não for, um "+0" é adicionado ao Quaternion.
O segundo loop "for" encontra TODAS as letras NOT no Quaternion, encontrando uma diferença simétrica entre um conjunto dessas letras encontradas na expressão e, em seguida, um conjunto incluindo todas as letras necessárias. Se algum for encontrado, um "+0" seguido da letra ausente e um espaço serão adicionados ao Quaternion.
Finalmente, nesta última etapa, um "," é adicionado entre cada caractere seguido de um símbolo +/- e, em seguida, o Quaternion é dividido nesses espaços, e a lista retornada é classificada pela última vez, de acordo com o função lambda definida como "q" anteriormente. As vírgulas na expressão separar cada parte do quaternion (caso contrário, você estaria recebendo algo como
14i+5j+6k
a partir4i+5j+6k+1
). Por fim, essa lista agora classificada é unida em uma sequência e apenas os números de qualquer tipo (cortesia de Expressões regulares) são extraídos e finalmente retornados em uma lista, na ordem correta, sempre.fonte