Las personas en este sitio realmente adoran embellecer sus títulos de publicaciones ...
Stewie's sequence: + * - / + * - /
Sin embargo, cuando este título debe incluirse en la URL de la página, se simplifica:
stewies-sequence
El reto
Su tarea es crear un programa o función que, dada una cadena que representa el título de una publicación, genera / devuelve su conversión "URL-Friendly".
El algoritmo es:
- Convertir a minúsculas (cuando corresponda)
- Reemplace cada espacio (
), punto (
.
), coma (,
) o barra diagonal (/
) con un guión (-
) - Elimine los caracteres no alfanuméricos, excepto los guiones.
- Minifique grupos de guiones adyacentes (
a---b -> a-b
), elimine los que están al principio / al final
Tenga en cuenta que este algoritmo es una simplificación y que no siempre produce los mismos resultados que el método real del sitio.
Reglas
- Puede suponer esa entrada:
- No estará vacío.
- Contendrá al menos un carácter alfanumérico.
- Solo contendrá caracteres en el rango ASCII 32-126 (imprimible)
- Se permiten programas o funciones completos.
- No se permite una construcción que haga la especificación exacta de la tarea .
- Este es el código de golf , por lo que gana la solución más corta (en bytes).
Casos de prueba
La mayoría de las publicaciones en este sitio servirán como pruebas, pero aquí hay una lista útil:
Loading... Forever -> loading-forever
N(e(s(t))) a string -> nest-a-string
"Hello, World!" -> hello-world
URL-Friendly titles -> url-friendly-titles
C.U.S.R.S -> c-u-s-r-s
1+2+3+4+...+n = -1/12? -> 1234-n-1-12
How can I use cmp(a,b) -> how-can-i-use-cmpa-b
Algunos más largos ...
Export The $PATH Variable, Line-By-Line -> export-the-path-variable-line-by-line
Do n and n^3 have the same set of digits? -> do-n-and-n3-have-the-same-set-of-digits
Quine Anagrams! (Cops' Thread) -> quine-anagrams-cops-thread
The Golfer Adventure - Chapter 1 -> the-golfer-adventure-chapter-1
Bootloader golf: Brainf*** -> bootloader-golf-brainf
Y algunas muestras de verificación de casos extremos (siéntase libre de sugerir más):
0123 -> 0123
a a1 -> a-a1
2-1=1 -> 2-11
-
s principales ? ¿Tendrán que ser removidos? Por ejemploasdf-
, ¿se-
tendrá que eliminar el último ?if(isalphanum(ch))...
_
guiones bajos? Mi código funciona excepto cuando hay guiones bajos.Respuestas:
Retina,
3331 bytes(El programa tiene una nueva línea final)
No estoy seguro de poder sacar más provecho de esto. Esto debería cubrir todo. Vino similar a Mama Fun Roll's. Otra versión de 33 bytes que usa expresiones regulares recursivas
Pruébalo en línea!
Explicación
Esta línea es simple, se convierte a minúsculas mediante T ransliterating
A-Z
(L
) aa-z
(l
, minúsculas).Esta etapa es simple, esencialmente elimina todos los caracteres innecesarios para evitarnos muchos problemas más adelante.
[^a-z ,-9]
Coincide con cualquier personaje que NO sea:a-z
: alfabeto en minúsculas (recuerde que la cadena completa está en minúsculas debido al elemento anterior): carácter espacial
,-9
este es el código de caracter gama de,
a9
que resulta ser,-./0123456789
, exactamente los caracteres que necesitamosA continuación, convertimos todos los caracteres no alfanuméricos en guiones (que ahora es justo
y
,./-
.Esto no coincidirá (no) lo
_
que se incluye en\w
(negación de\W
) porque se eliminó en la etapa anteriorfuente
a = b
.a = b
JavaScript (ES6),
90827975 bytesEste es un intento de hacer el trabajo con una sola
replace()
. Este código extrae solo los caracteres que nos interesan e ignora todo lo demás. Hay alguna lógica adicional para procesar los guiones.Casos de prueba
Mostrar fragmento de código
fuente
,a^a,
, este código da-aa-
(hay guionesV ,
41, 40, 37, 36 bytesPruébalo en línea! o ¡ Verifique todos los casos de prueba a la vez!
Como de costumbre, aquí contiene un montón de caracteres no imprimibles y no ASCII, así que aquí hay un hexdump:
En estos desafíos, el sistema de "Regex comprimido" de V es útil.
Explicación
Primero lo primero, convertiremos todo a minúsculas. Afortunadamente, hay una forma realmente conveniente de hacer esto en dos bytes. Escribí un consejo sobre eso aquí . Entonces hacemos
Después de eso, hacemos un montón de comandos sustitutos comprimidos. Una buena descripción de cómo funciona la expresión regular comprimida de V puede ser confusa aquí , pero la idea básica es que podemos establecer el bit alto para evitar tener que escapar de ciertos caracteres. Otra conveniencia es que los rangos (me gusta
:%
) y las banderas (me gusta/g
) se completan automáticamente. Pero al final, todo se traduce en comandos sustitutos vim. De hecho, incluso podríamos traducir directamente el resto del programa a vim. Eso nos daría esto:Si hablas vim-regex, debería quedar más claro lo que hace el resto del programa ahora. Así que aquí está el resto del programa:
fuente
JavaScript (ES6) 91
961 bytes guardados thx @ETHproductions
Prueba
fuente
*
en la última expresión regular, aunque puedo estar equivocadoPython 3,
1031009695 bytes5 bytes guardados gracias a Flp.Tkc
fuente
Retina, 34 bytes
Pruébalo en línea!
Tenga en cuenta la nueva línea final. Esencialmente, la implementación del OP.
fuente
T`L`l
para ir a minúsculas con menos bytesa..
similar[\W]
es solo\W
MATL , 38 bytes
Pruébalo en línea! O verificar todos los casos de prueba .
Explicación
fuente
Ruby ,
6160616453 bytes(52 bytes de código más un byte para el
-p
)Pruébalo en línea!
Actualización 1:
Usar engets
lugar del modo de edición de flujo de Ruby ahorra un byte.Revertido según la sugerencia de ValueInk .
Actualización 2: (+3 bytes en general)
..--hi, $/
(→hi
) (+10 bytes) : una vez más, cortesía del usuario ValueInk-p
(+1 byte)squeeze
y usé en sugsub
lugar (+2 bytes) , lo que me permitió:strip
para manejar los guiones iniciales y finales (-10 bytes) .Actualización 3: Hattrick por ValueInk. Ahorramos 11 bytes al aprovechar
String#split
el hábito de apretar automáticamente las corridas del mismo separador, lo que nos permite deshacernos de la cadenastrip
/ final completagsub
y reemplazarla por unsplit
/join
combo. (-11 bytes)fuente
-p
bandera, pero esto definitivamente no lo hará.-p
indicador agrega implícitamente 1 byte a su código (porque cambia la ejecución de su código deruby -e 'your code'
aruby -pe 'your code'
). También he encontrado un caso de borde donde da-hi-
información como..--hi, $/
cuando debería eliminar todos los guiones iniciales / finales y, por lo tanto, regresarhi
.gsub(/[^\w ]/){}
atr('^a-z ','')
, y luego termina con en.split*?-
lugar de.strip.gsub...
ya que maneja automáticamente los duplicados y los extremos de la cadena, ¡todo de una vez!JavaScript (ES6),
7469 bytesEditar: ahorré 5 bytes al darme cuenta de que ya había eliminado todos los caracteres, excepto
-/,. 0-9a-z
que puedo usar\w
para unir las palabras restantes.fuente
[a-z\d]
podría ser[^\W_]
?PHP, 87 bytes
La idea de las expresiones regulares proviene de respuestas existentes.
Requiere que tenga un servidor que ejecute PHP y que acceda a través de HTTP.
El título debe estar en la tecla
T
y el resultado se imprimirá en la pantalla.Ejemplo:
http://localhost/title.php?T=<my shiny title>
fuente
herramientas bash / Unix, 56 bytes
Reemplace las mayúsculas con minúsculas y los caracteres especiales requeridos con guiones.
Elimine (opción -d para tr) caracteres que no sean letras, dígitos y guiones, y luego exprima (opción -s para tr) guiones múltiples en una fila en un solo guión.
Eliminar guiones al principio, y luego al final.
fuente
Powershell, 85 bytes
lo convierten en minúsculas, a continuación, 3 reemplaza expresiones regulares en una fila, y recortar cualquier arrastran
-
'sfuente
$input
ahorrarte 2 bytes?JavaScript,
90989493919091 bytes¡1 byte guardado gracias a @ edc65!
¡1 byte guardado gracias a @IsmaelMiguel por detectar un punto y coma líder!
1 byte obtenido después de fallar
,a-^-a,
Lo que más me gusta de esta presentación en particular son los rangos. En la primera
replace
, se elimina todo lo que no es alfanumérico y no una,
,-
,.
,/
y no un espacio. ¡Usamosa-z
para detectar las letras, y usamos,-9
para detectar esos caracteres y números especiales ya que los códigos de caracteres de estos literales ASCII se alinean!Mostrar fragmento de código
fuente
f=
por lo que su recuento de bytes es 96 en este momento. Y no hay necesidad de \ dentro de un rango en la expresión regular, por lo que podría ser 95. Pero ... todavía no funciona: intente...title
f=
y el;
al final. Solo especifique que esta es una función anónima. Con esto, su respuesta debe tener 90 bytes de longitud.Lua, 91 bytes
¿Dónde
a
está la cadena de URL?Explicación:
a:lower()
devuelve la función en minúsculas:gsub
encuentra la coincidencia del patrón y lo reemplaza con la cadena.'[ .,/]'
: Los corchetes significan "o", por lo que esto coincide con el espacio, punto, coma y barra diagonal. No es necesario ser codicioso porque:gsub
todas las ocurrencias.'[^%w-]'
:^
significa "no" cuando está entre paréntesis,%w
significa cualquier cosa alfanumérica. Entonces'[^%w-]
coincide con cualquier cosa que no sea alfanumérica o un guión.'%-+'
: Combina tantos guiones como puedas y reemplázalos con un solo guión.match'%-?(.*)%-?'
: En Lua, si una cadena es el único argumento de la función, no se necesitan paréntesis. Solo necesita verificar un guión al inicio y al final porque los guiones ya se han minimizado. No hay necesidad de personajes de anclaje porque.*
es coincidir con todo, codicioso.fuente
C, 194 bytes
Llamar con:
fuente
SAS, 108
Una de las respuestas menos competitivas aquí debido a la sintaxis detallada de SAS (la penalización de 9 caracteres por expresión regular realmente duele), pero fue un buen ejercicio de aprendizaje de expresiones regulares:
fuente
Pyth, 35 bytes
Explicación
fuente
Perl 6, 75
fuente
GNU Sed, 65 bytes
Una serie de sustituciones de expresiones regulares. Utiliza no portátil
\L
de GNU sed para poner en minúscula la entrada. Ejecutar desde un archivo usandosed -f
.fuente