Dada uma lista de pontuações (números inteiros não negativos) pré-classificadas do maior para o menor:
[ 10, 10, 6, 6, 4, 0]
Atribua a cada pontuação uma classificação inteira, começando com 1 e crescente, para que pontuações iguais tenham a mesma classificação (ou seja, estão empatadas):
[ 1, 1, 3, 3, 5, 6 ]
No caso de empates, as fileiras são "puladas", por exemplo, uma vez que a primeira e a segunda maiores pontuações (10 e 10) estão empatadas, ambas têm classificação 1 e a classificação 2 é "pulada", de modo que a terceira maior pontuação ( 6) tem classificação 3.
Envie uma lista de classificações não decrescentes correspondentes às pontuações de entrada.
Exemplos
In: 10 10 6 6 4 0
Out: 1 1 3 3 5 6
In: 10 9 8
Out: 1 2 3
In: 0 0 0
Out: 1 1 1
In: 16 15 15 12 11 11 10 9 9 9 8 2 2 2 0
Out: 1 2 2 4 5 5 7 8 8 8 11 12 12 12 15
Entrada
Suponha que todas as pontuações estejam entre 0 e 1.000, inclusive, e a entrada não terá mais que 500 pontuações. A entrada pode estar em qualquer formato que seja conveniente para o seu idioma de escolha (incluindo, sem limitação, STDIN, argumentos para uma função, uma matriz já armazenada em uma variável etc.).
Resultado
Retorno ou armazenar em uma variável da lista resultante ordenada de fileiras, ou escrever para STDOUT de forma legível (por exemplo 1 2 3
, [1,2,3]
, 1\n2\n3\n
e { 1, 2, 3 }
são todos muito bem, 123
não é, por falta de um delimitador). As pontuações de entrada podem ser armazenadas / impressas junto com suas classificações de saída correspondentes, mas isso não é necessário.
Restrições
Você pode usar qualquer biblioteca padrão oferecida por seu idioma. Aplicam-se brechas padrão.
Condições vencedoras
Isso é código-golfe , então o menor programa (em bytes) vence. Em caso de empate, a resposta com mais votos vence.
Notas
Isso se baseia em uma pergunta do Ruby no SO que gerou algumas respostas interessantes, incluindo uma muito curta. Convido você a apresentar suas próprias soluções antes de procurar lá.
fonte
Respostas:
J (
76)EDIT: Ah, espera! Não precisa ser uma função!
Graças a Deus por
i.~
...Ou como uma função nomeada (3 caracteres a mais, mas não funcionalmente diferente):
Execute testes:
fonte
1+i.~
é o tipo de trem que pode ser atribuído e usado em linha e, portanto, pode ser usado como uma função sem seus parênteses comuns. São 5 caracteres. E, para que conste,@
faz o mesmo trabalho que@:
neste caso, para que você possa salvar um personagem fácil lá.T-SQL (40)
Suponha que
@
é uma tabela que contém as pontuações como linhas.fonte
Pitão , 6
A lista é armazenada em Y para começar. É funcionalmente o mesmo que a solução ruby de 22 caracteres: mapeie sobre d em Y para o índice de d em Y mais 1 e depois imprima.
Exemplo:
fonte
Python (33 caracteres)
Funcionalmente igual à minha resposta em J.
fonte
x
para começar e "produzir" armazenando o resultado em uma variável.APL, 2 bytes
In
⎕IO←1
. O iota diádico pesquisa seu argumento correto no argumento esquerdo. O operador⍨
copia o argumento da direita para o argumento da esquerda se o operando for usado monadicamente. Portanto, a solução simplesmente pesquisa a posição de cada um dos elementos do vetor dados em si.Amostras:
fonte
STATA (16)
O resultado está em b.
Assume que c é uma variável no conjunto de dados que contém a entrada.
fonte
Haskell (31)
Uso:
fonte
r l=concat$tail$scanl(\s->map$const$length s+s!!0)[0]$group l
com 61 caracteresPara estabelecer uma linha de base:
Rubi (38)
Assumindo que
a
é uma matriz:(Isso é baseado na resposta da falsetru no thread SO original e não é o meu trabalho original. Eu sei que há uma solução Ruby com 22 caracteres, mas eu gostaria de ver alguém aparecer com uma mais curta que a do Ruby.)
fonte
JavaScript (E6) 41
Uma função com um argumento de matriz, retornando uma matriz
Teste no console do Firefox
Saída: [1, 1, 3, 3, 5, 6]
Saída: [1, 2, 2, 4, 5, 5, 7, 8, 8, 8, 11, 12, 12, 12, 15]
fonte
R, 15
com entrada armazenada como vetor
x
,fonte
Powershell (70)
São apenas 51 caracteres se você escolher as atribuições de variáveis no início, o que me faz sentir um pouco menos inadequada.
Supõe que $ a seja atribuído e classificado conforme especificado pelo problema. $ n rastreia a classificação, $ c é apenas um contador que funciona com $ l, o último elemento verificado na matriz.
Se há algo que eu possa fazer para melhorar isso, eu adoraria saber.
fonte
Java (57)
Usando as mesmas 'regras' que o Allbeert :
Constante
i
é definida comoint[]
matriz e contém a entrada,z
contém o tamanho da entrada. Outros,l
,c
,x
en
, são definidos comoint
.O trecho de código que resta à esquerda é:
O resultado está na matriz de entrada.
fonte
Ruby, 22
Eu não olhei para o tópico SO, mas imagino que é isso que eles criaram.
Edit: Sim, é. Duvido que seja possível ficar menor no Ruby, a menos que você assuma que o está definindo como um método Array, você pode fazê-lo em 18 caracteres com
Mas é claro que o programa completo em torno desse trecho parece
fonte
> <> (47)
Não particularmente otimizado, apenas testando a água com meu primeiro golfe.
Supõe que a entrada seja preenchida previamente na pilha, de modo que o primeiro elemento da entrada seja o primeiro a ser retirado.
Teste:
saídas
fonte
Clojure, 35
Com alguma interoperabilidade Java misturada:
Sessão REPL:
fonte
C - 62
Como um trecho de código, já que não havia requisito para função ou programa completo.
Assume
a
,n
,j
, ek
são já definido comoint*
,int
,int
, eint
, respectivamente, em quea
é uma matriz contendo a entrada, en
contém o comprimento da entrada.Isso falha na entrada de comprimento 0, caso em que são necessários mais 3 caracteres.
fonte