Эта строка - буква, делающая колесо?


35

Источником вдохновения было то, что я видел где-то:

Слово "монахиня" - это просто буква n, делающая колесико

Ваша задача состоит в том, чтобы взять строку и определить, является ли это первая буква, делающая колесо.

правила

Строка - это буква, вращающая колесо, если:

  • Первая буква совпадает с последней буквой. (Письмо не может приземлиться на его голову.)
  • Строка чередуется между буквами колесика каждого символа.

Буквы колесика есть nи u, mи w, bи q. Обратите внимание, что nи wвместе они не являются буквами, и не являются wи b.

  • Вы возьмете строку, используя любой из наших стандартных методов ввода.
  • Вы выведете истинное значение, если строка представляет собой букву, и ложное значение, если это не так. Вывод может быть выполнен с использованием любых стандартных методов вывода.

Дополнительные правила:

  • Только строчные буквы колесика n/ u/ m/ w/ b/ qдолжны быть обработаны.
  • Вы можете предположить, что ввод никогда не бывает пустым.
  • Односимвольная строка не является допустимым колесом.

Контрольные примеры

Input        -> Output
nun          -> truthy
nunun        -> truthy
nunununu     -> falsy
wmw          -> truthy
wmwun        -> falsy
bqbqbqbqbqb  -> truthy
v^v^v        -> falsy
AVAVA        -> falsy
OOO          -> falsy
ununununu    -> truthy
nunwmwnun    -> falsy
nun unun     -> falsy
nunwmw       -> falsy
nnuunnuunnuu -> falsy
nwnwnwnwn    -> falsy
m            -> falsy
nunuuunun    -> falsy

победитель

Как и в случае с , выигрывает самый короткий код (на каждом языке)!


29
Я думаю, что bколесики в q, не так ли? dи pтакже приятели колесом. Их ключ в том, что они вращаются, а не переворачиваются.
— Тост инженера

Еще одно предложение для uwuwuwuwuwu
— тестирования

19
Почему bqbнет pdp?
— aschepler

@aschepler Я все испортил.
— MD XF

2
Так dpd, pdp и таких не работает, я думаю , вы должны иметь их в тестовых случаях с falsy ответом.
— 17

Ответы:


2

Желе , 23 байта

Это заняло больше работы, чем можно подумать!

“nmbuwq”iЀo⁵IAs2⁼€3,3Ȧ

Монадическая ссылка, содержащая список символов и возвращающая 1(truey) или 0(falsey).

Попробуйте онлайн! или посмотрите набор тестов .

Как?

Находит индекс каждого символа ввода в 1-индексированном списке символов nmbuwq. Эта строка организована таким образом, что индексы пар разделены на три, поэтому приращением разницы индексов для допустимых колес будет повторение одного из [-3,3]или [3,-3].

Когда элемент не найден в списке с помощью атома «index of» i, он возвращает значение 0, с которым будут сопоставлены необнаруженные символы b, что делает ввод bxbxbправдоподобным. Таким образом, 0s заменяются 10значением более трех от любого другого значения перед проверкой на достоверность.

“nmbuwq”iЀo⁵IAs2⁼€3,3Ȧ - Link: list of characters, s
         Ѐ             - map across c in s:
        i               -   first index of c in (1-indexed; 0 if not present)
“nmbuwq”                -   literal "nmbuwq"
            ⁵           - literal 10
           o            - logical or (vectorises - replace any 0s with 10s)
             I          - incremental differences (i.e. deltas)
              A         - absolute value (vectorises)
               s2       - split into chunks of 2 (possibly with a single remainder)
                   3,3  - pair three with three = [3,3]
                 ⁼€     - equals? for €ach (1 if so, otherwise 0 - including a single 3)
                      Ȧ - any and all? (0 if any 0s or if empty, 1 otherwise)

13

sed 4.2.2 , 30 + 1 -r= 43 31 байт

Сохранено 12 байтов благодаря @Neil за счет сокращения первой строки

