Безвоздмездно!

42

вступление

В стене 3 гвоздя. У вас есть кусок строки, который прикреплен к рамке с обоих концов. Чтобы повесить картину, вы запутали гвозди в струну. Но прежде чем позволить изображению исчезнуть: можете ли вы предсказать, упадет ли изображение, просто взглянув на то, как веревка обвивается вокруг ногтей?

В первом примере картинка не упадет. Во втором примере картина будет падать.

Вызов

Учитывая путь струны вокруг Nногтей, определите, будет ли картина падать или нет. Верните истинное значение, если картина будет падать, и ложное значение в противном случае.

Детали

  • Вы можете предположить, что ногти и рисунок расположены в правильном положении N+1, с рисунком внизу.
  • Можно предположить, что в веревке нет узлов, т. Е. Веревку можно непрерывно разворачивать с одного из двух концов.
  • Каждый гвоздь нумеруется по часовой стрелке буквой алфавита. Вы можете предположить, что есть максимум 26 гвоздей (AZ).
  • Оборачивание вокруг ногтя по часовой стрелке обозначается буквой в нижнем регистре, а завершение против часовой стрелки - буквой в верхнем регистре.

Первый пример сверху будет закодирован как BcA, второй пример закодирован как CAbBac.

Для склонного читателя: эта проблема эквивалентна определению, является ли элемент свободной группы - порожденный набором гвоздей - идентичностью или нет. Это означает, что достаточно многократно отменять подстроки, такие как aAили Aaдо тех пор, пока вы не достигнете фиксированной точки. Если фиксированная точка - пустая строка, это нейтральный элемент, в противном случае это не так.

Примеры

Picture will fall:
Aa
CAbBac
aBbA
DAacAaCdCaAcBCBbcaAb
ARrQqRrUuVHhvTtYyDdYyEKRrkeUWwua
AKkQqEeVvBESWwseYQqyXBbxVvPpWwTtKkVHLlWwNBbAanYYyyhWwEJZUuNnzjYyBLQqQqlEGgebeEPLlTtZzpUuevZzSsbXSGgsUuLlHhUQquPpHUuFfhTZzIitGgFAaBRrBbbYXxOoDZTDdtzVvXxUudHhOVvoUuXKkxyBEeLlbFfKkHhfVAaQqHAaJjODdoVvhSsZzMZzmPpXNBbnxBbUuSSsUuDRrdNnUusJDIiUuIidCEGgeMmcLlDPOopdTEeQqCAETtNnYyeGUuPEFfSsWwHheAaBbpgCcOHUuhAaCcoEFBbfeaFHhfcCFFffNncGFfgtjMVUuKAakvKkXxLlTMmtmOFfoUuXSsYZzLXxlyxUuRPZzTtprSsWwRrPLlpGgMmKRrDHhdRCcUurYNnKCckykXJjxWwUSsJjKkLlKkuBbBbOoWwWwIiUuPDdBbCcWHBbCFfcDdYBbLlyVvSsWGgEewCchDdYywAaJjEepPpPpQXxZzFfLGXxglNnZzYDdyqCcKWXxwXxQqXTtxkFfBSSAasTFftZzsXGgxSsLlLlbZzAaCCccXVvYyxTIiOoBbFftCVQqDdBbGgAavQqKkDPpKTCctRrkdcvAaQWOowLOolqVMmvZAaHCBbcPphIiRKkrLlzFMOomDIiXJjIixMmdNnMHhmfNTtIiKkSDdTtsVvHhnAaNSVvTUutNnXxsGIiXxPpPHhUupgNnAaAAOoaaIiHJjhVvLlnYyXxQqSsTtKJjkBbNnVvEYCcFfMHGghBbmNnEeJTtjJjWYywyeNWwDIiZYyzOodnMQqmVvCcQqxVvGNnEeNBbngVvUGgYyBbDdVvIiAAaauPpQKDdEekNnVLlvHhGSDIidPZzpsPCcpgQqKkQqNOonLlIiLlJjqPAaPXxTtppYyCPpHhCIicARBbracXxWwXEVUuUuGgZHhzBSsbvGgFfeVvxLlNKknWwBLlIibWOowNnRSsrSEeKAakOosLZzZRrHhzTtTFfUuNnOKkotXxTtla


