Implemente una función de patrón y cadena para que coincida, devuelva verdadero si el patrón coincide con la cadena ENTERA, de lo contrario es falso.
Nuestra sintaxis de patrón glob es:
?
coincide con cualquier personaje+
coincide con uno o más personajes*
coincide con cero o más caracteres\
escapa
Reglas:
- Sin evaluación, sin conversión en expresión regular, sin llamar a una función global del sistema.
- No se requieren E / S: solo puede escribir una función
- Victorias más cortas
Ejemplos:
glob('abc', 'abc') => true
glob('abc', 'abcdef') => false IMPORTANT!
glob('a??', 'aww') => true
glob('a*b', 'ab') => true
glob('a*b', 'agwijgwbgioeb') => true
glob('a*?', 'a') => false
glob('?*', 'def') => true
glob('5+', '5ggggg') => true
glob('+', '') => false
glob('a\*b', 'a*b') => true
Aquí hay un consejo para comenzar: http://en.wikipedia.org/wiki/Backtracking
code-golf
interpreter
regular-expression
Ming-Tang
fuente
fuente
Respuestas:
Golfscript - 82 caracteres
Asume que no hay líneas nuevas en las cadenas. Devuelve una matriz vacía para falso y una matriz no vacía para verdadero (consistente con la definición de golfscript de verdadero / falso).
Esta es una solución no recursiva (excepto para
*
s consecutivas ), que mantiene una lista de las posiciones en la cadena del patrón dei
manera quepattern[0..i]
coincidastring[0..cur]
.Esto tiene el potencial de funcionar durante mucho tiempo. Puede agregar
.&
después:C%
para evitar esto.fuente
Haskell, 141 personajes
Funciona para todas las entradas, tanto patrones como cadenas para comparar. Maneja la barra diagonal inversa posterior en el patrón como una coincidencia literal (el comportamiento no se especificó).
Esto se puede ejecutar con el siguiente controlador de prueba:
Actualización: escribí una publicación de blog sobre esta respuesta en particular, ya que creo que muestra bien cómo Haskell codifica tan fácilmente el problema.
d
ym
con operadoresr
en líneac
+
caso%
, que fue manejada por&
fuente
PHP -
275243 caracteresSin golf:
fuente
Pitón demasiado verbosa (
384367 caracteres)No es el más corto, pero es agradable y funcional. La cosa de despacho en el medio podría presumiblemente ser reescrita como una disyunción sobre las
(h(p) == '?') and (? lambda body)
cosas tipográficas. Definir que h operador me cuesta algunos caracteres sin ningún beneficio, pero es bueno tener una palabra clave para head.Me gustaría tener una grieta en el script de golf más tarde si el tiempo lo permite.
editar: eliminó la tercera rama innecesaria en el caso '*' después de leer la respuesta rubí del usuario300
fuente
Más corto Snappier Python 2.6 (272 caracteres)
golfizado:
sin golf:
con:
crédito a la respuesta del usuario 300 por ilustrar cómo se simplifican las cosas si puede obtener algún tipo de valor de terminador al extraer el encabezado de una cadena vacía.
Deseo que el desempaque de cabeza / cola se pueda realizar en línea durante la declaración de los argumentos de m. entonces m podría ser una lambda, al igual que sus amigos y glob. python2 no puede hacerlo, y después de leer un poco, parece que python3 tampoco puede hacerlo. aflicción.
pruebas:
fuente
Rubí -
199171Sin golf:
Pruebas:
Inspirado por la respuesta de los roobs
fuente
lambda s : list(s)+[None]
??
son caracteres literales,=>
son separadores de clave / valor en Ruby Hashes, y->
comienza un lambda :-) ({ ?? => ->{...} }
es un hash con clave"?"
y un lambda como valor). Pero sí, la forma en que se usa en conjunto parece una coincidencia de patrones en caracteres únicos :-)Función C - 178 caracteres necesarios
Compilado con GCC, esto no produce advertencias.
La primera y la última línea no están incluidas en el recuento de caracteres. Se proporcionan solo por conveniencia.
Volado:
fuente
JavaScript: 259 caracteres
Mi implementación es muy recursiva, por lo que la pila se desbordará si se usa un patrón extremadamente largo. Ignorando el signo más (que podría haber optimizado pero elegí no hacerlo por simplicidad), se utiliza un nivel de recursión para cada token.
La función a veces devuelve un número en lugar de un booleano. Si eso es un problema, puede usarlo como
!!glob(pattern, str)
.Ungolfed (sin minificar, más bien) para servir como un recurso útil:
Tenga en cuenta que la indexación en caracteres de una cadena como para elementos de matriz no es parte del estándar de lenguaje anterior (ECMAScript 3), por lo que puede no funcionar en navegadores más antiguos.
fuente
Python (454 caracteres)
fuente
D: 363 caracteres
Más legible:
fuente
golfscript
está construido a partir de funciones que consumen dos argumentos de la pila, syp, y producen un único valor de retorno booleano. hay un poco de basura para hacer que sea compatible con los perezosos y perezosos u operadores. Realmente dudo que este enfoque sea casi óptimo, o incluso en la dirección correcta.
También hay algunos momentos estúpidamente entretenidos, como
'*'
sacar un patrón, consumirlo'*'
en una comparación, solo para darse cuenta de que la rama posterior no coincide. para descender a la otra rama, necesitamos el patrón con el'*'
frente, pero hemos consumido ese patrón original cuando hicimos estallar'*'
, y consumimos el'*'
, así que para obtener el patrón nuevamente cargamos una nueva cadena brillante constante'*'
y anteponerlo en su lugar. se vuelve aún más feo porque, por alguna razón, la coincidencia de caracteres debe hacerse con valores ascii, pero preceder a la cadena necesita cadenas.menos golfscript de golf
pruebas
fuente
C # (251 caracteres)
Ligeramente más legible:
† Lo sé, lo sé ... excepto por los globos que contienen la barra invertida. Lo cual es realmente desafortunado. Hubiera sido realmente inteligente de lo contrario. :(
fuente