Votre objectif est de prendre des entrées comme
Pie is good. I just ate a bunch of pies early this morning. Actually, it was closer to the afternoon. Mornings are good.
et créez un tableau des index de la chaîne où apparaissent les lettres constituant le mot "Lama" (une de chaque dans l'ordre). Par exemple, laissez-moi montrer les lettres pointées avec des carets pour montrer les index:
Pie is good. I just ate a bunch of pies early this morning. Actually, it was closer to the afternoon. Mornings are good.
^ ^ ^ ^ ^
Donc, le tableau ressemblerait à:
[44, 67, 76, 105, 114]
(Si votre application utilise une indexation qui n'est pas basée sur 0, les chiffres seront différents. C'est très bien.)
Si le texte n'a pas de lama, le tableau doit alors être vide, nul, nul ou non défini.
Toute langue de code est acceptée. Ceci est un concours de code-golf , donc les moins de personnages gagnent!
Réponses:
CJam - 33
Il obtient les index basés sur 1 (2 octets supplémentaires pour les basés sur 0)
Explication:
l
lit une ligne depuis l'entrée (remplacer parq
pour l'entrée entière)el
convertit en minuscule"llama"{...}/
exécute le bloc pour chaque lettre "lama"1$
copie la chaîne en cours#
trouve l'index de la lettre)_
incrémente et dupliqueT+:T
ajoute T (initialement 0), met à jour T et la quitte sur la pile,\@
permute les éléments, nous avons maintenant current-T, index, string>
coupe la chaîne en commençant par l'index,;
la chaîne restante]
rassemble les index dans un tableau.À ce stade, nous avons tous les index basés sur 1; Si une lettre n’a pas été trouvée, le tableau aura des doublons.
___
fait 3 copies de plus du tableau|
(avec 2 copies de tableau) supprime les doublons=
compare, résultant en 0 s'il y avait des doublons ou 1 sinon*
multiplie le tableau 0 ou 1 en conséquencela source
Perl, 52 octets
La solution est fournie en tant que fonction qui prend la chaîne en tant qu'argument et renvoie une liste de positions.
Positions uniques, recherche sensible à la casse, sans saut de ligne: 52 octets
La recherche sensible à la casse renvoie un tableau vide dans l'exemple de la question, car après la mise en correspondance des trois premières lettres, la lettre minuscule
m
manque dans le texte saisi.Prise en charge des nouvelles lignes: + 1 octet = 53 octets
Le texte peut maintenant s'étendre sur plusieurs lignes.
Recherche insensible à la casse: + 1 octet = 54 octets
Maintenant, l'exemple dans la question rapporte une liste de positions d'index, ce sont des nombres à une base:
Positions basées sur zéro: + 9 octets = 63 octets
Résultat pour l'exemple dans la question:
Ungolfed:
Cette dernière variante comprend plus ou moins les autres variantes.
la source
[]
et la troisième s'imprime[ ]
pour moi (les plus longues fonctionnent correctement). J'utilise "perl, v5.8.8 construit pour msys-64int". Avez-vous un bogue ou fonctionne-t-il sur une version différente de perl?[]
est correct pour la première solution,M
ne correspond pas à une recherche sensible à la casse. La question n'est pas claire en ce qui concerne la sensibilité à la casse.[]
est acceptable pour les deux premiers. Mais les trois premières solutions ne fonctionnent toujours pas correctement pour moi: si vous lui donnez une entrée qui devrait renvoyer des index, elle retourne[ ]
sed, 299 + 1
Oui, Sed peut trouver un lama. Non, Sed ne peut pas faire de maths. C’est la réponse la plus longue à ce jour, avec 299 + 1 caractères, car j’ai dû apprendre à sed à compter.
Cette réponse nécessite un sed avec des expressions régulières étendues (
sed -E
oused -r
). J'ai utilisé OpenBSD sed (1) . L'entrée est une chaîne par ligne. (Par conséquent, la chaîne ne peut pas contenir de nouvelle ligne.) La sortie est une ligne de chiffres ou rien.Utilisation (+1 caractère pour
-r
):Code source (299 caractères):
Le programme remplace d'abord le lama par cinq
%
. (Tout%
dans ce programme sont littéral.) La première commandes/%/z/g
change tout%
àz
la ligne d'entrée. Les cinq prochains ordres trouvent le lama, de sorte que tous les bras sur les épaules peuvent faire mal. devient A %% bras sur% ll épaules% ay% che. Parce que chacun.*
est gourmand, je trouve toujours le lama sur la droite: lama lama deviendrait lama %%%%% . Si je ne peux pas en obtenir cinq%
,/(.*%){5}/!d
supprime la ligne de saisie et ignore les commandes suivantes.s/[^%]/z/g
change tous les caractères , mais%
àz
. Puis j'entre dans une boucle.s/(z*)%/\10 z\1/
change le premier%
en0
, copie zéro ou plusz
de gauche à droite et ajoute un de plusz
à droite. C'est ainsi que le nombre dez
sera égal à l'indice. Par exemple,zz%zzz%...
devientzz0 zzzzzzzz%...
parce que le premier%
était à l'index 2 et le suivant%
est à l'index 8.s/z*$//
supprime extraz
de la fin de la chaîne.Les onze prochaines commandes comptent
z
en supprimant chacune d’ellesz
et en comptant à partir de0
. Il compte commezzz0
,zz1
,z2
,3
. En outre,1zzzz9
devientz1zzz0
(plus tard23
) ouzzzz9
devient1zzz0
(plus tard13
). Cette boucle continue jusqu'à ce qu'il n'y en ait plus%
ouz
.la source
Fortran -
154148Fortran craint au golf, mais juste pour prouver que l’analyse de chaînes peut être faite dans un langage basé sur les mathématiques, je l’ai fait:
J'ai sauvé quelques caractères en éliminant les non-requis
f
à la finendfunction
et utilisés à laif(any(r==0))
place deif(.not.all(r>0))
.Cela nécessite:
s
être la chaîne avec du textea
être le test minuscule (c.-à-d.llama
)b
être le test majuscule (c.-à-d.LLAMA
)Le programme complet sans golf est
la source
C # - 119
Prend chaîne, sorties tableau. Null si pas de lama dans la chaîne.
la source
x=>x>=0
i
à -1 et en plaçant le .ToArray () sur l'instruction .Select, comme ceciint[]a(string s){var i=-1;var o="llama".Select(x=>i=s.IndexOf(x,i+1)).ToArray();return o.All(x=>x>=0)?o:null;}
Ruby,
566563Edit : +9 caractères pour qu'il ne respecte pas la casse.
Définit une fonction (lambda, techniquement)
f
.Retourne
nil
s'il n'y a pas de lama. Si ce doit être[]
(tableau vide), alors il suffit d’ajouter||[]
avant le dernier}
pour un total de 4 caractères supplémentaires .Version lisible:
la source
index(/#{c}/i
au lieu deupcase
.C - 53
Compiler avec:
J'ai testé cette commande de compilation avec le gcc de cygwin. D'autres environnements peuvent gérer des espaces et d'autres caractères spéciaux différemment.
Le résultat basé sur 0 est stocké dans un tableau
r
. Son contenu n'est pas défini s'il n'y a pas de lama dans la chaîne.Sensible à la casse (53)
i,m,r[5];main(){for(;W[i];i++)W[i]==L[m]?r[m++]=i:i;}
Insensible à la casse (58)
i,m,r[5];main(){for(;W[i];i++)(W[i]|96)==L[m]?r[m++]=i:i;}
la source
JavaScript (ECMAScript 6) - 68 caractères
Suppose que la chaîne à tester est dans la variable
s
. Si vous voulez en faire une fonction, ajoutez des préfixesf=s=>
(pour 5 caractères supplémentaires).Les sorties:
Insensible à la casse - 69 Caractères
Les sorties:
Insensible à la casse et premier match - 74 caractères
Les sorties:
la source
Python, 100
Je suis le pire golfeur de tous les temps. : P
Merci à @xnor d'avoir supprimé 6 octets.
o
contient le tableau après.EDIT : corrigé.
EDIT 2 :
len(g)
tog
,o==5
too>4
selon les suggestions de @ xnor.EDIT 3 : @WolframH l'a corrigé.
la source
o*=(len(o)==5)
est excellent . C'est horrible, mais j'adore ça!s
c'est la chaîne d'entrée, non? Ne devrait pas alorss.lower
êtrei.lower
? Cependant, cette bichePython 71
Suppose une entrée dans
s
. Sortie eno
.Éditer: changé de liste en tuples pour économiser 2 octets.
la source
o
nécessité de commencer sans être video[-1]
. Peut-être est-ce plus court de commencero
comme[-1]
ça et plus tardo=o[1:]
? De manière ennuyeuse, les premiers-1
tris vérifient sio
contient-1
.-1
Idée puisse fonctionner. Au moins, je n'ai pas réussi :-( Cependant, j'ai changé les listes en tuples pour économiser 2 octets. :-)Python 100
Échantillon:
la source
Haskell, 111
Ungolfed:
Exemple:
la source
Matlab, 61
96Recherche la chaîne et remplace tout le contenu de chaque correspondance par un charabia avant de rechercher le caractère suivant. Laissera
s
indéfini si le mot ne se produit pas.Notez que le nombre de caractères peut être réduit si la sensibilité à la casse est autorisée.
Versions précédentes
Recherche la chaîne et remplace tout le contenu de chaque correspondance par un charabia avant de rechercher le caractère suivant. La gestion des erreurs (try-catch-end) pourrait peut-être être supprimée, puis le programme se bloquerait (mais s serait indéfini selon les besoins) si llama n'est pas trouvé.
La mise en oeuvre:
Sans traitement d'erreur:
la source
Langage Java
la source
Python (70)
We search of each character in
'llama'
in turn, starting after the location of the previously-found character. If no character is found,c
becomes the default value of-1
, in which case the last line turnsr
into the empty list.Edit: Found out that
str.find(s,...)
can be invoked ass.find(...)
, saving 4 characters.la source
OpenEuphoria,
147128I have two examples. First, the shortest:
I can get it down to 126 characters if I use "or" instead of "and" like the C version does up above. However, this also matches the string
''!-!
asllama
. Uncommon, but still a possible error.And then the version using regular expressions:
Both take input from STDIN and post to STDOUT.
EDIT: Shorter regex example:
la source
split
/join
orexplode
/implode
, or does OpenEuphoria not have short versions of those?Powershell -
12185I'm still practicing with Powershell, expect this could be improved
$s contains the string, result is in array $a
Original version
Ungolfed
New version, with massive thanks to @goric
la source
$a=@();$w="llama";$n=$c=0;foreach($i in $s.tochararray()){if($i-eq$w[$n]){$a+=$c;$n+=1}$c+=1};$a*=$a.length-gt4
foreach($i in $s.tochararray())
with[char[]]$s|%
, as long as you change the subsequent$i
to a$_
. That shaves it down to 93:$a=@();$w="llama";$n=$c=0;[char[]]$s|%{if($_-eq$w[$n]){$a+=$c;$n+=1}$c+=1};$a*=$a.length-gt4
$w
variable altogether, since its only used once. Just inline it into the if:if($i-eq"llama"[$n])
+=1
s with++
sPHP
no PHP answer yet? I think a language heavily string-oriented can beat at least a math-based one
152 against fortran 154, job done :P
ungolfed
if the caller always passes a lowercase string, it lowers to 137
la source
<?
at the beginning of your code to make it valid. Sorry...JavaScript,
122115Defines a function that takes a string as its only argument (second arg is a cheap
var
) and returns either an empty array or a 5-element array.Drops to 108 if I take the input on a single char variable (
s
) and leave the output in another (b
):Edit: Swapped out map for for loop.
la source
b=(z=[].map.call("llama",a=>b=s.toLowerCase().indexOf(a,++b))).indexOf(-1)<0?z:[]
Rebol, 97
Usage example in Rebol console:
Rebol uses 1-based indexing. Returns empty list
[]
if no llama sequence found (case insensitive).Ungolfed:
la source
APL, 47
Not the shortest code, but quite warped, in an APL way.
Explanation
'amall',⊂⍬⍞
Make an array of 6 elements: the letters 'amall' and a subarray of 2 elements, themselves subarrays: the empty array and a line of characters read from input.{...}/...
Reduce (right-fold) the 6-element array using the provided function.a s←⍵
Decompose the right argument into the array of indices and the remaining substring (initially the empty array and the full string.)~⍺∊s:⍬⍬
If the substring does not contain the next letter⍺
stop the computation and return the empty array.a,←n←s⍳⍺
Otherwise, find its position, call it n, and append it to the array of indices.a(n↓s)
Make and return an array of 2 elements: the extended array of indices and the remaining substring.+\↑⊃...
Unpack the output of the folding, take the first element (the array of indices) and scan it with addition, to turn relative offsets into absolute ones.Examples
la source
Julia, 76
Another regex example using Julia language.
la source