Давайте підготуємось до Хеллоуїна


15

Я не знаю про вас усіх, але я не готуюсь до Хеллоуїна - ніколи цього не зробив - але мій сусід є, тому ми допоможемо їй.

Їй потрібна допомога розібратися, яку марку цукерок у неї є, але у неї стільки цукерок, що вона не змогла б закінчити до Хеллоуїна.

Вона має:

  • Снікерси
  • Kit Kat
  • Зоряний вибух
  • Желейні ведмедики
  • Двічі

Вхідні дані

Багаторядковий рядок (або будь-яка інша розумна форма), що містить лише літери та пробіли.

Вихідні дані

Неправдиве значення, якщо це не дійсна цукерка, або яка вона, якщо це цукерка.

Як вирішити, яка це цукерка

Цукерка є дійсною, якщо на ній написано одну з перерахованих вище марок. Однак це не так просто, адже це дійсна цукерка:

K i t
       K a
           t

Дійсний цукерки - це той, де:

  • літери в порядку зліва направо
  • літери правильно написані з великої літери
  • листи, йдучи зліва направо, а не робити як підйом і спуск
  • літери з пробілом, вилученими, утворюють одну з вищезазначених марок

Це , тому найкоротший код у байт виграє!

Приклади

Істини:

1.
              kers
           c
        i
       n
    S    

2.
  Kit K a t

3. 
St a
    r b u
         r st 

4.
         Bear s
G ummy

5.
T w i
                          x

Falsys:

1.
SNICKERS

2.
 C   n

   a   d y

3. 
xiwT

4.
S C I
       ss o
              r       s

5.
Kit
Kat

Чи можна на вході прокласти пробіли?
Ловджо

Крім того, чи вважає, що помилка кидання вважається поверненням помилкового значення?
Loovjo

@Loovjo, так і так
Даніель

Чи можна вважати відсутні порожні рядки?
анонімно2

@ anonymous2, вхід не буде порожнім
Даніель,

Відповіді:


0

Pyth - 72 байти

Я сподіваюся, що я спіймав усі крайні справи. Складе основу списку цукерок.

&sSIM_Bmxdh-d;fnd{TK.tQd}-sKdc"Snickers KitKat Starburst GummyBears Twix

Тестовий сюїт .


1

JavaScript (ES6), 221 218 216 212 208 205 201 байт

f=a=>(c=d=L=0,e=1,s=[],[...a].map(a=>a=='\n'?c=L=0:c++-(a!=' '&&(s[c]?e=0:(!L&&(d?d-1?e&=c>Q>d-3:d=c>Q>2:d=1),L=s[Q=c]=a)))),e&&'Snickers0KitKat0Starburst0GummyBears0Twix'.split(0).indexOf(s.join``)+1)

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


Ласкаво просимо в PPCG, і чудова перша відповідь! На жаль, я не вважаю, що це справедливо; він повертає значення truthy для Snick, ears|Tі т. д. Я думаю, ви можете виправити це, додавши .split('|')раніше .indexOf.
ETHproductions

Це дійсно зараз.
Олівер Ні

@ETHproductions. Це ears|Tне проблема, оскільки в тестових випадках допускаються лише літери. Однак ти маєш рацію, бо Snick.
sbisit


Ви також можете використовувати цей трюк, щоб зберегти кілька байтів.
ETHproductions

1

Ракетка 446 байт