Picture will not fall:
A
BcA
ABCD
aBaA
bAaBcbBCBcAaCdCaAcaCAD
ARrQqRrUatuVHhvTYyDdYyEKRrkeUAua
AEEeQqNneHhLlAIiGgaECXxcJjZzeJFfVWwDdKkvYWwyTJjtCXxANIinaXWwxcTWwtUuWwMmTBbVWIiFLlWwZzfwPLlEepvWZzwKkEYEeWXxwySXTtEexRIiNBbnWAaTtQqNnBMSsWwOombwWwPVPpGPpgYyvDdpBbrQqHhUusKRrDAVvadLlWwOZzokGJCXSSssXxxJPpGIigZzjJjLlOoNRrnPpcMZzmjgJjNDEeQqWKkNTtnSswIidCcnYBGgbyJSsjPpIiMmMmMmSNnWVvwZzIQqLXHhxTPptlisOoeTtTtYMmVvPpyKNnMFfmkXxSVvsCGJjXxgXYJPpjWwQIiXxqyDdxFfDdAaRNnJjrctHBbZzhEQqMmeCcRBbrGgAaAaJNnRrYyWwSDdVvsJOojQGgWWwIBbiwRrqJjjWwOoFPMmDdRrQOoqNnRrDPJjpMmdPpGFfVvWUuwgpWCcNnPpwfUXCcZzJjUSsuXxxUuuRGgHhrSQqJjOosMMTtmHhmKkXxDdLlWwjSUuAaMmKYyksZzVvPZzVEeVvvHhZZOozBbzMmZCczYyGgISsiQqpXxMmXxEMmeRrAGgaGgMOGgomZFfDdzSSssBGPpgbTtBbOoRWWwGgLJjlEeGgLDdRrUulNnZzJjJjUKkuXxFfwATtaZzLVvlWwSsMmrBAaELleGBLFflbgHhbIFfiBbPpTWZzwKkKLASsaTJYyjtBbBbWwIiZCcWwzIiZLlUTtuBbYyBbIizTJjtLTtDOOoBbodBbllSsUGgLlAKkauYykUuUNnPpuDFfAaLNVvnVvlHhdMmBAaBbIiVRrGWOoPpwgWXwKkvJjOoTtYCUucVGgYyLlVvFfvRrMmySsDdbtICZzcNnINSOosDQAaXoxRGgKkrqdZznDdXxZzMGgmiJjNnACcMQqmaNnWZzUOuwTVvAJjSsaRrGgSsTtOMmRroVvRrtAVGgvMmaINniDGCcOogRrWwMVvYFfyTtmTtVvOoOIiodRrGgAxaSsGgiJja
flawr
источник
3
Похоже, что если освободить руки, чтобы записать путь струны, картина все равно упадет. Тогда этот вызов станет действительно легким.
owacoder
@owacoder Вы просто должны быть достаточно быстрыми: D
flawr
Соответствует: youtube.com/watch?v=x5h3yTxeCew
flawr

Ответы:

11

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

