Мне пришла в голову спонтанная идея сделать серию испытаний для пользователей, которые помогали и продолжают помогать сообществу PPCG быть приятным местом для всех или, может быть, специально для меня. :П
Если вы преобразуете имя Денниса в массив 1
s и 0
s, где каждый согласный 1
и каждая гласная - 0
это массив [1, 0, 1, 1, 0, 1]
, который является симметричным. Таким образом, ваша задача состоит в том, чтобы определить, какие другие имена похожи на это.
Вызов
По заданной строке ASCII удалите все символы, которые не являются буквами, и определите, симметрична ли конфигурация гласных и согласных. y
это не гласная
Обратите внимание, что ваша программа не обязательно должна быть самой строкой этого типа.
Тестовые случаи
Dennis -> truthy
Martin -> truthy
Martin Ender -> truthy
Alex -> falsy
Alex A. -> truthy
Doorknob -> falsy
Mego -> falsy
Реализация эталона
Этот код Python 3 даст правильный вывод, учитывая тестовый пример. Это настолько безвкусно, насколько я мог бы сделать это, не будучи смешным.
Python 3
s = input()
l = []
for c in s:
if c in 'AEIOUaeiou':
l.append(0)
elif c in 'BCDFGHJKLMNPQRSTVWXYZbcdfghjklmnpqrstvwxyz':
l.append(1)
print(l == list(reversed(l)), end = '')
источник
Ответы:
05AB1E , 9 байтов
Попробуйте онлайн!
-2 спасибо Аднану .
Это точно атакует болевую точку Желе. Он использует
l
иA
1-байтовые эквиваленты для Jelly'sŒl
иØa
соответственно.источник
AÃ
наá
иDR
наÂ
.á
, не знал, чтоÂ
делает, спасибо!00
дляFF
тем 256 символов, увидеть Jelly ответаЖеле , 11 байт
Попробуйте онлайн!
Альтернативные версии:
Конечно, задача, оценивающая Дениса, должна иметь ответ на его языке.
источник
32-разрядная функция машинного кода x86,
4241 байтВ настоящее время самый короткий ответ на языке без игры в гольф, на 1В короче, чем у @ Streetter's q / kdb + .
С 0 для правдивых и ненулевых для ложных:
4140 байт. (в общем случае сохраняет 1 байт для 32-разрядных, 2 байта для 64-разрядных).Со строками неявной длины (в стиле C в стиле 0):
4544 байтаМашинный код x86-64 (с 32-битными указателями, как x32 ABI):
4443 байта .x86-64 со строками неявной длины, по-прежнему 46 байтов (стратегия битовых карт shift / mask теперь безубыточна).
Это функция C подписи
_Bool dennis_like(size_t ecx, const char *esi)
. Соглашение о вызовах немного нестандартно, близко к MS vectorcall / fastcall, но с другими регистрами arg: строка в ESI и длина в ECX. Это только забивает его arg-regs и EDX. AL содержит возвращаемое значение, а старшие байты содержат мусор (как это разрешено ABI SysV x86 и x32. IDK, что ABI MS говорят о высоком мусоре при возврате bool или узких целых чисел.)Объяснение алгоритма :
Зацикливание входной строки, фильтрация и классификация в логический массив в стеке: для каждого байта проверьте, является ли он буквенным символом (если нет, переходите к следующему символу), и преобразуйте его в целое число от 0-25 (AZ) , Используйте это 0-25 целое число, чтобы проверить битовую карту vowel = 0 / consonant = 1. (Растровое изображение загружается в регистр как 32-битная непосредственная константа). Вставьте 0 или 0xFF в стек в соответствии с результатом растрового изображения (фактически в младшем байте 32-битного элемента, который может содержать мусор в верхних 3 байтах).
Первый цикл создает массив 0 или 0xFF (в элементах dword, заполненных мусором). Выполните обычную проверку палиндрома со вторым циклом, который останавливается, когда указатели пересекаются в середине (или когда они оба указывают на один и тот же элемент, если было нечетное количество буквенных символов). Восходящий указатель является указателем стека, и мы используем POP для загрузки + приращения. Вместо сравнения / setcc в этом цикле мы можем просто использовать XOR для определения того же / другого, поскольку существует только два возможных значения. Мы могли бы накапливать (с помощью ИЛИ), нашли ли мы какие-либо несоответствующие элементы, но ранняя ветвь на флагах, установленных XOR, по крайней мере, так же хороша.
Обратите внимание, что второй цикл использует
byte
размер операнда, поэтому ему все равно, какой мусор первый цикл оставляет вне младшего байта каждого элемента массива.Он использует недокументированную
salc
инструкцию для установки AL из CF таким же образом, как этоsbb al,al
было бы. Он поддерживается на любом процессоре Intel (кроме 64-битного режима), даже в Knight's Landing! Agner Fog перечисляет время для этого на всех процессорах AMD (включая Ryzen), поэтому, если производители x86 настаивают на том, чтобы связать этот байт пространства кода операции с 8086 года, мы могли бы также воспользоваться этим.Интересные трюки:
bt
, вдохновленное некоторыми хорошими выходными данными компилятора дляswitch
.stosb
.cmp
/salc
не вариант, потому чтоsalc
работает только для CF, а 0xFF-0 не устанавливает CF.sete
составляет 3 байта, но позволит избежатьinc
внешнего цикла, за чистую стоимость 2 байта (1 в 64-битном режиме )) против xor в цикле и исправления с помощью inc.Вероятно, это также один из самых быстрых ответов, поскольку ни один из вариантов игры в гольф не причиняет слишком большого вреда, по крайней мере, для строк длиной до нескольких тысяч символов, когда использование памяти в 4 раза не приводит к большим потерям кэша. (Это также может привести к тому, что ответы, в которых раньше не было строк, подобных Деннису, перед циклическим перебором по всем символам, имеют ранний выход.) Это
salc
происходит медленнее, чемsetcc
на многих процессорах (например, 3 мопа против 1 на Skylake), но проверка битовой карты сbt/salc
все еще быстрее, чем поиск строки или регулярное выражение. И нет никаких накладных расходов на запуск, поэтому это очень дешево для коротких строк.Выполнение этого за один проход на лету означало бы повторение классификационного кода для направлений вверх и вниз. Это было бы быстрее, но с большим размером кода. (Конечно, если вы хотите быстро, вы можете сделать 16 или 32 символа одновременно с SSE2 или AVX2, все еще используя трюк сравнения, сдвигая диапазон к нижней части подписанного диапазона).
Тестовая программа (для ia32 или x32 Linux) для вызова этой функции с помощью аргумента cmdline и выхода из состояния = возвращаемое значение.
strlen
реализация от int80h.org .64-битная версия этой функции может использовать
sbb eax,eax
, что составляет всего 2 байта вместо 3 дляsetc al
. Это также потребовало бы дополнительного байта дляdec
илиnot
в конце (потому что только 32-битный имеет 1 байт inc / dec r32). Используя x32 ABI (32-битные указатели в длинном режиме), мы все еще можем избежать префиксов REX, даже если мы копируем и сравниваем указатели.setc [rdi]
Можно записывать напрямую в память, но резервирование байтов стека в ECX стоит больше кода, чем экономит. (И нам нужно перемещаться по выходному массиву.[rdi+rcx]
Для режима адресации требуется один дополнительный байт, но на самом деле нам нужен счетчик, который не обновляется для отфильтрованных символов, поэтому он будет хуже, чем этот.)Это источник YASM / NASM с
%if
условными обозначениями . Он может быть построен с-felf32
(32-битным кодом) или-felfx32
(64-битным кодом с x32 ABI) и с неявной или явной длиной . Я протестировал все 4 версии. Смотрите этот ответ для скрипта для создания статического двоичного файла из источника NASM / YASM.Чтобы протестировать 64-битную версию на машине без поддержки ABI x32, вы можете изменить регистры указателя на 64-битные. (Затем просто вычтите количество префиксов REX.W = 1 (0x48 байт) из числа. В этом случае 4 инструкции нуждаются в префиксах REX для работы с 64-битными регистрами). Или просто вызовите его с
rsp
помощью указателя и в низком 4G адресного пространства.Я смотрел на возни с DF (флаг направления, который контролирует
lodsd
/scasd
и так далее), но это просто не было победой. Обычные ABI требуют, чтобы DF очищался при входе и выходе из функции. Предполагая, что очищено при входе, но оставлено на выходе, это будет обманом, IMO. Было бы неплохо использовать LODSD / SCASD, чтобы избежать 3-х байтовsub esi, 4
, особенно в случае, когда нет высокого мусора.Альтернативная растровая стратегия (для строк неявной длины x86-64)
Оказывается, это не спасает байты, потому что
bt r32,r32
все еще работает с большим количеством мусора в битовом индексе. Это просто не задокументировано так, какshr
есть.Вместо того
bt / sbb
чтобы вводить бит в / из CF, используйте shift / mask, чтобы выделить нужный бит из битовой карты.Так как это производит 0/1 в AL в конце (вместо 0 / 0xFF), мы можем сделать необходимое инвертирование возвращаемого значения в конце функции с помощью
xor al, 1
(2B) вместоdec eax
(также 2B в x86-64) для по-прежнему производят правильноеbool
/_Bool
возвращаемое значение.Это использовалось для сохранения 1B для x86-64 со строками неявной длины, избегая необходимости обнулять старшие байты EAX. (Я использовал
and eax, 0x7F ^ 0x20
для преобразования в верхний регистр и обнуления оставшуюся часть eax с помощью 3-байтового кодаand r32,imm8
. Но теперь я использую 2-байтовую кодировку немедленного с AL, которую имеет большинство инструкций 8086, как я уже делал дляsub
иcmp
.)Он проигрывает в
bt
/salc
в 32-битном режиме, и для строк с явной длиной требуется ECX для подсчета, поэтому это тоже не работает.Но потом я понял, что был неправ:
bt edx, eax
все еще работает с большим мусором в EAX. Это , по- видимому маскирует сдвиг рассчитывать так же , какshr r32, cl
делает ( если смотреть только на низких 5 битов ХЛ). Это отличается от тогоbt [mem], reg
, к которому можно обращаться за пределами памяти, на которую ссылается режим / размер адресации, рассматривая ее как цепочку битов. (Сумасшедший CISC ...)Руководство Intel по установке insn set не документирует маскировку, поэтому, возможно, это недокументированное поведение, которое Intel сохраняет на данный момент. (Подобные вещи не редкость.
bsf dst, src
С src = 0 всегда оставляет dst неизмененным, даже если в этом случае задокументировано, что dst содержит неопределенное значение. AMD фактически документирует поведение src = 0.) Я тестировал на Skylake и Core2, иbt
версия работает с ненулевым мусором в EAX за пределами AL.Опрятный трюк здесь использует
xchg eax,ecx
(1 байт), чтобы получить счетчик в CL. К сожалению, BMI2shrx eax, edx, eax
составляет 5 байтов, по сравнению только с 2 байтами дляshr eax, cl
. Для использованияbextr
требуется 2 байтаmov ah,1
(для количества битов для извлечения), так что это опять 5 + 2 байта, как SHRX + AND.Исходный код стал довольно грязным после добавления
%if
условных выражений . Вот разборка строк неявной длины x32 (с использованием альтернативной стратегии для растрового изображения, так что это все еще 46 байтов).Основное отличие от версии с явной длиной в первом цикле. Обратите внимание на то, как есть
lods
перед ним и внизу, вместо одного в верхней части цикла.источник
Сетчатка ,
49 4745 байтПопробуйте онлайн!
Сохранено 2 байта благодаря Нейлу.
Сохранено еще 2 байта благодаря Мартину.
Удаляет не-буквы, затем заменяет гласные на 1 и согласные на 2, чтобы получить согласованные значения. Затем несколько раз удаляет первый и последний символ, если они совпадают. Если это не так, слово будет симметричным, если останется один или ноль символов.
источник
\D
2
ты, чтобы сэкономить пару байтовT`lL`2
?PHP, 82 байта
Попробуйте онлайн!
источник
(bool)
и удалите$s=
и==$s
проверьте , чтобы сохранить 1 байт.(bool)
просто0||
сказать false или ... вместо этого, сохранив 3 дополнительных байта.\w
для символов слова вместоa-z
?\w
содержит цифры подчеркивания и буквы. Это не будет работать и[^/p{L}]
дольше, как[^a-z]
плюс я. Я сравниваю обратную строку со строкой, поэтому$s
она необходима для создания логического значенияMATL, 14 байтов
Попробуйте это в MATL Online .
Вот немного измененная версия для проверки всех тестовых случаев.
объяснение
источник
Haskell,
84757469 байт-10 благодаря @nimi
-5 благодаря @Zgarb
Понимание списка заменяет каждую букву логическим и удаляет все остальные символы. Первая часть проверяет, является ли полученный список палиндромом.
Попробуйте онлайн!
источник
filter
следует,map
даже если вам нужно переключиться на не-poitfree. 2)<$>id
лишнее.f x=(==)<*>reverse$[elem c"aeiouAEIOU"|c<-x,c
эль['A'..'Z']++['a'..'z']]
.c
и"
для еще одного байта.c`elem`['A'..'Z']++['a'..'z']
может быть сокращено до'@'<c,c<'{','`'<c||c<'['
Pyth,
1815 байтПопробуй это здесь.
-2 спасибо КарлКастору , а впоследствии -1.
источник
_I/L"aeiou"@Grz0
(с использованием оператора инвариантности I)z
, я приму цитаты ввода)Брахилог , 13 байт
Попробуйте онлайн!
объяснение
источник
Алиса , 28 байт
Попробуйте онлайн!
Выводы
1
как правдивые, а не как ложные.объяснение
Каждая команда в этой программе выполняется в обычном режиме, но с небольшим поворотом в шаблоне, который позволяет мне сохранить байт. Если перевод строки является приемлемым истинным значением, я могу сохранить еще один байт тем же методом.
Линеаризованная программа выглядит следующим образом:
источник
Python 3 ,
7271 байт-1 байт благодаря @ovs
Попробуйте онлайн!
источник
def f(s):s=[c in'AEIOU'for c in s.upper()if'@'<c<'['];return s==s[::-1]
для 71 байтJavaScript (ES6),
7269 байтСохранено 3 байта благодаря Нейлу
Возвращает логическое значение.
Контрольные примеры
Показать фрагмент кода
источник
2
.+''
в конце? Это сэкономит 3 байта вместо этого.Mathematica, 113 байтов
источник
PalindromeQ@StringReplace[#,{Characters@"aeiouAEIOU"->"1",LetterCharacter->"0",_->""}]&
GolfScript , 42 байта
Попробуйте онлайн!
Сложная часть заключается в создании как прописных, так и строчных букв в одной строке, которую мы будем использовать в функции фильтра, чтобы отфильтровать буквы из входных данных. К счастью, поскольку строки в GolfScript - это просто массивы кодовых точек со специальным свойством, поэтому мы можем просто сгенерировать кодовые точки эффективным способом. Вот как мы их генерируем:
Сначала мы генерируем диапазон [0..122], 122 - это кодовая точка для
z
. Затем мы берем элементы от элемента с индексом 65 и далее. 65 является кодовой точкой дляA
. Прямо сейчас у нас есть [65..122]. Все хорошо, за исключением того, что у нас есть некоторые нежелательные кодовые точки ([91..96]) там. Итак, мы сначала делаем дубликат этого диапазона. Затем мы берем элементы начиная с индекса 26 и получаем [91..122]. После этого мы получаем элементы вплоть до индекса 5. Теперь у нас есть [91..96]. Наконец, мы удаляем эти элементы из нашего [65..122], оставляя нас [65..90, 97..122]. Это те кодовые точки, которые мы хотим.Теперь, когда мы создали список кодовых точек верхнего / нижнего алфавита, мы продолжаем нашу функцию фильтрации. Функция отображается на каждый символ входной строки, который, как я изначально сказал, вместо этого анализируется как ее код. Так что теперь у нас по существу есть
[codepoint, [65..90, 97..122]]
. Чтобы выяснить, является ли символcodepoint
буквой, мы просто берем его индекс в нашем списке. Если его там нет, мы-1
вместо этого получим индекс.Прямо сейчас мы получаем значение Falsey только в том случае
codepoint == 65
, если , то есть первый индекс в нашем списке, так как только тогда индекс будет равен 0. Но единственное приращение решит эту проблему, и теперь, если оноcodepoint
есть в нашем списке, мы получить его индекс + 1, который всегда является положительным числом, таким образом, всегда правдивым, а если его нет, мы получим -1 + 1 = 0, т.е.Наконец, мы применяем функцию, которую я описал, к каждому символу ввода, и мы берем только те символы, для которых функция вернула истинный результат.
Затем мы должны определить, является ли каждый символ гласным или согласным. Поскольку гласных меньше, чем согласных, создание строки гласных, так что мы проверяем это условие, короче, чем создание строки согласных, поэтому мы проверяем, является ли каждый символ гласным. Но, чтобы проверить, является ли логический список палиндромным, нам нужны логические значения, которые мы не получим, просто взяв индекс + 1, поскольку это может привести к любому числу [1..10], если char является гласным. И, как большинство языков для игры в гольф, этот также не имеет
bool
функции. Итак, мы просто используемnot not x
, так какnot
всегда возвращает логическое значение. Но ждать; нам действительно нужно иметь конкретные логические значения? Посколькуnot
всегда возвращает логическое значение, почему бы нам просто не удалить второеnot
и на самом деле проверить, является ли каждый символ согласным? Да, именно это мы и сделаем!После проверки, которая возвращает список логических значений, мы проверяем, является ли полученный нами логический список палиндромом, что и требует эта задача. Ну, каково определение палиндрома? Да, палиндром - это список или строка, равная его обратному. Итак, как мы проверяем? Просто, мы дублируем его, берем его обратное и сверяем с оригинальным списком. В итоге мы получаем то , что должен вернуть наш код.
источник
PHP , 87 байт
Regex бесплатная версия PHP. Добавлен "гласный", так как stripos может возвращать 0, что является ложным в PHP.
Ошибка исправлена Йоргом.
Попробуйте онлайн!
источник
for(;a&$c=$argn[$p++];)ctype_alpha($c)?$s.=stripos(_aeiou,$c)?0:1:0;echo$s==strrev($s);
но онq / kdb +,
4238 байтРешение:
Пример:
Объяснение:
Редактирование:
reverse
на эквивалент K|:
источник
CJam , 26 байт
Попробуйте онлайн!
-1 спасибо Esolanging Fruit .
источник
26,'af+
на,'{,97>
чтобы сохранить байт.Braingolf,
43 байта-1 байт благодаря Эрику Аутгольферу
Оказывается, у меня было
P
все время, даже до этого вызова.J
однако, несмотря на то, что он был создан до этого испытания, он не был передан github перед вызовом, поэтому все еще не конкурирует.Объяснение:
источник
n
?Alex A.
?Python 2, 83 байта
Определяет функцию, которая дает
True
илиFalse
источник
"aeiouAEIOU".__contains__
вместоlambda y:y.lower()in"aeiou"
.CJam , 79 байтов
Первый таймер! (Я сделал что мог)
Попробуйте онлайн!
источник
Питон 3 ,
928774726968 байтПопробуйте онлайн!
источник
for c in s
s
переменную, заменивs
во второй строке наinput().lower()
Рубин, 57 байт
Попробуйте онлайн!
источник
Баш , 82 байта
Попробуйте онлайн!
Получает имя в качестве параметра, удаляет не-буквы, заменяет гласные на 0, не гласные и не 0 на 1 и сравнивает с тем же обратным.
Могли бы еще поиграть в гольф, если можете приступить к работе двойной или тройной замены
Состояние выхода 0 для истины и 1 для нет.
источник
i=${i^^*};
преобразуетсяi
в верхний регистр. Но я думаю, что это только спасает васa-z
и анaeiou
, что меньше, чем 10B, это стоит.Japt v2.0a0,
1911 байтПопробуйте онлайн
объяснение
источник
APL (Dyalog) ,
3433 байтаПопробуйте онлайн!
Гольф в прогрессе.
источник
819⌶⍨∘1
(⊢≡⌽)
PowerShell, 108 байт
источник
Аксиома, 126 байт
контрольная работа
источник
Пайк, 12 байт
Попробуй это здесь!
источник
PowerShell, 87 байт
Получить копию строки, где гласные равны 0, а согласные равны 1, при этом все специальные символы удалены, сравните эту строку с обращенной версией, присоединенной к строке
Выход:
источник
Сетчатка , 47 байт
Попробуйте онлайн!
Это просто другой подход для не алфавитных символов
источник