Этот конкурс окончен.
Победителем стал CJam с 22 персонажами, победивший ответ TwiNight одним персонажем. Поздравляем Дениса !
Похвальная грамота идет Фалько , который сошел с ума от бесплатного импорта.
,
Некоторое время назад я хотел знать, как я могу превзойти современные смартфоны с моей Nokia 3310, и хотя некоторые ответы были действительно хорошими, я все еще не могу идти в ногу! Может быть, я должен использовать другой подход и просто не писать слова, которые неудобно набирать.
Мы назовем фрагмент текста легко набираемым, если на одной клавиатуре телефонной клавиатуры нет двух последовательных букв, учитывая стандартную раскладку:
Твое задание
Ваша задача - написать программу / функцию, которая принимает строку s
из stdin / в качестве параметра и возвращает истинное значение, если s
его легко ввести, и ложное значение в противном случае. Ввод будет состоять только из строчных букв и пробелов и гарантированно будет непустым!
счет
Это Codegolf, поэтому выигрывает меньшее количество символов.
Заявления на импорт не будут засчитаны ваш окончательный счет, так что если вы когда - либо хотели использовать std::set_symmetric_difference
, liftM4
или itertools.combinations
в вашем коде, сейчас самое время!
-3, если ваш исходный код легко набирается, при условии, что все, что не является буквой, находится на кнопке 0. В конце концов, я мог бы хотеть сообщить ваш код некоторым друзьям!
Testcases
Вот несколько тестов, чтобы проверить, работает ли ваш код так, как задумано:
"x" -> True
"aardvark" -> False
"ardvark" -> True
"flonk" -> False
"im codegolfing all day long" -> False
"i indulge in minimizing bytecount" -> True
"havent heard from you in a long time" -> False
"your silence was of undue permanence" -> True
"how are you" -> False
"how are you" -> True
Удачного игры в гольф!
Ответы:
CJam,
34312722 персонажаПопробуйте онлайн.
Пример запуска
Как это работает
Задний план
Суть кода состоит в применении карты F к каждому символу C входной строки, чтобы изображения символов на одном и том же ключе совпадали. Я нашел подходящую карту, наблюдая следующее:
Карта T: C ↦ (C - 'h') + 13 преобразует строку S: = "abcdefghijklmnopqrstuvxyz" следующим образом:
Для ключей 0к 6, было бы достаточно , чтобы разделить T (C) на 3 , но мы должны применить какой - то коррекции к персонажам в ы , т , V , у и г .
Карта D: C ↦ (C - 'h') / 9 преобразует строку S в следующий массив:
Это исправляет коэффициенты s , t , v , y и z , не влияя на другие.
Наконец, карта F: C ↦ (T (C) - D (C)) / 3 преобразует строку S следующим образом:
Осталось только сравнить последовательные символы как-то. Для этого мы XOR F (C) с изображением предыдущего символа - для первого мы XOR F (C) со значением 1 (значение по умолчанию для переменной X ), которое не имеет прообраза, - и умножаем все результаты.
Продукт будет falsy тогда и только тогда , когда один из факторов равен нулю, то есть, если и только если два последовательных символа имеют один и тот же образ на F .
источник
Python 2 -
80, 68, 64, 61, 58, 50, 48, 45, 4442Несмотря на то, что сейчас это немного смешно, я буду продолжать использовать бесплатный импорт библиотеки, даже
__builtin__
библиотеки:Таким образом, только следующая короткая строка учитывает длину кода:
Кредиты Маркуз за идеи относительно
input()
! Эти проблемы бесплатного импорта всегда знакомят вас с некоторыми менее известными библиотеками. ;)Альтернатива с использованием только
operator
библиотеки (98, 83,79):Я остановлюсь здесь. Но вы могли бы в дальнейшем в гольф эту версию , используя
sys
,pprint
и другие библиотеки ...Альтернатива без библиотек (105):
источник
ord(c)
переменную (скажемo
), а затем вычитаяc/112
иc/119
вместо логических значений?lambda
выражениях так легко. В[(o-1-o/112-o/119)/3for o in map(ord,s)]
итоге я снова получаю 80 байтов.from sys import argv as s
помощью,s[1]
вместоinput()
input
из__builtin__
также на самом деле даже лучше: D сохранение еще одного байта.RubyRegex (самые популярные вкусы),10683 байтаПотому что регулярное выражение
Я только что сократил посредника (Ruby) и сделал это решение с использованием регулярных выражений. Работает во многих вариантах и находит совпадение только в том случае, если строка не содержит двух последовательных символов на одной кнопке.
источник
{2}
вне чередования, экономя 22 байта?Bash + coreutils, 49
Возвращает код выхода 1 для TRUE и 0 для FALSE:
источник
perl -pE'y/a-z/aaadddgggjjjmmmpppptttwwww/;$_=!/(.)\1/' <(echo "x")
он печатает 1 для true и ничего для false.aaadddgggjjjmmmpppptttwwww
но я сдался.11122233344455566667778888
сделаем. Основываясь на кодировке 36 первых 19 цифр этого номера, мы можем сохранить 1 символ!АПЛ (Дьялог),
2423объяснение
⍞
: Принимает строковый ввод с экрана⎕AV
: это атомный вектор, который в основном является строкой всех символов, распознаваемых APL, которые, конечно, включают все строчные буквы (индекс 18 ~ 43) и пробел (индекс 5)⍳
:IndexOf
функция. Для многих функций в APL, которые принимают один или два скалярных аргумента, вы можете передать их вместо скалярного массива - APL сделает цикл за вас. Так⍳
возвращает числовой массив индексов..21-.31×
: Времена 0,31, а затем вычесть из 0,21. Это небольшая хитрость, которая отображает буквы на одном и том же ключе (особенно PQRS) на одно и то же число (при округлении до целых чисел), за исключением Z, который отображается в свою собственную группу¯13⌈
:max
с -13. Это возвращает Z обратно в группу с WXY: округлить⌊
до целых чисел2≠/
: Pairwise-≠
. Возвращает логический массив для каждой последовательной пары.∧/
: И вместе все записи результирующего массива.источник
∧/2≠/
(все последовательные пары набираются на разных клавишах) вместо~∨/2=/
(никакие последовательные пары не набираются на одной и той же клавише.) APL FTW !!!Perl - 44
Это в основном Perl-адаптация ответа @ DigitalTrauma, опубликованного с его разрешения. Сбрил 2 символа благодаря @KyleStrand.
43 символа + 1 для
-p
флага.y///
так же, какtr///
. Он печатает1
за правду и ничего за ложь. Я могу опубликовать подробное объяснение, если требуется.Пример выполнения:
Perl - 81
+1 за
-n
флаг. Он работает, используяjoin
для создания регулярного выражения (тот же, что и у Мартина ), которое сбрасывает несколько байтов.Пример выполнения:
источник
a
иz
не оставив транслитерированных?y/b-y/aadddgggjjjmmmpppptttzzz/;$_=!/(.)\1/
Кроме того, это не будет обрабатывать пробелы, не так ли?a
иz
остается прежним. Обновленный ответ!JavaScript -
159156 байтВозвращает 1 для правдивых и 0 для ложных.
Если бы я только мог избавиться от ключевых слов.
источник
function g(s){p=n=-1;for(i=0;i<s.length;i++){p=n;n=s.charCodeAt(i)-97;n>17&&n--;n>23&&n--;if(~p)continue;if(~(p/3)==~(n/3))return 0}return 1}
!=
цикл for на a<
.с, 74 байта
Возвращает ненулевой статус выхода для TRUE и 0 для FALSE:
источник
while
Tofor(;c=~getchar();d=c/3)
и другой байт, изменяя ваш первыйif
к?:
оператору.c=getchar()
требуются, хотя, потому что~
имеет более высокий приоритет, чем=
. Тем не менее, я возьму другие два байта :)exit(d!=c/3);
вместоif(d==c/3)exit(0);
работы?Рубин 1,8,
89838178 байтВот еще одно представление. К моему стыду, это бьет регулярное выражение. :(
Это берет строку через аргумент командной строки и печатает логическое значение.
Что касается алгоритма, я сдвигаю буквы после
p
одного на один и послеz
на две, а затем проверяю, нет ли коллизий после целочисленного деления на 3.PS: Впервые Ruby 1.8 сократил код (из-за более короткого способа получения кодов символов).
источник
Кобра - 80
источник
JavaScript (ES6) 66
74Внутренний цикл поиска группы для каждого символа. Концептуально это «уменьшить», но «карта» короче. Внешний цикл сравнивает группу последовательных символов и выходов с ложным, если они равны.
Тест In Firefox / Консоль Firebug
Выход
источник
.some
вместо каждого. Потому что даже если это не удастся один раз, ответ ложный.some
иevery
взаимозаменяемы, возиться с условиями. Но тут просто поставитьsome
вместоevery
не получится, попробуйте.[...s].every
трюк в моих гольфах :)Perl, 83 байта
Злоупотребление $ _ в Perl.
источник
-e
в Perl, бесплатно.) 71 символов Альтернативы с параметрами командной строки:perl -nlaF -e 'map{$_=ord;$_=($_-$_/112-$_/119-1)/3;die 0 if$l==$_;$l=$_}@F;die 1'
.-l
, но выглядит хорошо!-l
качестве заменыchop
. Но, конечно, вы правы.Две задачи сложны в Python; обнаружение цепочек и назначение групп. И то, и другое можно использовать с помощью numpy, но его нет в стандартной библиотеке.
Python 2 (только стандартная библиотека) - функция 59 символов
Python 2 (только стандартная библиотека) - 53 символа stdin для выхода из значения
Здесь я злоупотребляю тем фактом, что
issubclass(bool,int)
при переходеall()
кany()
действительному значению выхода я сбрасываю егоnot()
с возвращаемого значения. Удаление служебных функций привело к отставанию версий регулярных выражений.источник
J - 42 символа
Функция взятия строки справа.
Сначала мы сопоставляем алфавит (
u:97+i.26
) с номерами от 0 до 25, все остальные символы (включая пробелы) переходят в 26 (i.
). Затем мы сопоставляем ({~
) первые три элемента, которые сопоставляются с первой клавишей, следующие три - со следующей клавишей и т. Д. С помощью клавиш телефонной панели, проверяя соответствие пробела / другой пунктуации отдельной клавише в конце , (4 3 4 1,~5#3
равно3 3 3 3 3 4 3 4 1
иI.
превращает его в массив из 27 элементов, где первые три являются ключом 1 и т. д.) Затем мы проверяем парное неравенство (2~:/\
) и И все результаты вместе (*/
).источник
Ракетка, 119
Ungolfed (комбинаторное регулярное выражение):
источник
JavaScript - 152
Не победитель, но я дал ему шанс. Превосходит @Lozzaaa на 4 байта на момент публикации :)
Проходит все тесты.
Использует отсутствие в JS типизации для создания многотипного массива, а также использует indexOf, возвращающий -1 для поддержки пространства.
Использование:
Предполагается только строчные буквенные символы и пробелы. Возвращает 1 для истины, 0 для ложных.
Может быть, если бы я знал ES6, я мог бы попробовать второй вызов ...
источник
ES6, JavaScript
8970 символовЯ знаю, что это не победитель, потому что когда дело доходит до полезных операций, таких как получение ASCII-значения символа, JS добавляет много bloat (
.charCodeAt()
).Запустите его в веб-консоли последней версии Firefox.
Использование:
Функция возвращает либо true, либо false.
РЕДАКТИРОВАТЬ : много играл в гольф, используя
[...x].every
трюк, извлеченный из @ edc65 (спасибо!)Я постараюсь в гольф это больше :)
источник
GML (Game Maker Language), 149
источник
Python 3 - 152 символа
Не самое короткое, на что я мог пойти, но пока подойдет
источник