+`(.)(?!\1)(?i)\1

^$

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

Как и в случае решения flawr, он просто многократно удаляет соседние пары верхнего и нижнего регистров, а затем проверяет, является ли результат пустым или нет.

Что касается того, как каждый соответствует заглавной / строчной пары:

(.)     # Match and capture a letter.
(?!\1)  # Ensure that the next character is not the same, to avoid matching
        # "aa" and "AA".
(?i)    # Turn on case-insensitivity.
\1      # Match the backreference. In .NET, when using case insensitivity,
        # backreferences also get case-insensitive, so this *can* still match
        # iff the cases of the two letters are different.
Мартин Эндер
источник
7

MATLAB, 76 байт, октава, 82 79 77 байт

Это может быть первый раз, когда я увидел, что MATLAB на самом деле короче, чем Octave (на целый байт)!

Новый ответ в MATLAB:

c=input('');k='Aa';while k<1e5,k=k+1;c=strrep(c,65+mod(k,64),'');end;~nnz(c)

Ответ в октаве:

c=input('');k='Aa';while k++<1e5,c=strrep(c,['',65+mod(k,64)],'');end;~nnz(c)

Сохранено три пять байтов благодаря flawr. ~nnz(c)короче isempty(c), и 'Aa'на два байта короче, чем [0,32].

Попробуйте Octave-версию онлайн!


Объяснение:

c=input('')просит пользователя для ввода. Мы определяем k='Aa'как массив символов.

while k++<1e5: В то время как цикл , в котором оба элемента в kувеличиваются каждой итерации, Aa, Bb, Ccи так далее. Цикл будет продолжаться до тех пор, пока не появится самый большой элемент 1e5, который должен быть достаточно высоким для большинства строк. Это может быть увеличено до 9e9без увеличения количества байтов.

Мы рассмотрим strrepфункцию поэтапно, начиная с середины.

Используя, mod(k,64)мы получим следующее, когда достигнем конца алфавита (если мы преобразуем kобратно в символы):

ans = Yy
ans = Zz
ans = [{
ans = \|
ans = ]}
ans = ^~
ans = _
ans = `�
ans = aA
ans = bB

Как вы можете видеть, между ними будет несколько символов, но затем они будут повторяться и начинаться с алфавита, а теперь сначала с букв нижнего регистра. Это очень короткий способ проверить и то, Aaи другое aA.

['',65+mod(k,64)]объединяет числовые значения из mod-call с пустой строкой, преобразуя числа в символы.

strrepиспользуется для удаления элементов из строки cи ее возврата. Он будет искать все вхождения kв строке и заменять ее пустой строкой.

После 1e5итераций у нас будет либо пустая строка, либо непустая строка. Мы проверяем, есть ли какие-либо элементы в cиспользовании nnz(c). Мы возвращаемся not(nnz(c)), таким образом, 1если он пуст, и 0если в нем остались символыc

Стьюи Гриффин
источник
6

Минколанг 0,15 , 30 байт

od4&x,N.I1=$6&d3~c-$~48*=,2&xx

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

объяснение

od                            Take character from input and duplicate it
  4&                          If top of stack is truthy, jump 4 spaces
    x                         Dump top of stack
     ,                        NOT top of stack
      N.                      Output as number and stop

    I1=                       1 if stack has 1 element, 0 otherwise
       $6&                    If top of stack is truthy, jump 16 spaces (to the beginning)
          d3~c                Duplicate top two items of stack, in reversed order
              -               Subtract
               $~             Absolute value
                 48*          Push 32
                    =,        0 if top two items are equal, 1 otherwise
                      2&xx    If top of stack is truthy, dump two elements from top

Тороидальная природа Минколанга используется здесь, чтобы устранить необходимость во внешней петле. Общая идея здесь состоит в том, чтобы проверить, находятся ли два верхних элемента стека на расстоянии 32 единицы (это означает, что они состоят из прописных / строчных букв), и, если они есть, вытолкнуть оба из них. Так как это делается, так сказать, в реальном времени, вложение пар обрабатывается правильно.

Эльендия Старман
источник
5

Haskell, 62 байта

a%l|b:t<-l,abs(a-b)==32=t|1>0=a:l
f=null.foldr((%).fromEnum)[]

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

Кредит flawr дляabs и Laikoni для fromEnumкарты .

