(Примечание: это ответвление моего предыдущего задания « Найди закрученные слова!» )
Определение Бесконечного Слова :
- Если вы соедините кривыми все символы Слова Бесконечности в алфавите (AZ), вы получите символ бесконечности ∞, как показано на диаграммах ниже.
- Все соединения четных должно быть вниз , все нечетные соединения должны быть вверх .
- Вы можете игнорировать верхний / нижний регистр или рассматривать / конвертировать все в верхний регистр или все в нижний регистр.
- Вводимые слова - это только символы в диапазоне алфавита AZ, без пробелов, знаков пунктуации или символов.
- Каждое слово должно быть ровно 5 символов. Слова> 5 или <5 недействительны.
- Если слово состоит из двух последовательных символов, оно недопустимо, например, «FLOOD» или «QUEEN».
- Все Слова Бесконечности начинаются и заканчиваются одним и тем же символом.
Вот несколько примеров:
Задача:
Напишите полную программу или функцию, которая возьмет слово из стандартного ввода и выведет, если это Слово Бесконечности или нет. Выход может быть true / false, 1/0, 1 / Null и т. Д.
Тестовые случаи:
Infinity Words:
ALPHA, EAGLE, HARSH, NINON, PINUP, RULER, THEFT, WIDOW
NOT Infinity Words:
CUBIC, ERASE, FLUFF, LABEL, MODEM, RADAR, RIVER, SWISS, TRUST,
KNEES, QUEEN, GROOVE, ONLY, CHARACTER, OFF, IT, ORTHO
Правила:
- Самый короткий код выигрывает.
Необязательная задача:
Найдите в списке как можно больше слов бесконечности в словаре английского языка. Вы можете взять, например, в качестве ссылки полный список английских слов здесь .
Ответы:
Желе ,
43 41 40 25 24 23 22 21 1413 байт-7 байт благодаря fireflame241 (
0ị=1ị$
->=ṚḢ
и использованиюIIA⁼2,2
для проверки 4 вращений)-1 Благодаря Кевину Круйссену (использование ранее недоступного nilad,
Ø2
который дает[2,2]
)TryItOnline
или все контрольные примеры (плюс "ПРАВИЛА")
Как?
Слово бесконечности имеет:
Все, кроме (1) и (эквивалентно) (4), могут быть сведены к условию, что дельта-знаки алфавита являются некоторым вращением
[1,1,-1,-1]
(где знак0
является0
)fireflame241 отметил, что тогда это эквивалентно дельтам дельт алфавитных дельта-знаков, в
[[2,2],[2,-2],[-2,2],[-2,-2]]
которых могут быть проверены абсолютные значения, равные[2,2]
!Как?
источник
II
для проверки на равенство вращения 1,1, -1, -1.Ява 8,
23119318512210378 байтПопробуй это здесь.
-38 байт, спасибо @ dpa97 за напоминание о необходимости использовать
char[]
вместоString
.-63 байта благодаря полученной формуле @KarlNapf .
-25 байт путем преобразования его из Java 7 в Java 8 (и теперь возвращает логическое значение вместо целого числа).
Ответ 193 байта:
Объяснение:
false
false
true
если он соответствует любому из них (и вfalse
противном случае):1<2<3>4>5
(т.е.ALPHA
)1>2<3<4>5
(т.е.EAGLE
,HARSH
,NINON
,PINUP
)1<2>3>4<5
(т.е.RULER
)1>2>3<4<5
(то естьTHEFT
,WIDOW
)Эти четыре правила могут быть упрощены
1*3<0 and 2*4<0
(благодаря ответу @KarlNapf на Python 2 ).источник
char[]
качестве ввода вместоString
. -38 байт благодаря вам.z,x
иw,y
должны иметь переменный знак, поэтому достаточно проверить ,z*x<0
иw*y<0
JavaScript (ES6),
918987 байтСохранено 2 байта благодаря Исмаилу Мигелю
Как это работает
Мы создаем 4-битную битовую маску,
k
представляющую 4 перехода между 5 символами строки:NaN
устанавливается так, что слово отбрасывается (в соответствии с правилом № 6)Действительными битовыми масками являются те, которые имеют ровно два последовательных
1
перехода (первый и последний биты также рассматриваются как последовательные ):Другими словами, это комбинации, которые:
k?
: больше 0!(k%3)
: соответствует 0 по модулю 3Другие условия:
!s[5]
: не более 5 символовs[0]==s[4]
: 1-й и 5-й символы идентичныNB : Мы не проверяем явно,
k != 15
потому что любое слово, следующее за таким шаблоном, будет отклонено этим последним условием.Контрольные примеры
Показать фрагмент кода
Первоначальный вариант
Для записи, моя первоначальная версия была 63 байта. Он успешно проходит все тестовые случаи, но не может обнаружить последовательные идентичные символы.
Ниже приведена 53-байтовая версия, предложенная Нилом в комментариях, которая работает (и не работает) одинаково хорошо:
Редактировать: См . Ответ Нейла для фиксированной / завершенной версии приведенного выше кода.
источник
0000
также соответствует 0 по модулю 3, но опять же вы не можете иметь первые и последние буквы одинаковыми, поэтому, подобно 15, вам не нужно явно проверять это.!((a>b)-(b>c)+(c>d)-(d>e))
?p<c?0:NaN
можно записать как0/(p<c)
, что экономит 2 байта.k?
тест из-за возможногоNaN
.) Что касается вашей альтернативной версии: это должно сработать.JavaScript (ES6), 78 байт
Основано на неверном коде @ Arnauld, но исправлено и исправлено. Работает, сначала проверив, что первый символ совпадает с пятым (таким образом гарантируя 5 символов) и что длина строки не более 5. После проверки последовательных повторяющихся символов остается проверить волнообразность строки, который должен иметь один пик и одну впадину с двумя буквами.
Изменить: Альтернативное 78-байтовое решение, основанное на ответе @ KarlNapf:
источник
Код выхода Python 2, 56 байт
Выходы через код выхода: Ошибка для False и успешный запуск для True.
Принимает строку
s
с символамиabcde
, поворачивает ееbcdea
, выполняет поэлементное сравнение соответствующих символов и присваивает их пяти переменнымv,w,x,y,z
. Неправильная длина дает ошибку.Слова бесконечности у всех есть
которые могут быть проверены совместно как
v*x+w*y|z == -2
. Цепочка сравненияv*x+w*y|z>-2>_
цепей замыкается в этом случае, и в противном случае выполняется оценка,-2>_
которая выдает ошибку имени.источник
Python 2,
1108760 байтСохранение 1 байта благодаря Нейлу
Требуется ввод в кавычках, например
'KNEES'
True
если это бесконечное слово,False
если нет, оно имеет длину 5 и печатает сообщение об ошибке, если неправильная длинаВдохновленный ответом xnor используя
map(cmp...
предыдущее решение:
Используя оптимизированную логику Кевина Круйссена
источник
a*c+b*d+2==0==e
?a*c+b*d|e
еще меньше.<-1
может работать, так как оба-2|1
и-2|-1
равны-1
.PHP, 102 байта
источник
Python 2, 71 байт
Берет строку
s
с символамиabcde
, поворачивает ееbcdea
и выполняет поэлементное сравнение соответствующих символов.Результатом является список
-1, 0, 1
. Затем проверяет, является ли результат одной из действительных последовательностей взлетов и падений:как сгенерировано из шаблона
[m,n,-m,-n,0]
сm,n=±1
. Последние0
проверяют, чтобы первая и последняя буквы были равны, а длина гарантирует, что длина входной строки равна 5.Альтернатива 71. Проверяет условия сравнения при обеспечении правильной длины.
источник
R, 144 байта
Ответ основан на логике @Jonathan Allan. Это, вероятно, может быть в гольф, хотя.
Тестовые сценарии R-fiddle (векторизованный пример, но та же логика)
источник
length(s)==5
, вы можете заменитьs[1]==tail(s,1)
наs[1]==s[5]
. Один байт короче метод , чтобы проверить длину являетсяis.na(s[6])
. Вместе эти два изменения возвращаютсяTRUE
дляs
длины 5 точно иFALSE
иначе, какTRUE&NA
есть,NA
ноFALSE&NA
естьFALSE
. Вы также можете сохранить несколько байтов, заменив!sum(sign(d))&any(rle(sign(d))$l>1)
на!sum(a<-sign(d))&any(rle(a)$l>1)
.GNU Prolog, 47 байт
Определяет предикат,
i
который успешно (на самом деле бесконечно много раз) для бесконечного слова, таким образом, выводит «да» при запуске из интерпретатора (как обычно для Пролога); не подходит для слова-кандидата, чьи первая и последняя буквы не совпадают или не имеют длины 5 букв, таким образом, выводя «нет» при запуске из интерпретатора; и вылетает с переполнением стека, если дано слово-кандидат, которое не является словом бесконечности, но состоит из пяти букв с первым и последним совпадением. (Я не уверен почемуон падает; рекурсивный вызов должен восприниматься как ответный вызов. По-видимому, оптимизатор GNU Prolog не очень хорош.) Успех - это эквивалент Пролога для Пролога, а неудачный эквивалент для Falsey; сбой определенно более ложный, чем правдивый, и его исправление сделает решение значительно более длительным, поэтому я надеюсь, что это считается правильным решением.Алгоритм довольно прост (и действительно, программа довольно читабельна); проверьте, составляют ли буквы один из четырех шаблонов, составляющих бесконечное слово, и, если нет, циклически переставьте и попробуйте снова. Нам не нужно явно проверить для двойных букв , как
<
и>
операторы позволяют нам неявно проверить , что в то же самое время , что мы проверяем , что дельты совпадают.источник
На самом деле ,
3827 байтовЭтот ответ был в значительной степени вдохновлен превосходным ответом Джонатана Аллана . Вероятно, есть несколько мест, где можно сыграть в гольф, поэтому предложения по игре в гольф приветствуются! Попробуйте онлайн!
Ungolfing
источник
APL (Dyalog) ,
1615 байтовПопробуйте онлайн!
источник
TI-BASIC, 81 байт
Строка для передачи в программу находится в Ans. Возвращает (и неявно отображает) 1, если введенное слово является Бесконечным Словом, и 0 (или выходит с сообщением об ошибке), если это не так.
Ошибки любых повторяющихся символов или не 5-буквенных слов.
источник
05AB1E , 16 байтов
Порт @JonathanAllan 's Jelly ответа .
Попробуйте онлайн или проверьте все контрольные примеры .
Объяснение:
источник