Цей рядок буквою робить кошик?


35

Натхненням на виклик було те, що я десь побачив:

Слово "монахиня" - це лише літера n, яка робить кошик

Ваше завдання полягає в тому, щоб взяти рядок і визначити, чи це перша буква, яка робить кошик.

Правила

Рядок - це лист, що робить колесо, якщо:

  • Перша літера така ж, як і остання. (Лист не може приземлитися на голову.)
  • Рядок чергує букви з кошиком кожного символу.

Кольорові букви бувають nі u, mі w, bі q. Зверніть увагу , що nі wразом є НЕ cartwheeling листи, і ні один НЕ wі b.

  • Ви візьмете рядок, використовуючи будь-який із наших стандартних методів введення.
  • Ви виведете значення truthy, якщо рядок є буквеним колом, а помилкове значення, якщо це не так. Вихід може бути здійснений за допомогою будь-яких стандартних методів виводу.

Додаткові правила:

  • Необхідно обробляти лише маленькі літери кошика 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
Kritixi Lithos

19
Чому, bqbале ні pdp?
aschepler

@aschepler я заплутався.
MD XF

2
Так dpd, pdp і таких не працює, я думаю , ви повинні мати їх в тестових випадках з falsy відповіддю.
trlkly

Відповіді:


2

Желе , 23 байти

Це зайняло більше роботи, ніж можна було б подумати!

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

Монадійне посилання, що містить список символів і повертається 1(тритум) або 0(фальси).

Спробуйте в Інтернеті! або побачити тестовий набір .

Як?

Знаходить індекс кожного символу введення в 1-індексованому списку символів nmbuwq. Цей рядок розташований таким чином, що індекси пар розділені одна від одної, тому такою додатковою різницею індексів для дійсних колесних коліс буде повторення одного з [-3,3]або [3,-3].

Якщо елемент не знайдений у списку за атомом "індекс" i, він повертається 0, з яким би поєднувався з незрозумілими символами b, роблячи введення на зразок bxbxbtruthy. Таким чином, 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

Спробуйте в Інтернеті!

Видаляє введення, якщо є фальси, інакше нічого не робить на введенні.

Пояснення

За допомогою -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 байт відповіді повертає істинно для 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
Недійсне: 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) ) )


Справді люблю логіку тут! Я ніколи б не подумав додати символу в кінці і випробувати. Хороший, чистий код теж навіть у гольф.
trlkly

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 для помилки.

Відповідь крякання порту корів.

Спробуйте в Інтернеті!


Новіша версія виводить truthy для 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]

Желе ... довше, ніж Піт ?!
Містер Xcoder

@ Mr.Xcoder shhhh Я працюю над цим ... 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

Спробуйте в Інтернеті!

Друкує "догори ногами" версію першого символу для істинного, нічого для помилкового.


Бийте мене міцними 18 байтами. Гарна відповідь!
Сільвіо Майоло

Зараз не дуже багато. Оригінал повертав істину для будь-якого рядка того ж символу.
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' , а потім відображає рядок.

Пояснення

'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Матч між змінною і список означає , що змінна повинна відповідати елемент.
  • barє @[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.