Я деякий час займався полюванням на алфавіт


18

Знаєте, останнім часом у нас було багато проблем з "алфавітом". ( один два три чотири п'ять .) Хоча я люблю гарний виклик, і ці виклики були дуже веселими, я думаю, що настав час для зміни темпу. Нам потрібно виключити такі виклики в майбутньому. Час автоматизації !

Ви збираєтесь знайти для мене кілька алфавітів, і для автоматизації (і для слави!) Алфавіти вигадливі і люблять маскуватися під себе. [потрібна цитата] Вам потрібно буде врахувати наступні фактори:

  1. Букви можуть бути великими або малими (але не обома). Отже, потрібно шукати ABCDEFGHIJKLMNOPQRSTUVWXYZі abcdefghijklmnopqrstuvwxyz, але ні AbCdeFGhIJkLmNOpQRsTuvwxyZ. Тобто шукайте лише алфавітів, які складаються цілком з одного випадку.
  2. Алфавіти можуть змінюватися навколо. вони не завжди можуть починатися з A, але натомість можуть починатися з Gабо U. Тож вам доведеться шукати такі речі OPQRSTUVWXYZABCDEFGHIJKLMN.
  3. Алфавіти не завжди можуть читати вперед. Вони також можуть читати назад, вгору та вниз. Наприклад, ZYXWVUTSRQPONMLKJIHGFEDCBAтакож є дійсним алфавітом.

Ось приклад рядка з алфавітом:

JIHGFEDCBAZYXWVUTSRQPONMLK

Це зворотно зміщений алфавіт:

JIHGFEDCBAZYXWVUTSRQPONMLK
<--------|<---------------

Він також містить алфавіт:

F
G
H
I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
A
B
C
D
E

це алфавіт, орієнтований вниз:

F |
G |
H |
I |
J |
K |
L |
M |
N |
O |
P |
Q |
R |
S |
T |
U |
V |
W |
X |
Y |
Z V
A===
B |
C |
D |
E V

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

Тестові справи

Truthy

ABCDEFGHIJKLMNOPQRSTUVWXYZ

abcdefghijklmnopqrstuvwxyz

ABCDEFGHIJKLMNOPQRSTUVWXYabcdefghijklmnopqrstuvwxyz

ZABCDEFGHIJKLMNOPQRSTUVWXYghijklmnopqrstuvwxyzabcdef

ZBCDEFGHIJghijklmnopqrstuvwxyzabcdef

AAAAAAAA
BBBBBBBB
CCCCCCCC
DDDDDDDD
EEEEEEEE
FFFFFFFF
GGGGGGGG
HHHHHHHH
IIIIIIII
JJJJJJJJ
KKKKKKKK
LLLLLLLL
MMMMMMMM
NNNNNNNN
OOOOOOOO
PPPPPPPP
QQQQQQQQ
RRRRRRRR
SSSSSSSS
TTTTTTTT
UUUUUUUU
VVVVVVVV
WWWWWWWW
XXXXXXXX
YYYYYYYY
ZZZZZZZZ

 J54
 Igeh
 H
 G
 Fzx6
 E
 Dv
 Cvzxc
 Bs
 Adf
 Z
@Yascvf
 Xsf
 W
 Vfas
 Uw
 Te
~S
 R
 Qasdfasdf
 P
 O
 N
 M
 LMNOPQR
 K

Фальсі

Hello, World!

KLMNOPQRSTUVWXYZABCDEF

K        ZYXW
 L         V
  M       U
   N     T
    O   S
     P R
      Q

A
 BCDEFGHIJKLMNOPQRSTUVWXYZ

ABCDEFGHIJKLmnopqrstuvwxyz

16
"Мені нудить проблема з алфавітом. Ось проблема з алфавітом". lol +1
AdmBorkBork

Чи може у нас вхід прокладений пробілами, щоб утворити прямокутник? : 3
Пуховик

@Downgoat Так, можна.
Conor O'Brien


1
Чи можемо ми взяти 2D масив рядків? Кожен рядок буде лінією, обкладеною правою стороною з пробілами, щоб утворити прямокутник
Луїс Мендо

Відповіді:



2

Чеддар, 148 байт

(s,b=65@"90,c?)->(|>27).map(->s has(b=b.slice(1)+b[0])||s has b.lower||(1|>3).map(j->(c=s.lines.turn(j).vfuse)has b||c has b.lower?1:0).sum?1:0).sum

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

Non copmeting, 146 132 байт

Це точно так само, як вище, за винятком map(...?1:0).sumтого, що стало any(...).

(s,b=65@"90,c?)->(|>27).any(->s has(b=b.slice(1)+b[0])||s has b.lower||(1|>3).any(j->(c=s.lines.turn(j).vfuse)has b||c has b.lower))

Досить повільний, але він працює ¯ \ _ (ツ) _ / ¯. доданоany функція після дати випуску виклику.

Вхід не потрібно заливати пробілами. Але якщо введення не працює, обклейте його пробілами, щоб зробити прямокутник. TheturnФункція дійсно вибагливі , і я не впевнений , коли він працює , і коли вона не

Пояснення

Проведіть усі можливі цикли алфавіту. Після кожної ітерації перевіряйте, чи існує поточний цикл алфавіту в рядку, якщо ні, перевірте, чи є в будь-якому з можливих обертів рядка алфавіт.

Безумовно

(str, a = 65@"90)->
  (|>27).any(->
    str has (a = a.slice(1) + a[0]) ||
    str has a.lower                 ||
    (1|>3).any(j ->
      (c = str.lines.turn(j).vfuse) has a ||
      c has a.lower
    )
  )

Що c?означає?
Conor O'Brien

@ ConorO'Brien c?означає необов'язковий аргумент. в основному те саме, щоc=nil
Downgoat

Створіть конкуруючу версію, після чого поставте цю неконкуруючу версію внизу.
Leaky Nun

@LeakyNun працювати над нею, не можу зрозуміти, як без {}хоча
Downgoat

1
any(...)простоmap(...?1:0).sum
Leaky Nun

2

05AB1E, 43 байти

A‚Duìvy26FÀD}})U|Dø€J)˜vXDgs`rFysk>ˆ}}¯O__

Пояснення коротко

Отримайте різні варіанти алфавіту (шапки, без обмежень, перевернуті, звичайні) та зберігайте в X.

A‚Duìvy26FÀD}})U

Отримайте кожен рядок і стовпець введення у вигляді списку рядків.

                 |Dø€J)˜

Перевірте кожен такий рядок, якщо він містить зміну алфавіту.

                        vXDgs`rFysk>ˆ}}

