Давайте подготовимся к Хэллоуину


15

Я не знаю всех вас, но я не готовлюсь к Хэллоуину - никогда не знал, - но мой сосед, так что мы поможем ей.

Ей нужна помощь, чтобы выяснить, какую марку конфет у нее есть, но у нее столько конфет, что она не сможет закончить до Хэллоуина.

У нее есть:

  • кроссовки
  • Кит-Кат
  • Starburst
  • GummyBears
  • Twix

вход

Многострочная строка (или любая другая разумная форма), содержащая только буквы и пробелы.

Выход

Ложное значение, если это не действительная конфета, или какая конфета это, если это конфета.

Как решить, что это за конфета

Конфета действительна, если на ней написано одно из вышеуказанных брендов. Однако это не так просто, потому что это настоящая конфета:

K i t
       K a
           t

Действительная конфета - это та, где:

  • буквы в порядке слева направо
  • буквы заглавные правильно
  • письма, идя слева направо, а не делать как подъем и спуск
  • буквы с пропущенными пробелами образуют один из указанных брендов

Это , поэтому выигрывает самый короткий код в байтах!

Примеры

Truthys:

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

@Loovjo, да и да
Даниэль

Можем ли мы предположить, что нет пустых строк?
anonymous2

@ 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.
Сбисит


Вы также можете использовать этот трюк, чтобы сохранить несколько байтов.
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))))))

Ungolfed:

(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

Я думаю, что вы назвали свой выходной "Ungolfed"
Роман Gräf

Да. Я исправил ошибку. Благодарю.
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, и возьмите внешний продукт с собой. Если в diff смешаны положительные и отрицательные записи, то где-то во внешнем произведении будет отрицательная запись. Если так, верните ЛОЖЬ.

Обратите внимание, что такие случаи, как

"    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.