Вспомогательная функция %берет уже упрощенную строку lи добавляет символ aперед упрощением результата. Если lначинается с обратного символа a, они отменяются. В противном случае aпросто добавляется. Обратите внимание, что на данном этапе дальнейшее упрощение не требуется.

Основная функция fдобавляет и упрощает каждый символ по очереди через foldr. Затем он проверяет, является ли результат пустым.

Чтобы проверить, являются ли два символа противоположными, и поэтому следует их отменить, посмотрите, отличаются ли их значения ASCII на 32. Каждый элемент обрабатывается fromEnumперед передачей в %.

XNOR
источник
Ницца! И спасибо за объяснение, я узнаю что-то новое каждый раз!
flawr
4

05AB1E , 17 байт

DvADu‚øDíìvyK}}õQ

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

объяснение

Dv                 # input number of times do:
  A                # push lowercase alphabet
   Du              # push uppercase alphabet
     ‚ø            # zip the alphabets together (['aA', ..., 'zZ'])
       Díì         # prepend a copy with each element reversed ('Aa' ...)
          v        # for each pair in the resulting list
           yK      # remove it from the accumulated string (starts as input)
             }}    # end loops
               õQ  # check result for equality to empty string
Emigna
источник
4

Haskell , 98 97 85 81 байт

Это просто наивная реализация, которая неоднократно пытается отменить прилагательные буквы до тех пор, пока не останется никаких изменений, а затем определяет результат из этого.

Спасибо @nimi за -12 байтов и @xnor за еще -4 байта!

o=fromEnum
r(a:b:l)|abs(o a-o b)==32=l|1>0=a:r(b:l)
r x=x
f=null.until((==)=<<r)r

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

flawr
источник
f=null.until(\a->r a==a)r.map fromEnumдолжен сохранить два байта.
Лайкони
Я думаю, что (\a->r a==a)может быть ((==)=<<r).
xnor
1
Во второй строке, я думаю, вы можете перейти =r lк l, идея состоит в том, что достаточно сделать только одну замену за цикл.
xnor
Спасибо! Я понимаю второй намек, но я понятия не имею, что происходит с =<<, похоже, волшебство XD
flawr
1
@flawr Посмотрите этот совет . Это =<<как, >>=но с аргументами поменялись местами. Выражение часто появляется в форме, ((==)=<<r)чтобы означать «инвариантен под r».
xnor
3

Mathematica, 102 байта

