Um script do Stack Exchange determina quais cinco comentários sobre perguntas ou respostas são vistos inicialmente na página principal dos sites através do número de votos positivos; os cinco comentários com o maior número de votos são exibidos. Sua tarefa é recriar esse comportamento.
Escreva um programa ou função completo, recebendo entradas através de STDIN, argumentos de linha de comando ou argumentos de função e imprima ou retorne as cinco principais pontuações de comentários. A entrada será uma matriz de números inteiros representando o número de votos positivos nos comentários de alguma postagem. Por exemplo, uma entrada de
0, 2, 5, 4, 0, 1, 0
significa que o primeiro comentário não tem votos, o segundo tem dois votos, o terceiro tem cinco, o quarto tem quatro, etc. A ordem das pontuações dos comentários deve permanecer a mesma no resultado.
Se a entrada contiver cinco ou menos pontuações de comentários, a saída deverá conter nada mais do que os dados. Se duas ou mais pontuações de comentários forem iguais, as primeiras pontuações devem ser exibidas. Você pode assumir que a matriz de entrada conterá pelo menos uma pontuação de comentário.
Os números na saída devem ser facilmente distinguidos (portanto, 02541 para o caso 1 é inválido). Caso contrário, não há restrições no formato de saída; os números podem ser separados por um espaço ou nova linha, ou podem estar no formato de lista etc.
Casos de teste:
[0, 2, 5, 4, 0, 1, 0] -> [0, 2, 5, 4, 1]
[2, 1, 1, 5, 3, 6] -> [2, 1, 5, 3, 6]
[0, 4, 5] -> [0, 4, 5]
[1, 1, 5, 1, 1, 5] -> [1, 1, 5, 1, 5]
[0, 2, 0, 0, 0, 0, 0, 0] -> [0, 2, 0, 0, 0]
[0, 0, 0, 0, 1, 0, 0, 0, 0] -> [0, 0, 0, 0, 1]
[5, 4, 2, 1, 0, 8, 7, 4, 6, 1, 0, 7] -> [5, 8, 7, 6, 7]
[6, 3, 2, 0, 69, 22, 0, 37, 0, 2, 1, 0, 0, 0, 5, 0, 1, 2, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 2] -> [6, 69, 22, 37, 5]
O último exemplo foi retirado dessa pergunta de estouro de pilha .
Se possível, forneça um link em sua postagem para que seu envio possa ser executado on-line.
Este é o código golf, portanto o código mais curto em bytes vence. Boa sorte!
Respostas:
Gelatina , 6 bytes
Experimente online! ou verifique todos os casos de teste de uma só vez .
Como funciona
fonte
Python 2, 58 bytes
Teste em Ideone .
Como funciona
list.remove
remove a primeira ocorrência se seu argumento da lista especificada. Ao reverter a lista x , basicamente conseguimos que ela remova a última ocorrência.Portanto, basta remover o comentário com a quantidade mínima de votos até que uma lista de não mais que cinco comentários seja alcançada. Depois, revertemos a lista mais uma vez para restaurar o pedido original.
fonte
Pitão, 11 bytes
Calculamos a interseção multiset da entrada (
Q
) com os cinco maiores elementos emQ
(na ordem em que aparecemQ
) e, em seguida, obtemos os cinco primeiros.Experimente aqui .
fonte
<5SQ
é equivalente a<SQ_5
, o que economiza 1 byte.b[:-a]
... acho que pode ter sido isso em algum momento.MATL , 16 bytes
Isso usa a versão atual (10.2.1) , que é anterior a esse desafio.
Experimente online!
Explicação
fonte
JavaScript,
74 65 6261 bytes3 bytes de desconto, graças a @ user81655. 1 byte de desconto, graças a @apsillers.
Mostrar snippet de código
fonte
Python 3, 76
Economizei 9 bytes graças a Kevin, lembrando-me que eu posso abusar das declarações if em uma lista comp.
Economizou 5 bytes graças ao DSM.
Solução bastante simples no momento. Pegue as 5 melhores pontuações e analise a lista adicionando-as ao resultado conforme as encontramos.
Aqui estão meus casos de teste, se alguém quiser:
fonte
05AB1E ,
1211 bytesCódigo:
Explicação:
Usa a codificação CP-1252.
fonte
CJam, 16 bytes
Um bloco sem nome (função) que pega uma matriz e retorna uma matriz.
Suíte de teste.
Explicação
fonte
Utilitários Bash + GNU, 36
E / S formatada como listas separadas por nova linha via STDIN / STDOUT.
Experimente online.
fonte
Python, 68 bytes
Exemplo de execução.
Um pedaço de embutidos. Eu acho que a melhor maneira de explicar é seguir um exemplo.
enumerate
transforma a lista em pares de índice / valor (tecnicamente umenumerate
objeto).Os pares são classificados pelo maior valor primeiro, mantendo a ordem atual do índice para empates. Isso coloca na frente os comentários mais pontuados, quebrados por post anterior. Então, os 5 melhores comentários são feitos.
Coloque os cinco principais comentários de volta na ordem de postagem e remova os índices, mantendo apenas as pontuações.
fonte
PowerShell v4,
12097 bytesExperimentando, encontrei uma abordagem alternativa que gerava alguns bytes adicionais. No entanto, parece ser específico para o PowerShell v4 e como essa versão lida com a classificação de uma hashtable - parece, por padrão, que na v4, se vários valores tiverem o mesmo valor, leva aquele com uma chave "inferior", mas você não está garantido na v3 ou anterior, mesmo ao usar a palavra-chave ordenada na v3. Ainda não testei isso totalmente no PowerShell v5 para dizer se o comportamento continua.
Esta versão somente da v4 recebe entrada como
$a
e cria uma nova hashtable vazia$b
. Percorremos todos os elementos da entrada$a|%{...}
e cada iteração adiciona um par de chave / valor a$b
(feito pré-incrementando uma variável auxiliar$d
como a chave para cada iteração). Em seguida,sort
$b
baseamos emValue
, entãoselect
o-l
ast5
, depoissort
emName
(ou seja, a chave) e, finalmente, produzimos apenas os.Value
s do hash resultante.Se menos de 5 elementos forem inseridos, ele apenas classificará o valor, selecionará os cinco últimos (ou seja, todos), reordenará a chave e a saída.
Mais antigo, 120 bytes, funciona em versões anteriores
O mesmo algoritmo da resposta de Morgan Thrapp , que aparentemente é uma indicação de que grandes mentes pensam da mesma forma. :)
Recebe entrada, verifica se o número de itens é menor ou igual a 5 e, se assim for, gera a entrada e sai. Caso contrário, criamos um ArrayList
$b
(com o[System.Collections.ArrayList]
elenco exorbitantemente longo ) dos cinco principais elementos de$a
. Em seguida, iteramos sobre$a
e para cada elemento, se estiver na$b
saída e o removemos$b
(e aqui está o motivo pelo qual precisamos usar o ArrayList, pois remover elementos de um Array não é um recurso suportado no PowerShell, pois eles são tecnicamente corrigidos Tamanho).Requer v3 ou superior para o
-in
operador. Para uma resposta que funciona nas versões anteriores, troca$_-in$b
para$b-contains$_
um total de 126 bytes .fonte
Haskell, 62 bytes
Exemplo de uso:
map snd.sort.take 5.sortOn((0-).snd).zip[0..] $ [5, 4, 2, 1, 0, 8, 7, 4, 6, 1, 0, 7]
->[5,8,7,6,7]
.Como funciona: aumente cada elemento com seu índice, classifique decrescente, pegue os 5 primeiros elementos, classifique por índice e remova o índice.
fonte
PHP 5,
107102Guardado 5 bytes graças a @WashingtonGuedes
Ungolfed
Tente.
fonte
1 1 5 1 1 5
, sua submissão produz uma saída em1 5 1 1 5
vez da correta1 1 5 1 5
.Ruby, 82
8789bytes$><<eval($*[0]).map.with_index{|x,i|[i,x]}.sort_by{|x|-x[1]}[0,5].sort.map(&:last)
chamar:
ruby test.rb [1,2,2,3,4,5]
envio original - 56 bytes, mas falha em determinados casos de teste e não suportava $ stdin e $ stdout
_.reduce([]){|a,x|a+=_.sort.reverse[0..4]&[x]if !a[4];a}
Explicação
fonte
Java 7, 155 bytes
Ungolfed & test-code:
Experimente aqui.
Saída:
fonte
Julia, 48 bytes
Experimente online!
Como funciona
O comentário c 1 tem precedência mais alta que o comentário c 2 se um dos seguintes for verdadeiro:
Isso define uma ordem total dos comentários, e a tarefa em questão é encontrar os cinco comentários que têm as precedências mais altas.
Em vez de classificar os comentários por precedência (o que alteraria sua ordem, para cada comentário c , contamos os comentários que têm uma precedência maior ou igual. Mantemos c se e somente se essa contagem for 5 ou menos.
Para classificar parcialmente os comentários por número de votos positivos, fazemos o seguinte. Seja x o vetor da coluna que contém a contagem de votos. Em seguida,
x'
transpõe x - criando, assim, um vector da linha - ex.<x'
cria uma matriz booleano que compara cada um dos elementos de x , com cada elemento de x t .Para x = [0, 2, 5, 4, 0, 1, 0] , isso fornece
Ao somar linhas (via
sum(...,2)
), contamos o número de comentários que têm estritamente mais votos que o comentário nesse índice.Para o vetor de exemplo, isso fornece
Em seguida, contamos o número de comentários com uma quantidade igual de upvotes publicados antes desse comentário. Conseguimos isso da seguinte maneira.
Em primeiro lugar, construir uma tabela a igualdade com
x.==x'
que compraes os elementos de x com os elementos de x T . Para o nosso vetor de exemplo, isso fornece:Em seguida, usamos
cumsum
para calcular as somas cumulativas de cada coluna da matriz.A diagonal (
diag
) contém a contagem de comentários que têm uma quantidade igual de votos positivos e ocorrem o mais tardar no comentário correspondente.Ao adicionar os dois vetores de linha que produzimos, obtemos as prioridades ( 1 é a mais alta) dos comentários.
Os comentários com prioridades que variam de 1 a 5 devem ser exibidos, para que determinemos seus índices
find(....<6)
e recuperemos os comentários correspondentesx[...]
.fonte
Python 3.5, 68 bytes
Não é páreo para a minha resposta do Python 2 , mas apenas três bytes a mais do que sua porta para o Python 3, e acho que é diferente o suficiente para ser interessante.
A E / S está na forma de tuplas. Testá-lo em repl.it .
fonte