Безкорисно; без зворотніх зобов'язань!


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

3
Здається, що звільнивши руки, щоб записати шлях рядка, малюнок все одно впаде. Тоді цей виклик стає дійсно легким.
овакодер

@owacoder Ви просто повинні бути досить швидкими: D
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 байт Octave, 82 79 77 байт

Це, можливо, я вперше побачив, де MATLAB насправді коротший за Октаву (на весь байт)!

Нова відповідь у 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-звону з порожнім рядком, перетворюючи числа в символи.

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

Хаскелл, 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передує та спрощує кожен символ по черзі через a foldr. Потім він перевіряє, чи результат порожній.

Щоб перевірити, чи два символи протилежні регістри, і так слід скасувати, подивіться, чи відрізняються їх значення ASCII на 32. Кожен елемент обробляється fromEnumперед тим, як передати його %.


Приємно! І дякую за пояснення, я щоразу вчу нові речі!
помилка

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

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

Спробуйте в Інтернеті! або Перевірте всі приклади!


f=null.until(\a->r a==a)r.map fromEnumмає зберегти два байти.
Лайконі

Я думаю, що (\a->r a==a)може бути ((==)=<<r).
xnor

1
У другому рядку, я думаю , що ви можете змінити , =r lщоб l, ідея в тому , що досить зробити тільки одну заміну за перспективі.
xnor

Дякую! Я розумію другий натяк, але поняття не маю, що відбувається з =<<, здається, магічним XD
недоліком

1
@flawr Дивіться цю пораду . Це =<<схоже, >>=але міняються аргументи. Вираз часто придумується так, як у формі ((==)=<<r)означає «інваріантний під r».
xnor

3

Математика, 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)

На відміну. пара верхнього / нижнього регістру


3

Perl, 28 байт

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

Пояснення:

Perl дозволяє включати динамічно генерований регулярний вираз всередині стандартного регулярного виразу.

.Матчі нічого.

Це (??{початок згенерованого регулярного вираження.

$&Мінлива міститиме цільні знайдену рядок до сих пір, що в даному випадку тільки те , що .узгоджений.

^Оператор робить або числовий XOR або рядок XOR, в залежності від значень операндів. У цьому випадку це буде string xor.

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

Це })кінець генерованого регулярного вираження.

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

$_є змінною за замовчуванням. Ця змінна - це те, що в perl цікаво та захоплююче, коли ви не вказуєте іншу змінну. Тут я використовую це для повернення значення "фальшивий" або "хибний", оскільки рядок нульової довжини помилковий, а ненульова довжина, яка не дорівнює нулю, "0"є істинною. Я також припускаю, що вхідний рядок був спочатку розміщений у ньому.

Спробуйте тут


технічно це повертає протилежне тому, що вимагає виклик (ти повертаєш правду, коли це має бути хибним і навпаки). Щоб виправити це, просто додайте !до фіналу $_. Якщо зберегти це таким чином, то з вами нормально, ви можете зберегти 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).

Тривати тривалі помилкові випадки через зворотний трек.

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

Безумовно

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



Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.