Сума і подвійне заперечення, даючи 1 за істинне і 0 за хибне.

                                       ¯O__

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


0

Пітон, 182 байти

Не дуже "гольф", але ...

import re
a='abcdefghijklmnopqrstuvwxyz'
P,N='|\n'
p=P.join(a[i:]+a[:i] for i in range(26))
p+=P+p[::-1]
p+=P+p.upper()
lambda s:re.search(p,s+N+N.join(map(''.join,zip(*s.split(N)))))

Теорія роботи:

Спочатку побудуйте схему регулярного вираження, що поєднує всі можливі алфавіти:

p=P.join(a[i:]+a[:i] for i in range(26))будує рядок усіх обертів 'a', з'єднаних з '|'. наприклад "abc ... z | bcd ... za | ..."

p+=P+p[::-1] додає зворотну версію себе.

p+=P+p.upper() додає велику версію.

Потім створіть довгу рядок, що поєднує оригінал sта версію sзі стовпцями, перетвореними на рядки:

N.join(map(''.join,zip(*s.split(N)))) гортає рядки та стовпці, тому "a \ nb \ nc" стає "abc"

повернути true, якщо шаблон є у довгій рядку.


Досить впевнений, що для цього вам не потрібен регулярний вираз; конкретно, inперевіряє наявність підрядків.
Leaky Nun

@LeakyNun, я намагався уникати безлічі циклів над можливими алфавітами (обертання, перевороти, регістр). Шаблон регулярного виразів має всі можливості - використовуючи лише одну петлю. Також рядок для пошуку включає вхідну рядок як у звичайній, так і у перевернутій рядком версії, тому також не виникає циклів.
RootTwo
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.