Напишите функцию / программу, которая принимает строку строчных / прописных букв [A-Za-z] в качестве входных данных, которая проверяет, являются ли встречающиеся буквы уникальными и в алфавитном порядке (игнорируя строчные и прописные буквы) или нет. Вывод должен быть правдивым, если они уникальны и в алфавитном порядке, и ложным, если нет.
Вот несколько тестов
a true
abcdefGHIjklmnopqrSTUVWXyz true
aa false
puz true
puzz false
puzZ false
puZ true
PuZ true
pzu false
pzU false
abcdABCD false
dcba false
Если хотите, запустите вашу программу на всех словах словаря, подобного этому, и опубликуйте несколько интересных =).
Гол
Наименьшее количество байтов побеждает.
za
быть истинное значение?a
и заканчивается наz
.Ответы:
CJam, 8 байт
Вот тестовый комплект для всех примеров в задаче. Это возвращает
0
или1
(которые являются ложными и правдивыми, соответственно, в CJam).А вот скрипт для фильтрации списка слов в вопросе (для его запуска требуется несколько секунд). Вам придется скопировать список слов в поле ввода вручную, потому что это слишком долго для постоянной ссылки.
объяснение
источник
Regex (любой вкус), 55 байт
Некоторые люди не считают regex языком программирования, но он использовался раньше, и он не является самым коротким.
Я добавил один байт для
i
(без учета регистра) флага. Это очень просто и может быть короче, чтобы генерировать на лету.Если одно только регулярное выражение не разрешено, вы можете использовать эту 56-байтовую программу Retina, предложенную Мартином Бюттнером:
Выполнение этого в списке слов, связанном выше, дало 10 6-буквенных слов в алфавитном порядке.
источник
i`^a?b?c?d?e?f?g?h?i?j?k?l?m?n?o?p?q?r?s?t?u?v?w?x?y?z?$
Python 3, 44 байта
Простой подход - проверить уникальность, проверить сортировку.
источник
*s,=...
делает?s=list(input().lower())
.x,*y = [1, 2, 3, 4]
, который сопоставляет 1 доx
и[2, 3, 4]
доy
.*s,=
islist(s)
... ссылка{*s}
вместо того,set(s)
чтобы сохранить 2 байта.> <> ,
524239 байтЭтот тип вопросов является одним из немногих типов, с которыми> <> довольно удобно, так как нам нужно иметь дело только с одним символом за раз.
объяснение
Не потеряйся! Здесь много обёрток.
Предыдущее решение, 42 байта
Интересно то, что, несмотря на то, что они имеют одинаковую функциональность, альтернатива
(Изменение в стрелках и зеркалах справа)
фактически дает неверные результаты, потому что интерпретатор> <> использует defaultdict Python. В результате, проходя через пустое пространство в конце второй строки, 0 неявно помещаются в пустые пространства, когда> <> пытается получить доступ к ячейке. Это затем портит
?
условный батут в начале той же строки, так как вновь помещенные 0 пропускаются, а неv
в конце.источник
Haskell, 52 байта
Использование:
(and.(zipWith(>)=<<tail).map toLower) "abcd"
какие выходыTrue
.источник
C,
67 65 5754 (52) символовнемного короче:
и еще короче
Вот небольшой тест: http://ideone.com/ZHd0xl
После последних предложений вот еще две более короткие версии:
Также этот код опирается на тот факт, что строчные и прописные буквы ASCII отличаются только 5-м битом (32), который я отфильтрую. Так что это может не работать с другими кодировками, очевидно.
РЕДАКТИРОВАТЬ: последняя версия всегда устанавливает 5-й бит, как
|32
короче, чем&~32
.источник
for(;(*s&=95)>d;d=*s++);
. И вы можетеd
выполнить инициализацию1
без изменения результата, сохранив еще 1. Видеть.d;f(char*s){d=32;for...}
работает,d
неявно объявляя его как глобальный int (что в GCC является предупреждением - «определение данных не имеет типа или класса хранения», но не является ошибкой). Это экономит два байта.d
вfor
цикле, а не в собственном операторе? Таким образом, вы сохраните;
.Руби, 33
Проверяет, совпадают ли отсортированные уникальные символы со всеми символами.
источник
c==c.sort|c
Javascript (ES5), 101
Улучшено до 87 с помощью edc95:
одобряю его комментарий :)
Кстати, контрольные примеры, которые в настоящее время находятся в OP, выполняются, если программа проверяет только уникальность, игнорируя порядок.
Я пока не могу писать комментарии, поэтому отвечу на некоторые замечания здесь:
@ edc65: Спасибо! Я попытался переписать его с помощью
some()
, но я не мог получить более короткое решение, потому что несмотря на то , похоже , это дало бы мне возможность избавиться от superflous переменной б, вам нужно ввести «возвращение» в два раза ( то же самое сreduce()
), и вы не может просто вернуть результат сравнения напрямую, потому что последний символ необходимо сохранить после сравнения с ним.@ edc65: Хорошо использовать оператор запятой для 87! Я отредактировал его в своем ответе для большей наглядности.
источник
return
и,!b
чтобы сохранить символ.function i(s){b=0;l='';s.toUpperCase().split('').forEach(function(c){if(c<=l)b=1;l=c});return!b}
function i(s){s.toUpperCase(b=0).split(l='').forEach(function(c){if(c<=l)b=1;l=c});return!b}
function i(s){return!s.toUpperCase().split(l='').some(function(c){return(u=l,l=c)<=u})}
Haskell, 90 байт
Поставляет функцию
f :: String -> Bool
Использование (при условии, что оно сохраняется как golf.hs).
...
используется для заменыghci
подробных загрузочных сообщений.Если у кого-то есть
lowercase
метод короче,import Distribution.Simple.Utils
пожалуйста, прокомментируйте.источник
map toLower
сData.Char
вместоlowercase
l
вf
, т. Е.f=g.lowercase
(Или,f=g.map toLower
если вы переключитесь наtoLower
). Вg
одно сравнение достаточно:g l=nub(sort l)==l
.Wolfram Mathematica,
4937 байтPS Более короткое решение от Мартина Бюттнера:
источник
#⋃#==#&@*Characters@*ToLowerCase
J, 17 байт
Проверяет,
/:~
совпадает ли отсортированная строчная строка-:
со строчной строчкой~.
.Так как в J длинная «строка» из 1 символа, представленная в виде обычной строки (с кавычками), является просто символьным атомом, а не реальной строкой, я соответствующим образом отформатировал ввод, чтобы весь ввод был реальным. (В приведенном выше примере я использовал
1$'a'
.)источник
MATLAB,
2927 байтТеперь для одного лайнера, который даже имеет смысл вне код-гольфа.
Как анонимная функция (использовать как
o('yourstring')
)Я предполагаю, что эта функция довольно понятна, так как она читается как реклама в газете.
Предыдущая версия (29 байт):
Ввод должен быть представлен между'
отметками, например'Potato'
.источник
Брахилог , 3 байта
Попробуйте онлайн!
Предикат успешно выполняется, если входные данные соответствуют изложенным требованиям, и не выполняется, если он не выполняется, печатается
true.
илиfalse.
запускается как программа.Первая версия, которую я придумал, явно не ссылаясь на алфавит:
Брахилог , 4 байта
Попробуйте онлайн!
источник
J, 21 символов
Это слишком долго. Аргумент должен иметь ранг
1
, то есть он должен быть строкой или вектором.tolower y
-y
в нижнем регистре./:~ y
-y
в лексическом порядке.~. y
-y
то естьy
с удаленными дубликатами.x ; y
-x
иy
положить в коробки, а затем соединены.< y
-y
положить в коробку.x = y
-x
по сравнению с поэлементноy
.(< y) = (~. y) ; (/:~ y)
- вектор, указывающий,y
равен ли его кусок и сам отсортирован.*/ y
- произведение предметовy
или его логика, и если предметы логические.*/ (< y) = (~. y) ; (/:~ y)
- логическое значение, указывающее желаемое свойство в нижнем регистреy
.источник
Юлия, 44 байта
Это создает анонимную функцию, которая принимает один аргумент
s
, преобразует его в нижний регистр и сравнивает с уникальной отсортированной версией строки. Возвращает логическое значение, т.е.true
false
. Или . Если вы хотите проверить это, назначьте его как,f=s->...
а затем позвонитеf("PuZ")
и т. Д.источник
Pure Bash 4.x, 37
Ввод принимается как параметр командной строки. Согласно стандартной семантике оболочки, код выхода 0 означает истину (буквенный), а код выхода! = 0 означает ложь (не буквенный).
Printf создает регулярное выражение как в решении @ hsl . Входная строка раскрывается в нижний регистр и сравнивается с регулярным выражением.
Предыдущий ответ:
Баш + кореутилс, 52
Простое решение:
источник
C # 6, 18 +
8276 = 94 байтаТребуется (18 байт):
Код (76 байт):
C # 6 поддерживает лямбда-выражения для определения функции, которая полезна для игры в гольф.
Версия без C # 6:
Ungolfed код:
источник
JavaScript (ES6) 54
Преобразовать в верхний регистр, затем в массив и сортировку. Если во время сортировки два элемента находятся в неправильном порядке или равны, верните 0 (ложно), иначе 1 (верно)
Редактировать Укороченный ТНХ к @Optimizer (но все еще больше , чем решение @Tamas реализованного в ES6 2:
F=s=>[...s.toUpperCase()].every(c=>(u=l,l=c)>u,l='')
)Тест в консоли Firefox / FireBug
источник
s=
Вроде не требуется ...C (44 байта)
f(char*s){return(*s&=95)?f(s+1)>*s?*s:0:96;}
Проверьте это здесь: http://ideone.com/q1LL3E
Отправляя это, потому что я пока не могу комментировать, в противном случае было бы предложение улучшить существующий C-ответ, потому что я полностью украл нечувствительную к регистру идею из существующего C-ответа.
Возвращает 0, если строка не упорядочена, и ненулевое значение, если упорядочено.
источник
Голанг (65 байт)
Го - это не дружелюбный язык для гольфа, я тоже сосу в гольф ...
Запустите его здесь: http://play.golang.org/p/xXJX8GjDvr
редактировать 106-> 102
редактировать 102-> 96
редактировать 96-> 91
редактировать 91-> 87
редактировать 87-> 65
Я бью Java-версию, я могу остановиться на сегодня
источник
Java 8 -
90898785 символовИдея здесь состоит в том, чтобы использовать функцию «уменьшить», которая отслеживает последний символ и «сдается», когда обнаруживает, что последовательность не является строго восходящей.
golfed:
ungolfed:
пример:
выход:
источник
Perl 6, 35 байт
Это производит вызываемый блок; если бы я мог предположить, что
$_
уже установлено желаемое слово, я мог бы удалить окружающие фигурные скобки и потерять еще два байта, но, вероятно, единственный разумный способ сделать это предположение состоял бы в том, чтобы запустить его-n
и передать слово в качестве стандартного ввода. , который добавил бы два байта назад.источник
.uc.comb
ничего не переставляет, поэтому, если массив в верхнем и гребенном регистре равен отсортированному массиву в верхнем и гребенном, это означает, что он начинался в отсортированном порядке.R , 37 байт
Попробуйте онлайн!
Регистрация, поскольку это существенно отличается и короче, чем ответ Михала R .
Преобразует буквы в кодовые точки ASCII с помощью
utf8ToInt
, а затем принимает модуль 32, чтобы нижние и верхние буквы были преобразованы в одинаковые числа 1 ... 26. Вычисляет попарные разности и проверяет, все ли они положительны.источник
Perl, 27
регулярное выражение @ hsl.
Также мы можем выполнить обратное сопоставление: преобразовать входные данные в регулярное выражение:
PuZ
=>,.*p.*u.*z.*
а затем сопоставить его со строкой букв в алфавитном порядке. Результат - тоже 27 символов.источник
к (6 байт)
&
возвращает true, если оба аргумента верны/
модифицирует,&
чтобы применить "поверх" списка, как сгиб в функциональных языках>
больше чем':
модифицируется,>
чтобы применять «каждый-предшествующий», поэтому возвращает вектор логических значений, указывающих, какие элементы больше, чем их предшественник_
аргумент в нижнем регистре(
0b
означает логическое значение false)q (13 байт)
д просто синтаксический сахар на к.
all
определяется как&/
, а ниже_
источник
Python, 50 байт
Попробуйте онлайн здесь: http://repl.it/c5Y/2
источник
VBA (161 байт)
Сравнивает значение ascii с предыдущей буквой в нижнем регистре, возвращает 0 (false), если его значение меньше / равно, и завершает работу
источник
Python 2 , 43 байта
Попробуйте онлайн!
Помещает
<
символы между всеми буквами (преобразуются в нижний регистр) и затемeval
отображает их. Цепные операторы сравнения Python с радостью оценивают все это как одно большое логическое выражение.источник
Эрланг, 51
Использует упорядоченный набор (аналогично
java.util.TreeSet
) для сортировки символов и удаления любых дубликатов. Затем новый список сравнивается со строкой ввода.Тестовая функция:
источник
Ява, 96
Довольно просто здесь. Просто конвертируйте все в нижние и сравните каждый с предыдущим символом.
источник