Учитывая непустую строку, состоящую только из строчных и заглавных буквенных символов и пробелов ( [a-zA-Z ]
), уменьшите ее до фрагмента алфавита, начиная с первого символа.
Чтобы уменьшить строку, начните с первого алфавитного символа, затем удалите каждый символ после него, который не является следующей буквой алфавита. Продолжайте делать это, пока не дойдете до конца строки.
Например codegolf
:
Начните с c
удаления, o
поскольку это не следующая буква алфавита.
Продолжайте , d
как это является следующей буквой алфавита, и сохранить , e
как это следующая буква тоже.
Удалить g
, o
и l
, и сохранить f
.
Ваш последний фрагмент будет тогда cdef
правила
- Капитализация должна быть сохранена, поэтому
CodEgolF
приведет кCdEF
- Пробел не является буквой алфавита, и поэтому всегда должен быть удален, даже если это начало строки
- Из-за характера сокращения первый алфавитный символ ввода всегда будет первым символом вывода.
zZ
это последняя буква алфавита. После него букв нет, алфавит не зацикливается.
Тестовые случаи
codegolf -> cdef
CodEgolf -> CdEf
codeolfg -> cdefg
ProgrammingPuzzles -> P
Stack Exchange -> St
The quick red fox jumped over the lazy brown dog -> Tuvw
Zebra -> Z
Abcdegfhijkl -> Abcdef
счет
Это код-гольф , поэтому выигрывает меньшее количество байтов на каждом языке !
z
мы просто остановимся, верно?<space>codegolf
Ответы:
JavaScript (ES6),
66796867 байтКак?
Тестирование последовательных писем
Поскольку преобразование двух символов в их ASCII-коды было бы довольно длительной операцией в JS, вместо этого мы используем следующую формулу:
При условии, что оба a и b находятся в
[a-zA-Z ]
, приведенное выше выражение равно,0
если и только если a и b являются последовательными буквами (то есть последовательными цифрами в базе 36), независимо от регистра символов.Например:
Отформатировано и прокомментировано
Контрольные примеры
Показать фрагмент кода
источник
Python 2 , 69 байт
Попробуйте онлайн!
Простое сокращение строки. Мы просто объединяем следующий символ тогда и только тогда, когда
(ord(y)-ord(x[~0]))%32==1
. Очень некрасивая проверка - я уверен, что это можно улучшить, но я не уверен, как!источник
from functools import*
.import functools as f
иf.
намного дольше, чемfrom functools import*
наверняка, даже используется один раз. Смотрите эту тему для получения дополнительной информации.Python 3 ,
75 85 84 91 81 7775 байтовЯ думаю, что это настолько короткий, насколько это возможно в Python 3 . Это может быть сокращено на несколько байтов в Python 2, как показано в представлении Сизифа .
Попробуйте онлайн!
источник
05AB1E , 13 байтов
Попробуйте онлайн!
-1 спасибо Аднану
источник
ðK
наá
?Брахилог , 15 байт
Попробуйте онлайн!
Это было бы 10 байт:
⊇.ḷ~sẠ&h~h
если бы не было довольно неинтересного ограничения «строки могут начинаться с пробелов».объяснение
Поскольку это довольно декларативно, это также очень медленно.
источник
MATL ,
181615 байтСпасибо Mr.Xcoder за указание на ошибку, теперь исправлена
Буквы в выводе разделены переводом строки.
Попробуйте онлайн! Или проверьте все контрольные примеры (код нижнего колонтитула отображает все выходные буквы в одной строке для ясности).
объяснение
источник
Java (OpenJDK 8) ,
10210174 байтаПопробуйте онлайн!
-27 байт благодаря @Olivier Grégoire
источник
s->{char c=0;for(char x:s)if(c<33&x>33|~-x%32==c%32)System.out.print(c=x);}
(сchar[]
вводом).C # (Mono) ,
129107939187 байтовСохранено 2 байта благодаря @Mr. Xcoder.
Сохранено 4 байта благодаря @jkelm.
Попробуйте онлайн!
источник
(c-1)%32
это~-c%32
PHP, 64 + 1 байт
Запустите как трубу с
-nR
или попробуйте онлайн .Помимо обычных трюков: Когда
$c
достигаетZ
,++$c
приводитAA
,и
&__
держится , что длина нетронутым; так$n
больше не будет совпадать$c
.источник
Pyth ,
23 22 2120 байт-1 байт косвенно благодаря трюку @Erik the Outgolfer (
-Qd
) .-1 байт благодаря @Erik Outgolfer.
Попробуй это здесь.
источник
Haskell,
106 10597 байтЯ пытался использовать
fromEnum
+ char арифметику вместо импортаData.Char
, но это оказалось длиннее ...Сохранено 8 байтов благодаря H.PWiz!
Попробуйте онлайн.
источник
filter
Data.List
Pyth,
212018 байтПопробуй это здесь.
Более эффективная 20-байтовая версия:
Попробуй это здесь.
-1 спасибо мистеру Xcoder (косвенно).
источник
.U+b?tlrreb1rZ1kZrz6
(я думаю). Этот трюк помог мне, хотя..U+b?tlrreb1rZ1kZr6
но, к сожалению, этоr <str> 6
означаетA.strip()
, что я не удаляю пробелы без начальных и конечных символов .32
, тогда как все буквы имеют> 64
, и, следовательно, не влияет на функциональность. Я думаю, что это относится и к вашему ответу.Perl 6 , 51 байт
Попробуй это
Expanded:
Обратите внимание, что
<!before …>
утверждение нулевой шириныисточник
Желе , 17 байт
Попробуйте онлайн!
источник
Japt ,
181716 байтовСохранено 1 байт благодаря @Shaggy
Проверьте это онлайн!
Думал, что это будет немного короче, но ... Такова жизнь ...
объяснение
источник
rS
наx
.C # (.NET Core) ,
7060 + 18 байт-10 байт благодаря TheLethalCoder
Количество байтов также включает в себя:
Попробуйте онлайн!
На 1 байт длиннее
(в настоящее время)(не больше), чем в TheLethalCoder, поэтому публикация ради интереса. Другой подход, с LINQ.Это позволяет использовать две C-подобные функции в C # - символьная
char
переменная неявно ведет себя так же, как целое числоint
, и логический оператор AND&&
не выполняет правую операцию, если left возвращает afalse
. Объяснение кода:источник
.ToArray()
, возвращая какIEnumerable<char>
для сохранения байтов.q / kdb +,
4745 байтРешение:
Примеры:
Объяснение:
Используя
mod 32
трюк из существующих решений вместе с функцией сходятся . Выполните итерацию по строке, если разница между последним элементом результата (например, начинается сT
«Быстрая красная лиса ...») и текущим символом равна 1 (после того, какmod
'd с 32), то мы добавим это к результат (следовательно, принимая, почему мы беремlast x
), затем приведем все обратно к строке.источник
Perl 5 , 30 + 1 (-n) = 31 байт
Попробуйте онлайн!
Как?
источник
Сетчатка , 76 байт
Попробуйте онлайн!Ссылка включает в себя тестовые случаи. Объяснение:
Удалить пробелы.
Тройной первый символ и вставьте разделитель.
Преобразуйте второй и третий символы в нижний регистр и увеличивайте их. Преобразовать последний в верхний регистр. Теперь это поисковые символы.
Попробуйте сопоставить любой из символов поиска. Если найдено, то дублируйте совпадение, что перезапускает цикл для следующего поиска. В противном случае просто удалите символы поиска и оставшуюся часть ввода.
источник
восьмых , 114 байт
Код
объяснение
пример
источник
C (gcc) ,
79787570 байтПопробуйте онлайн!
источник
Протон , 59 байт
Порт Питона 2 представления .
Попробуйте онлайн!
источник
Pyth, 15 байт
Тестирование
В отличие от всех других ответов, это не склеивает вывод, он генерирует все подпоследовательности ввода, а затем приказывает им поместить желаемую строку в конец и выводит ее.
источник
J, частичное решение
Я публикую это для обратной связи и идей для улучшения больше всего на свете. Это работает, но не обрабатывает случаи с заглавными буквами и пробелами, и уже давно для J.
Сначала диадический вспомогательный глагол, который говорит вам, что левый и правый аргументы расположены в алфавитном порядке:
Далее глагол, который удаляет первый элемент, который не является частью буквенной полосы, начиная с первого элемента:
Обратите внимание, что мы используем неблагоприятные
::
чтобы вернуть весь аргумент без изменений, если не найден нестрочный элемент (т. Е. Если весь аргумент является допустимой буквенной строкой).Наконец, решение дается путем применения
f
до сходимости:Попробуйте онлайн!
А вот разобранная версия
f
для удобства чтения:Дополнительный вопрос : почему символы ячеек не выровнены идеально при отображении на SO (они работают в моей консоли):
источник