""==StringDelete[""|##&@@#<>#2&~MapThread~{Join[a=Alphabet[],A=ToUpperCase@a],A~Join~a}]~FixedPoint~#&

Безымянная функция, принимающая буквенную строку в качестве ввода и возвращающая Trueили False.

Сердцем реализации является создание функции, которая удаляет любую строку отмены, например "Pp"или "gG", из строки. Выражение {Join[a=Alphabet[],A=ToUpperCase@a],A~Join~a}создает упорядоченную пару списков символов, причем первый список является {"a","b",...,"Z"}вторым {"A","B",...,"z"}. Затем #<>#2&~MapThread~создает список, в котором соответствующие элементы этих двух списков были объединены, то есть {"aA","bB",...,"Zz"}. Тогда забавное выражение ""|##&@@(посредством магии последовательности аргументов ##) создает список альтернатив "" | "aA" | "bB" | ... | "Zz"; наконец, StringDelete[...]это функция, которая удаляет любое вхождение любой из этих альтернатив из строки.

Теперь достаточно многократно применять эту функцию к входной строке до тех пор, пока результат не изменится, что и выполняется ~FixedPoint~#, и затем проверить, является ли результат пустой строкой ""==.

Грег Мартин
источник
3

JavaScript (ES6), 73 байта

f=(s,t=s.replace(/(.)\1+/gi,s=>s.replace(/(.)(?!\1)./,'')))=>s==t?!s:f(t)

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

Нил
источник
3

Perl, 28 байт

1 while s/.(??{$&^' '})//;$_

Объяснение:

Perl позволяет включать динамически генерируемое регулярное выражение в стандартное регулярное выражение.

.Матчи ничего.

Это (??{начало сгенерированного регулярного выражения.

До $&сих пор переменная будет содержать всю совпадающую строку, которая в данном случае будет .соответствовать.

^Оператор делает либо числовой XOR или строку XOR, в зависимости от значений операндов. В этом случае это будет строка xor.

Это ' 'просто строка, содержащая пробел, который обычно имеет значение ascii (или unicode!) 32. Когда пробел записывается с помощью символа в диапазоне az или AZ, он изменяется с верхнего на нижний регистр или тиски наоборот.

Это })конец сгенерированного регулярного выражения.

1 while s/whatever// будет многократно искать шаблон и заменять его пустой строкой.

$_переменная по умолчанию. Эта переменная - это то, что perl делает весело и увлекательно, когда вы не указываете другую переменную. Здесь я использую его для возврата истинного или ложного значения, поскольку строка нулевой длины равна false, а строка ненулевой длины, которая не равна, "0"- true. Я также предполагаю, что входная строка была первоначально помещена в нее.

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

BenGoldberg
источник
технически это возвращает противоположность тому, что требует задача (вы возвращаете истину, когда она должна быть ложной, и наоборот). Чтобы это исправить, просто добавьте !перед финалом $_. Если с этим способом все в порядке, вы можете сохранить 4 байта, изменив его на s/.(??{$&^' '})//&&redo+1 байт для -pфлага. Это не будет работать в подпрограмме, как у вас сейчас, потому что на { code }самом деле это не цикл (следовательно &&redo, не будет работать), но -pон помещает его в whileцикл.
Габриэль Бенами
Вы также можете сохранить другой байт, заменив ' 'на $". Посмотрите на это, чтобы увидеть, как выглядит код.
Габриэль Бенами
2

Пролог (SWI) , 151 байт

f(S):-S="";string_code(I,S,X),string_code(J,S,Y),J is I+1,32is abs(X-Y),B is J+1,sub_string(S,0,I,_,T),sub_string(S,B,_,0,U),string_concat(T,U,V),f(V).

Требуется много времени, чтобы работать на более длинных ложных делах из-за возврата.

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

Ungolfed

f(S):-                       The string S corresponds to a falling picture if:
  S="";                      S is the empty string, or...
  string_code(I,S,X),        X is the character code at some index I
  string_code(J,S,Y),        Y is the character code at some index J
  J is I+1,                  J is I+1
  32 is abs(X-Y),            X and Y differ by 32 (difference between lower/upper case)
  B is J+1,                  ...
  sub_string(S,0,I,_,T),     ...
  sub_string(S,B,_,0,U),     ...
  string_concat(T,U,V),      ...
  f(V).                      The concatenation of the substrings before and after 
                             the letters X and Y corresponds to a falling picture.
Бизнес Кот
источник
1

MATL , 20 байтов

t"[]yd|32=fX<tQh(]n~

Попробуйте онлайн! Или проверьте все тестовые случаи (это займет некоторое время).

объяснение

t       % Input string implicitly. Duplicate
"       % Do as many times as input size
  []    %   Push empty array
  y     %   Duplicate current string onto the top
  d|    %   Absolute consecutive differences
  32=   %   Convert to true if 32, false otherwise
  fX<   %   Index of first occurrence of true, or empty of all false
  tQ    %   Duplicate, add 1. This gives the next index, or empty
  h     %   Concatenate. Gives the two consecutive indices of letters
        %   to be removed, or empty
  (     %   Assign an empty array to those positions, i.e. delete them
]       % End
n~      % Number of elements, negate
Луис Мендо
источник
1

Mathematica, 65 байт

(ToCharacterCode@#//.{x___,y_,z_,w___}/;Abs[y-z]==32:>{x,w})=={}&
alephalpha
источник