Ваша цель состоит в том, чтобы воспринимать как
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, числа будут выглядеть иначе. Это нормально.)
Если текст не имеет ламы, то массив должен быть пустым, нулевым, нулевым или неопределенным.
Любой код языка принимается. Это соревнование по коду-гольфу , поэтому выигрывает меньше всего персонажей!
Ответы:
CJam - 33
Он получает индексы на основе 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 раз соответственноисточник
Perl, 52 байта
Решение предоставляется в виде функции, которая принимает строку в качестве аргумента и возвращает список позиций.
Позиции на основе позиции, поиск с учетом регистра, без перевода строки: 52 байта
Поиск с учетом регистра возвращает пустой массив в примере вопроса, потому что после сопоставления первых трех букв строчная буква
m
отсутствует во входном тексте.Поддержка новых строк: + 1 байт = 53 байта
Текст теперь может занимать несколько строк.
Поиск без учета регистра: + 1 байт = 54 байта
Теперь пример в вопросе сообщает список позиций индекса, они представляют собой числа на основе одного:
Нулевые позиции: + 9 байтов = 63 байта
Результат для примера в вопросе:
Ungolfed:
Последний вариант включает более или менее другие варианты.
источник
[]
а третье печатает[ ]
для меня (более длинные работают правильно). Я бегу "Perl, v5.8.8 построен для msys-64int". У вас есть ошибка, или она работает на другой версии Perl?[]
верно для первого решения,M
не совпадает с поиском с учетом регистра. Вопрос совершенно неясен относительно чувствительности к регистру.[]
приемлемо для первых двух. Но первые три решения все еще не работают для меня правильно: если вы дадите ему ввод, который должен возвращать индексы, он вернет[ ]
сед, 299 + 1
Да, сед может найти ламу. Нет, Сед не умеет заниматься математикой. Это самый длинный ответ, до 299 + 1 символов, потому что я должен был научить sed считать.
Этот ответ требует sed с расширенными регулярными выражениями (
sed -E
илиsed -r
). Я использовал OpenBSD sed (1) . Ввод - одна строка на строку. (Следовательно, строка может не содержать символ новой строки.) Выходные данные - это строка чисел или ничего.Использование (+1 символ для
-r
):Исходный код (299 символов):
Программа сначала заменяет ламу пятью
%
. (Все%
в этой программе являются буквальными.) Первая команда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
.источник
Фортран -
154148Фортран отстой в игре в гольф, но просто чтобы доказать, что разбор строк можно сделать на математическом языке, я сделал это:
Я сохранил несколько символов, исключив ненужные
f
в концеendfunction
и использовалif(any(r==0))
вместоif(.not.all(r>0))
.Это требует:
s
быть строкой с текстомa
быть тестом нижнего регистра (то есть,llama
)b
быть тестом в верхнем регистре (то естьLLAMA
)Полная программа без игры в гольф
источник
C # - 119
Принимает строку, выводит массив. Нуль, если в строке нет ламы.
источник
x=>x>=0
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;}
Руби,
566563Изменить : +9 символов, так что он не зависит от регистра.
Определяет функцию (лямбда, технически)
f
.Возвращает,
nil
если нет ламы. Если это должно быть[]
(пустой массив), то просто добавьте||[]
перед последним}
всего 4 дополнительных символа.Читаемая версия:
источник
index(/#{c}/i
вместоupcase
.С - 53
Компилировать с:
Я протестировал эту команду компиляции с помощью 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;}
источник
JavaScript (ECMAScript 6) - 68 символов
Предполагается, что строка для проверки находится в переменной
s
. Если вы хотите превратить его в функцию, тогда добавьтеf=s=>
(для дополнительных 5 символов).Выходы:
Без учета регистра - 69 символов
Выходы:
Регистр не учитывается и первый матч - 74 символа
Выходы:
источник
Питон, 100
Я самый худший игрок в гольф. :П
Спасибо @xnor за то, что сбрил 6 байтов.
o
содержит массив после.РЕДАКТИРОВАТЬ : Исправлено.
EDIT 2 :
len(g)
чтобыg
,o==5
чтобыo>4
в соответствии с @ XNOR - х предложений.РЕДАКТИРОВАТЬ 3 : @WolframH это исправить.
источник
o*=(len(o)==5)
это отлично . Это ужасно, но я люблю это!s
, что входная строка, верно? Не следует ли тогдаs.lower
бытьi.lower
? Тем не менее, эта ланьPython 71
Предполагает ввод в
s
. Выход вo
.Изменить: Из списков в кортежи, чтобы сохранить 2 байта.
источник
o
необходимости начинать непустые попыткиo[-1]
. Может быть, это короче, чтобы просто начать,o
а[-1]
потом сделатьo=o[1:]
? Досадно, начальные-1
поездки до проверки , еслиo
содержит-1
.-1
-Idea можно заставить работать. По крайней мере, у меня ничего не получилось :-( Однако я изменил списки на кортежи, чтобы сохранить 2 байта. :-)Python 100
Образец:
источник
Хаскелл, 111
Ungolfed:
Пример:
источник
Матлаб, 61
96Поиск строки и заменяет все до каждого совпадения на тарабарщину перед поиском следующего символа. Оставит
s
неопределенным, если слово не встречается.Обратите внимание, что количество символов может быть уменьшено, если разрешена чувствительность к регистру.
Предыдущие версии
Поиск строки и заменяет все до каждого совпадения на тарабарщину перед поиском следующего символа. Обработка ошибок (try-catch-end) может быть отброшена, тогда программа будет аварийно завершать работу (но s будет неопределенным при необходимости), если llama не найдена.
Реализация:
Без обработки ошибок:
источник
Язык Java
источник
Python (70)
Мы ищем каждого персонажа по
'llama'
очереди, начиная с места нахождения ранее найденного персонажа. Если символ не найден,c
становится значением по умолчанию-1
, в этом случае последняя строка поворачиваетсяr
в пустой список.Редактировать: Обнаружено, что
str.find(s,...)
можно вызвать какs.find(...)
, сохраняя 4 символа.источник
OpenEuphoria,
147128У меня есть два примера. Сначала самое короткое:
Я могу уменьшить его до 126 символов, если буду использовать «или» вместо «и», как в версии C выше. Однако это также соответствует строке
''!-!
какllama
. Нечасто, но все же возможна ошибка.А затем версия с использованием регулярных выражений:
Оба принимают входные данные из STDIN и отправляют сообщения в STDOUT.
РЕДАКТИРОВАТЬ: более короткий пример регулярного выражения:
источник
split
/join
илиexplode
/implode
, или OpenEuphoria не имеет их коротких версий?Powershell -
12185Я все еще тренируюсь с Powershell, ожидаю, что это можно улучшить
$ s содержит строку, результат находится в массиве $ a
Оригинальная версия
Ungolfed
Новая версия, с огромной благодарностью @goric
источник
$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
$w
переменную полностью, так как она используется только один раз. Просто вставьте его в if:if($i-eq"llama"[$n])
+=1
с++
сPHP
нет ответа PHP еще? Я думаю, что язык, сильно ориентированный на строки, может превзойти по крайней мере математический
152 против Фортрана 154, работа сделана: P
ungolfed
если вызывающий всегда передает строчную строку, он понижается до 137
источник
<?
в начале вашего кода, чтобы сделать его действительным. Сожалею...JavaScript,
122115Определяет функцию, которая принимает строку в качестве единственного аргумента (второй аргумент является дешевым
var
) и возвращает либо пустой массив, либо массив из 5 элементов.Сбрасывается до 108, если я беру входные данные для одной переменной char (
s
) и оставляю выходные данные в другом (b
):Изменить: поменять карту для цикла.
источник
b=(z=[].map.call("llama",a=>b=s.toLowerCase().indexOf(a,++b))).indexOf(-1)<0?z:[]
Реболь, 97
Пример использования в консоли Rebol:
Rebol использует индексирование на основе 1. Возвращает пустой список
[]
если последовательность ламы не найдена (без учета регистра).Ungolfed:
источник
APL, 47
Не самый короткий код, но довольно искаженный, в стиле APL.
объяснение
'amall',⊂⍬⍞
Создайте массив из 6 элементов: буквы «amall» и подмассив из 2 элементов, сами подмассивы: пустой массив и строку символов, считываемых из ввода.{...}/...
Уменьшите (сложите вправо) массив из 6 элементов, используя предоставленную функцию.a s←⍵
Разложите правильный аргумент в массив индексов и оставшуюся подстроку (изначально пустой массив и полную строку.)~⍺∊s:⍬⍬
Если подстрока не содержит следующую букву,⍺
остановите вычисление и верните пустой массив.a,←n←s⍳⍺
В противном случае найдите его позицию, назовите его n и добавьте его в массив индексов.a(n↓s)
Создайте и верните массив из 2 элементов: расширенный массив индексов и оставшуюся подстроку.+\↑⊃...
Распакуйте выходные данные свертывания, возьмите первый элемент (массив индексов) и отсканируйте его с добавлением, чтобы превратить относительные смещения в абсолютные.Примеры
источник
Юлия, 76
Еще один пример регулярного выражения с использованием языка Юлии.
источник