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


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.