/nu|wm|qb/!d
/^((.).)\1*\2$/!d

Попробуйте онлайн!

Удаляет ввод, если false, в противном случае ничего не делает с вводом.

объяснение

С -rфлагом нам не нужно использовать \(и \)для захвата групп и это экономит байты.

/nu|wm|qb/!                # On every line that does not match this regex
           d               # Delete
/^((.).)\1*\2$/!           # On every line that does not math
 ^((.).)                   #  the first two characters at the beginning of the line
        \1*                #  repeated
           \2$             #  with the first character at the end of the line
                d          # Delete

Вот идет sedволшебник ...
— MD XF

@MDXF Я далеко не волшебник, все еще начинающий :)
— Kritixi Lithos

Все в sed выглядит как волшебство для меня. : P
— MD XF

1
Вам нужно только проверить наличие половины пар букв, например, обоих unu и nunсодержать, nuа вторая строка гарантирует, что остальные буквы соответствуют этим двум.
— Нил

8

JavaScript (ES6), 82 78 77 байт

Сохранено 1 байт с использованием двух ложных значений, как предложено ThePirateBay и MD XF.

([c,...s],S='bqwmun')=>s.reduceRight((r,a)=>r&a==S[S.search(c)^++k&1],k=s>'')

Контрольные примеры


Любая причина уйти &&вместо &?

@ThePirateBay Ну, единственная причина - согласованность возвращаемого ложного значения, хотя на самом деле это не является требованием для этой задачи. (Использование &будет производить либо falseили 0.)
— Арно

@Arnauld Вы можете удалить второй &; Я указывал (в чате), что противоречивые ложные значения разрешены.
— MD XF

5

Python 3 , 111 байт

-2 байта благодаря мистеру Xcoder.

lambda s:s[0]==s[-1]and any(any({*s[::2]}=={i[j]}and{*s[1::2]}=={i[j<1]}for j in[0,1])for i in['nu','mw','bq'])

Попробуйте онлайн!


2
вздыхает, когда вы передаете мне в повтор снова
— MD XF

Я не чувствую себя хорошо по этому поводу, так как вы собираетесь снова достичь моего количества байтов, но -2 байта .
— г-н Xcoder

Кстати, ваше решение недействительно, так же, как мое было в начале. Терпит неудачу за nunununu.
— г-н Xcoder

Исправлено за счет большого количества байтов. ; -;
— полностью человек

5

Python 2 , 63 байта

lambda s:s[:3]in'ununqbqbwmwm'and s==s[:2]*max(len(s)/2,1)+s[0]

Попробуйте онлайн!


Хороший ответ, добро пожаловать на сайт! Несколько советов: вы можете "nu un nm mn bp pb".split()сэкономить 4 байта и удалить пробелы. 75 байт:lambda s:any(s==c[-1]+c*max(len(s)/2,1)for c in"nu un nm mn bp pb".split())
— DJMcMayhem

Вы можете сэкономить 1 байт, выполнив s[0]вместо c[-1].
— DJMcMayhem

61-байтовый ответ возвращает True для unmnuи unmwnu. На самом деле он возвращает ложные срабатывания, когда (s==s[::-1])+len(set(s))равен 4, что легко форсировать. Даже только 4 разных персонажа заставляют его возвращать True.
— Арнольд Палмер

59 байтов разбиваются с односимвольными вводами. Извините за выбор на этом, мне нравится Python :)
— Арнольд Палмер

Не являются ли исключения Фэлси? Это перерыв намеренный
— Harrichael

5

Python 3 , 71 байт

lambda n:''.join(sorted({*n[1::2]}|{*n[::2]}))in"nu,mw,bq"*(n==n[::-1])

Попробуйте онлайн!

-1 благодаря @HyperNeutrino и -13 благодаря @ovs

Если вышеописанное не помогло в любом тестовом примере, есть альтернатива:

