Выведите внутреннюю ламу предложения

33

Ваша цель состоит в том, чтобы воспринимать как

Pie is good.  I just ate a bunch of pies early this morning.  Actually, it was closer to the afternoon.  Mornings are good.

и создайте массив индексов строки, где появляются буквы, составляющие слово «лама» (по одной по порядку). Например, позвольте мне показать буквы, на которые указывают каретки, чтобы показать индексы:

Pie is good.  I just ate a bunch of pies early this morning.  Actually, it was closer to the afternoon.  Mornings are good.
                                            ^                      ^        ^                            ^        ^

Таким образом, массив будет выглядеть так:

[44, 67, 76, 105, 114]

(Если ваше приложение использует индексирование, не основанное на 0, числа будут выглядеть иначе. Это нормально.)

Если текст не имеет ламы, то массив должен быть пустым, нулевым, нулевым или неопределенным.

Любой код языка принимается. Это соревнование по , поэтому выигрывает меньше всего персонажей!

Cilan
источник
7
@TheWobbuffet Вы продолжаете изменять свое имя пользователя и изображение. Было время, когда вы были «дверной ручкой» и имели его фотографию. Теперь ваша картинка - овца. Вы должны изменить это на ламу.
Джастин
1
Как насчет индексации на основе 0 против 1? Можем ли мы просто использовать индексацию, используемую нашим языком, или все материалы должны соответствовать одному соглашению (которое)?
Мартин Эндер
1
@Quincunx Овца говорит "42" на этом!
Cilan
2
@ TheWobbuffet слишком много ориентированных на математику: - / (Matlab, Mathematica, Julia, я не знаю о R) ... также Lua и Smalltalk. Единственным из тех, кто имеет отношение к игре в гольф, будет Mathematica, но, вероятно, не для задач по манипуляции со струнами.
Мартин Эндер
3
Вы просто хотите функцию, которая делает это или всю программу? Вы хотите также ввести код ввода / вывода?
июля

Ответы:

11

CJam - 33

lel"llama"{1$#)_T+:T\@>}/;]___|=*

Он получает индексы на основе 1 (еще 2 байта для основанных на 0)

Объяснение:

lчитает строку из ввода (заменить qна весь ввод)
elпреобразует в нижний регистр
"llama"{...}/выполняет блок для каждой буквы "llama"
1$копирует текущую строку,
#находит индекс
)_приращения буквы и дублирует,
T+:Tдобавляет T (изначально 0), обновляет T и оставляет его в стеке происходит
\@обмен элементами, теперь у нас есть current-T, index, string,
>срезы строки, начинающиеся с индекса,
;всплывающие, оставшаяся строка
]собирает индексы в массиве.
На данный момент у нас есть все индексы, основанные на 1; если ни одна буква не была найдена, массив будет иметь дубликаты.
___делает еще 3 копии массива
|(с 2 копиями массива) удаляет дубликаты
=сравнивает, что приводит к 0, если были дубликаты, или 1, если нет,
*умножает массив 0 или 1 раз соответственно

aditsu
источник
sourceforge.net/p/cjam/wiki/Home для получения дополнительной информации о языке. Новое для меня.
TankorSmash
12

Perl, 52 байта

