Em muitas fontes (especificamente na fonte Consolas ), 5 dos 10 dígitos decimais têm "buracos". Vamos chamar esses dígitos sagrados:
46890
Os 5 dígitos profanos são assim:
12357
Um número inteiro pode, portanto, ser classificado como "sagrado" se contiver apenas dígitos sagrados e "profano" caso contrário. Por -
ser profano, nenhum número inteiro negativo pode ser sagrado.
Inteiros sagrados podem ser classificados ainda com base em quantos buracos eles têm. Por exemplo, os seguintes dígitos têm uma santidade de 1:
469
E esses dígitos têm uma santidade de 2:
80
Dizemos que a santidade geral de um número inteiro é a soma da santidade de seus dígitos. Portanto, 80
teria uma santidade de 4 e 99
teria uma santidade de 2.
O desafio
Dado dois inteiros n > 0
e h > 0
, produza o n
th santo inteiro cuja santidade é pelo menos h
. Você pode assumir que as entradas e saídas não serão maiores que o número máximo máximo representável no seu idioma ou 2^64 - 1
, o que for menor.
Aqui está uma lista dos primeiros 25 inteiros sagrados com santidade h >= 1
, para referência:
0, 4, 6, 8, 9, 40, 44, 46, 48, 49, 60, 64, 66, 68, 69, 80, 84, 86, 88, 89, 90, 94, 96, 98, 99
Os primeiros 25 inteiros sagrados com santidade h >= 2
são:
0, 8, 40, 44, 46, 48, 49, 60, 64, 66, 68, 69, 80, 84, 86, 88, 89, 90, 94, 96, 98, 99, 400, 404, 406
0
tem uma santidade de dois" antes de eu finalmente clicado no link wikipedia para ConsolasRespostas:
Pitão, 32 bytes
Explicação
Experimente aqui
Recebe entrada no formulário
h \n n
fonte
Ruby,
1091059582 bytesEssa é a terrível abordagem "calcular de 0 a 99999999999 ...", que é 13 bytes mais curta que seu equivalente lento. No entanto, é improvável que esta versão termine antes da morte pelo calor do universo. Vale 13 bytes, enfim ¯ \ _ (ツ) _ / ¯
Você pode testá-lo para valores menores, alterando
?9*99
para, digamos'99999'
,.Aqui está a versão antiga (95 bytes, com avaliação lenta, que é executada quase instantaneamente em vez de quase nunca):
fonte
take
vez defirst
?take
Retorna @NotthatCharlesLazy
, que não pode ser indexado.Python 3, 103
Aqui está uma solução que usa uma abordagem mais eficiente em termos de memória, mas usa o mesmo algoritmo se você quiser testá-lo.
Casos de teste:
fonte
2**64-1
; consulte stackoverflow.com/questions/34113609/…PowerShell,
1631501411019896 bytesPega a entrada e depois volta até
$n
zero. Inicialmente, definimos$i=-1
usando um truque de pré-processamento, que funciona porque$i
, não tendo sido declarado anteriormente, é$null
. Então nós--
, o que faz o PowerShell avaliá-lo como$i = $null - 1
, o que é$i=-1
.Cada loop incrementamos
$i
e depois executamos umaif
declaração longa . A primeira parte do condicional verifica$i
se não há nada12357
disso usando o-notmatch
operador para filtrar os números profanos.A segunda parte do condicional verifica a quantidade de furos
$i
. Ele usa o-replace
operador para substituir cada8
ou0
com11
, e, em seguida, compara se o comprimento for> =$h
. Não precisamos nos preocupar em eliminar os números profanos, já que isso é a primeira parte do condicional, e os números com um único orifício têm o mesmo comprimento de1
qualquer maneira, portanto, também não precisamos substituí-los.Se isso ainda é verdade, diminuímos
$n
(como isso significa que encontramos outro número que atende aos requisitos de entrada). Assim, quando afor
condição é recalculada para verificar se$n
é zero, significa que encontramos a enésima , então saímos dofor
loop, saímos$i
e terminamos.Edit - salvou 13 bytes usando uma matriz em vez de string
$l
e alterando como$n
é diminuído / verificado.Edit 2 - salvou 9 bytes adicionais verificando
$n
nofor
condicional e movendo a saída para fora do loopEdit 3 - salvou um gritante Mais 40 bytes mudando radicalmente a maneira como calculamos os furos.
Edit 4 - salvou mais 3 bytes movendo-o
++
para um pré-incremento na primeira parte da edição condicional5 - salvou outros 2 bytes graças a TessellatingHeckler
fonte
for(--$i;$n)
e-replace"8|0"
?$i=-1
estava me deixando absolutamente maluco. Ainda estou tentando descobrir uma maneira de não precisarmos inicializar$i
em primeiro lugar, mas as coisas que tentei até agora são mais longas (e, agora, considerando isso, provavelmente ainda serão mais longas).CJam,
3634 bytesObrigado ao aditsu por economizar 2 bytes.
Teste aqui.
fonte
Utilitários Bash + GNU, 67
seq
simplesmente gera números inteiros a partir de0
cimased -r
:h
copie a linha de entrada para o espaço de espera/12357/d
excluir números profanoss/8|0/&&/g
substitua dígitos duplamente sagrados por duas vezes. Assim, dígitos únicos santos são contados uma vez e dígitos duplamente santos são contados duas vezes./^.{$1}/!d
Se não corresponder a pelo menos$1
orifícios, exclua e continue na próxima linhax
trazer o número original de volta ao espaço do padrãosed
$2!d
em qualquer linha antes da linha$2
, exclua e continue na próxima linhaq
deve estar na linha$2
- sair (e impressão implícita)Ideone.
fonte
sed -r "h;/[12357]/d;s/8|0/&&/g;/^.{$1}/!d;x"
. E outros 4:sed $2!d\;q
. E se você está feliz com um limite superior de apenas 4611686018427387904, você pode se safar comseq 0 $[1<<62]
seq
aceitaNaN
como um valor: agora tenhoseq 0 NaN|sed -r "h;/[12357]/d;s/8|0/&&/g;/^.{$1}/!d;x"|sed $2!d\;q
67 pontos.-sh: !d\: event not found
` before
! `Não é necessário em um script . Isso é necessário apenas ao executar isso diretamente na linha de comando, o que não acho que seja um requisito.MATL , 39
40bytesEntradas são
n
eh
nessa ordem.Experimente online!
Precisamos acompanhar dois números: número atual do candidato (para verificar sua santidade) e a quantidade de números encontrados que são sagrados o suficiente. O primeiro é o topo da pilha e o último é mantido como o número de elementos na pilha. Quando o programa termina, apenas a parte superior precisa ser exibida.
fonte
R,
109107 bytesCom novas linhas e recuos:
Uso:
fonte
JavaScript (ES6), 110 bytes
Solução recursiva de cauda que acumula números sagrados em uma matriz.
Fora de interesse, não exigir que o número seja totalmente santo (!) Torna a santidade mais embaraçosa, mas ainda economiza 10% no total:
fonte
i
er
em um ponto e não consegui editar a alteração corretamente.JavaScript ES6, 191 bytes
Claro, essa não é a maneira mais eficiente. Mas você me conhece, eu amo geradores <3
Ligeiramente não destruído:
fonte
C # 6, 168 bytes
Esta é uma expressão lambda do tipo Func <int, int, int>. Este código é otimizado para o tamanho mínimo (não performatic).
Abaixo, o código embelezado na declaração do método (com mais desempenho):
fonte
JavaScript (ES6), 87
Menos golfe
Teste
fonte
Lua, 169 bytes
Ungolfed:
fonte
Lua,
155141140 BytesRecebe as duas entradas pelo argumento da linha de comando (o primeiro argumento é n, depois h)
Edit: Obrigado a @DavisDude, que me ajudou a raspar 14 bytes e me lembrou que eu não precisava imprimir todos os números sagrados até n, mas apenas o enésimo.
Ungolfed e explicações
fonte
print(a[arg[1]])
n
. Na verdade,print(a[#a])
economiza ainda mais bytes. Obrigado pelo comentário !x=0a={}
vez dex,a=0,{}
.0a
seria interpretado como um número hexadecimal, mas eu posso fazer issoa={}x=0while
sem problemas :) #Oracle SQL 11.2, 229 bytes
Sem golfe
fonte
Python 2, 96 bytes
A condição de santidade ativada
k
é verificada porsum(map(s.count,`k`))>=h
, que conta o número de furos somando as contagens de cada caractere ems="0046889"
, onde0
e8
aparece duas vezes.set(str(k))<=set(s))
, que verifica se os números são todos santos.str
é usado em vez de backticks para evitar o sufixoL
por muito tempo.Eles são encadeados em uma única igualdade usando o fato de Python 2 de que os números são menores que os conjuntos.
A função é definida recursivamente para contar números
k
, diminuindo o contadorn
cada vez que um número sagrado de acerto, a menos que acerte0
. Em seguida, ele poderia retornar ok
que desencadeou isso, mas é mais curto manter a contagem recursivamente adicionando1
cada vez, embora um fator de um por um exija uma contagem básica de-1
para corrigir.fonte
Haskell, 94 bytes
c
é a santidade de um dígito,v
a santidade de um número,n!h
faz o resto.Nota: Eu acho que esta é a única resposta sem os caracteres
4,6,8
.fonte
Rápido
fonte