Eu acho que a maioria das pessoas por aqui sabe o que é um display de 7 segmentos para dígitos:
_ _ _ _ _ _ _ _
| | | _| _| |_| |_ |_ | |_| |_|
|_| | |_ _| | _| |_| | |_| _|
Podemos definir a diferença de 7 segmentos (7SD) entre dois dígitos para ser o número de segmentos que precisam ser alternados para alternar de um para o outro. Por exemplo, o 7SD entre 1
e 2
é 5 (os três segmentos horizontais e os dois segmentos verticais inferiores precisam ser alternados) e o 7SD entre 6 e 8 é 1 .
Além disso, podemos definir o 7SD entre dois números como a soma dos 7SDs entre os dígitos correspondentes. Se um número for maior que o outro, assumimos que eles estão alinhados à direita e adicionamos o número de segmentos necessários para exibir os dígitos mais significativos do número maior. Como exemplo, considere o 7SD entre 12345
e 549
:
x: 1 2 3 4 5
y: 5 4 9
7SD: 2+5+2+0+1 = 10
Sua tarefa é calcular 7SD entre n e n + 1 , dado n .
Por conveniência, aqui está a tabela completa de 7SDs entre dígitos individuais. A linha _
representa uma posição vazia.
_ 0 1 2 3 4 5 6 7 8 9
_ 0 6 2 5 5 4 5 6 3 7 6
0 6 0 4 3 3 4 3 2 3 1 2
1 2 4 0 5 3 2 5 6 1 5 4
2 5 3 5 0 2 5 4 3 4 2 3
3 5 3 3 2 0 3 2 3 2 2 1
4 4 4 2 5 3 0 3 4 3 3 2
5 5 3 5 4 2 3 0 1 4 2 1
6 6 2 6 3 3 4 1 0 5 1 2
7 3 3 1 4 2 3 4 5 0 4 3
8 7 1 5 2 2 3 2 1 4 0 1
9 6 2 4 3 1 2 1 2 3 1 0
Entrada
- A entrada é um único número inteiro positivo
n
. - Você pode escrever um programa ou função, recebendo informações via STDIN (ou alternativa mais próxima), argumento de linha de comando ou argumento de função.
- Você pode supor que a entrada seja no máximo um menor que o maior número que pode ser representado pelo tipo inteiro padrão do seu idioma, desde que esse tipo suporte pelo menos valores até 127 inclusive.
Saída
- Você deve imprimir um único número inteiro, o 7SD entre
n
en+1
. - Você pode enviar via STDOUT (ou alternativa mais próxima), valor de retorno da função ou argumento da função (out).
Pontuação
Aplicam-se as regras de código-golfe padrão, o código mais curto (em bytes) vence.
Casos de teste
Por alguma razão obscura, essa sequência ainda não está no OEIS, embora exista a sequência A123587 intimamente relacionada . Aqui estão os 100 primeiros números (começando com n = 1, 2, 3, ...
):
5, 2, 3, 3, 1, 5, 4, 1, 4, 4, 5, 2, 3, 3, 1, 5, 4, 1, 7, 4, 5, 2, 3, 3, 1,
5, 4, 1, 4, 4, 5, 2, 3, 3, 1, 5, 4, 1, 5, 4, 5, 2, 3, 3, 1, 5, 4, 1, 5, 4,
5, 2, 3, 3, 1, 5, 4, 1, 3, 4, 5, 2, 3, 3, 1, 5, 4, 1, 7, 4, 5, 2, 3, 3, 1,
5, 4, 1, 6, 4, 5, 2, 3, 3, 1, 5, 4, 1, 3, 4, 5, 2, 3, 3, 1, 5, 4, 1, 6, 4
A primeira entrada para a qual o 7SD é maior que 9 é a 1999
que deve render 11. Aqui estão alguns outros exemplos maiores:
n 7SD
1999 11
12345 1
999999 14
5699999 15
8765210248 1
Python,
5048 bytesExplicação
Esta função opera no dígito menos significativo do número
n
, somando o 7SD dos dígitos quando incrementado por um até o primeiro não9
dígito.26523308
é uma máscara de bits que codifica o mapeamento para os dígitos0-8
. Quandon=0
, o que ocorre apenas quandon
compreende apenas9
s, a resposta será desativada em dois. Isso é compensado pela expressão0**n*2
. Quanto ao dígito9
, a máscara de bit é avaliada em zero, o que acionará a chamada recursiva enquanto se adiciona2
ao 7SD.fonte
05AB1E ,
3130282726 bytesCódigo:
Explicação ( desatualizada ):
Estamos alterando o seguinte para o último dígito não 9:
Para os casos especiais:
Usa a codificação CP-1252 . Experimente online! .
Alternativa 28 bytes:
D[¤©•2X›ùì•sès®9Ê#¨]\rÚ9Q4*O
.fonte
Java, 63 bytes
O mundo está certo porque o Python passa pelo Java mais uma vez.
Porque, você sabe, Java.
Veja no ideone
O limite máximo é em 2147483647, pois esse é o Java
Integer.MAX_VALUE
.Esta é uma porta da minha resposta Python, que é uma porta da resposta ES6 .
fonte
MATL ,
613936 bytesExperimente online!
Explicação
fonte
Julia, 44 bytes
Experimente aqui.
Dennis salvou um byte!
fonte
Python,
7166 bytes48 bytes por xsot . Matemática ainda mais mágica!
Veja no ideone
Porque a resposta anterior do Python não funciona e está longe de ser ótima. Uma porta simples de uma versão anterior do ES6 . Agora, use o ajuste de bits (da formulação alternativa ES6) para cortar um elenco!
Pode ser feito para trabalhar com Python 3 usando explicitamente floordiv para +1 byte.
fonte
9
e
é uma letra válida após um num, por exemplo9e9
,.n%10==9
paran%10<9
não salva, pois o if não precisa de espaço nesta ordem.Jolf, 32 bytes
Experimente aqui!
Explicação
Esta é uma transpilação da resposta de Neil.
fonte
Pitão -
783027 bytesAquele primeiro foi embaraçoso.
Conjunto de Teste .
fonte
J, 53 bytes
Originalmente baseado na solução da @ Neil . Em seguida, aprimorou-se ao salvar um byte usando a mesma fórmula no @ Lynn solução .
A versão de 54 bytes baseada na string é
Uso
fonte
Retina , 34 bytes
Experimente online!(A primeira linha apenas permite o processamento de vários casos de teste de uma só vez.)
Explicação
Como a maioria das respostas já descobriu até agora, não precisamos usar a tabela completa, pois apenas os menos significativos
9
alterações ao incrementar. É também assim que essa resposta funciona.Isso corresponde (
M
) ao regex,.9*$
ou seja, o primeiro dígito separado apenas por9
s do final. O!
diz à Retina para substituir a entrada por essa correspondência, descartando tudo o que não afeta o 7SD.Se a entrada agora começa com um
9
que significa, a entrada em si consistia apenas de9
s, portanto, a exibição de 7 segmentos precisa preceder a1
que custos2
. A maneira mais simples de lidar com isso é substituir a liderança9
neste caso por a0
, uma vez que o custo de incrementar a9
(to0
) é2
e o custo de incrementar0
(to1
) é4
, portanto, isso aumenta o custo geral2
conforme necessário.Agora temos um estágio de transliteração que substitui cada dígito pelo seu custo para incrementá-lo (já que o
d
expande para0123456789
). Observe que este é o primeiro subdiagonal da tabela 7SD.Isso substitui cada dígito
n
porn
cópias de1
, ou seja, converte cada dígito em unário e, como não há separadores, os adiciona imediatamente.Finalmente, contamos o número de caracteres (ou seja, número de correspondências de
.
) no resultado, que converte a soma unária de volta em decimal.fonte