O título diz tudo. Dois inteiros positivos de 32 bits de entrada m, n >= 2
, saída gcd(m,n)
em forma de fatoração primária.
Entrada
Args da linha de comando ou 1 linha de stdin ok, o que for melhor para o golfe.
Resultado
Espaço único delimitado por expoentes (sem espaços adicionais). Não produza nada se as entradas forem relativamente primárias.
Exemplos:
$ ./factorize 96 162
2^1 3^1
$ ./factorize 14 15
$ ./factorize 196 294
2^1 7^2
Regras
- Você não pode usar recursos externos, bibliotecas matemáticas ou funções internas para fatoração ou GCD. Exemplos: Java, no
java.lang.Math
. ruby, nãoprime_division
, perl, nãofactor
, etc.
gcd(n,m) == 1
?q:a+.b
ou__ q:a+.b
em J não usaexternal resources or math libraries
, mas não vou publicá-lo, pois está muito longe do espírito da pergunta. Eu apenas pensei em compartilhar aqui.Respostas:
Python 3,
255250237226188180150142137136 caracteresÉ incrível o quanto eu poderia encurtar isso apenas pulando coisas (como, você sabe, encontrando o gcd)! Também eu poderia reduzir mais 10 caracteres, tornando isso uma função que espera 2 polegadas, como algumas outras respostas, em vez de ler a partir de stdin.
fonte
while g<a and g<b:
parawhile(g<a)*(g<b):
a%g+b%g
poucoelse:g+=1
poderia serg+=1
, a menos que eu esteja perdendo alguma coisa.Ruby -
16811711410110097Edit: Depois de pensar sobre isso, percebi que não precisava da peneira, já que a primalidade do fator é tratada no ciclo de fatoração. Além disso, conforme informado pelas respostas de outras pessoas (as de Laindir e Tal são as que eu já tinha visto, embora pareça que outras pessoas também o fizeram), removeram o cálculo separado do MDC, pois isso também ocorre na fatoração.
Edit 2: Não precisa
do
.Edit 3: Apertando-o mais.
Edit 4: Puxou mais um espaço.
Editar 5: em
upto
vez deeach
;?^ == "^"
!Saída (o mesmo após a edição):
Certamente poderia ser melhorado, mas não ruim para o meu primeiro.
fonte
map{|i|i.to_i}
paramap &:to_i
. Você pode remover um 5º byte sem contar a nova linha no final do arquivo; Ruby funciona sem ele.$*
vez deARGV
.Python 2 -
254252196185156151134126121Intérprete
repl.it
Exemplo de entrada - stdin
Saída de exemplo - stdout
fonte
…`a`+'^'+`f.count(a)`…
?f.append(i)
paraf+=[i]
salvar 5 caracteres.f=''
ainda está aí?)Java -
184175Isso é inspirado na resposta do @Geobits (e um pouco da resposta do @ Tal), mas o suficiente é diferente que eu decidi criar minha própria resposta.
Arnês de teste não testado (tipo de) com (verificação humana):
fonte
dc, 96 bytes
Ele lê uma linha de entrada padrão. Sua saída não termina com uma nova linha. (EDIT: Ele também gera um espaço extra após cada fatoração. Algumas das outras respostas diminuem o espaço, mas essa não.)
Exemplo:
Código com comentários:
fonte
PowerShell - 82
fonte
2..$a
em um loop Foreach-Object%{...}
. O loop coleta os valores deif($p){"$_^$p"}
.JavaScript (ECMAScript 6 Draft) - 89 caracteres
Converte a resposta original (iterativa), abaixo, em uma resposta recursiva.
Explicação
Resposta iterativa: JavaScript (ECMASCript 6) -
108 (ou 121)98 caracteresVersão 2:
Versão 1:
Respondendo à pergunta como originalmente solicitado:
Ou para cumprir as alterações da regra após o fato:
Explicação
Resultado
fonte
f(158,237)
por favor" 79^1"
filter()
ligação?Perl 6: 90 caracteres, 94 bytes
Um pouco de-golfed e comentou:
O uso é como:
fonte
Perl,
1441331181149793Versão não destruída:
Eu literalmente comecei a aprender Perl apenas para responder a essa pergunta (este é o meu primeiro código Perl), então eu suspeito que isso possa ser resolvido ainda mais.
fonte
foreach
é sempre sinônimo defor
em Perl 5, de modo que deve cortar 4 caracteres :)Java:
247241Controla os fatores em uma matriz e apenas os imprime em um loop.
Tamanho decente para Java, ao que parece.
fonte
int
, você perde 4 para oint
mas as recupera comnew int[
->new Integer[
então é uma lavagem.n%i<1&&m%i<1
paran%i+m%i<1
.()
. Sen==m
, o padrão será om+1
mesmo.m/=i;i=1;
comm/=i--;
Ele vai correr mais rápido também :)for
ciclo são necessários?JavaScript (ECMAScript 5)
170164163113Eu praticamente não pude resistir seguindo a liderança do MT0. Eu já havia considerado recursão antes, mas parecia fácil demais para atrapalhar. E é mesmo. A menor variação destrói tudo.
Há um violino para quem gosta de violino.
Ungolfed:
Versão antiga
Ungolfed:
Aqui estão alguns testes:
fonte
f(301343045, 421880263);
provavelmente porque meu navegador não me permite recursar tão profundamente. Estúpido quebrado Firefox!GolfScript, 68 bytes
Observe que essa abordagem requer tempo e espaço O (b 2 ) para os números inteiros “a” e “b”.
Ao custo de um byte extra, "apenas" O (b) tempo e espaço são necessários:
Como funciona
fonte
Python 3 (123)
Isso usa basicamente a mesma estrutura da resposta de Tal .
Basta fazer um loop até p = a-1, pois incrementamos imediatamente para obter p = a e a> = min (a, b). Se b> a, não há mal em tentar valores inúteis de p acima de a.
Em 2.x, eu acho que nós poderíamos salvar caracteres, imprimindo cada peça como obtê-lo, em vez de acumular uma string:
if c:print'%d^%d'%(p,c),
. Infelizmente, o Python 3 não parece ter uma maneira compacta de imprimir sem uma nova linha à direita.fonte
PHP, 96
fonte
p=0;g+=1
em uma linha começandog
em 1, o que permite que você faça emg<a
vez deg<=a
. Espero que você goste de python.awk -
1151119685A nova versão pode lidar apenas com uma linha de entrada. Obrigado a durron597 por apontar que eu só preciso ter certeza
i <= $1
.Ungolfed:
Anteriormente, poderia levar pares de números repetidamente
Ungolfed:
fonte
&&i<=b
?i > b
, entãob % i != 0
... obrigado :) #NF=0;
falha ao excluir $ 1 e $ 2. A saída deecho 301343045 421880263 | awk -f factorize.awk | sed 's/ */ /g'
é5 7 1021^1 59029^1
porque $ 1 é 5 e $ 2 é 7. O sed espreme os espaços extras resultantes da impressão de $ 1022, $ 1023, $ 1024, ..., $ 59028 como cadeias vazias unidas por espaços.$0=z;
$0=z;
é o mesmo número de caracteres queNF=0;
. Se$0=z;
fosse mais longo, eu diria para você ficarNF=0;
.Pip , 41 bytes
Não é uma resposta competitiva, pois a linguagem é mais nova que a pergunta. Mas essa marca Golf 68 de 68 precisava diminuir.
A saída termina em um espaço; se houver algum problema, a seguinte versão também terá 41 bytes (incluindo o
-s
sinalizador):Formatado, com explicações:
Pip, diferentemente de GolfScript, CJam, et al. é uma linguagem imperativa para operadores de infix; Ele também se inspira nas linguagens de programação de array. Essa tarefa exibe bem os dois paradigmas no trabalho.
(Observe que o commit 2015-4-20 é necessário para executar isso, pois acabei de corrigir alguns bugs.)
fonte
Python 2 - 262 bytes
A linha 6 precisa de trabalho.
fonte
…`a`+'^'+`f.count(a)`…
?Groovy: 174 caracteres
Esta é uma porta da solução da Geobits para o Groovy 2.2.1:
Aqui está a versão não destruída:
fonte
R: 139
Com recuos:
Uso:
fonte