Objectif
De Wikipédia :
Un acronyme récursif est un acronyme qui se réfère à lui-même dans l'expression qu'il représente.
Votre objectif est de vérifier si une chaîne est un acronyme récursif.
- L'acronyme est le premier mot
- Les mots ne sont pas sensibles à la casse, séparés par un seul espace.
- La chaîne donnée ne contient aucune ponctuation ni apostrophe.
- Seule la première lettre de chaque mot peut faire partie de l'acronyme.
Vous devez également donner les mots de fonction . Par souci de simplicité, chaque mot peut être considéré comme un mot fonction.
Exemple
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"] }
Vous pouvez donner un programme complet ou une fonction.
La chaîne d'entrée peut être extraite de STDIN ou comme argument de fonction.
Le résultat de sortie peut être vrai / faux, 0/1, oui / non ...
La liste des mots de fonction (n'importe quel format de liste est valide) doit être donnée si et seulement s'il s'agit d'un acronyme récursif (même si la liste est vide) . Il n'est pas nécessaire de conserver la capitalisation des mots de fonction.
Critères gagnants
Ceci est un code-golf , le code le plus court gagne.
Réponses:
GolfScript,
5150 caractèresIl peut probablement être joué plus loin. Prend entrée sur STDIN. Le booléen est 0/1.
Testez en ligne
Explication:
la source
Regex, saveur .NET, 62 octets
Vous pouvez le tester ici . Si l'entrée est un acronyme récursif, cela donnera une correspondance et le groupe de capture
w
contiendra tous les mots de fonction. Si ce n'est pas le cas, il n'y aura pas de correspondance.Cela fait préserver la capitalisation des mots de fonction (mais correspond insensible à la casse).
Malheureusement, le testeur ne montre pas l'ensemble de la pile d'un groupe de capture nommé, mais si vous l' avez utilisé partout dans .NET, le
w
groupe ne contient tous les mots de fonction dans l' ordre.Voici un extrait C # pour prouver que:
Voici une explication rapide. J'utilise les groupes d'équilibrage de .NET pour créer une pile de lettres acronymes dans le groupe nommé
c
, avec cet extraitL'astuce est que j'ai besoin de la deuxième lettre en haut de la pile et la dernière en bas. J'ai donc mis tout cela dans un lookbehind qui correspond à la position après l'acronyme. Cela aide, car .NET fait correspondre les regards de droite à gauche, donc il rencontre d'abord la dernière lettre.
Une fois que j'ai obtenu cette pile, je fais correspondre le reste de la chaîne mot à mot. Soit le mot commence par la lettre en haut de la pile des acronymes. Dans ce cas, je pop cette lettre de la pile:
Sinon, je fais quand même correspondre le mot et je pousse sur la
w
pile qui contiendra alors tous les mots de fonction:À la fin, je m'assure d'avoir atteint la fin de la chaîne avec
$
et je m'assure également d'avoir utilisé toutes les lettres de l'acronyme, en vérifiant que la pile est vide:Testez-le sur ideone.
la source
Python (158, sans regex)
Ce n'est pas que je n'aime pas les regex. C'est que je ne les connais pas.
Oh, j'avais aussi une version non golfée:
la source
Python 2.7 -
131126 octetsFait une liste de lettres dans le premier mot de l'acronyme. Ensuite, pour chaque mot de la chaîne complète, supprimez le premier élément de cette liste que nous avons créé s'il est identique à la première lettre de ce mot. Sinon, ajoutez ce mot à la liste des mots de fonction. Pour afficher, renvoyer
not a
(en python, toute liste autre que la liste vide estTrue
-y, et la liste est vide s'il s'agit d'un acronyme récursif) et la liste ifnot a
.Merci à @ace de m'avoir aidé à corriger une erreur / enregistrer quelques octets.
la source
SyntaxError: invalid syntax
en fin dereturn
ligne.for w in s:f+=0*a.pop(0)if a and w[0]==a[0]else[w]
ce qui est plus court et ne repose pas sur des onglets. Quant à lareturn
déclaration, j'ai trouvé celle0if a else(1,f)
qui est plus courte que l'original.Python - 154 caractères
Première tentative de golf par code. Je pense que le python n'est pas le meilleur langage pour cela, étant donné tous les mots-clés longs. De plus, je ne pense pas que cette fonction soit infaillible. Cela fonctionne pour l'entrée du PO, mais je suis sûr que je pourrais imaginer des exceptions.
la source
ECMAScript 6 (105 octets):
Entrez la fonction dans la console du navigateur de Firefox, puis appelez simplement la fonction, comme ceci:
la source
The function words list ... must be given if and only if this is a recursive acronym
. Cela les alertera malgré tout.Haskell - 287 octets
Pas l'entrée la plus courte (hé c'est Haskell, à quoi vous attendiez-vous?), Mais toujours très amusante à écrire.
Testé avec
Production attendue
Ungolfed
la source
JavaScript (ECMAScript 6) - 97 caractères
Tests:
la source
Rebol - 133
Ungolfed:
Testé avec:
Sortie:
la source
Julia - 116 octets
Moins golfé:
Le
0
sur la fin le fait sortir 0. Sinon, il sort un tableau contenant1
suivi des mots de fonction. Par exemple:la source
Brachylog , 29 octets
Essayez-le en ligne!
Génère les mots de fonction via la variable de sortie si l'entrée est un acronyme récursif et échoue dans le cas contraire.
Sans avoir à sortir les mots de fonction (en traitant cela comme un pur problème de décision ), cela ne fait que 12 octets, car
∧Zt
peut être supprimé pour -3,Y
peut être remplacé par.
pour -1, et surtout;0zpᵐz{ċ₂ˢ}ᵐZh
peut être remplacé par⊇
pour un énorme -13:ḷṇ₁Xh.∧X⊇hᵐc
la source
Cobra - 187
la source
Rubis - 173
Cela pourrait être mieux...
Appeler le func:
Sortie:
la source
Java - 195
Malheureusement, Java n'a pas de support de tuple intégré.
Donc, c'est une classe qui stocke le booléen dans 'b' et la liste des mots de fonction dans 'x'.
Ici, la fonction est le constructeur de la classe.
Tester
la source
string[]
:null
signifie simplement faux, vide signifie vrai etn
éléments signifie vrai avecn
des mots de fonction.Awk - 145
Tester:
la source
Coffeescript - 144
Appelez-le avec, par exemple:
z "GNU is not Unix"
Le JS compilé:
Il divise la chaîne en mots, puis parcourt chaque mot. Si le premier caractère du mot ne correspond pas au suivant dans l'acronyme, le mot est stocké. Un compteur (
g
) permet de suivre le nombre de mots ignorés. Si le nombre de mots ignorés plus la longueur de l'acronyme correspond à la longueur de la phrase, il correspond, donc renvoyez 1 et les mots ignorés. Sinon, il n'était pas valide, retournez donc 0.la source
C # - 234
la source
Python (108)
la source