lambda n:(sorted(list({*n[1::2]}.union({*n[::2]})))in[[*'nu'],[*'mw'],[*'bq']])*n[0]==n[-1]

Попробуйте онлайн!


объяснение

  • ''.join(sorted(list({*n[1::2]}).union({*n[::2]})))) - Получает символы с нечетными индексами и символы с четными индексами, дедуплицирует их и сортирует список, образованный их объединением.

  • in'nu,mw,bq' - Проверяет, являются ли они действительными комбинациями буква-корзина.

  • n[0]==n[-1] - Проверяет, совпадает ли первый символ с последним.


Не проходит ни одного теста, хорошая работа +1
— MD XF

@MDXF О, спасибо! Я так рад, р-н ...> _ <
— Мистер Xcoder

1
uwuwuwuwuwuистинные результаты
— Kritixi Lithos

1
Invalid: nunuuunun
— Harrichael

1
nuuun -> True, Это неправильно.
— рекурсивный

5

JavaScript (ES6), 40 байт

s=>/^(nu|un|bq|qb|wm|mw)+$/.test(s+s[1])

Проверяет, является ли входная строка, соединенная со вторым символом входной строки, повторяющейся строкой из той же пары символов колесика.

тесты:

[
  "nun",
  "nunun",
  "nunununu",
  "wmw",
  "wmwun",
  "bqbqbqbqbqb",
  "v^v^v",
  "AVAVA",
  "OOO",
  "ununununu",
  "nunwmwnun",
  "nun unun",
  "nunwmw",
  "nnuunnuunnuu",
  "nwnwnwnwn",
  "m",
  "nunuuunun"
].forEach( x=>console.log( x, (s=>/^(nu|un|bq|qb|wm|mw)+$/.test(s+s[1]))(x) ) )


Очень нравится логика здесь! Я никогда бы не подумал добавить персонажа в конце и протестировать. Хороший, чистый код тоже, даже когда играешь в гольф.
— 17

4

Clojure, 156 байт