Решение предоставляется в виде функции, которая принимает строку в качестве аргумента и возвращает список позиций.

  • Позиции на основе позиции, поиск с учетом регистра, без перевода строки: 52 байта

    sub l{pop=~/(l).*?(l).*?(a).*?(m).*?(a)/;@+[1..$#+]}

    Поиск с учетом регистра возвращает пустой массив в примере вопроса, потому что после сопоставления первых трех букв строчная буква mотсутствует во входном тексте.

  • Поддержка новых строк: + 1 байт = 53 байта

    sub l{pop=~/(l).*?(l).*?(a).*?(m).*?(a)/s;@+[1..$#+]}

    Текст теперь может занимать несколько строк.

  • Поиск без учета регистра: + 1 байт = 54 байта

    sub l{pop=~/(l).*?(l).*?(a).*?(m).*?(a)/si;@+[1..$#+]}

    Теперь пример в вопросе сообщает список позиций индекса, они представляют собой числа на основе одного:

    [45 68 77 106 115]
    
  • Нулевые позиции: + 9 байтов = 63 байта

    sub l{pop=~/(l).*?(l).*?(a).*?(m).*?(a)/si;map{$_-1}@+[1..$#+]}

    Результат для примера в вопросе:

    [44 67 76 105 114]
    

Ungolfed:

Последний вариант включает более или менее другие варианты.

sub l {
    # pop() gets the last argument 
    pop() =~ /(l).*?(l).*?(a).*?(m).*?(a)/si;
    # the letters inbetween are matched against ".*?",
    # the non-greedy variant of ".*". Thus ".*?"
    # matches only as few as possible characters.
    # The modifier /i controls the case-sensitivity
    # and means ignore case. Without the case matters.
    # Modifier /s treats the string as single line,
    # even if it contains newlines.
    map { $_-1 }   # subtract 1 for zero-based positions
        @+[1..$#+]
    # Array @+ contains the end-positions of the last
    # submatches, and of the whole match in the first position.
    # Therefore the first value is sliced away.
    # @+ is available since Perl 5.6.
}

# test
my @result = l(<<"END_STR");
Pie is good.  I just ate a bunch of pies early this morning.  Actually, it was closer to the afternoon.  Mornings are good.
END_STR
print "[@result]\n";
Хайко Обердиек
источник
1
Это также предполагает, что ввод ASCII, или, по крайней мере, не полный Unicode. Если регулярные выражения Perl правильно не уважают границы графемы в эти дни (они, конечно, не вернулись, когда я имел несчастье использовать его.)
Trejkaz
@Trejkaz: Unicode здесь вообще не имеет значения: (a) "llama" - это ASCII, и его буквы не конфликтуют ни с каким-либо не-ASCII символом Unicode или его байтовым представлением в UTF-8. (b) С учетом многобайтовых кодировок термин «индекс» в вопросе будет недостаточно конкретизирован. Индекс может относиться к позиции символа или позиции байта (памяти). (c) Поддержка любой кодировки с позициями символов будет означать, что кодировка должна быть известна и должна быть предоставлена ​​в качестве дополнительного аргумента.
Хайко Обердиек
Ваши первые два решения печатают, []а третье печатает [ ]для меня (более длинные работают правильно). Я бегу "Perl, v5.8.8 построен для msys-64int". У вас есть ошибка, или она работает на другой версии Perl?
Тим С.
@TimS .: []верно для первого решения, Mне совпадает с поиском с учетом регистра. Вопрос совершенно неясен относительно чувствительности к регистру.
Хайко Обердиек
Итак, это []приемлемо для первых двух. Но первые три решения все еще не работают для меня правильно: если вы дадите ему ввод, который должен возвращать индексы, он вернет[ ]
Тим С.
10

сед, 299 + 1

Да, сед может найти ламу. Нет, Сед не умеет заниматься математикой. Это самый длинный ответ, до 299 + 1 символов, потому что я должен был научить sed считать.

Этот ответ требует sed с расширенными регулярными выражениями ( sed -Eили sed -r). Я использовал OpenBSD sed (1) . Ввод - одна строка на строку. (Следовательно, строка может не содержать символ новой строки.) Выходные данные - это строка чисел или ничего.

Использование (+1 символ для -r):

$ echo 'All arms on all shoulders may ache.' | sed -rf llama.sed
1 2 12 26 30 

Исходный код (299 символов):

s/%/z/g
s/(.*)[Aa]/\1%/
s/(.*)[Mm](.*%)/\1%\2/
s/(.*)[Aa]((.*%){2})/\1%\2/
s/(.*)[Ll]((.*%){3})/\1%\2/
s/(.*)[Ll]((.*%){4})/\1%\2/
/(.*%){5}/!d
s/[^%]/z/g
:w
s/(z*)%/\10 z\1/
s/z*$//
s/z0/1/
s/z1/2/
s/z2/3/
s/z3/4/
s/z4/5/
s/z5/6/
s/z6/7/
s/z7/8/
s/z8/9/
s/([0-9]z*)z9/z\10/g
s/(z*)z9/1\10/
/[%z]/bw

Программа сначала заменяет ламу пятью %. (Все %в этой программе являются буквальными.) Первая команда s/%/z/gменяет любое %на zво входной строке. Следующие пять команд находят ламу, поэтому все руки на всех плечах могут болеть. становится %% оружия на% ll плечи% ay% che. Потому что каждый.* жадный, я всегда нахожу ламу справа: лама становится ламой %%%%% . Если я не могу получить пять %, то /(.*%){5}/!dудаляет строку ввода и пропускает следующие команды.

s/[^%]/z/gменяет каждый символ, кроме %как z. Затем я вхожу в цикл. s/(z*)%/\10 z\1/изменяет первый %на 0, копирует ноль или более zслева направо и добавляет еще одинz справа. Это так, число zбудет равно индексу. Например, zz%zzz%...становится, zz0 zzzzzzzz%...потому что первый %был с индексом 2, а следующий %- с индексом 8. s/z*$//удаляет лишние zиз конца строки.

Следующие одиннадцать команд считаются z, удаляя каждую zи считая от 0. Он считает , как zzz0, zz1, z2, 3. Также 1zzzz9становится z1zzz0(позже 23) или zzzz9становится 1zzz0(позже 13). Этот цикл продолжается до тех пор, пока нет больше %или z.

kernigh
источник
1
+1 за обучение СЭД. Легче научить ламу считать, чем седу.
Андрей Костырка
9

Фортран - 154 148

Фортран отстой в игре в гольф, но просто чтобы доказать, что разбор строк можно сделать на математическом языке, я сделал это:

function f result(r);integer::r(5),j=1;do i=1,len(s);if(s(i:i)==a(j:j).or.s(i:i)==b(j:j)) then;r(j)=i;j=j+1;endif;enddo;if(any(r==0))r=0;endfunction

Я сохранил несколько символов, исключив ненужные fв конце endfunctionи использовал if(any(r==0))вместо if(.not.all(r>0)).

Это требует:

  1. s быть строкой с текстом
  2. aбыть тестом нижнего регистра (то есть, llama)
  3. bбыть тестом в верхнем регистре (то есть LLAMA)

Полная программа без игры в гольф

program find_llama
   character(len=123) :: s = "Pie is good.  I just ate a bunch of pies early this morning.  Actually, it was closer to the afternoon.  Mornings are good."
   character(len=5) :: a="llama",b="LLAMA"

   print *,f()
 contains
   function f result(r)
     integer::r(5),j=1
     do i=1,len(s)
        if(s(i:i)==a(j:j).or.s(i:i)==b(j:j)) then
           r(j)=i
           j=j+1
        endif
     enddo
     if(any(r==0)) r=0
   end function
end program find_llama
Кайл Канос
источник
Современный Фортран по крайней мере разрешен на площадках поля и патта. FORTRAN IV все равно будет играть в сумасшедший гольф.
ClickRick
4
@ClickRick: Fortran IV - это то, чего я не изучал. Не уверен, что хочу. Что-то насчет принудительного отступа и заглавных букв беспокоит меня.
Кайл Канос
7

C # - 119

Принимает строку, выводит массив. Нуль, если в строке нет ламы.

int[]a(string s){var i=0;var o="llama".Select((x,y)=>i=s.IndexOf(x,y>0?i+1:0));return o.All(x=>x>=0)?o.ToArray():null;}
jzm
источник
1
+1 дляx=>x>=0
ClickRick
Я впечатлен. Намного меньше, чем любая из моих идей для этого. Я обнаружил, что вы можете уменьшить его, инициализировав i-1 и поместив .ToArray () в оператор int[]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;}
.Select
7

Руби, 56 65 63

Изменить : +9 символов, так что он не зависит от регистра.

Определяет функцию (лямбда, технически) f.

f=->s{i=0;'LLAMA'.chars.map{|c|i=s.upcase.index(c,i+1)||break}}

Возвращает, nilесли нет ламы. Если это должно быть [](пустой массив), то просто добавьте ||[]перед последним }всего 4 дополнительных символа.

Читаемая версия:

innerLlama = -> str{
    index = 0;
    str.downcase!
    arr = 'llama'.each_char.map{|char|
        index = str.index(char, index + 1)
        break unless index
    }
    # uncomment this line for empty array on failure
    #arr || []
}
Дверная ручка
источник
Я прошу прощения за редактирование моего вопроса через некоторое время, но я просто добавил, что массив, если нет ламы, может быть nil, null, empty или undefined.
Силан
21
Так ты сделал это с лямбдой?
Мейсон Уилер
@ Doorknob будет на два байта короче, если использовать верхний регистр вместо нижнего регистра нет?
августа
@dstarh Да, спасибо
дверная ручка
Думаю, вы можете получить нечувствительность к регистру на байт дешевле, выполнив index(/#{c}/iвместо upcase.
гистократ
6

С - 53

Компилировать с:

gcc -D L=\"llama\" -D W=\"Lie\ is\ good.\ \ I\ just\ ate\ a\ bunch\ of\ pies\ early\ this\ morning.\ \ Actually,\ it\ was\ closer\ to\ the\ afternoon.\ \ Mornings\ are\ good.\"

Я протестировал эту команду компиляции с помощью gg cygwin. В других средах пробелы и другие специальные символы могут обрабатываться иначе.

Результат на основе 0 сохраняется в массиве r. Его содержимое не определено, если в строке нет ламы.

  • С учетом регистра (53)

    i,m,r[5];main(){for(;W[i];i++)W[i]==L[m]?r[m++]=i:i;}

  • Без учета регистра (58)

    i,m,r[5];main(){for(;W[i];i++)(W[i]|96)==L[m]?r[m++]=i:i;}

Allbeert
источник
4

JavaScript (ECMAScript 6) - 68 символов

(/((((.*l).*l).*a).*m).*a/.exec(s)||[]).map(x=>x.length-1).reverse()

Предполагается, что строка для проверки находится в переменной s. Если вы хотите превратить его в функцию, тогда добавьтеf=s=> (для дополнительных 5 символов).

Выходы:

[]

Без учета регистра - 69 символов

(/((((.*l).*l).*a).*m).*a/i.exec(s)||[]).map(x=>x.length-1).reverse()

Выходы:

[68, 80, 93, 105, 114]

Регистр не учитывается и первый матч - 74 символа

(/((((.*?l).*?l).*?a).*?m).*?a/i.exec(s)||[]).map(x=>x.length-1).reverse()

Выходы:

[44, 67, 76, 105, 114]
mt0
источник
4

Питон, 100

Я самый худший игрок в гольф. :П

Спасибо @xnor за то, что сбрил 6 байтов.

g,n,o='llama',0,[]
for i in s:
 if g:exec("o+=[n];g=g[1:];"*(i.lower()==g[0])+"n+=1")
o*=len(o)>4

o содержит массив после.

РЕДАКТИРОВАТЬ : Исправлено.

EDIT 2 : len(g)чтобы g, o==5чтобы o>4в соответствии с @ XNOR - х предложений.

РЕДАКТИРОВАТЬ 3 : @WolframH это исправить.

cjfaure
источник
2
o*=(len(o)==5)это отлично . Это ужасно, но я люблю это!
kevinsa5
Я не думаю, что внешние скобки в этой строке необходимы. Вы можете сохранить два символа, удалив их.
user2357112 поддерживает Монику
@ user2357112 В этой второй последней строке? Я удалю их.
cjfaure
Я предполагаю s, что входная строка, верно? Не следует ли тогда s.lowerбыть i.lower? Тем не менее, эта лань
Восстановить Монику
@ WolfhH ах, да, завтра исправлю.
cjfaure
3

Python 71

Предполагает ввод в s. Выход в o.

F=s.lower().find
o=F('l'),
for c in'lama':o+=F(c,o[-1]+1),
o*=min(o)>=0

Изменить: Из списков в кортежи, чтобы сохранить 2 байта.

Восстановить Монику
источник
1
Умножение списков на логические значения - это весело, не правда ли? ; D
cjfaure
Мне нравится, как ты уклоняешься от oнеобходимости начинать непустые попытки o[-1]. Может быть, это короче, чтобы просто начать, oа [-1]потом сделать o=o[1:]? Досадно, начальные -1поездки до проверки , если oсодержит -1.
xnor
@xnor: Я не думаю, что -1-Idea можно заставить работать. По крайней мере, у меня ничего не получилось :-( Однако я изменил списки на кортежи, чтобы сохранить 2 байта. :-)
Восстановить Монику
2

Python 100

import re
x=input()
print[re.search(r"l.*?(l).*?(a).*?(m).*?(a)",x,re.I).start(i) for i in range(5)]

Образец:

in  = Pie is good.  I just ate a bunch of pies early this morning.  Actually, it was closer to the afternoon.  Mornings are good.
out = [44, 67, 76, 105, 114]
in[out] = ['l', 'l', 'a', 'M', 'a']
Kaya
источник
2

Хаскелл, 111

import Data.Char
l i(a:as)t@(b:bs)|a==b=i:l(i+1)as bs|True=l(i+1)as t
l _ _ _=[]
r s=l 0(map toUpper s)"LLAMA"

Ungolfed:

import Data.Char

llama :: Int -> String -> String -> [Int]
llama i (a:as) t@(b:bs)
  | a==b      = i : llama (i+1) as bs
  | otherwise = llama (i+1) as t
llama _ _ _ = []

runme :: String -> [Int]
runme s = llama 0 (map toUpper s) "LLAMA"

Пример:

*Main> r "Pie is good.  I just ate a bunch of pies early this morning.  Actually, it was closer to the afternoon.  Mornings are good."
[44,67,76,105,114]
danmcardle
источник
2

Матлаб, 61 96

Поиск строки и заменяет все до каждого совпадения на тарабарщину перед поиском следующего символа. Оставит sнеопределенным, если слово не встречается.

t='llama';for q=1:5;s(q)=min(regexpi(z,t(q))),z(1:s(q))=0;end

Обратите внимание, что количество символов может быть уменьшено, если разрешена чувствительность к регистру.

Предыдущие версии

 try;t='llama';for q=1:length(t);s(q)=find(lower(z)==t(q),1);z(1:s(q))=ones(1,s(q));end;catch;end

Поиск строки и заменяет все до каждого совпадения на тарабарщину перед поиском следующего символа. Обработка ошибок (try-catch-end) может быть отброшена, тогда программа будет аварийно завершать работу (но s будет неопределенным при необходимости), если llama не найдена.

Реализация:

>> z='Pie is good.  I just ate a bunch of pies early this morning.  Actually, it was closer to the afternoon.  Mornings are good.';
>> try;t='llama';for q=1:length(t);s(q)=find(lower(z)==t(q),1);z(1:s(q))=ones(1,s(q));end;catch;end
>> s
s =

    45    68    77   106   115

Без обработки ошибок:

t='llama';for q=1:length(t);s(q)=find(lower(z)==t(q),1);z(1:s(q))=ones(1,s(q));end
Йорген
источник
Понравилась идея, немного уменьшили charcount.
Деннис Джаэруддин
2

Язык Java

 final int[] wordIndexInSentence(String sentence, String word)
  {
    final int[] returnArr = new int[word.length()];
    int fromIndex = 0;
    word = word.toUpperCase();
    sentence = sentence.toUpperCase();
    for (int i = 0; i < word.length(); i++)
    {
      final char c = word.charAt(i);
      returnArr[i] = sentence.indexOf(c, fromIndex);
      fromIndex = returnArr[i] > 0 ? returnArr[i] + 1 : fromIndex;
    }
    return returnArr;
  }
Сударшана
источник
2

Python (70)

r=[];c=-1
for x in'llama':c=s.lower().find(x,c+1);r+=[c]
r*=1-(-1in r)

Мы ищем каждого персонажа по 'llama'очереди, начиная с места нахождения ранее найденного персонажа. Если символ не найден, cстановится значением по умолчанию -1, в этом случае последняя строка поворачиваетсяr в пустой список.

Редактировать: Обнаружено, что str.find(s,...)можно вызвать как s.find(...), сохраняя 4 символа.

XNOR
источник
2

OpenEuphoria, 147 128

У меня есть два примера. Сначала самое короткое:

object t=and_bits(gets(0),#DF),L="LLAMA",i=0,X={}for j=1 to 5 do 
i=find(L[j],t,i+1)X&=i 
end for 
if find(0,X) then X={} end if?X

Я могу уменьшить его до 126 символов, если буду использовать «или» вместо «и», как в версии C выше. Однако это также соответствует строке ''!-!как llama. Нечасто, но все же возможна ошибка.

object t=or_bits(gets(0),96),L="llama",i=0,X={}for j=1 to 5 do 
i=find(L[j],t,i+1)X&=i 
end for 
if find(0,X) then X={} end if?X

А затем версия с использованием регулярных выражений:

include std/regex.e
include std/sequence.e
include std/utils.e
object X=regex:find(new("(?i)(l).*?(l).*?(a).*?(m).*?(a)"),gets(0))
? iff(atom(X),{},vslice(X[2..6],2))

Оба принимают входные данные из STDIN и отправляют сообщения в STDOUT.

РЕДАКТИРОВАТЬ: более короткий пример регулярного выражения:

include std/regex.e
include std/sequence.e
object X=regex:find(new("(?i)(l).*?(l).*?(a).*?(m).*?(a)"),gets(0))
if atom(X)then?{}else?vslice(X[2..6],2)end if
Оловянный солдатик
источник
Можно ли сэкономить несколько, построив регулярное выражение с split/ joinили explode/ implode, или OpenEuphoria не имеет их коротких версий?
Питер Тейлор
OpenEuphoria может выполнять разбиение / соединение со строками символов, но я не вижу способа сделать это более коротким способом. Я не очень хорош с регулярными выражениями; Регулярное выражение, использованное здесь, было «вдохновлено» (бесстыдно украдено) из одного из других примеров на этой странице.
TinSoldier
2

Powershell - 121 85

Я все еще тренируюсь с Powershell, ожидаю, что это можно улучшить

$ s содержит строку, результат находится в массиве $ a

Оригинальная версия

$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 -gt 4

Ungolfed

$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 -gt 4

Новая версия, с огромной благодарностью @goric

$a=@();$n=$c=0;[char[]]$s|%{if($_-eq"llama"[$n]){$a+=$c;$n++}$c++};$a*=$a.length-gt4
Брайан
источник
Вы можете удалить много пробелов, чтобы сократить их до 112:$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())на [char[]]$s|%, если вы измените последующее $iна $_. Это бреет до 93:$a=@();$w="llama";$n=$c=0;[char[]]$s|%{if($_-eq$w[$n]){$a+=$c;$n+=1}$c+=1};$a*=$a.length-gt4
Горик
Сохраните еще 5 символов, удалив $wпеременную полностью, так как она используется только один раз. Просто вставьте его в if:if($i-eq"llama"[$n])
goric
..и, конечно, заменить ваши +=1с ++с
Горич
1

PHP

нет ответа PHP еще? Я думаю, что язык, сильно ориентированный на строки, может превзойти по крайней мере математический

function x($s){$i=$j=0;$r=str_split('llama');$s=strtolower($s);while($i<strlen($s)){if($s[$i]==$r[$j]){$r[$j]=$i;$j++;if($j>4)return$r;}$i++;}return[];}

152 против Фортрана 154, работа сделана: P

ungolfed

function x($s){
    $i=$j=0;$r=str_split('llama');
    $s=strtolower($s);
    while($i<strlen($s)){
        if ($s[$i]==$r[$j]){
            $r[$j]=$i;
            $j++;
            if($j>4)
                return $r;
        }
        $i++;
    }
    return[];
}

если вызывающий всегда передает строчную строку, он понижается до 137

Einacio
источник
Вы должны добавить <?в начале вашего кода, чтобы сделать его действительным. Сожалею...
августа
1

JavaScript, 122 115

function(s,b){z=[];for(i=0;i<5;i++){z.push(b=s.toLowerCase().indexOf("llama"[i],++b))};return z.indexOf(-1)<0?z:[]}

Определяет функцию, которая принимает строку в качестве единственного аргумента (второй аргумент является дешевым var ) и возвращает либо пустой массив, либо массив из 5 элементов.

Сбрасывается до 108, если я беру входные данные для одной переменной char ( s) и оставляю выходные данные в другом ( b):

var b=((z="llama".split('').map(function(a){return (b=s.toLowerCase().indexOf(a,++b))})).indexOf(-1)<0?z:[])

Изменить: поменять карту для цикла.

Аарон Дюфур
источник
Версия ECMAScript 6 (81 символ) -b=(z=[].map.call("llama",a=>b=s.toLowerCase().indexOf(a,++b))).indexOf(-1)<0?z:[]
MT0
1

Реболь, 97

f: func[s][a: copy[]foreach n"llama"[if none? s: find s n[return[]]append a index? s s: next s]a]

Пример использования в консоли Rebol:

>> f "Pie is good.  I just ate a bunch of pies early this morning.  Actually, it was closer to the afternoon.  Mornings are good." 
== [45 68 77 106 115]

>> f "nearly llami"       
== []

>> f "Llama"
== [1 2 3 4 5]

>> f reverse "llama"
== []

Rebol использует индексирование на основе 1. Возвращает пустой список[] если последовательность ламы не найдена (без учета регистра).

Ungolfed:

f: func [s] [
    a: copy []
    foreach n "llama" [
        if none? s: find s n [return []]
        append a index? s
        s: next s
    ]
    a
]
draegtun
источник
1

APL, 47

+\↑⊃{a s←⍵⋄~⍺∊s:⍬⍬⋄a,←n←s⍳⍺⋄a(n↓s)}/'amall',⊂⍬⍞

Не самый короткий код, но довольно искаженный, в стиле APL.

объяснение

'amall',⊂⍬⍞ Создайте массив из 6 элементов: буквы «amall» и подмассив из 2 элементов, сами подмассивы: пустой массив и строку символов, считываемых из ввода.

{...}/... Уменьшите (сложите вправо) массив из 6 элементов, используя предоставленную функцию.

a s←⍵ Разложите правильный аргумент в массив индексов и оставшуюся подстроку (изначально пустой массив и полную строку.)

~⍺∊s:⍬⍬ Если подстрока не содержит следующую букву, остановите вычисление и верните пустой массив.

a,←n←s⍳⍺ В противном случае найдите его позицию, назовите его n и добавьте его в массив индексов.

a(n↓s) Создайте и верните массив из 2 элементов: расширенный массив индексов и оставшуюся подстроку.

+\↑⊃... Распакуйте выходные данные свертывания, возьмите первый элемент (массив индексов) и отсканируйте его с добавлением, чтобы превратить относительные смещения в абсолютные.

Примеры

      +\↑⊃{a s←⍵⋄~⍺∊s:⍬⍬⋄a,←n←s⍳⍺⋄a(n↓s)}/'amall',⊂⍬⍞
All cats meow aloud.
2 3 6 10 15

 

      +\↑⊃{a s←⍵⋄~⍺∊s:⍬⍬⋄a,←n←s⍳⍺⋄a(n↓s)}/'amall',⊂⍬⍞
Some cats purr instead.
 
Тобия
источник
1

Юлия, 76

Еще один пример регулярного выражения с использованием языка Юлии.

f(s)=(m=match(r"(?i)(l).*?(l).*?(a).*?(m).*?(a)",s);m==nothing?m:m.offsets)
Оловянный солдатик
источник