Su objetivo es tomar aportes como
Pie is good. I just ate a bunch of pies early this morning. Actually, it was closer to the afternoon. Mornings are good.
y cree una matriz de los índices de la cadena donde aparecen las letras que forman la palabra "Llama" (una en orden). Por ejemplo, permítame mostrarle las letras señaladas con puntos para mostrar los índices:
Pie is good. I just ate a bunch of pies early this morning. Actually, it was closer to the afternoon. Mornings are good.
^ ^ ^ ^ ^
Entonces la matriz se vería así:
[44, 67, 76, 105, 114]
(Si su aplicación usa una indexación que no está basada en 0, los números se verán diferentes. Eso está bien).
Si el texto no tiene llama, la matriz debe estar vacía, nula, nula o indefinida.
Se acepta cualquier lenguaje de código. Este es un concurso de código de golf , por lo que ganan menos personajes.
Respuestas:
CJam - 33
Obtiene los índices basados en 1 (2 bytes más para 0)
Explicación:
l
lee una línea de la entrada (reemplazaq
por entrada completa)el
convierte a minúscula"llama"{...}/
ejecuta el bloque para cada letra "llama"1$
copia la cadena actual#
encuentra el índice de los)_
incrementos de letras y duplicadosT+:T
agrega T (inicialmente 0), actualiza T y lo deja en la pila\@
intercambia elementos alrededor, ahora tenemos el actual-T, el índice, los>
cortes de cadena, la cadena que comienza en el índice;
emerge, la cadena restante]
reúne los índices en una matriz.En este punto tenemos todos los índices basados en 1; Si no se encuentra ninguna letra, la matriz tendrá duplicados.
___
realiza 3 copias más de la matriz|
(con 2 copias de matriz) elimina duplicados=
compara, lo que resulta en 0 si hubo duplicados o 1 si no*
multiplica la matriz 0 o 1 veces en consecuenciafuente
Perl, 52 bytes
La solución se proporciona como una función que toma la cadena como argumento y devuelve una lista de posiciones.
Posiciones basadas en uno, búsqueda entre mayúsculas y minúsculas, sin nuevas líneas: 52 bytes
La búsqueda entre mayúsculas y minúsculas devuelve una matriz vacía en el ejemplo de la pregunta, porque después de hacer coincidir las tres primeras letras,
m
falta la letra minúscula en el texto de entrada.Soporte de nuevas líneas: + 1 byte = 53 bytes
El texto ahora puede abarcar varias líneas.
Búsqueda sin distinción entre mayúsculas y minúsculas: + 1 byte = 54 bytes
Ahora el ejemplo en la pregunta informa una lista de posiciones de índice, son números basados en uno:
Posiciones basadas en cero: + 9 bytes = 63 bytes
Resultado para el ejemplo en la pregunta:
Sin golf:
La última variante incluye más o menos las otras variantes.
fuente
[]
y la tercera se imprime[ ]
para mí (las más largas funcionan correctamente). Estoy ejecutando "perl, v5.8.8 creado para msys-64int". ¿Tiene un error o funciona en una versión diferente de perl?[]
es correcto para la primera solución,M
no coincide en una búsqueda sensible a mayúsculas y minúsculas. La pregunta no está clara con respecto a la sensibilidad a mayúsculas y minúsculas.[]
es aceptable para los dos primeros. Pero las tres primeras soluciones todavía no funcionan bien para mí: si le das una entrada que debería devolver índices, vuelve[ ]
sed, 299 + 1
Sí, sed puede encontrar una llama. No, sed no puede hacer matemáticas. Esta es la respuesta más larga hasta ahora, con 299 + 1 caracteres, porque tuve que enseñarle a contar.
Esta respuesta requiere un sed con expresiones regulares extendidas (
sed -E
osed -r
). Usé OpenBSD sed (1) . La entrada es una cadena por línea. (Por lo tanto, la cadena puede no contener una nueva línea). La salida es una línea de números, o nada.Uso (+1 carácter para
-r
):Código fuente (299 caracteres):
El programa primero reemplaza la llama por cinco
%
. (Todos%
en este programa son literales). El primer comandos/%/z/g
cambia cualquiera%
az
en la línea de entrada. Los siguientes cinco comandos encuentran la llama, por lo que todos los brazos en todos los hombros pueden doler. se convierte en A %% brazos en% ll hombros% ay% che. Como cada uno.*
es codicioso, siempre encuentro la llama a la derecha: llama llama se convertiría en llama %%%%% . Si no puedo obtener cinco%
,/(.*%){5}/!d
borra la línea de entrada y omite los siguientes comandos.s/[^%]/z/g
cambia cada personaje excepto%
az
. Entonces entro en un bucle.s/(z*)%/\10 z\1/
cambia el primero%
a0
, copia cero o mász
de izquierda a derecha y agrega uno mász
a la derecha. Esto es para que el número dez
sea igual al índice. Por ejemplo, sezz%zzz%...
convierte enzz0 zzzzzzzz%...
porque el primero%
estaba en el índice 2, y el siguiente%
en el índice 8.s/z*$//
elimina mász
del final de la cadena.Los siguientes once comandos cuentan
z
eliminando cada unoz
y contando desde0
. Se cuenta comozzz0
,zz1
,z2
,3
. Además, se1zzzz9
conviertez1zzz0
(más tarde23
) o sezzzz9
convierte1zzz0
(más tarde13
). Este ciclo continúa hasta que no haya más%
oz
.fuente
Fortran -
154148Fortran apesta al golf, pero solo para demostrar que las cadenas de análisis se pueden hacer en un lenguaje matemático, lo hice:
Ahorré algunos caracteres al eliminar lo no requerido
f
al finalendfunction
y lo usé enif(any(r==0))
lugar deif(.not.all(r>0))
.Esto requiere:
s
ser la cadena con textoa
ser la prueba en minúscula (es decir,llama
)b
ser la prueba de mayúsculas (es decir,LLAMA
)El programa completo sin golf es
fuente
C # - 119
Toma cadena, emite matriz. Nulo si no hay llama en cadena.
fuente
x=>x>=0
i
a -1 y colocando .ToArray () en la instrucciónint[]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;}
Rubí,
566563Editar : +9 caracteres para que no distinga entre mayúsculas y minúsculas.
Define una función (lambda, técnicamente)
f
.Devuelve
nil
si no hay llama. Si tiene que ser[]
(matriz vacía), simplemente agregue||[]
antes del último}
para un total de 4 caracteres adicionales .Versión legible:
fuente
index(/#{c}/i
lugar deupcase
.C - 53
Compilar con:
Probé este comando de compilación con el gcc de cygwin. Otros entornos pueden manejar espacios y otros caracteres especiales de manera diferente.
El resultado basado en 0 se almacena en la matriz
r
. Su contenido no está definido si no hay llama en la cadena.Mayúsculas y minúsculas (53)
i,m,r[5];main(){for(;W[i];i++)W[i]==L[m]?r[m++]=i:i;}
No distingue entre mayúsculas y minúsculas (58)
i,m,r[5];main(){for(;W[i];i++)(W[i]|96)==L[m]?r[m++]=i:i;}
fuente
JavaScript (ECMAScript 6) - 68 caracteres
Asume que la cadena a probar está en la variable
s
. Si quieres convertirlo en una función, entonces anteponef=s=>
(para 5 caracteres adicionales).Salidas:
Caso insensible - 69 caracteres
Salidas:
Case Insensitive & First Match - 74 caracteres
Salidas:
fuente
Python, 100
Soy el peor golfista de todos los tiempos. :PAGS
Gracias a @xnor por reducir 6 bytes.
o
contiene la matriz después.EDITAR : fijo.
EDIT 2 :
len(g)
tog
,o==5
too>4
según las sugerencias de @ xnor.EDITAR 3 : @WolframH lo arregló.
fuente
o*=(len(o)==5)
is excellent. It's horrible, but I love it!s
is the input string, right? Shouldn't thens.lower
bei.lower
? However, that doePython 71
Assumes input in
s
. Output ino
.Edit: Changed from lists to tuples to save 2 bytes.
fuente
o
needing to start nonempty to takeo[-1]
. Maybe it's shorter though to just starto
as[-1]
and later doo=o[1:]
? Annoyingly, the initial-1
trips up checking ifo
contains-1
.-1
-Idea can be made to work. At least, I didn't succeed :-( However, I changed lists to tuples to save 2 bytes. :-)Python 100
Sample:
fuente
Haskell, 111
Ungolfed:
Example:
fuente
Matlab, 61
96Searches the string and replaces everything up to each match with gibberish before searching for next character. Will leave
s
undefined if an the word does not occur.Note that the charcount could be reduced if case sensitivity is allowed.
Previous versions
Searches the string and replaces everything up to each match with gibberish before searching for next character. Error handling (try-catch-end) could maybe be dropped, then the program would crash (but s would be undefined as required) if llama not found.
Implementation:
Without error handling:
fuente
Language Java
fuente
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.fuente
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:
fuente
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
fuente
$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
fuente
<?
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.
fuente
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:
fuente
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
fuente
Julia, 76
Another regex example using Julia language.
fuente