Objetivo
De Wikipedia :
Un acrónimo recursivo es un acrónimo que se refiere a sí mismo en la expresión que representa.
Su objetivo es verificar si una cadena es un acrónimo recursivo.
- El acrónimo es la primera palabra.
- Las palabras no distinguen entre mayúsculas y minúsculas, separadas con un solo espacio.
- La cadena dada no contiene ningún signo de puntuación ni apóstrofe.
- Solo la primera letra de cada palabra puede ser parte del acrónimo.
También debe dar las palabras de función . Por simplicidad, cada palabra puede considerarse como una palabra de función.
Ejemplo
f("RPM Package Manager") => { true, [] }
f("Wine is not an emulator") => { true, ["an"] }
f("GNU is not Unix") => { true, ["is"] }
f("Golf is not an acronym") => { false }
f("X is a valid acronym") => { true, ["is","a","valid","acronym"] }
Puedes dar un programa completo o una función.
La cadena de entrada puede tomarse de STDIN o como un argumento de función.
El resultado de salida puede ser verdadero / falso, 0/1, sí / no ...
La lista de palabras de función (cualquier formato de lista es válida) debe darse si y solo si se trata de un acrónimo recursivo (incluso si la lista está vacía) . No tiene que preservar la capitalización de las palabras de función.
Criterios ganadores
Este es un código de golf , el código más corto gana.
Respuestas:
GolfScript,
5150 caracteresProbablemente se pueda jugar más al golf. Toma entrada en STDIN. El booleano es 0/1.
Prueba en línea
Explicación:
fuente
Regex, sabor .NET, 62 bytes
Puedes probarlo aquí . Si la entrada es un acrónimo recursivo, esto generará una coincidencia y el grupo de captura
w
contendrá todas las palabras de función. Si no es así, entonces no habrá coincidencia.Esto hace preservar la capitalización de las palabras de función (pero coincide con mayúsculas y minúsculas).
Por desgracia, el probador no muestra toda la pila de un grupo de captura de llamada, pero si se ha utilizado en cualquier lugar de .NET, el
w
grupo podría contener todas las palabras de función en orden.Aquí hay un fragmento de C # para demostrar que:
Aquí hay una explicación rápida. Estoy usando los grupos de equilibrio de .NET para construir una pila de letras acrónimas en el grupo nombrado
c
, con este fragmentoEl truco es que necesito la segunda letra en la parte superior de la pila y la última en la parte inferior. Así que puse todo esto en una retrospectiva que coincide con la posición después del acrónimo. Esto ayuda, porque .NET hace coincidir los mirar hacia atrás de derecha a izquierda, por lo que primero encuentra la última letra.
Una vez que obtuve esa pila, hago coincidir el resto de la cadena palabra por palabra. O bien, la palabra comienza con la letra en la parte superior de la pila de siglas. En ese caso, saco esa letra de la pila:
De lo contrario, coincido con la palabra de todos modos y empujo a la
w
pila que contendrá todas las palabras de función:Al final, me aseguro de llegar al final de la cadena
$
y también me aseguro de haber usado todas las letras del acrónimo, verificando que la pila esté vacía:Pruébalo en ideone.
fuente
Python (158, sin expresión regular)
No es que no me gusten las expresiones regulares. Es que no los conozco.
Oh, también tenía una versión sin golf:
fuente
Python 2.7 -
131126 bytesHace una lista de letras en la primera palabra del acrónimo. Luego, por cada palabra en la cadena completa, elimine el primer elemento de esa lista que hicimos si es igual a la primera letra de esa palabra. De lo contrario, agregue esa palabra a la lista de palabras de función. Para generar, regrese
not a
(en python, cualquier lista que no sea la lista vacía esTrue
-y, y la lista está vacía si es un acrónimo recursivo) y la lista sinot a
.Gracias a @ace por ayudarme a corregir un error / guardar algunos bytes.
fuente
SyntaxError: invalid syntax
al final de lareturn
línea.for w in s:f+=0*a.pop(0)if a and w[0]==a[0]else[w]
que es más corto y no depende de pestañas. En cuanto a lareturn
declaración, encontré0if a else(1,f)
que es más corta que la original.Python - 154 caracteres
Primer intento de código de golf. Creo que Python no es el mejor lenguaje para él, dadas todas las palabras clave largas. Además, no creo que esta función sea infalible. Funciona para la entrada del OP, pero estoy seguro de que podría pensar en excepciones.
fuente
ECMAScript 6 (105 bytes):
Ingrese la función en la consola del navegador de Firefox y luego simplemente llame a la función, así:
fuente
The function words list ... must be given if and only if this is a recursive acronym
. Esto los alertará independientemente.Haskell - 287 bytes
No es la entrada más corta (hey, este es Haskell, ¿qué esperabas?), Pero sigue siendo muy divertido de escribir.
Probado con
Rendimiento esperado
Sin golf
fuente
JavaScript (ECMAScript 6) - 97 caracteres
Pruebas:
fuente
Rebol - 133
Sin golf:
Probado con:
Salida:
fuente
Julia - 116 bytes
Menos golfizado:
El
0
en el extremo hace que salga 0. De lo contrario, genera una matriz que contiene1
seguida de las palabras de función. Por ejemplo:fuente
Brachylog , 29 bytes
Pruébalo en línea!
Emite las palabras de función a través de la variable de salida si la entrada es un acrónimo recursivo y falla si no lo es.
Sin tener que emitir las palabras de función (tratando esto como un puro problema de decisión ), sale a solo 12 bytes, porque
∧Zt
se puede descartar para -3,Y
se puede reemplazar.
por -1 y, lo más importante,;0zpᵐz{ċ₂ˢ}ᵐZh
se puede reemplazar⊇
por un enorme -13:ḷṇ₁Xh.∧X⊇hᵐc
fuente
Cobra - 187
fuente
Rubí - 173
Podría ser mejor...
Llamando a la func:
Salida:
fuente
Java - 195
Desafortunadamente, Java no tiene soporte de tuplas integrado.
Entonces, esta es una clase que almacena el booleano en 'b' y la lista de palabras de función en 'x'.
Aquí, la función es el constructor de la clase.
Prueba
fuente
string[]
:null
simplemente significa falso, vacío significa verdadero yn
elementos significa verdadero conn
palabras de función.Awk - 145
Prueba:
fuente
Coffeescript - 144
Llámalo con, por ejemplo:
z "GNU is not Unix"
El JS compilado:
Divide la cadena en palabras y luego recorre cada palabra. Si el primer carácter de la palabra no coincide con el siguiente en el acrónimo, la palabra se almacena. Un contador (
g
) se utiliza para rastrear cuántas palabras se han omitido. Si el número de palabras omitidas más la longitud del acrónimo coincide con la longitud de la frase, coincide, por lo que devuelve 1 y las palabras omitidas. Si no, no fue válido, por lo tanto, devuelva 0.fuente
C # - 234
fuente
Pitón (108)
fuente