Meu primeiro código de golfe, desculpas por qualquer erro ...
Contexto
Na escalada ( especificamente em pedregulho ), as notas de escalada V / Vermin (EUA) começam em 'VB' (a nota mais fácil) e depois passam 'V0', 'V0 +', 'V1', 'V2', 'V3' , 'V4', 'V5' etc. até 'V17' (a série mais difícil).
Tarefa
Você terá como entrada uma lista / matriz de notas de escalada e precisará retornar ou imprimir uma lista / matriz das notas classificadas da mais fácil à mais difícil.
Se a entrada estiver vazia, retorne uma estrutura de dados vazia; caso contrário, a entrada sempre será válida.
Casos de teste
Input | Output
[] | []
['V1'] | ['V1']
['V7', 'V12', 'V1'] | ['V1', 'V7', 'V12']
['V13', 'V14', 'VB', 'V0'] | ['VB', 'V0', 'V13', 'V14']
['V0+', 'V0', 'V16', 'V2', 'VB', 'V6'] | ['VB', 'V0', 'V0+', 'V2', 'V6', 'V16']
Este é um desafio do código-golfe .
code-golf
array-manipulation
sorting
Chris_Rands
fonte
fonte
Respostas:
Python 2 ,
5854 bytesExperimente online!
Como funciona
fonte
a=>a.sort((a,b,B10=0)=>(g=s=>eval(s.slice(1)+10))(a)>g(b))
tem 58 bytes.a=>a.sort((a,b)=>(g=s=>eval(s.slice(B10=1)+10))(a)-g(b))
é 2 bytes mais curto, mas ainda é muito longo.JavaScript (ES6) / Firefox, 53 bytes
Casos de teste
Para o Firefox:
Mostrar snippet de código
Para Chrome ou Edge (+4 bytes):
Mostrar snippet de código
Quão?
Aplicamos três transformações sucessivas que levam a seqüências lexicograficamente comparáveis.
fonte
a=>a.sort((a,b)=>(g=s=>parseInt(s,32)%334+s)(a)>g(b))
no Chrome, ele não dá a resposta correta,f(["VB","V0","V0+","V1","V2","V3","V4","V5","V6","V7","V8","V9","V10","V11","V12","V13","V14","V15","V16","V17"])
não sei por que; a versão compatível com borda funciona bem no chrome.Casca , 5 bytes
Experimente online! Os resultados são impressos um por linha, mas internamente esta é uma função que pega e retorna uma lista de cadeias.
Explicação
Isso é surpreendentemente semelhante à resposta de Martin na Retina . Primeiro, o que
Öm±
significa "ordenar pelo mapeamento é um dígito". Isso colocaVB
,V0
eV0+
na ordem correta, uma vez que são comparados como[0,0]
,[0,1]
e[0,1,0]
. Em seguida, fazemos o queÖi
significa "ordenar por valor inteiro". Dada uma string,i
retorna a primeira sequência de dígitos que ocorrem nela como um número inteiro, ou 0 se um não for encontrado. As três seqüências acima são todas mapeadas para 0 e a classificação é estável, portanto, elas estarão na ordem correta na saída.fonte
Retina , 14 bytes
Experimente online!
Explicação
Substitua
B
por!
para que a ordem lexicográfica das notas fiqueVB
(ou entãoV!
) na frente de todas as notas numéricas.Classifique todas as linhas de entrada lexicograficamente. Isso não dá o resultado certo, mas faz o pedido
V! < V0 < V0+
corretamente.Volte
V!
paraVB
.Classifique as linhas numericamente. O Retina simplesmente procura o primeiro número decimal em uma string para determinar sua chave de classificação. Se não houver um número (como para
VB
), ele define o valor como0
. Isso significa que todosVB
,V0
eV0+
têm a mesma chave de classificação. Mas a classificação de Retina é estável e já as colocamos na ordem relativa correta.fonte
V , 3 bytes
Experimente online!
Como funciona?
Este comando é quase uma solução válida, pois todas as linhas que não podem ser classificadas por números (AKA
VB
) serão colocadas no início, sem que a ordem seja alterada. No entanto, como ele está apenas olhando para números, não pode distinguir entreV0
eV0+
. Como o Vim usa uma classificação estável, o que ocorrer primeiro ocorrerá após a classificação. Tão...fonte
C #,
121838283 bytesEconomizou 39 bytes graças a TheLethalCoder e LiefdeWen
Experimente online!
Bytecount inclui
using System.Linq
.Quão?
VB
, defina o valor como -1, se for igualVB0+
, defina o valor como 0.V
.Pode ser um pouco complicado, mas funciona! :)
fonte
ToArray()
umIOrderedEnumerable
deve ficar bem..Remove(0,1)
para -1 bytes adicionais :)Ruby ,
52 4241 bytesExperimente online!
Como funciona:
Vire o problema, produza a lista completa de classificação e faça o cruzamento com a entrada.
Obrigado Lynn por economizar 1 byte.
fonte
->x{[?B,0,"0+",*1..17].map{|a|"V#{a}"}&x}
salva um byte.Pitão , 16 bytes
Resposta do Port of Python pelo OP.
Conjunto de teste .
fonte
05AB1E ,
17138 bytesExperimente online!
fonte
†
é melhor do queD"VB"åiÁ
por um tiro no escuro.Geléia , 9 bytes
Um link monádico que obtém uma lista de listas de caracteres e retorna a lista classificada.
Experimente online! (o rodapé formata bem o resultado)
Quão?
fonte
Haskell , 55 bytes
Experimente online!
fonte
Para começar aqui, está a minha solução em Python 3 ...Desculpas, postadas cedo demais contra a convenção, agora republicando novamente ...Python 3 ,
6967 bytesExperimente online!
fonte
Swift 3 , 102 bytes
Esta é uma função. Você pode chamá-lo assim:
Experimente online!
Como é que isso funciona?
Esta é basicamente uma porta da incrível resposta Javascript do @Arnauld , mas otimizada para o Swift.
Ele mapeia cada um dos valores para Strings lexicograficamente ordenáveis, conforme mostrado na tabela abaixo:
Código Explicação
String((Int($0,radix:32) ?? 992)%334)
- Converte cada String de um número base 32 em decimal. Caso o valor seja "V0 +", a chamadaInt(_:radix:)
retornará nulo e assumimos o valor de "V0", 992. Além disso, pegamos o resultado demod 334
e finalmente o convertemos em String.+$0
- Adiciona o valor atual à String criada acima. Por exemplo, se a String forV9
, a função acima retornará333
e nós adicionamosV9
, resultando em333V9
.var r={...}
- Declara uma variávelr
para um fechamento anônimo, porque salva muitos bytes, pois é usado duas vezes.func f(l:[String])
- Define uma funçãof
com um parâmetrol
, uma lista de Strings.print(l.sorted(by:{r($0)<r($1)}))
- Imprime o resultado da classificação da lista fornecida, com a chave sendo a variávelr
definida acima.fonte
PowerShell , 45 bytes
Experimente online!
Usa o mesmo processo que a resposta Ruby do GB para construir a lista completa de argumentos em ordem classificada e, em seguida, selecione aqueles que são
-in
a lista de entrada.fonte
Planilhas Google, 142 bytes
Entrada é uma cadeia de caracteres
A1
com cada entrada separada por vírgula.Saída é a célula da fórmula mais as
n-1
células abaixo dela, onden
está o número de entradasA1
.É uma fórmula longa e confusa, então vamos desempacotá-la.
If(A1="","",~)
corrige a entrada nula. Sem isso, uma entrada vazia retorna um#VALUE!
erro porque aSplit
função não funciona em entradas vazias.Transpose(Split(A1,","))
divideA1
nas vírgulas e a transpõe para uma coluna porque aSort
função funciona apenas em colunas.Transpose(IfError(Find(),Value()+9))
é quebras nessas partes:Find(Split(A1,","),"VBV0V0+")
tenta encontrar cada parâmetro nessa sequência. Esses três primeiros são os únicos que devem ser classificados como cadeias de caracteres, para que possamosFind
obter sua ordem de classificação.Value(Mid(Split(A1,","),2,3))+9
obtém o valor numérico da nota. Isso só importa para V1 e superior, para que eles sejam classificados numericamente. O+9
objetivo final é garantir que V1 venha após V0 +, pois seuFind
valor seria5
. Tecnicamente, então,+5
é apenas necessário, mas não me custa mais bytes para ter o dobro extra de certeza de que está classificado corretamente.IfError(Find(~),Value(~))
retorna oFind
valor se a sequência foi encontrada (ou seja, a nota é VB, V0 ou V0 +). Se não puder ser encontrado, ele retornará o valor numérico da nota mais nove.Transpose(IfError(~))
novamente o transforma em uma coluna para que vocêSort
possa usá-lo.Sort(Transpose(Split(~)),Transpose(IfError(Find(~),Value(~)+9)),1)
quebra tudo, classificando a entrada dividida usando a ordem de classificação personalizada crescente.ArrayFormula(~)
envolve a coisa toda para que ele retorne os resultados como uma matriz em vez de apenas retornar o primeiro valor nessa matriz. É isso que faz com que a fórmula em uma célula também preencha as células abaixo dela.fonte
Bash + coreutils, 21
sort
O-V
modo de classificação por imersão do GNU quase faz o que queremos. MudeB
para a.
e pronto.Experimente online .
fonte
Haskell ,
90848361 bytesExperimente online!
f
é uma função que converte escaladas em cordas que podem ser comparadas. Se a conversãoVB
for a sequência vazia, obtendo a prioridade mais alta, ela será substituídaV1
porX
sequências de três anos para diminuir a prioridade deV10
-V17
. Quanto ao restante, não fazemos nada.Para classificar a lista, usamos
Data.Lists
asortOn
função (como sugerida por Lynn) para criar uma função sem pontos.fonte
g=sortOn f
, que também está emData.List
.f(_:'1':a)='X':a
economiza 4 bytes![a]
outra formaV1
, será o padrão correspondente, que é o problema que estou tentando contornar.R , 45 bytes
Como é que isso funciona?
fonte
Python2, 77 bytes
fonte
Geléia ,
1711 bytesExperimente online!
fonte
TXR Lisp : 45 bytes
Corre:
fonte
Perl 5 , 56 + 1 (-a) = 57 bytes
Experimente online!
fonte