(fn[w](let[s["nu""wm""bq"]c #(= 1(count(set %)))e #(take-nth 2 %)r #(and(c(e %))(c(e(drop 1 %))))](and(=(first w)(last w))(r w)(some #(=(set w)(set %))s))))

Это было обманчиво сложно! В итоге мне пришлось разбить его на 3 подзадачи:

  • Первая буква такая же, как и последняя?
  • Буквы повторяются?
  • Являются ли все буквы частью одного из действительных наборов?

Я конечно не победил, но это было доброе утро! Полное объяснение ниже:

(defn cartwheel? [word]
  (let [; Valid Character Sets
        cs ["nu" "wm" "bq"]

        ; Is the list composed of only a single character?
        count-1? #(= 1 (count (set %)))

        ; Grabs every other element of the list
        every-other #(take-nth 2 %)

        ; Do the characters repeat? Works by checking if every other element is the same, then drops the first letter
        ; to check all the odd indexed characters
        repeating? #(and (count-1? (every-other %))
                         (count-1? (every-other (drop 1 %))))]

    ; Do all the predicates hold?
    (and (= (first word) (last word))
         (repeating? word)
         ; Is the set of letters in the word part of some set of the valid characters?
         (some #(= (set word) (set %)) cs))))

4

Haskell, 80 78 байт

f s|l<-length s=odd l&&l>1&&any((==s).take l.cycle)(words"un nu mw wm bq qb")

Попробуйте онлайн!

Как это работает:

l<-length s        -- let l be the length of the input string

f s         =      -- return True, if
    odd l          -- l is odd and
    l > 1          -- l is greater than 1 and 
    any            -- any of the following is also True
      (     )(words "  ...  ")
                   -- apply the function to each of the words "un", "nu" ... "qb"
           cycle   --  infinitely repeat the word
      take l       --  take the first l characters
     (==s)         --  and compare to s

4

Python 2 , 45 байт

lambda s:s[2:]+s[1:3]==s>s[:2]in'bqbunuwmw'

Попробуйте онлайн!

Пробелы в строке являются DELсимволами.


|u|интерпретируется как колесо
— Harrichael

@Harrichael Я вставил DELсимволы, чтобы прояснить ситуацию .
— xnor

Хотя символы DEL все еще могут быть входными. Мне нравится ваше решение , но вы должны брать трюк из моего ответа:s[:3]in'bqbqnunuwmwm'
— Harrichael

4

Сетчатка , 24 байта

G`nu|mw|bq
^((.).)\1*\2$

Выходы 1 для правдивых, 0 для ложных.

Порт Коров крякает ответ.

Попробуйте онлайн!


Более новая версия выводит истину для nunwmwnun(когда она должна быть ложной), именно поэтому у меня был \1*ответ в моем sed.
— Kritixi Lithos

@ Cowsquack Ах, я вижу.
— Okx

Первая строка может быть, G`nu|mw|bpтак как все истинные строки содержат одну из этих пар букв, а вторая строка будет гарантировать, что все остальные строки содержат эти буквы тоже ..
— Нейл

@Neil, который не проходит контрольный примерununununu
— Okx

Предложение @Okx Нейла все еще работает для этого теста. Попробуйте онлайн!
— Kritixi Lithos

3

Грязь , 28 байт

e`..-#!"nu\|bq\|mw"oTv&..v+.

Попробуйте онлайн! Отпечатки 1для правдивых входов и 0ложных.

объяснение

Синтаксис Grime напоминает регулярные выражения, а программа Grime задает шаблон, который может совпадать или не совпадать с прямоугольником символов.

e`..-#!"nu\|bq\|mw"oTv&..v+.
e`                            Match input against pattern:
      !                       Does not
     #                        contain
  ..                          a 2-character substring
    -                         which is not
       "nu\|bq\|mw"           any of these strings
                   oT         potentially reversed,
                     v&       AND
                       ..     two characters
                         v+   one or more times
                           .  then one more character.

Некоторые особенности Grime, которые помогли сократить это:

  • Обычно символьный литерал должен быть экранирован с помощью обратной косой черты, но ""это меняется: элементы синтаксиса экранируются, а литералы - нет. Без кавычек часть, которая перечисляет пары символов, была бы (\n\u|\b\p|\m\w)oT.
  • Унарные операторы, которые следуют за двоичным оператором (здесь -), воздействуют на его результат: ..-#!"…"oTэквивалентно (..-"…"oT)#!.
  • В vs понизить приоритет синтаксических элементов , которые следуют за ними. Одинокий &имеет более высокий приоритет, чем -, но v&имеет более низкий. Аналогично, ..+анализируется как .(.+), но ..v+эквивалентно (..)+.



2

Желе , 27 байт

Ḋm2Qµ³m2Q;Ṣe“nu“mw“bq”ȧ³⁼U¤

Попробуйте онлайн!

Как это работает

Ḋm2Qµ³m2Q;µṢe“nu“mw“bq”ȧ³⁼U¤  Main link; z is the argument
Ḋ                             z[1:]
 m2                           z[1::2]
   Q                          deduplicate(z[1::2])
    µ                         New Chain
     ³                        z
      m2                      z[::2]
        Q                     deduplicate(z[::2])
         ;                    deduplicate(z[1::2]) + deduplicate(z[::2])
          Ṣ                  Sort the result
           e                 Is it an element of the following?
            “nu“mw“bq”       ["nu", "mw", "bq"]
                      ȧ      It has the correct characters and:
                       ³  ¤  Nilad followed by links as nilad
                       ³     z
                        ⁼      == 
                         U        z[::-1]
                          ¤  [End chain]

Желе ... дольше, чем Пиф ?!
— Мистер Кскодер

@ Mr.Xcoder тссс, я работаю над этим ... xD
— HyperNeutrino

Ха, хорошо, я сейчас с тобой связан xD
— HyperNeutrino



1

Python 3 , 88 байт

lambda x:[len(x)%2,x[:2]in'nu,un,bq,qb,mw,wm',len(set(x[::2])),len(set(x[1::2]))]==[1]*4

len(x)%2: строка четной длины не может заканчиваться первым символом

x[:2] in: проверьте наличие любой из 6 допустимых начальных пар

len(set()): получить длину наборов символов в 0,2,4 ... и 1,3,5 ...

Возвращает, Trueесли список оценок равен [1,1,1,1], иначе False.

Попробуйте онлайн!


1

Perl 5 , 55 + 1 (-p) = 56 байт

$c={"nuunmwwmbppb"=~/./g}->{$l=chop};$_=/^($l$c)+$/&&$c

Попробуйте онлайн!

Печатает «перевернутую» версию первого символа для true, ничего для false.


Ударь меня твердыми 18 байтами. Хороший ответ!
— Сильвио Майоло

Не так много сейчас. Оригинал возвращал true для любой строки одного и того же символа.
— Xcali

1

PHP, 59 + 1 байт

<?=preg_match('#^(nu|un|mw|wm|bq|qb)\1+$#',$argn.$argn[1]);

Беги как труба с -F.

частично регулярное выражение, 101 + 1 байт:

for($s=$argn;$c=$s[$i++];$p=$c)$c!=$p||die;echo$i%2<1&&preg_match("#^(nu|mw|bq)#",count_chars($s,3));

Пустой вывод для фальши. Беги как труба с -nR.


1

Java 8, 57 байт

s->s.matches("(nu)+n|(un)+u|(mw)+m|(wm)+w|(bq)+b|(qb)+q")

Попробуй это здесь.

Простое регулярное выражение для соответствия всем шести случаям. Обратите внимание, что Java String#matchesавтоматически соответствует всей строке, поэтому в этом нет необходимости ^...$.


1

MATL , 25 байт

'nuwmbq'&mq2&\d~wdts~Gnqv

Выходной результат - это непустой числовой вектор-столбец, который верен, если все его записи отличны от нуля, и ложный в противном случае. Попробуйте онлайн!

Для проверки всех тестовых случаев , ifветвь добавляется в сноске , который заменяет любое значение truthy строки 'truthy', или любого falsy значения по строке 'falsy', а затем выводит строку.

объяснение

'nuwmbq'  % Push this string
&m        % Implicit input. For each char, push index of membership in the above
          %  string, or 0 if not member
q         % Subtract 1
2         % Push 2
&\        % Divmod. Pushes remainders, then quotients
d~        % Consecutive differences negated. Gives an array of ones iff all
          % quotients were equal
w         % Swap. Moves remainders to top
d         % Consecutive differences. Gives nonzeros iff no consecutive
          % remainders were equal
ts~       % Duplicate, sum, negate. Gives true iff sum was 0. For unequal
          % consecutive differences of remainders, this corresponds to an odd
          % number of remainders
Gnq       % Push input, length, subtract 1. True iff input longer than 1
v         % Concatenate into column vector. Truthy iff all entries are nonzero


0

Clojure, 115 байт

(apply some-fn(map(fn[r]#(re-matches r %))(map(fn[[x y]](re-pattern(str x"("y x")+")))["nu""un""mw""wm""bq""qb"])))

Создайте регулярное выражение из каждой пары букв и посмотрите, соответствует ли входное значение единице. Множество более изящных способов сделать все эти части, но они все более многословны. Такова жизнь с гольфом Clojure.


0

Perl 5, 68 + 1 = 69 байт

if(/../&&$&=~/nu|un|bq|qb|mw|wm/){s/^($&)*//;$&=~/./;print if/^$&$/}

Беги с -n.

Объяснение:

# Match the first two characters, and if they exist, then...
if (/../ &&
 # Make sure they are a pair of compatible cartwheel characters.
 $&=~/nu|un|bq|qb|mw|wm/) {
  # If that's true, then eliminate as many of that pair of characters
  # from the beginning of the string as possible.
  s/^($&)*//;
  # Then get the first character out of the match (the first character
  # of the original string).
  $&=~/./;
  # Print the text (which is truthy since it's nonempty) if the original
  # first character matches exactly the remaining string.
  print if/^$&$/
  # Otherwise, print nothing (the empty string in Perl is falsy).
}

0

TXR Lisp , 50 байтов

(f^$ #/n(un)+|u(nu)+|m(wm)+|w(mw+)|b(qb)+|q(bq)+/)

Бег:

1> (f^$ #/n(un)+|u(nu)+|m(wm)+|w(mw+)|b(qb)+|q(bq)+/)
#<intrinsic fun: 1 param>
2> [*1 "nun"]
"nun"
3> [*1 "nuns"]
nil
4> [*1 "mwm"]
"mwm"
5> [*1 "wmw"]
"wmw"
6> [*1 "abc"]
nil

f^$является комбинатором, который принимает объект регулярного выражения и возвращает функцию, которая соответствует этому регулярному выражению привязанным способом. (Сам по себе объект регулярного выражения является вызываемым функцией объектом, который берет строку и ищет себя в ней.)



0

TXR : 78 74 байта

@{x 2}@(rep :gap 0)@x@(end)@y
@(bind(x y)(#"nu un mw wm bq qb"@[x 0..1]))

Запустите из командной строки. Число в приглашении является статусом завершения: 0 = успех, 1 = отказ:

0:$ ./txr cart.txr 
nun
0:$ ./txr cart.txr 
abc
1:$ ./txr cart.txr 
bab
1:$ ./txr cart.txr 
mwm
1:$ ./txr cart.txr 
nununununun
0:$

Объяснение:

  • @{x 2}: сопоставить два символа, привязать к x переменной.
  • @(rep :gap 0)@x@(end): повторное совпадение без пропусков: ноль или более вхождений x ранее подобранного орграфа.
  • @y: оставшаяся часть строки совпадает, фиксируется в y .
  • @(bind(x y)(foo bar))Привязать xк foo, у к bar. Так как xи yуже связаны, они должны совпадать fooи bar, иначе, происходит сбой.
  • fooявляется #"nu un mw wm bq qb"литералом списка слов, синтаксическим сахаром для списка Lisp ("nu" "un" ... "qb"). Соответствие bindмежду переменной и списком означает, что переменная должна соответствовать элементу.
  • baris @[x 0..1]: односимвольная подстрока xот ее начала. Соответствие bindмежду yи этим заставляет последнюю букву строки соответствовать первой.

0

C ++, 268 байт

#include<map>
#include<string>
std::map<char,char>c{{'n','u'},{'m','w'},{98,'q'},{'w','m'},{'u','n'},{'q',98}};
int w(std::string s){if(s[0]!=s[s.size()-1]||c.find(s[0])==c.end()||s.size()<3)return 0;for(int i=0;i<s.size()-1;i+=2)if(s[i+1]!=c[s[i]])return 0;return 1;}

Сохраните 10 байтов, используя значения ASCII для всех символов вместо двух.
— MD XF

@MDXF n= 110, u= 117, m= 109, w= 119, q= 113. Таким образом, использование значений ASCII или нет не имеет значения для любых символов выше c(99)
— HatsuPointerKun

0

JavaScript (ES6), 63 байта

s=>/bq|wm|un/.test(s)&s.replace(RegExp(s[0]+s[1],'g'),'')==s[0]

Возвращает 1или 0.

объяснение

Все строки колесика будут иметь один или несколько символов bq , wm или un . Мы проверяем это с помощью:

/bq|wm|un/.test(s)

Если вы замените все вхождения первых двух букв строки колесика на ничто, у вас останется первая буква строки. Мы проверяем это с помощью:

s.replace(RegExp(s[0]+s[1],'g'),'')==s[0]

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.