Objetivo
Dada a entrada r
e n
encontre os primeiros n
números naturais, de x
modo que, se girarmos o primeiro dígito para o último local, obteremos x/r
.
Você pode assumir que 2 <= r <= 9
e 1 <= n <= 65535
.
Você pode escrever um programa que receba informações dos argumentos stdin ou da linha de comando; ou você pode escrever uma função que aceita r
e n
como parâmetros. A saída, no entanto, deve ser stdout. A saída deve ser uma linha por valor de x
, formatada como x/r=y
, em ordem crescente x
.
Sua solução deve ser capaz de lidar com todos os casos válidos dentro de um minuto em um computador desktop razoável.
Casos de teste
Entrada: 4 5
Saída:
102564/4=25641
205128/4=51282
307692/4=76923
410256/4=102564
512820/4=128205
Entrada: 5 1
Saída:714285/5=142857
Isso é código-golfe, então o mínimo de bytes ganha. A resposta vencedora será aceita daqui a quatro semanas (19/09/2014).
Os créditos para esta pergunta vão para o meu colega, que me permitiu postar esta pergunta aqui :)
fonte
gprof
, um caso de entrada para o meu programa gasta menos de meio segundo no meu código, mas leva cerca de 80 segundos no total, o que suponho que deva estar bloqueando a saída.printf
.Respostas:
Haskell,
182179Segunda versão, provavelmente ainda mais jogável, mas com o algoritmo "adequado" desta vez. Em particular, ele termina dentro de alguns minutos com
r=4
en=65535
, mas, novamente, meu computador não é razoável nem desktop, portanto, é provável que isso permaneça dentro de um minuto em outras máquinas.É baseado na ideia de que
x=10^k*a + m
, onde seu primeiro dígito0≤a≤9
é movido para o final para obtery=10*m+a
. Um pouco de matemática revela quem
pode ser obtido comoa*(10^k-r)/(10*r-1)
, de modo que basta digitalizara
mais[1..9]
para cadak
de 0 a infinito, e manter e imprimir os primeirosn
resultados para o qual a expressão acima param
é integral.A
fromIntegral
é necessária porqueread
ing uma lista comn
como um de seus elementosmain
, em combinação com o uso den
notake
, forçariar
aInt
toda, o que resulta em excessos desagradáveis com os grandes números em questão. Eu poderia ter usadogenericTake
, mas isso requer umimport
.Esse código também tem o benefício de ser quase trivial expandir para bases diferentes de 10.
A entrada é lida
stdin
, os dois valores podem ser separados por qualquer espaço em branco.fonte
r = 5; n = 65535
em um minuto?y`mod`10
commod y10
, que é um char mais curtoPure Bash (sem utilitários externos), 80 bytes
Observe que o bash apenas aritmético inteiro e não o ponto flutuante; portanto, verificamos se, em
x == y * r
vez dex / r == y
. Também a multiplicação geralmente deve ser mais rápida. Ainda assim, isso não chega nem perto de atender aos requisitos de desempenho.Resultado:
fonte
C 468
(Algumas linhas novas não contadas na contagem de bytes foram adicionadas acima para eliminar as barras de rolagem. Sim, a nova linha final é contada.)
Espera argumentos na linha de comando e assume que a saída padrão aceita ASCII. O tempo de execução é O (número de bytes de saída) = O (n * n).
Não, eu não posso usar
printf
. Isso leva muito tempo e leva o programa além do limite de minutos na minha área de trabalho. Como é, alguns casos de teste levam cerca de 30 segundos.O algoritmo trata a saída como seqüências de caracteres, não como números, uma vez que elas rapidamente se tornam enormes e existem padrões fortes na saída.
Um pouco não-destruído:
Prova
que o programa resolve o problema:
(Na prova, considere todos os operadores e funções como as funções matemáticas reais, não as operações do computador que as aproximam.
^
Denota exponenciação, não xor a bit).Para maior clareza, usarei uma função
ToDec
para descrever o processo comum de escrever um número como uma sequência de dígitos decimais. Seu alcance é o conjunto de tuplas ordenadas{0...9}
. Por exemplo,Para um número inteiro positivo
n
, definaL(n)
como o número de dígitos na representação decimal den
; ou,Para um número inteiro positivo
k
e um número não negativon
comL(n)<k
, definaRep_k(n)
como o número real obtido adicionando zeros na frente dos dígitos decimais den
, se necessário, para obter ok
total de dígitos e, em seguida, repetindo infinitamente essesk
dígitos após o ponto decimal. Por exemploA multiplicação
Rep_k(n) * 10^k
fornece os dígitosn
anteriores ao ponto decimal e os dígitos (preenchidos com zero) den
infinitamente repetidos após o ponto decimal. entãoDado um número inteiro positivo
r
, suponha quex
seja uma solução para o problema eonde
x_1 != 0
ek = L(x)
.Para ser uma solução,
x
é um múltiplo der
eA aplicação da
Rep_k
função fornece uma boa equação:Usando sua forma fechada de cima,
x_1
deve estar no conjunto{1 ... 9}
.r
foi especificado para estar no conjunto{2 ... 9}
. Agora, a única questão é: para quais valoresk
a fórmula acimax
fornece um número inteiro positivo? Vamos considerar cada valor possívelr
individualmente.Quando
r
= 2, 3, 6, 8 ou 9,10r-1
é 19, 29, 59, 79 ou 89, respectivamente. Em todos os casos, o denominadorp = 10r-1
é primo. No numerador, só10^k-1
pode haver um múltiplo dep
, o que acontece quandoO conjunto de soluções é fechado em adição e subtração que não resulta em um número negativo. Portanto, o conjunto compreende todos os múltiplos de algum fator comum, que também é a solução menos positiva para
k
.Quando
r = 4
e10r-1 = 39
; ou quandor = 7
e10r-1 = 69
, o denominador é 3 vezes um primo diferentep=(10r-1)/3
.10^k-1
é sempre um múltiplo de 3 e, novamente, nenhum outro fator no numerador pode ser múltiplo dep
, portanto, novamente o problema se reduz ae novamente as soluções são todos os múltiplos da solução menos positiva para
k
.[Não finalizado...]
fonte
Python -
9190Aqui está um primeiro tiro:
Edit: Ok, provavelmente é uma maneira lenta de cumprir o limite de tempo de 1 minuto necessário para números de 65K.
fonte
JavaScript - 145
não jogou golfe:
fonte
(5,4)
. O motivo para não funcionar é que os números crescem muito . a) Muito maior que um número em JS pode representar com precisão eb) muito grande, pois seria possível iterar por todos os números para chegar lá.Python
3-223179 bytesImplementação em Python da solução de TheSpanishInquisition:
Corre:
python3 <whatever you named it>.py
Resultado:
Constatações:
https://oeis.org/A092697 é o primeiro valor para cada r.
Parece que apenas certos valores de k produzem respostas e que o intervalo é regular. Por exemplo, para r = 4:
Os intervalos são:
Este formulário https://oeis.org/A094224 .
Usando esses valores, uma versão mais eficiente pode ser criada:
No entanto, ainda não posso provar que isso continua matematicamente.
Resultados para r = 5:
fonte
9 65535
?unsigned long long
isso e torná-lo multicore para fazer isso em um minuto.unsigned long long
tiver 64 bits, não é grande o suficiente.