Для выполнения этой задачи вы должны реализовать Abbrev
модуль Ruby как можно меньше кода.
Вызов
Входными данными будут все, что имеет ваш язык в виде массива (массив, список, последовательность и т. Д.) Строк. Вы можете написать функцию или принять слова, разделенные запятыми, в STDIN.
Затем вы должны вычислить набор однозначных префиксов для этих строк. Это означает, что вы должны вернуть хеш (или карту, объект и т. Д.) Сокращений в их исходные строки.
«Префикс» - это подстрока исходной строки, начинающаяся с начала строки. Например, «преф» является префиксом слова «префикс».
Однозначный префикс один , что может означать только одно слово. Например, если вы вводите
car,cat
, тоca
это не однозначный префикс, потому что он может означать «автомобиль» или «кошка».Исключением из этого правила является то, что слово всегда является префиксом самого себя. Например, если у вас есть ввод, например
car,carpet
,car:car
должен быть в вашем выводе.
Затем вы можете вернуть хеш / карту / объект / и т.д. от вашей функции (или сделать эквивалент на вашем языке), или распечатать его в STDOUT в
key:value
парах в формеf:foo,fo:foo,...
. (Пары ключ-значение также могут быть разделены пробелами, если это делает ваш код короче.)
Контрольные примеры
Input code,golf,going
Output c:code,co:code,cod:code,code:code,gol:golf,golf:golf,goi:going,goin:going,going:going
Input pie
Output p:pie,pi:pie,pie:pie
Input pie,pier,pierre
Output pie:pie,pier:pier,pierr:pierre,pierre:pierre
Input a,dog
Output a:a,d:dog,do:dog,dog:dog
правила
Входные данные не будут содержать дубликаты элементов.
Ваш вывод может быть в любом порядке; Вы не должны сортировать это.
Вы не можете использовать встроенный
Abbrev
модуль / функцию / что-то вроде Ruby.Это код-гольф , поэтому выиграет самый короткий код в байтах!
key:value\nkey:value\nkey:value
...?Ответы:
APL (46)
(Да, кодировка APL вписывается в байт, с запасом места.)
Это функция, которая принимает список строк и возвращает матрицу 2 на N, где каждая строка содержит однозначный префикс и слово, которому она принадлежит:
Объяснение:
∆←⍵
: сохранить правильный аргумент в∆
.{↑∘⍵¨⍳⍴⍵}¨∆
: для каждого элемента∆
, получить возможные префиксы этого элемента:⍳⍴⍵
: получить список с1
длиной⍵
↑∘⍵¨
: для каждого из этих чисел, получить столько элементов из⍵
.∪⊃,/
: объединить списки вместе и принять уникальные значения.{
...}¨
: для каждого из уникальных префиксов:∆/⍨⊃¨⍵∘⍷¨∆
: выберите слова, которые начинаются с этого префикса(⊂⍵),
: также заключите префикс и объедините∆/⍨2=⍴∆←
: вернуть список, только если есть два элемента (префикс и одно совпадающее слово)↑
: превратить список кортежей в матрицуисточник
Python 2,7 -
146141 байтОбратите внимание, что отступ в строках 4 и 5 не 4 пробела, это побочный эффект интерпретатора уценки SE. Это буквенный символ табуляции, поэтому только один байт.
Технически это не совсем соответствует спецификации, но я изменю это, если пояснится дверная ручка. Он использует новые строки вместо запятых для разделения вывода. Например:
Новое: мне удалось избавиться от 5 символов, назначив строку, которую я проверяю, переменной
e
. Это означает, что мне нужно печататьe
толькоw[:a]
три раза. Это также означает, что я сохраняю символы, делаяe=w[:a+1]
и изменяя...range(1,len(w)+1)
наrange(len(w))
.Объяснение:
источник
sum(b.startswith(e) for b in l)
вместоlen(filter(lambda b:b.startswith(e),l))
b.startswith(e)
доb.find(e)==0
илиb[:a+1]==e
и проверить<2
счет вместо==1
.e=""\n for a in w:\n\te+=a
вместо того,for a in range(len(w)):\n\te=w[:a+1]
чтобы сэкономить 10 символовJ - 47 символов
J рассматривает строки как просто векторы символов, что означает, что когда он пытается составить список строк, он на самом деле заканчивает тем, что создает таблицу символов, поэтому концы дополняются пробелами. Решение J для этого называется боксом , поэтому эта функция принимает в качестве аргумента список строк в штучной упаковке, чтобы сохранить длину.
Кроме того, J не имеет хеш-типа, поэтому наиболее близким к нему является таблица элементов из двух столбцов, например, в штучной упаковке. Если это неприемлемо, и мне нужно использовать форму ключ-значение по умолчанию, я могу переформатировать вывод в эту форму в общей сложности 67 символов :
Объяснение взрывом:
Примеры:
источник
Haskell
9687Безголовая версия:
Пример:
Я использовал
inits
функцию, которая находит все префиксы списка / строки. Это считается обманом?источник
concatMap
на то(=<<)
, что есть в Prelude. Спасает вас 10 символов.concatMap
но не могу сохранить больше 9 символов.>>=\
одной лексемой. Извините за это ...Питон 3 (97)
Мы перебираем префиксы каждого слова на входе, печатая соответствующую пару префикс / слово, если она появляется ровно один раз или относится ко всему слову. Мы пользуемся преимуществом короткого замыкания
or
(и являемсяprint
функцией) для печати, только если выполняется одно из этих условий.while
Цикл несколько раз отрежет последний символ , чтобы создать более короткие префиксы, завершение , когда пустую строка остается. Это единственный раз, когда мы индексируем или нарезаем что-либо.Мы подсчитываем вхождения префикса
e
во входных данных путем поискаS
подстрок в исходной строке ввода, разделенных запятыми','+e
. Мы добавляем запятую к входной строке перед этим. Это добавление вызывает дополнительный пустой строковый элемент, когда мыsplit
, но это не имеет никакого эффекта, потому что у него нет непустых подстрок.Чтобы проверить случай, когда подстрока
e
является целым словомw
, мы сравниваем их, используя оператор сравнения строк. Это сравнивает лексикографически, поэтому короткие префиксы меньше. Двойное сравнение не выполняется , если либоe==w
илиS.count(c+e)<2
.Если бы распечатка выводов в форме
e,w
была разрешена, я бы сохранил символ, написавe+c+w
вместо этого.Кредит undergroundmonorail от которого ответа я основывал мою общую структуру кода.
источник
(e<w)*S.count(c+e)>1
можно сыграть в гольф,e<w<w*S.count(c+e)
чтобы спасти 2 персонажа.Руби, 114
Ungolfed:
источник
к4 (70)
не особенно в гольф; я уверен, что это может быть короче
очень похоже на J импл. выше, я думаю - в основном просто собирает все (правильные) префиксы, снова удаляет слова из префиксов (для обработки
"car"
/"carpet"
case), группирует их в классы эквивалентности, выбирает классы только с одним элементом, сокращает их от списков до строки и добавляет в карту из строк для себя.некоторые тесты
обратите внимание, что в
k
/q
строка представляет собой список символов, поэтому строку, содержащую только один символ, необходимо пометить как таковую с помощью унарной,
функции; & mmwrt список строк, содержащих только одну строкуОни используют
q
«секshow
функции, которая имеет встроенную форматированию для некоторых структур данных, чтобы сделать результаты более удобными для чтения:источник
JavaScript - 212
Начальный гольф.
Входные данные:
code,golf,going
Выход:
["c:code", "co:code", "cod:code", "code:code", "gol:golf", "golf:golf", "goi:going", "goin:going", "going:going"]
источник
Perl,
9377С переводом строки и отступом для удобства чтения:
Слишком поздно и слишком долго, но я рад, что наконец-то стало меньше 100. Функция возвращает список, который можно присвоить хеш-переменной:
и
На самом деле, возвращаемый список еще не отфильтрован - построение хеша завершается в момент его назначения, т.е. вне функции. Если это не достаточно чисто / справедливо, добавьте 3 для подсчета и поместите содержимое функции в фигурные скобки, предварительно добавив
+
- тогда функция вернет 'истинную' ссылку на хеш.источник
Q: 44 байта
ПРИМЕЧАНИЯ
Язык Q имеет внутреннее ядро с внутренним именем K4 (используется в этом ответе и другом ранее ответе на этот вопрос)
Для проверки кода загрузите интерпретатор (kx.com, бесплатно для некоммерческого использования, поддержка Windows, Linux, Mac)
Интерпретатор допускает два синтаксиса:
многословный (более читаемые имена, отдельные имена для мотивов и диад, больше библиотек, ...). Загрузить исходный файл с расширением q или интерактивный интерпретатор
компактный (функциональное внутреннее ядро, однобуквенные операторы, одна буква для обоих использует монаду / диаду, ...). Загрузите исходный файл с расширением k или интерактивный интерпретатор в режиме k (запись \ при запросе). Код должен быть проверен в этом режиме
Код определяет лямбду (анонимная функция). Чтобы дать имя функции, нам нужен префикс name: (ex f: {..}), поэтому требуется 46 байт.
ТЕСТОВОЕ ЗАДАНИЕ
(предполагая именованную функцию: в противном случае подставьте код f)
возвращает словарь (синтаксические ключи! значения). Ключи представляют собой список символов (`symb`symb ..), а значения представляют собой список символов. Если мы выполним предложение в интерактивном интерпретаторе, у нас будет более удобное представление (каждый ключ и соответствующие значения находятся в отдельной строке)
ОБЪЯСНЕНИЕ
x
является неявным аргументом в пользу лямбды$x
преобразовать список символов в список строк(-1_)\
перебирает каждый элемент списка символов(читается как для каждой строки вычисляет префиксы (при итерации есть последний символ строки (-1_), до пустой строки)
$
снова преобразуется в список символов (список всех префиксов)p:
и назначает р,/
уничтожить все (объединяет и создает одноуровневую структуру)=
классифицировать -> для каждого уникального префикса, связывает соответствующие слова#:'
вычисляет длину (количество слов, связанных с каждым префиксом)1=
истина, если длина = 1 (однозначно), ложь в противном случае&
где -> индекс истинных элементовp in\:
определяет для всех префиксов, находятся ли они в однозначном префиксе(..)'
применяется (..) к каждому значению справа (однозначный префикс)?0,&:
-> отличный 0 объединенный где (чтобы справиться со словами как префикс себя)p@
преобразовать индексы в символыx!..
создать словарь с x (словами) в качестве ключей и .. в качестве значенийЧитать как:
Создать и вернуть словарь со словами в качестве ключей и значений.
... значения индексов в разных позициях 0 (все слова) и где однозначный префикс
... однозначно рассчитывается как префиксы, которые появляются только в одном слове (список слов, связанный с каждым символом, имеет длину один)
... выводит список классификации всех уникальных символов с соответствующими словами
... префиксы рассчитываются путем повторения удаления последнего символа каждого слова
источник
PHP 7.0, 67 байт (после испытания)
принимает входные данные из аргументов командной строки; печатает запятую; беги с
-nr
.для более нового PHP добавьте один байт: замените
&a
на""<
.для более старого PHP используйте эти 70 байтов:
PHP, 70 байт
источник
Брахилог , 23 байта
Попробуйте онлайн!
Принимает ввод в виде списка через входную переменную и генерирует список
[key, value]
пар через выходную переменную. Любая входная строка, которая не является префиксом другой входной строки, будет сгенерирована как собственный префикс дважды, хотя заголовок в TIO скрывает это, используяᵘ
для получения полный список вместоᶠ
.источник
{}ᵘ
, если не существует более короткого способа либо исключить что-то, что является префиксом самого себя, либо сгенерировать каждую необходимую выходную пару без дополнительного правила∋gj
.Perl 5
-a
, 76 байтПопробуйте онлайн!
источник
APL (Dyalog Classic) , 38 байт
благодарит Эрика Outgolfer за напоминание мне использовать однобайтовую кодировку символов
Попробуйте онлайн!
источник
Python (127)
Поэтому я не мог комментировать @undergroundmonorail, но я думал, что лучше использовать словарный подход? Я уверен, что с некоторым пониманием списка / словаря это также может быть значительно сокращено, но я не могу заставить его работать с треском от диктата.
Печать выведет словарь, неупорядоченный.
РЕДАКТИРОВАТЬ: Ааа я пропустил машину: автомобиль / автомобиль: ковер критерии. Может быть, проверка длины?
источник
Groovy - 212 символов
Golfed:
пример вывода:
Ungolfed:
источник
JavaScript (Node.js) , 88 байт
Попробуйте онлайн!
источник
Зш , 95 байт
Попробуйте онлайн!
Единственный способ «вернуть» ассоциативный массив в Bash / Zsh - это объявить его без
local
ключевого слова и затем обратиться к нему в родительской области. Это спасло бы один байт. Однако ввод-вывод через переменные обычно не одобряется, поэтому вместо этого мы печатаем определение массива.источник
Рубин , 84 байта
Просто заметил, что уже существует решение для Ruby, да ладно. Это в основном улучшает старое решение, выбирая префиксы более умным способом (устраняя необходимость добавлять каждое слово в качестве «префикса» в конце) и подсчитывая префиксы для проверки уникальности перед добавлением их в хеш, вместо перезаписи значения пустышка, если есть дубликат, а затем стирание записи.
Попробуйте онлайн!
источник