Pelo menos h com pelo menos h
Uma lista de números inteiros não negativos.
O maior número inteiro não negativo, de hmodo que pelo menos hos números da lista sejam maiores ou iguais a h.
Você pode escrever um programa completo ou uma função, e funções anônimas também são permitidas. Isso é código-golfe, então a menor contagem de bytes vence. As brechas padrão não são permitidas.
O índice h é uma noção usada na academia que visa capturar o impacto e a produtividade de um pesquisador. Segundo a Wikipedia, um pesquisador tem o índice h , se ele publicou h artigos científicos, cada um dos quais foi citado em outros artigos pelo menos h vezes. Portanto, esse desafio é sobre o cálculo do índice h a partir de uma lista de contagens de citações.
Uau, ótimas respostas o tempo todo! Aceitei a mais curta, mas se alguém vier com uma ainda mais curta, atualizarei minha escolha.
Vencedores por idioma
Aqui está uma tabela de vencedores por idioma que também tentarei manter atualizada. Incluí todas as postagens com pontuação não negativa. Corrija-me se cometi um erro aqui.
APL : 7 bytes por @MorisZucca
Bash + coreutils : 29 bytes por @DigitalTrauma
C # : 103 bytes por @ LegionMammal978
C ++ : 219 bytes por @ user9587
CJam : 15 bytes por @nutki
GolfScript : 13 bytes por @IlmariKaronen
Haskell : 40 bytes por @proudhaskeller
J : 12 bytes de @ ɐɔıʇǝɥʇuʎs
Java : 107 bytes por @Ypnypn
JavaScript : 48 bytes por @ edc65
Mathematica : 38 bytes por @ kukac67
Perl : 32 bytes por @nutki
Pyth : 10 bytes por @isaacg
Python : 49 bytes por @feersum
R : 29 bytes de @MickyT
Ruby : 41 bytes por @daniero
Scala : 62 bytes por @ChadRetz
SQL : 83 bytes de @MickyT
TI-BASIC : 22 bytes de @Timtech
Pode ser experimentado online em tryapl.org
Uma solução recursiva. Execute isso no Stackless Python se estiver preocupado com estouros.
A partir de n=0, verifica se pelo menos n+1os números são pelo menos n+1. Nesse caso, aumenta ne inicia novamente. Caso contrário, as saídas n.
A condicional é feita usando o curto-circuito do Python para booleanos. A expressão sum(n<x for x in s)conta o número de valores smaiores do que a nadição do indicador Booleans, que são tratados como 0ou 1.
Para comparação, o equivalente iterativo é 2 caracteres a mais. Requer Python 2.
Infelizmente, a entrada precisa ser salva para uma variável antes de ser iterada ou o Python tentará ler a entrada repetidamente.
Pitão, 13 10 bytes
Insira um formulário como [22,33,1,2,4]no STDIN.
-QUTé todos os números na entrada ( Q) pelo menos tão grandes quanto o número que está sendo verificado T.
<l-QUTTé verdadeiro se o comprimento dessa lista for menor que T.
f<l-QUTT1localiza o primeiro número inteiro que retorna true para a verificação interna, iniciando 1e subindo.
tf<l-QUTT1 decrementa isso em um, fornecendo o maior valor para o qual a condição é falsa, que é o índice h.
A partir de 1 garante que 0seja retornado quando o teste for sempre verdadeiro, como no primeiro caso de teste.
A entrada deve ser digitada no mesmo formato que os exemplos.
Que algoritmo incrível!
Tradução direta da minha solução Perl.
l~$W%{W):W>},,- 14 bytes
@ Optimizer Obrigado, eu esperava que houvesse uma maneira curta de reverter uma tabela. Surpreende-me, porém, que não haja acesso à contagem de iterações nos mapas. De qualquer forma, se apenas 1 byte é suficiente, isso não é ruim para meu primeiro código CJam.
Agora existem algumas soluções de 12 bytes: {$W%ee::<1b}( eefoi adicionado 17-04-2015) e {$W%_,,.>1b}( .foi adicionado 2015-02-21).
J ( 13 12)
Muito semelhante à solução da randomra. Demonstração:
Usar em #\<:vez de i.@#<salva um personagem.
Execute-o alinhando a entrada até o final da seguinte maneira:
@ MartinBüttner Você está certo, eu posso usar #>i++. Eu testei mais alguns casos. (E obrigado por todas as sugestões!)
Dada uma tabela (I) de valores (V), a seguinte consulta retornará h. Testado no PostgreSQL e também funcionará no SQL Server. Editar Faça com que ele retorne 0 em vez de NULL. Melhorou com COUNT, obrigado @nutki
Essencialmente, ele numera as linhas em uma ordem decrescente dos valores. Em seguida, ele retorna o número máximo de linhas em que o número da linha é maior que igual ao valor.
Você pode usar em COUNT(R)vez de COALESCE(MAX(R),0)uma correção mais curta para o problema NULL.
@nutki é claro ... Obrigado
Dado um vetor de inteiros em ie usando a lógica de uma ordem inversa, retornando o comprimento do vetor em que o número do elemento é menor que s. Obrigado a @plannapus pela boa dica.
Agradável! Você pode até encurtar a 29 pela soma diretamente o vetor lógica:s=sort(i);sum(s>=length(s):1)
Isso leva a lista como uma matriz em STDIN, como
Você pode usar isso para executar todos os casos de teste:
A lógica está um pouco para trás, mas salvou alguns bytes. Basicamente, o bloco passou para classificar retornos 0para candidatos válidos e 1outros. Portanto, os candidatos válidos vêm em primeiro lugar na matriz classificada. E como a classificação é estável, e começamos com uma lista de N até 1, isso retornará o maior h válido.
Perl 5: 32 (30 + 2 para -pa)
Toma entrada separada por espaço no STDIN:
sort{$b-$a}economiza mais 2
Basicamente, uma porta direta da minha solução J. Obviamente, muito mais tempo, como se pode imaginar.
Você pode salvar alguns caracteres usando enumerate.
isso procura o primeiro número que não se enquadra no esquema e retorna seu antecessor.
39 bytes com until: Experimente online!
Estratégia recursiva, mais ou menos a mesma da solução Python do xnor:
Não recursivo:
Funções lambda / anônimas "Stabby", requerem Ruby 1.9 ou mais recente. Ligue com, por exemplof[[22,33,1,2,4]]
Entrada retirada do stdin como uma lista separada por nova linha.
sort os números inteiros em ordem decrescente
nl prefixa cada linha com seu número de linha com base em 1, separando o número da linha e o restante da linha com um número maior que >
Avalie aritmeticamente cada linha com bc. Inteiros menores que o número da linha resultam em 0. Caso contrário, 1.
grepconta o número de 0s, ou seja, o número de números inteiros maior ou igual ah
Solução recursiva.
47 bytes: f=(l,h=0)=>l.map(v=>x+=v>h,x=0)&&x>h?f(l,h+1):h. No entanto, sua solução também teria 47 bytes, se você mudar apenas h=-1para h=0.
APL, 12 caracteres
C ++ 815 219 de (wc -c main.cpp)
Tudo bem, aqui estão alguns dos piores códigos que eu já escrevi! :)
— user9587
Pega a lista como entrada:
Teste este código online. 1
Recebe entrada como uma matriz na pilha. Usa o mesmo algoritmo da solução Python do feersum , iterando sobre os números na matriz e incrementando um contador de 0 até que seja igual ou exceda o elemento atual da matriz.
1) O servidor GolfScript on-line parece estar experimentando tempos limite aleatórios novamente. Se o programa atingir o tempo limite, tente executá-lo novamente.
Representação ASCII:
Despejo hexagonal:
Obtém uma lista como entrada. A partir de Ans = 0, verifica se pelo menos Ans + 1 dos números são pelo menos Ans + 1. Nesse caso, incrementa Ans e volta novamente. Caso contrário, gera Ans.
Não conta porque a funcionalidade de matriz reversa 'C' foi adicionada após a pergunta, mas estou respondendo por diversão de qualquer maneira.
Assume que a matriz é o primeiro item da pilha e coloca a resposta no topo da pilha.
Para imprimir, basta adicionar P no final, adicionando um byte.
J, 15 11 caracteres
(Solução J mais curta atual.)
Compara os elementos da <:lista classificada \:~com 1..n + 1 #\e conta comparações verdadeiras +/.
Teste de similaridade com outra solução J em 100 casos de teste aleatórios:
Experimente aqui!Esse código pode ser dividido em três partes: inicial, computacional e final.
Isso armazena 1a x, o comprimento da pilha de entrada kpara y, e recebe todas as entradas ( aïí) que é então classificadas ( '). 1øvai para a próxima linha, ou seja, a próxima parte.
Reng não tem embutido na desigualdade. Assim, um algoritmo deve ser implementado. O algoritmo mais curto que encontrei a < bé %:1,%1e; isso é assim:
Tenho certeza que esclareceu tudo! Deixe-me explicar mais. x % 1, ou seja, módulo com 1, mapeia xpara (-1,1). Sabemos que (a/b) % 1é a/bquando a < b. Assim, essa expressão é igual a a < b.
No entanto, isso não funciona tão bem devido a problemas com o módulo com zero. Portanto, incrementamos cada membro da pilha e do contador inicialmente.
Depois de colocar a desigualdade booleana na pilha, a x+adiciona a x, mas a deixa no momento. y1-diminui ye ?^sobe se y == 0continuarmos para a fase final. Caso contrário, nós colocamos y-1em yeo novo xem x.