Dado um número inteiro 1 ≤ N ≤ 1.000.000 como entrada, imprima o último dígito diferente de zero de N! onde ! é o fatorial (o produto de todos os números de 1 a N , inclusive). Esta é a sequência OEIS A008904 .
Seu programa precisa terminar em 10 segundos em uma máquina razoável para qualquer entrada válida.
Casos de teste
1 => 1
2 => 2
3 => 6
4 => 4
5 => 2
6 => 2
7 => 4
8 => 2
9 => 8
10 => 8
100 => 4
1000 => 2
10000 => 8
100000 => 6
1000000 => 4
Este é um código de golfe, portanto o código mais curto em bytes vence!
Respostas:
Ruby - 63 caracteres
Fonte - http://oeis.org/A008904
Alças de até mil dígitos em menos de um segundo.
Teste
fonte
Mathematica,
4536 bytesMuito legível para uma resposta vencedora. :) (Por outro lado, ainda não há envios da GolfScript & Co.).
Isso lida com a entrada 1.000.000 em cerca de 5 segundos na minha máquina.
fonte
Python - 75
fonte
PARI / GP - 27 bytes
Isso negocia velocidade por tamanho - o testcase leva muito tempo (~ 6 segundos).
Esta versão é muito mais rápida (~ 15 microssegundos), mas leva 81 bytes:
Você pode usar este código (sem golfe) para testar:
fonte
Windows PowerShell, 53
565960637390Notas:
História:
$input
uma corda é suficiente; o elenco paraint
é aplicado implicitamente.fonte
Perl, 53
5861personagensTodo o espaço em branco pode ser removido, mas eu o deixei para "legibilidade". Nota: não use alguma fórmula explícita boba de Sloane.
Calcula f (10 ^ 6) em 8,7 segundos na minha máquina.
Atualização : O OP queria que fosse um programa inteiro:
Isso torna 55 caracteres.
fonte
CJam - 28
Você pode experimentá-lo em http://cjam.aditsu.net/ para valores de até 10000; para números maiores, você deve usar o interpretador java . 1000000 é executado em cerca de 3 segundos no meu laptop.
Explicação:
Infelizmente, a solução direta é muito lenta, por isso estou mantendo apenas os últimos 7 dígitos (antes dos zeros à direita) após cada multiplicação.
Nota: esse idioma é muito mais recente que a pergunta.
fonte
Mathematica, 34 bytes
fonte
05AB1E , 4 bytes
Experimente online!
Explicação
fonte
Gelatina , 4 bytes
Experimente online!
Explicação
Usa o fato de que, quando
Ṛ
(reverter uma lista; não vetoriza) é aplicado a um número inteiro, ele automaticamente levaD
(dígitos) primeiro.Com a entrada 8:
Eu não acho que exista um "primeiro elemento de verdade" de um byte (que
ȯ/
atua como), mas se houver, pode ser reduzido para três bytes no total.fonte
Java (OpenJDK 8) , 62 bytes
Experimente online!
Semelhante ao @ Kevin Cruijssen, mas economiza 5 bytes combinando os loops.
fonte
||
por|
e um byte adicional substituindo==0
por<1
. Aproveite sua estadia!C,
150140135 bytesEsta é a versão para sistemas ASCII; substituir a cadeia
33436
com11214
um sistema EBCDIC, ou com\1\1\2\1\4
um programa portátil.As soluções C são um pouco dificultadas pelo requisito de fornecer um programa completo; no entanto, isso responde totalmente à pergunta.
Experimente online (requer Javascript):
Explicação
É baseado no algoritmo descrito em Dígito não zero menos significativo de n! , virou-se para que recuássemos para encontrar a potência mais alta de cinco e faça o cálculo na saída. As tabelas de constantes eram muito grandes, então reduzi-as encontrando uma relação entre o resíduo anterior
r
, o dígito atuald
e a profundidade da recursãok
:Pois
r>0
isso se resolve com tempos der
tempos constantes2^dk
(mod 5); as constantes estãoa[]
abaixo (destacadas no código do golfe). Também observamos que(2^4)%5
é 1, para que possamos reduzir o expoente para evitar transbordar o intervalo deint
.Testes:
O desempenho também é respeitável. Aqui está uma entrada máxima para um sistema com 32 bits
int
:Também obtive os mesmos tempos com um máximo de 64 bits
int
.fonte
2147483647!
tem mais de 19 bilhões de dígitos e(2^63-1)!
mais de 170.000.000.000.000.000.000.000 de dígitos, portanto, essa é uma grande vitória sobre o cálculo dos fatoriais.1000000!
conforme especificado na pergunta, é possível calcular o hardware atual; são apenas 5,5 milhões de dígitos. :-)PHP - 105
Executa menos de 10 segundos com o caso de teste fornecido.
fonte
Python3
239 CharsPode fazer 10000 em ~ 3,2 segundos (a Ideone me interrompe em 8 segundos, tenho certeza de que demorará mais de 10 segundos :()
Python2.6
299 caracteres (um pouco mais rápido)fonte
Haskell, 78 caracteres
(Provavelmente precisaria ser compilado para calcular 1.000.000! Em 10 segundos).
fonte
foldl1
porproduct
(cf codegolf.stackexchange.com/questions/607/find-the-factorial/… ). Mas você já tentou com 1000000! ?J -
4240 caracteresUm programa inteiro. Salve este programa em um arquivo e execute com
jconsole script.ijs 1234
. Observe que este programa não sai do intérprete após a impressão de um resultado. Digite^D
ouexit]0
para sair do intérprete.Aqui está uma explicação:
x #. y
interpreta o vetor inteiroy
como umx
número base ; por exemplo,10 #. 1 2 3 4
produz1234
.u inv
produz o inverso de um verbou
. Em particular,x #. inv y
representay
como umx
número base ; por exemplo,10 #. 1234
produz1 2 3 4
. Observe queinv
é definido como^:_1
, isto é,u
aplicado -1 tempo.x * y
é o produto dex
ey
, portanto,x 10&#.inv@* y
produz uma representação de base 10 do produto dex
ey
.x # y
copia o n- ésimo itemy
tantas vezes quanto o n- ésimo item dex
; Quandox
é um vetor de booleano,x
seleciona quais itensy
levar. Por exemplo,1 0 1 0 # 1 2 3 4
produz1 3
.* y
produz o signum dey
.x u~ y
é o reflexo deu
, isto é, o mesmo quey u x
.y #~ * y
produz um vetor de todos os itensy
positivos. Em notação tácita, isso pode ser escrito com um gancho como(#~ *)
.{: y
produz o último item emy
.([:{:@(#~*)10&#.inv@*)
.u/ y
é a redução doy
verbo diádicou
inserido entre os elementos dey
. Por exemplo,+/1 2 3 4
é como1 + 2 + 3 + 4
e produz10
.([:{:@(#~*)10&#.inv@*)/ y
produz o último dígito do produto dos itens dey
.ARGV
é um vetor em caixa dos argumentos da linha de comando.".>{:ARGV
é o último argumento sem caixa e interpretado como um número.i. y
calcula números naturais de0
atéy - 1
.1+i. y
produz números naturais de1
atéy
. Eu também poderia ter usado>:
incremento aqui, mas1+
é mais claro ao mesmo custo de caracteres.1+i.".>{:ARGV
(o vetor de1
ao número no último argumento da linha de comando) ao verbo([:{:@(#~*)10&#.inv@*)/
e imprime o resultado comecho
.fonte
Pyt , 5 bytes
Explicação:
Experimente online!
fonte
R ,
63555146 bytesCalcula fatorial, extrai o último dígito diferente de zero. Agradecimentos a Giuseppe por fornecer a estrutura básica.
Experimente online!
Como alternativa, minha antiga resposta de 51 bytes:
Calcula fatorial, converte em caractere, remove todos os
0
se depois pega o caractere final. Economizou 2 bytes graças a Giuseppe.Experimente online!
fonte
gamma(x+1)
é menor quefactorial(x)
(y=(x<-gamma(scan()+1))%/%10^(0:nchar(x))%%10)[!!y][1]
em 54 bytes.nchar(x)
com1e5
uma solução de 46 bytes! Boa viagem.> <> , 25 bytes
Experimente online!
Alças 0! corretamente também. Valor transmitido pela
-v
bandeira.fonte
1000
não produz nenhuma saída no TIO - o que há de errado?Perl 6 ,
2635 bytesTente
Como um programa completo:
Tente
Expandido:
fonte
C (gcc) , 72 bytes (função)
Experimente online!
C (gcc) ,
10199 bytes (programa inteiro)Experimente online!
Essa pergunta tem apenas 8 anos e, portanto, "máquina razoável" não é a mesma de então, mas estou recebendo ~ 0,01 segundos no meu computador ao executar todos os casos de teste juntos, portanto, a menos que os computadores tenham aumentado a velocidade por um fator de 1000 na última década, deve estar bem.
fonte
Adicionar ++ , 11 bytes
Experimente online!
fonte
Anexo , 26 bytes
Experimente online!
Explicação
Esta é uma composição de 4 funções:
`!
- esta é uma versão funcional do operador fatorialDigits
- obtém os dígitos do fatorial\&:(All@V)
- Esta é uma função de seleção. Ele funciona ligando à esquerda (&:
) a funçãoAll@V
to\
, que é select. Por sua vez,All@V
é uma maneira curta de testar se um número não é 0. Ele funciona lançando sua entrada para um vetor0 -> [0]
depois perguntando se todos esses membros são verdadeiros (ou seja, não são 0). Isso fornece os dígitos do número sem 0s.Last
- isto simplesmente obtém o último membro desta matriz.fonte
APL (Dyalog Unicode) ,
1815 bytesExperimente online!
Função de prefixo tácito. Retorna o dígito correto para um único caso de teste ou uma sequência de dígitos para vários casos de teste.
Obrigado a @ Adám e @ErikTheOutgolfer por 3 bytes cada.
Quão?
fonte
NARS APL, 28 bytes, 14 caracteres
Não sei por que, mas isso passa no teste:
fonte
AWK ,
4757 bytesExperimente online!
A solução original não tratou muito bem os valores de entrada "grandes". Pode adicionar
-M
para forçá-lo a funcionar, mas isso também requer muito mais tempo de processamento.fonte
inf
não está%
muito bem. :(Japonês , 6 bytes
Vim com alguns 6-byters diferentes, mas eu gostei mais deste. Estou convencido de que deve haver uma maneira de fazer isso em 5, no entanto.
Tente
Explicação
Ê
calcula o fatorial da entrada,s
converte-o em uma sequência e depois em um número inteiro depois de aw
reverter,ì
converte o resultado em uma matriz de dígitos ev
retorna o primeiro elemento.Alternativas
fonte
Perl 5 , 36 + 10 (
-p -Mbigint
) = 46 bytesExperimente online!
fonte
f
(deve ser 4 ) e 100 ⇒7
(deve ser 4 )