Ваша программа должна найти все слова в этом списке слов, которые содержат все гласные ( a e i o u y
). Есть простые способы сделать это, но я ищу кратчайший ответ. Я возьму любой язык, но я бы хотел увидеть Баш.
Вот пример (может быть значительно улучшен):
cat wordlist.txt | grep "a" | grep "e" | grep "i" | grep "o" | grep "u" | grep "y"
Ваша оценка - это длина кода.
-5 баллов за подсчет всех вхождений слова.
Самый низкий балл побеждает.
Ответы:
GolfScript, 20 символов - 5 = 15 баллов
Основано на решении Говарда , но с использованием более короткого теста (
\-!
экономит один символ&,6=
), более короткого добавления длины (.,+
= 3 символа) и более короткого форматирования вывода (никто не говорил, что вывод должен быть разделен символом новой строки, поэтому`
сохраняется один символn*
).Вот вывод, учитывая список слов в нижнем регистре в качестве ввода (разрывы строк вставлены для удобства чтения):
(Ps. Технически, учитывая, что задача только говорит, что код должен работать для этого конкретного ввода,
n%{'aeiouy'\-!},`43
было бы еще на один символ короче. Хотя я считаю, что измена.)Объяснение:
n%
разбивает ввод на новых строках в массив.{ },
является оператором "grep", выполняющим код в фигурных скобках для каждого элемента массива и выбирающим те, для которых он возвращает истинное значение.'aeiouy'\-
принимает буквальную строкуaeiouy
и удаляет из нее все символы, найденные в слове-кандидате.!
Затем логически нивелирует полученную строку, получая1
(истина) , если строка пуста , и0
(ложь) , если это не так ..,+
создает копию отфильтрованного массива, считает количество слов в нем и добавляет результат к исходному массиву.`
снимает массив, преобразуя его в строковое представление его содержимого. (Без этого слова в массиве просто будут объединены в выводе, что приведет к нечитаемому беспорядку.)источник
GolfScript, 19 символов
Использование:
Выход:
Если вы также хотите вывести счет в конце, вы можете использовать
который на четыре символа длиннее.
источник
Python - 46 символов
Читаемая версия: это уже довольно читабельно :-)
источник
APL, 21 - 5 = 16
Ожидает найти список слов как
w
. Возвращает список слов, которые содержат все гласные, плюс их количество. Протестировано с ngn apl . Вот пример .объяснение
источник
Руби 38
Изменить 34: Лучший на данный момент (из @OI):
Редактировать 1: Я только что заметил вопрос о том, чтобы 'y' был включен в гласные, поэтому я соответственно отредактировал свой вопрос. Как отметил @Nik в комментарии к своему ответу,
"aeiouy".chars
это на один символ меньше%w[a e i o u y]
, но я оставлю последнего ради разнообразия, хотя я рискую испытать кошмары из-за упущенной возможности.Изменить 2: Спасибо @OI за предложение улучшения:
который спасает 11 символов от того, что у меня было раньше.
Изменить 3 и 3a: @OI сбил еще несколько:
тогда
и снова (3б):
Я простой писец!
Вот еще два неконкурентных решения:
Изначально у меня было:
s
это строка, содержащая слова, разделенные символом новой строкиs
Возвращается массив слов , содержащий все пять гласных. Для читателей , не знакомых с Ruby,%w[a e i o u y] #=> ["a", "e", "i", "o", "u", "y"]
и&
является массивом пересечений.предполагать
В блоке
{...}
изначальнопоэтому "аббревиатуры" не выбраны.
Если строка
s
может содержать дубликаты,s.split.select...
ее можно заменить,s.split.uniq.select...
чтобы удалить дубликаты.Просто заметил, что я могу сохранить 1 символ, заменив
size==6
наsize>5
.источник
...size=5
это ошибка - должно быть...size==5
s.split.select{|w|'aeiouy'.delete(w)==''}
s.split.select{|w|'aeiouy'.tr(w,'')==''}
. Я почти уверен, что вы можете получить это до 40 символов, если используете ноль логику и правильный метод String. Все еще смотрю ...Haskell - 67
источник
Рубин - 28 символов (или 27, если
y
исключен из гласных)Полная команда для запуска (48 символов):
РЕДАКТИРОВАТЬ: заменено
puts
на,p
как предложено @CarySwovelandисточник
%w[a e i o u]
сэкономит 1 символ,p
ибо ещеputs
3.p
, я редко использую это. Что касается% w [], если y включен в набор гласных, версия с символами еще короче."aeiouy".delete(s)==''
может спасти тебе несколько персонажей.AWK - 29
Для запуска: сохраните список слов в нижнем регистре в
wordlist.txt
. Затем выполните:Если вашей системы нет
mawk
,awk
можно также использовать.Вы также можете запустить его из файла, сохранив программу
program.awk
и выполнивmawk
илиawk
-f program.awk
.источник
'/y/&&/u/&&/i/&&/o/&&/a/&&/e/'
!!Python, 45 символов
источник
к [22-5 = 17 символов]
Я переименовал файл «corncob_lowercase.txt» в «w»
Подсчитайте слова [22 символа]
Выход
Найти все слова [25 символов]
Всего 43 слова, содержащие все гласные
(a e i o u y)
Выход
источник
Javascript / JScript 147 (152-5), 158 (163-5) или 184 (189-5) байтов:
Вот мой Javascript и JScript чудовищно "негольфированная" версия (
164152152-5 = 147 байт):function(s,k,z,x,i,c,r){c='aeiouy'.split('');r=[];for(k in s=(s+'').split(/\b/)){i=0;for(z in c)i+=s[k].indexOf(c[z])>=0;i==6&&(r[r.length]=s[k]);}return r;}
function(s,k,z,x,i,c,r){c='aeiouy'.split('');r=[];for(k in s=(s+'').split(/\b/)){i=6;for(z in c)i-=!!s[k].search(c[z]);i&&(r[r.length]=s[k]);}return r;}
Спасибо @GaurangTandon за
search()
функцию, которая спасла мне байт!RegExp основан на производительности HORRIBLE , но поддерживает прописные и строчные буквы (163-5 = 158 байт):
function(s,k,z,x,i,c,r){c='aeiouy'.split('');r=[];for(k in s=(s+'').split(/\b/)){i=0;for(z in c)i+=RegExp(c[z],'i').test(s[k]);i==6&&(r[r.length]=s[k]);}return r;}
RegExp, основанный на ЛУЧШЕЙ производительности, НО занимает намного больше байтов (189-5 = 184 байта):
function(s,k,z,x,i,c,r,l){l=[];r=[];for(z in c='aeiouy'.split(''))l[z]=RegExp(c[z],'i');for(k in s=(s+'').split(/\b/)){i=0;for(z in c)i+=l[z].test(s[k]);i==6&&(r[r.length]=s[k]);}return r;}
Этот, если только для забавы (175-5 байт) и не считается ответом:
function(s,k,z,x,i,c,r){c='aeiouy'.split('');r=[];for(k in s=(s+'').split(/\b/)){i=0;for(z in c)i+=s[k].indexOf(c[z])>=0;i==6&&(r[r[r.length]=s[k]]=1+(r[s[k]]||0));}return r;}
Он основан на 1-м ответе, но имеет «поворот»: вы можете знать, сколько раз было найдено слово.
Вы просто делаете это так:
var b=(function(s,k,z,x,i,c,r){c='aeiouy'.split('');r=[];for(k in s=(s+'').split(/\b/)){i=0;for(z in c)i+=s[k].indexOf(c[z])>=0;i==6&&(r[r[r.length]=s[k]]=1+(r[s[k]]||0));}return r;})('youaie youaie youaie youaie a word');
b.youaie //should be 4
Поскольку в нем
length
нет всех гласных, оно не будет удалено и все равно будет ответом за бонус.Как вы это называете?
«Простой»: вы оборачиваете функцию внутри,
()
а затем добавляете('string goes here');
в конец.Так:
(function(s,k,z,x,i,c,r){c='aeiouy'.split('');r=[];for(k in s=(s+'').split(/\b/)){i=0;for(z in c)i+=s[k].indexOf(c[z])>=0;i==6&&(r[r.length]=s[k]);}return r;})('a sentence youyoy iyiuyoui yoiuae oiue oiuea');
Этот пример вернет массив только с 1 строкой: yoiuae
Я знаю, что это худшее решение, но работает!
Почему я считаю -5?
Ну, у массивов Javascript / JScript есть свойство (
length
) в массивах, которое сообщает количество элементов, которые у него есть.После подтверждения в вопросе бонус -5 предназначен для определения количества слов.
Поскольку количество слов находится в этом свойстве, я автоматически получаю оценку -5.
источник
search()
вместоindexOf()
сохранения 1 символ..split()
вкл"aeiouy"
. JS перебирает массив и строку одинаково. (Удаление этого экономит вам ~ 10 символов)Ruby
3938В настоящее время самая короткая запись Ruby при подсчете всей программы, включая ввод и вывод.
Сохраненный символ, используя
map
вместоeach
:Другая версия, 39 символов с более красивым выводом:
Обе программы получают ввод из стандартного ввода или в виде имени файла, передаваемого в качестве аргумента командной строки:
$ ruby wovels.rb wordlist.txt
Стоит добавить 3 дополнительных символа
y
в качестве ткацкого ореха.источник
Enumerable#grep
сократить это? например,s.split.grep /a*e*i*o*u*y/
предположим , чтоs
это строка слов, разделенных символами новой строки..*
между волнами.s = "aeiouy\neiouay\nyuaioe\n"
. Затемs.split.grep /a*e*i*o*u*y/
возвращается["aeiouy", "eiouay", "yuaioe"]
за мной. Тестирование вpry
Ruby 2.0.0. Отличное решение, кстати.grep
использовал=~
оператор, но, видимо, он использует===
. Я подозревал, что он также будет соответствовать строкам, не содержащим всех wovels, потому что, например,/e*a*i*o*u*y/=~"eioy"
работает. Я действительно не понимаю, что на===
самом деле делает регулярное выражение и оператор. Отличная находка; Я бы посоветовал вам опубликовать это как ответ самостоятельно. править я был прав: попытка с, например"heya"
.Mathematica (65 или 314)
Два совершенно разных подхода, лучший из которых был предложен Велисарием в комментариях к моему первоначальному ответу. Во-первых, мое грубое усилие, которое алгоритмически генерирует каждое возможное регулярное выражение, которое соответствует комбинации из шести гласных (включая «y»), а затем проверяет каждое слово в целевом списке слов по каждому из этих 720 регулярных выражений. Это работает, но это не очень кратко и медленно.
~ 320 символов. Некоторые из них могут быть сохранены с использованием альтернативной записи, и дополнительные символы будут потеряны при подготовке файла словаря в виде списка строк (естественный формат словаря в Mathematica. Другие языки могут не нуждаться в этой подготовке, но Mathematica делает это). Если мы пропустим этот шаг, предполагая, что он был обработан для нас, такой же подход может быть использован менее чем в 250 символах, и если мы используем встроенный словарь Mathematica, мы получим еще большую экономию,
До 200 символов. Подсчет количества найденных слов требует только передачи результата
Length[Flatten[]]
, который может быть добавлен вокруг любого блока кода выше или может быть выполнен позже, например, с помощьюLength@Flatten@%
. Список слов, указанный для этого задания, дает 43 соответствия, а словарь Mathematica - 64 (и намного быстрее). В каждом словаре есть совпадающие слова, которых нет в другом. Mathematica находит, например, «непрофессионально», которого нет в общем списке, а общий список находит «eukaryotic», которого нет в словаре Mathematica.Велисарий предложил гораздо лучшее решение. Предполагая, что список слов уже подготовлен и назначен переменной
l
, он определяет один тест на основеStringFreeQ[]
функции Mathematica , а затем применяет этот тест к списку слов с помощьюPick[]
функции. 65 символов, и это примерно в 400 раз быстрее, чем мой подход.источник
f@u_:=And@@(!StringFreeQ[u,#]&/@Characters@"aeiouy");Pick[l,f/@l]
гдеl
список словy
гласным (согласно требованиям ОП!)Perl 6 - 35 символов
Вдохновленный решением Ruby @CarySwoveland:
Это выбирает (
grep
ы) каждую строку,True
для<a e i o u y> ⊆ *.comb
которой возвращается , что является просто причудливым способом спросить: «Является ли Set('a','e','i','o','u','y')
подмножеством (⊆
) Set, составленным из букв input (*.comb
)?»На самом деле, оба
<a e i o u y>
и*.comb
только создаютList
s:⊆
(или(<=)
если вы застряли в ASCII) превращает их вSet
s для вас.Чтобы получить количество напечатанных строк, это скрипт из 42 символов - 5 = 37 пунктов также выведет:
источник
C - 96 байт
Я сохранил несколько байтов скобок благодаря удачному совпадению приоритетов операторов.
источник
Javascript - Оценка = 124 - 5 = 119 !!!
Изменить: 17/02/14
Большое спасибо @Ismael Miguel за помощь в прекращении ~ 12 символов !
Я удалил форму функции обозначения жирной стрелки, потому что, хотя я видел, как она начала использоваться, она не работает. Понятия не имею, почему ...
Чтобы это работало:
Передайте все слова, разделенные символом новой строки, в качестве аргумента функции, как показано ниже.
Тест:
источник
k="aeiouy".split("")
вfor(i in k)
цикл. Использование;
вместо новых строк экономит несколько байтов в Windows. И все же я не вижу, как он будет обрабатывать список слов. И как заставить это работать.k="aeiouy";o=0;for(i in k)
, чтобы попробоватьo=0;for(i in k='aeiouy')
. и с помощью экономит байты, вы можете использовать их , чтобы изменитьo+=RegExp(k[i]).test(s)
вo+=RegExp(k[i],'i').test(s)
, занимая один байт больше, но работать как с верхним и нижним.Bash + coreutils, 39
Принимает ввод от стандартного ввода.
источник
Сед 29 символов
Порядок выбран из Частота письма в Википедии для проверки скорости.
На моем хосте:
а также
источник
Bash (grep) - 36 байт
Обратите внимание на порядок проверки гласных, в первую очередь наименее часто встречающихся. Для тестового примера это выполняется примерно в 3 раза быстрее, чем тестирование в порядке. Таким образом, первый тест удаляет большее количество слов, поэтому последующим тестам меньше работы. Очевидно, что это не влияет на длину кода. Многие другие решения, опубликованные здесь, также выиграют от выполнения тестов в этом порядке.
источник
Д - 196
Без гольфа :
использование :
C:\>rdmd vowels.d wordlist.txt
wordlist.txt
должен содержать строчный список слов.источник
Реболь (104 символа)
Un-golfed:
d
теперь содержит список найденных слов. Вот пример из консоли Rebol:источник
Smalltalk (36/57 символов)
чтобы получить количество, отправьте #size в результирующую коллекцию. Коллекция результат содержит 43 слова ( «воздержанно» «авторитетно» ... «несомненно,» «неузнаваемо»)
Приведенный выше код содержит 77 символов, но я мог бы переименовать файл списка слов в «w», поэтому я считаю, что имя файла равно 1, что дает оценку 57.
Является ли чтение файла частью проблемы или нет? Если нет (см. Другие примеры), и список слов уже находится в коллекции c, то код сокращается до:
что составляет 36 символов (с пропуском пропущенного пробела).
источник
обновлено: ненужные пробелы удалены
Очень медленно, но в bash (81 символ):
РЕДАКТИРОВАТЬ:
echo $l|fold -w1
заменено на,fold -w1<<<$l
как предложено @ nyuszika7hисточник
fold -w1<<<$l
вместоecho $l|fold -w1
. Примечание: текущий код состоит из 84 символов, вы не должны считать завершающий перевод строки.JavaScript - 95 байт
Вот мой гольф.
И я также хотел бы отметить, что ваш гольф, кажется, не встречает все случаи появления гласных.
Ungolfed:
источник
(?=.*a)
проверить,a
находится ли где-нибудь в строке.сортировать + uniq + sed
Этот не соответствует повторным вхождениям слова. Оно также не соответствует букве «у», если оно встречается в начале слова.
источник
удар
Не такой короткий, как ОП, но одна строка в Bash:
источник
C # - 170
отформатирован:
Сейчас не в настроении для подсчета, но это должно быть легко.Путь к списку слов (в нижнем регистре) должен быть передан программе в качестве первого аргумента:Выход:
Я взял на себя смелость выводить и разделять запятыми слова; ни то, ни другое не указано в правилах (какое состояние «должно найти все слова», а не то, как (и ЕСЛИ) выводить).
Включая счет (+ вывод): 192 - 5 = 187
Выход:
(Обратите внимание на количество в конце: 43)
Нет вывода («должен найти все слова»): 137 - 5 = 132
(Снова немного изменив правила: не совсем). Это находит все слова, и счет доступен после выполнения
r.Count()
.источник
C-Sharp
Я никогда не делал этого раньше, и я не совсем уверен, каковы процедуры размещения. Но вот что я придумал:
185 байт
wordList
= аList<string>
из всех слов.если вы хотите отобразить итог:
219 - 5 = 214 байтов
расширенный
источник
vb.net (оценка 91 = 96с - 5) * 0
* 0 + 49с мин
Это создает перечисление, содержащее все слова, которые содержат все гласные.
источник
Your program must find all the words in this wordlist
, Это а) не программа, а фрагмент программы и б) не читает / не использует список слов.Mathematica -
136102Сокращенная ссылка ведет на http://www.mieliestronk.com/corncob_lowercase.txt
источник
http://bit.ly/1iZE9kY
.Characters["aeiou"]
или более, если вы включитеy
.