Sua tarefa é escrever um programa ou função que determine se um número é divisível por outro. O problema é que ele deve dar uma resposta o mais rápido possível , mesmo que nem todos os dígitos do número tenham sido fornecidos.
Seu programa deve ter um número inteiro D ≥ 2 e depois uma série de dígitos como entrada. Eles representam os dígitos de outro número inteiro N ≥ 1, iniciando no dígito menos significativo. No primeiro ponto que N quer deve ou não deve ser divisble por D , seu programa deve saída a resposta adequada e sair. Se a extremidade da entrada é alcançado, deve debitar se o completo N é divisível por D .
Aqui está uma lista de formatos de entrada aceitáveis para N (deixe um comentário se você acha que algo que não está incluído deve ser permitido):
Entrada padrão : os dígitos são dados em linhas separadas; final da entrada é EOF ou um valor especial; exit significa que a função retorna ou o programa sai.
Entrada analógica : através, por exemplo, de teclas ou dez botões representando cada dígito; fim da entrada é um valor especial; exit significa que a função retorna ou o programa sai.
Função com estado global : chamada repetidamente com dígitos sucessivos; fim da entrada é um valor especial; exit significa que a função retorna um valor não nulo. Observe que, se você usar o estado global, ele deverá ser limpo depois que um valor for retornado ou redefinido para que a função funcione várias vezes .
Função ao curry : retorna outra função a ser chamada com o próximo dígito ou um valor; fim da entrada é um valor especial ou chama a função sem argumento; exit significa que a função retorna uma resposta em vez de outra função.
Prompt da GUI ou similar : exibido repetidamente; final da entrada é "cancel" ou equivalente, ou um valor especial; exit significa que os avisos param de aparecer.
Função Iterator : input é um objeto ou função com estado que retorna o próximo dígito quando chamado; o final da entrada é uma exceção ou valor especial; exit significa que o iterador para de ser chamado.
A entrada para D e a saída podem ser feitas por qualquer método padrão aceitável .
Casos de teste:
2; 6 => true
5; 6 => false
20; 0 3 => false
20; 0 4 => true
100; 1 => false
100; 0 0 => true
100; 0 2 => false
4; 2 4 => false
4; 2 5 => true
4; 2 [eof] => false
4; 4 [eof] => true
625; 5 5 => false
625; 5 7 2 => false
625; 5 7 3 6 => false
625; 5 7 3 4 => true
7; 9 3 4 [eof] => false
7; 9 3 4 5 [eof] => true
140; 0 3 => false
140; 0 4 5 [eof] => false
140; 0 4 5 1 [eof] => true
14; 4 5 1 4 [eof] => false
14; 4 5 1 4 1 [eof] => true
fonte
digits
entrada com um valor especial para EOF?[]
e[2]
retorno outra coisa senãofalse
outrue
(incluindo a própria função etc ...) enquanto[2,3]
,[2,3,1]
e[2,3,1,EOF]
retornotrue
. Parece-me tão próximo da opção de estado global.Respostas:
JavaScript (ES6), 70 bytes
Formato de entrada: Função ao curry
Uma função que pega o divisor e retorna uma função que pega cada dígito ou para EOF. A segunda função retorna 0 (falso), 1 (verdadeiro) ou ela mesma (sem resposta).- 1 0 0 1
Experimente online!
Quão?
Dado um divisor e um dividendo q composto por n dígitos decimais, calculamos a seguinte expressão para todos os 0 ≤ k < p :p q n 0 ≤ k < p
Comentado
fonte
Lote,
177169 bytesToma
d
como parâmetro da linha de comando e lê dígitosn
em linhas separadas com-
o marcador EOF. Saídas1
para divisíveis,0
se não. Explicação:Inicialize
n
com a string vazia.g
égcd(d, 10**len(n))
Comece um loop lendo dígitos.
Leia o próximo dígito.
Pare o processamento no EOF.
Anexe o próximo dígito a
n
.Atualize
g
agora quelen(n)
aumentou e calculen%g
.Se
r
for diferente de zero, entãod
definitivamente não se dividen
, porqueg
, um fator ded
, não. Ser
for zero, sabemos apenas sed
dividen
se forg
iguald
; portanto, se não for, continue o loop.Saia do loop de leitura de dígitos aqui no EOF.
Calcular e gerar implicitamente o resultado.
fonte