(let((lr list-ref)(ls list-set)(sl string-length)(ss substring)(l(string-split s "\n")))(let loop((changed #f))(for((i(sub1(length l))))
(let*((s(lr l i))(r(lr l(add1 i)))(n(sl s))(m(sl r)))(when(> n m)(set! l(ls l i(ss s 0 m)))(set! l(ls l(add1 i)
(string-append r(ss s m n))))(set! changed #t))))(if changed(loop #f)(begin(let*((l(for/list((i l))(string-trim i)))(l(string-join l))
(l(string-replace l " " "")))(ormap(λ(x)(equal? x l))cl))))))

Безголівки:

(define (f s cl)
  (let ((lr list-ref)
        (ls list-set)
        (sl string-length)
        (ss substring)
        (l (string-split s "\n")))
    (let loop ((changed #f))
      (for ((i (sub1 (length l))))
        (let* ((s (lr l i))
               (r (lr l (add1 i)))
               (n (sl s))
               (m (sl r)))
               (when (> n m)
                 (set! l (ls l i (ss s 0 m)))
                 (set! l (ls l (add1 i)(string-append r (ss s m n))))
                 (set! changed #t))))
        (if changed (loop #f)
            (begin
              (let* ((l (for/list ((i l))
                          (string-trim i)))
                     (l (string-join l))
                     (l (string-replace l " " "")))
                (ormap (λ(x) (equal? x l)) cl)))
            ))))

Тестування:

(f "
              kers
           c
        i
       n
    S"
   (list "Snickers""KitKat""Starburst""GummyBears""Twix"))


(f "  Kit K a t"
   (list "Snickers""KitKat""Starburst""GummyBears""Twix"))

(f "St a
    r b u
         r st "
   (list "Snickers""KitKat""Starburst""GummyBears""Twix"))

(f "         Bear s
G ummy"
   (list "Snickers""KitKat""Starburst""GummyBears""Twix"))

(f "T w i
                          x"
   (list "Snickers""KitKat""Starburst""GummyBears""Twix"))

(f "SNICKERS"
   (list "Snickers""KitKat""Starburst""GummyBears""Twix"))
(f " C   n
          y
   a   d"
   (list "Snickers""KitKat""Starburst""GummyBears""Twix"))

(f "xiwT"
   (list "Snickers""KitKat""Starburst""GummyBears""Twix"))

(f "S C I
       ss o
              r       s"
   (list "Snickers""KitKat""Starburst""GummyBears""Twix"))

(f "Kit
Kat"
   (list "Snickers""KitKat""Starburst""GummyBears""Twix"))

Вихід:

#t
#t
#t
#t
#t
#f
#f
#f
#f
#t

Думаю, ви назвали свій вихід "Безголковим"
Роман

Так. Я виправив помилку. Спасибі.
rnso

1

JavaScript (ES6), 139 байт

a=>/^(Snickers|KitKat|Starburst|GummyBears|Twix)$/.test(a.reduce((s,t)=>s.replace(/./g,(c,i)=>c<'!'?t[i]:t[i]<'!'?c:'!')).replace(/ /g,''))

Приймає введення як масив рядків з пробілами.


0

R, 199 символів

function(M){if(any(outer(z<-diff(apply(M,1,function(r)which.min(r==" ")))),z<0))return(F);C=c("Twix","KitKat","Starburst","Snickers","GummyBears");C[match(paste0(gsub(" ","",c(t(M))),collapse=""),C)}

Введення здійснюється у вигляді символьної матриці.

matchпіклується про те, які цукерки це (він також перевіряє капіталізацію).

Щоб перевірити, чи букви є послідовністю "висхідної" чи "низхідної", нам просто потрібно перевірити, чи розташування першого символу без пробілу (якщо він є) у кожному рядку збільшується чи зменшується. Для цього, це ми

  • візьміть перше розташування символу, що не є пробілом, у кожному рядку, використовуючи apply
  • взяти diff. У цьому може бути якийсь нуль, інакше має бути або все позитивне, або все негативне
  • назвіть diff zі візьміть із собою зовнішній виріб. Якщо різниця мала змішані позитивні та негативні записи, десь у її зовнішньому продукті буде негативний запис. Якщо так, поверніться ЛІЖНЕ.

Зауважте, такі випадки, як

"    i "
"   w x"
"  T   "

поверне порожній символ символів (зокрема, не "Twix"), оскільки matchбуде намагатися відповідати "Twxi".


0

Python 2.7, 254 байт

Я впевнений, що це може бути більше гольфу. Введення - це масив ліній s.

x=len
p=lambda a:x(a)-x(a.lstrip())
g=sorted
a=map(p,l)
j=''.join
z=[i.replace(' ','')for i in l]
if g(a)==a:q=j(z)
elif g(a)==a[::-1]:q=j(z[::-1])
else:q=''
if x(set(a))<x(a):q=''
print 1if q in('Snickers','KitKat','Starburst','GummyBears','Twix')else 0

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


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