Com base na pergunta Quantos números inteiros positivos <1.000.000 contêm o dígito 2? . Estou procurando a solução mais criativa para contar todos os números inteiros de X
para Y
conter o número inteiro Z
. Z
pode ser de 0 a Y
.
Todo número inteiro encontrado conta apenas uma vez, mesmo que o número inteiro Z
apareça com mais frequência. Por exemplo:
Z = 2
123 counts 1
22222 also counts 1
Começarei com um algoritmo realmente simples escrito em Java (porque é amado por todos):
public class Count {
public static void main(String[] args) {
int count = 0;
for (int i = Integer.parseInt(args[0]); i <= Integer.parseInt(args[1]); i++) {
if (Integer.toString(i).contains(args[2])) {
count++;
}
}
System.out.println(count);
}
}
se você executar isso com
java -jar Count.jar 0 1000000 2
você obtém isso como resultado:
468559
Como esse problema não é difícil de resolver, é apenas um concurso de popularidade . A resposta mais votada até 28 de fevereiro vence!
popularity-contest
counting
Obl Tobl
fonte
fonte
N
pode ser123
e só corresponderia se a substring 123 existir?Respostas:
bash (20)
Uso
fonte
Funciton
Como de costume, como a altura da linha adicionada pelo StackExchange divide as linhas, considere a execução
$('pre').css('line-height',1)
no console do navegador para corrigir isso.Ao contrário das minhas outras respostas do Funciton, este não usa nenhuma declaração de função. É apenas um programa. Porém, ele usa uma expressão lambda - um recurso que eu adicionei ao Funciton em dezembro :)
Espera a entrada como três números inteiros decimais (pode ser negativo) separados por espaços (ou seja
x y z
). De fato,z
pode ser qualquer string; por exemplo, poderia ser apenas o sinal de menos (−
, U + 2212) para contar o número de números negativos no intervalo :)fonte
C #
Exemplo
fonte
.Range
aceita(int start, int count)
, não(start, end)
. Eu sempre cair nessa armadilha eu mesmo :)APL (29)
Esta é uma função que assume
Z
como argumento à esquerda e o intervalo[X,Y]
como argumento à direita:fonte
Python 2.7
Necessito de velocidade
Explicação
Implementação
Demo
Comparação
@Dennis
@arshajii
fonte
key
pode ser qualquer número inteiro , não dígito, entrelo
ehi
.Python 2.7
Uma solução usando expressões regulares:
fonte
re.findall
em um one-liner fazendo__import__('re').findall('\d...
bash -
32.311714 caracteres + comprimento de X, Y e ZObrigado devnull por sugerir
seq
!por exemplo, X = 100, Y = 200, Z = 20
por exemplo, X = 100, Y = 200, Z = 10
por exemplo, X = 0, Y = 1000000, Z = 2
fonte
echo
quando você pode usarseq
e reduzir o comprimento em 4 caracteres? (1 para o comprimento de comando, 2 para ser capaz de omitir chaves e um para a substituição..
com um único espaço)xargs
ewc
- e também corre muito mais rápido!PHP
Nada original, apenas comemorando meu primeiro post aqui.
Entrada
Resultado
fonte
Scala:
args(0).toInt to args(1).toInt count (_.toString contains args(2))
fonte
Rubi
Este é um ótimo exemplo para usar reduzir!
Entrada:
Resultado:
fonte
Golfe em Python - 61
Python não-golfe
fonte
Java8
Usando o novo material do IntStream, isso se torna essencialmente um liner, se você ignorar o material obrigatório do Java Framework:
Pode ser executado aqui , embora eu tenha que codificar os valores.
fonte
F #
Esta solução usa
IndexOf
para pesquisar a string e, em seguida, um pouco de manipulação de números para converter o resultado em 1, se encontrado, e 0, se não encontrado, e soma o resultado:E pode ser chamado assim:
fonte
Expressão regular
A seguir, os dígitos de 1 até 49.
fonte
R 23
2527caracteresBasta obter a ferramenta certa para o trabalho. Uso simples de grep em R, nada extravagante.
Isto é o que ele faz:
grep
todas as instâncias do2
vetor0
até10e6
e contam o número de resultados usandolength
.length(grep(2,0:100000,value=TRUE))
Resultado:
[1] 468559
Fora do curso, você pode escrever uma função que aceita os números como entrada, exatamente como é mostrado no exemplo.
Agora você pode chamar
count
com x, ye z, se não estiver definido (por padrão), os valores de x, ye z serão 0, 1000000 e 2, respectivamente. Alguns exemplos:ou
ou
Alguns aqui acham que o tempo é importante, usando esta função em R leva cerca de 1 segundo.
fonte
JavaScript (ES6), 63
Uso:
Sem golfe:
fonte
Rubi
Basicamente eu tirei a resposta de Pablo e joguei semi-golfe (38 caracteres se você deixar espaço em branco desnecessário) em um exemplo não tão bom de uso
select
.Ele seleciona todos os índices no intervalo
(x .. y)
que contémz
. Infelizmente, este resultado intermediário é armazenado em uma matriz, cujo tamanho é retornado.Parece bem organizado, tanto sintática quanto semanticamente, embora a
i[z]
parte não pareça realmente fazer sentido.Funciona porque
x
ey
realmente são strings, não números! Assim, cadai
um também é uma string e, éi[z]
claro, verifica se a stringz
está contidai
.fonte
Python 2.7, 70 sinais
Mais curto, 65 sinais
fonte
range(0,y+1)
serange(y+1)
faz a mesma coisa. Além disso, você pode remover a maioria desses espaços se você está golfe ...Usando Ruby
Enumerable#grep
:fonte
T-SQL
Se eu posso assumir variáveis
@X
,@Y
e@Z
estão disponíveis:Com uma tabela de números existente (arbitrariamente grande;) - 65
Com um CTE recursivo - 127
Se as variáveis precisarem ser definidas explicitamente:
Adicione 58 a ambas as respostas - tabela de números: 123, CTE recursiva: 185
Não tenho idéia de quanta memória o CTE recursivo pode usar, mas certamente não vai ganhar nenhum concurso de velocidade. O exemplo de pesquisa de 2 em 0 a 1000000 leva 8 segundos no meu sistema.
Aqui está um SQL Fiddle se alguém quiser brincar com ele. A consulta 1000000 leva mais de 30 segundos para ser executada.
fonte
Rebol
Exemplo de uso no console Rebol (REPL):
fonte
PowerShell
Duas soluções, ambas
4037 caracteres.Para todas as versões do PowerShell:
O PowerShell V3 e superior têm o
sls
alias paraSelect-String
. Isso exige@
forçar uma matriz se apenas um valor passar pelo pipeline.fonte
Lote
Um pouco mais legível -
Agradável e simples. Utiliza manipulação de string para verificar se a variável
!b!
é igual a si mesma sem a terceira entrada do usuário,%3
(!b:%3=!
).fonte
Mathematica
Primeira maneira: strings
x, y, z
são convertidos em strings. Se um número inteiro de string não estiver livrez
, ele será contado.Exemplos
Segunda maneira: listas de dígitos
Exemplos
fonte
GolfScript
Eu tenho tentado melhorar minhas habilidades no GolfScript, então pensei em tentar com esta pergunta. Aqui está o que eu vim com:
Isso pode ser dividido assim:
Embora seja o GolfScript, o objetivo era tentar torná-lo relativamente mais eficiente do que compacto, por isso tenho certeza de que alguém pode apontar várias maneiras de melhorar isso.
Demonstração : observe que reduzi Y na demonstração para que ela seja concluída em <5 segundos.
fonte
PHP - 112
Sem loops visíveis, mas um pouco pesado na memória!
Uso
php script.php 0 1000000 2
fonte
ECMAScript 3 a 6
(javascript, JScript, etc.)usando regex:
demolir:
usando indexOf:
demolir:
esse corpo da função é um caractere a menos do que o de florent; portanto, ao usar a
=>
notação de função ES6 , o total seria de 62 caracteresChamada de exemplo:
f(0,1e6,2)
Exemplo de uso:
alert( f(0,1e6,2) );
JSFiddle aqui
PS: as duas funções acima retornam sua variável local
r
.Portanto, ao colocar a variável de resultado
r
no escopo global, é possível salvar novamente 10 caracteres:Exemplo de uso:
alert( f(0,1e6,2)||r );
fonte
Delphi - 120
Um pouco demais para o meu gosto, vou ver se consigo tirar algum proveito.
fonte
Python 2.7 - 50 caracteres
Um pouco de economia nas respostas existentes do Python.
Usando os seguintes truques:
z+x
inn
'Em ação:
fonte
k [28 caracteres]
Uso
fonte
$:[z]
por($z)
.