Mi primer post de código de golf, disculpas por cualquier error ...
Contexto
En la escalada en roca ( específicamente en boulder ), los grados de escalada V / Vermin (EE. UU.) Comienzan en 'VB' (el grado más fácil) y luego pasan a 'V0', 'V0 +', 'V1', 'V2', 'V3' , 'V4', 'V5', etc. hasta 'V17' (el grado más difícil).
Tarea
Tomará como entrada una lista / conjunto de calificaciones de escalada y deberá devolver o imprimir una lista / conjunto de las calificaciones ordenadas de la más fácil a la más difícil.
Si la entrada está vacía, devuelve una estructura de datos vacía; de lo contrario, la entrada siempre será válida.
Casos de prueba
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 es un desafío de código de golf .
code-golf
array-manipulation
sorting
Chris_Rands
fuente
fuente
Respuestas:
Python 2 ,
5854 bytesPruébalo en línea!
Cómo funciona
fuente
a=>a.sort((a,b,B10=0)=>(g=s=>eval(s.slice(1)+10))(a)>g(b))
es de 58 bytes.a=>a.sort((a,b)=>(g=s=>eval(s.slice(B10=1)+10))(a)-g(b))
es 2 bytes más corto, pero aún es demasiado largo.JavaScript (ES6) / Firefox, 53 bytes
Casos de prueba
Para Firefox:
Mostrar fragmento de código
Para Chrome o Edge (+4 bytes):
Mostrar fragmento de código
¿Cómo?
Aplicamos 3 transformaciones sucesivas que conducen a cadenas lexicográficamente comparables.
fuente
a=>a.sort((a,b)=>(g=s=>parseInt(s,32)%334+s)(a)>g(b))
en Chrome, no da la respuesta correcta,f(["VB","V0","V0+","V1","V2","V3","V4","V5","V6","V7","V8","V9","V10","V11","V12","V13","V14","V15","V16","V17"])
no estoy seguro de por qué; La versión compatible con bordes funciona bien en Chrome.Casco , 5 bytes
Pruébalo en línea! Los resultados se imprimen uno por línea, pero internamente esta es una función que toma y devuelve una lista de cadenas.
Explicación
Esto es sorprendentemente similar a la respuesta de Martin Retina . Primero lo hacemos
Öm±
, lo que significa "orden por mapeo es dígito". Esto poneVB
,V0
yV0+
en el orden correcto, ya que se comparan como[0,0]
,[0,1]
y[0,1,0]
. A continuación lo hacemosÖi
, que significa "ordenar por valor entero". Dada una cadena,i
devuelve la primera secuencia de dígitos que aparecen en ella como un entero, o 0 si no se encuentra uno. Las tres cadenas anteriores se asignan a 0 y el orden es estable, por lo que estarán en el orden correcto en la salida.fuente
Retina , 14 bytes
Pruébalo en línea!
Explicación
Reemplace
B
con!
para que el orden lexicográfico de calificaciones pongaVB
(o luegoV!
) delante de todas las calificaciones numéricas.Ordenar todas las líneas de entrada lexicográficamente. Esto no da el resultado correcto pero ordena
V! < V0 < V0+
correctamente.Convertir de
V!
nuevo enVB
.Ordenar las líneas numéricamente. Retina simplemente busca el primer número decimal en una cadena para determinar su clave de clasificación. Si no hay un número (como for
VB
), establece el valor en0
. Es decir, todasVB
,V0
yV0+
tienen la misma clave de ordenación. Pero el tipo de Retina es estable y ya los hemos puesto en el orden relativo correcto.fuente
V , 3 bytes
Pruébalo en línea!
¿Como funciona?
Este comando es casi una solución válida, ya que cada línea que no se puede ordenar por números (AKA, por sus
VB
siglas en inglés) se colocará al principio, sin que se cambie el orden. Sin embargo, dado que solo está mirando números, no puede distinguir entreV0
yV0+
. Dado que Vim usa un tipo estable, lo que ocurra primero seguirá siendo el primero después de ordenarlo. Asi que...fuente
C #,
121838283 bytesGuardado 39 bytes gracias a TheLethalCoder y LiefdeWen
Pruébalo en línea!
Bytecount incluye
using System.Linq
.¿Cómo?
VB
, establezca el valor en -1, si es igual aVB0+
, establezca el valor en 0.V
.Puede ser un poco hack, ¡pero funciona! :)
fuente
ToArray()
anIOrderedEnumerable
esté bien..Remove(0,1)
para -1 byte adicional :)Ruby ,
52 4241 bytesPruébalo en línea!
Cómo funciona:
Cambie el problema, produzca la lista ordenada completa, luego obtenga la intersección con nuestra entrada.
Gracias Lynn por guardar 1 byte.
fuente
->x{[?B,0,"0+",*1..17].map{|a|"V#{a}"}&x}
guarda un byte.Pyth , 16 bytes
Puerto de respuesta de Python por OP.
Banco de pruebas .
fuente
05AB1E ,
17138 bytesPruébalo en línea!
fuente
†
es mejor queD"VB"åiÁ
un tiro largo.Jalea , 9 bytes
Un enlace monádico que toma una lista de listas de caracteres y devuelve la lista ordenada.
Pruébalo en línea! (el pie de página formatea bien el resultado)
¿Cómo?
fuente
Haskell , 55 bytes
Pruébalo en línea!
fuente
Comenzar aquí es mi solución de Python 3 ...Disculpas, publiqué esto demasiado pronto contra la convención, ahora vuelvo a publicar ...Python 3 ,
6967 bytesPruébalo en línea!
fuente
Swift 3 , 102 bytes
Esta es una función. Puedes llamarlo así:
Pruébalo en línea!
¿Como funciona esto?
Esto es básicamente un puerto de la increíble respuesta Javascript de @Arnauld , pero optimizado para Swift.
Asigna cada uno de los valores a cadenas ordenables lexicográficamente como se muestra en la tabla a continuación:
Explicación del código
String((Int($0,radix:32) ?? 992)%334)
- Convierte cada cadena de un número base-32 a decimal. En caso de que el valor sea "V0 +", la llamada aInt(_:radix:)
devolverá nil, y tomamos el valor de "V0", 992. Además, tomamos el resultado demod 334
, y finalmente lo convertimos en String.+$0
- Agrega el valor actual a la cadena creada anteriormente. Por ejemplo, si la cadena esV9
, la función anterior regresa333
y agregamosV9
, lo que resulta en333V9
.var r={...}
- Declara una variabler
a un cierre anónimo, porque ahorra muchos bytes ya que se usa dos veces.func f(l:[String])
- Define una funciónf
con un parámetrol
, una lista de cadenas.print(l.sorted(by:{r($0)<r($1)}))
- Imprime el resultado de ordenar la lista dada, siendo la clave la variabler
definida anteriormente.fuente
PowerShell , 45 bytes
Pruébalo en línea!
Utiliza el mismo proceso que la respuesta Ruby de GB para construir la lista completa de argumentos en orden, luego selecciona aquellos que son
-in
la lista de entrada.fuente
Hojas de cálculo de Google, 142 bytes
La entrada es una cadena
A1
con cada entrada separada por una coma.La salida es la celda de la fórmula más las
n-1
celdas debajo de ella, donden
está el número de entradasA1
.Es una fórmula larga y desordenada, así que desempaquételo.
If(A1="","",~)
corrige la entrada nula. Sin esto, una entrada vacía devuelve un#VALUE!
error porque laSplit
función no funciona en entradas vacías.Transpose(Split(A1,","))
se divideA1
en comas y se transpone en una columna porque elSort
función solo funciona en columnas.Transpose(IfError(Find(),Value()+9))
se rompe en estas piezas:Find(Split(A1,","),"VBV0V0+")
intenta encontrar cada parámetro en esa cadena. Estos tres primeros son los únicos que deben clasificarse como cadenas, por lo que utilizamosFind
para obtener su orden de clasificación.Value(Mid(Split(A1,","),2,3))+9
Obtiene el valor numérico de la calificación. Esto solo importa para V1 y superior, por lo que se clasifican numéricamente bien. los+9
final es para asegurar que V1 viene después de V0 + ya que suFind
valor sería5
. Técnicamente, entonces, solo+5
se requiere, pero no me cuesta más bytes hacer un doble extra seguro de que se ordena correctamente.IfError(Find(~),Value(~))
devuelve elFind
valor si se encontró la cadena (es decir, la calificación es VB, V0 o V0 +). Si no se puede encontrar, devuelve el valor numérico de la calificación más nueve.Transpose(IfError(~))
nuevamente lo convierte en una columna para queSort
pueda usarlo.Sort(Transpose(Split(~)),Transpose(IfError(Find(~),Value(~)+9)),1)
concluye todo ordenando la entrada dividida usando el orden de clasificación personalizado ascendente.ArrayFormula(~)
envuelve todo para que devuelva los resultados como una matriz en lugar de simplemente devolver el primer valor en esa matriz. Esto es lo que hace que la fórmula en una celda también llene las celdas debajo de ella.fuente
Bash + coreutils, 21
sort
El-V
modo de clasificación por ersión de GNU casi hace lo que queremos. Cambia elB
por a.
y hemos terminado.Pruébalo en línea .
fuente
Haskell ,
90848361 bytesPruébalo en línea!
f
es una función que convierte los grados de escalada en cadenas que se pueden comparar. Si la conversión se convierteVB
en la cadena vacía para obtener la máxima prioridad, se reemplazaV1
conX
cadenas de tres largos para reducir la prioridad deV10
-V17
. Por el resto no hacemos nada.Para ordenar la lista usamos
Data.Lists
lasortOn
función (como lo sugiere Lynn) para crear una función sin puntos.fuente
g=sortOn f
, que también está enData.List
.f(_:'1':a)='X':a
ahorra 4 bytes![a]
que coincidaV1
con el patrón, que es el problema que estoy tratando de eludir.R , 45 bytes
¿Como funciona esto?
fuente
Python2, 77 bytes
fuente
Jalea ,
1711 bytesPruébalo en línea!
fuente
TXR Lisp : 45 bytes
Correr:
fuente
Perl 5 , 56 + 1 (-a) = 57 bytes
Pruébalo en línea!
fuente