Przygotujmy się na Halloween

15

Nie wiem o was wszystkich, ale nie przygotowuję się na Halloween - nigdy tego nie zrobię - ale mój sąsiad jest, więc pomożemy jej.

Potrzebuje pomocy w ustaleniu, którą markę ma słodyczy, ale ma tyle słodyczy, że nie byłaby w stanie skończyć przed Halloween.

Ona ma:

  • Snickers
  • KitKat
  • Starburst
  • Żelki
  • Twix

Wejście

Wielowierszowy ciąg znaków (lub dowolna inna rozsądna forma) zawierający tylko litery i spacje.

Wynik

Wartość falsy, jeśli nie jest to prawidłowy cukierek lub który to cukierek, jeśli jest to cukierek.

Jak zdecydować, które to cukierki

Cukierek jest ważny, jeśli zawiera na nim jedną z powyższych marek. Nie jest to jednak takie proste, ponieważ jest to prawidłowy cukierek:

K i t
       K a
           t

Ważny cukierek to taki, w którym:

  • litery są uporządkowane od lewej do prawej
  • litery są pisane dużymi literami
  • litery, idąc od lewej do prawej, NIE zarówno unosić się oraz opuszczać
  • litery z usuniętymi białymi znakami tworzą jedną z powyższych marek

To jest , więc wygrywa najkrótszy kod w bajtach!

Przykłady

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
Daniel
źródło
Czy dane wejściowe można uzupełnić spacjami?
Loovjo,
Czy zgłaszanie błędu jest również liczone jako zwracanie wartości fałszywie?
Loovjo
@Loovjo, tak i tak
Daniel
Czy możemy założyć, że nie ma pustych linii?
anonimowy2
@ anonymous2, dane wejściowe nie będą puste
Daniel

Odpowiedzi:

0

Pyth - 72 bajty

Mam nadzieję, że złapałem wszystkie przypadki krawędzi. Będzie kompresować listę cukierków.

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

Pakiet testowy .

Maltysen
źródło
1

JavaScript (ES6), 221 218 216 212 208 205 201 bajtów

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)

Wypróbuj tutaj.

sbisit
źródło
Witamy w PPCG i świetna pierwsza odpowiedź! Niestety nie wierzę, że to jest ważne; zwraca wartość truthy dla Snick, ears|Titp myślę, że można rozwiązać ten problem przez dodanie .split('|')przed .indexOf.
ETHprodukcje
To jest teraz ważne.
Oliver Ni
@ETHproductions. Nie ears|Tstanowi to problemu, ponieważ w przypadkach testowych dozwolone są tylko litery. Masz jednak rację Snick.
sbisit
Możesz także użyć tej sztuczki, aby zapisać kilka bajtów.
ETHproductions
1

Rakieta 446 bajtów

(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))))))

Nie golfowany:

(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)))
            ))))

Testowanie:

(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"))

Wynik:

#t
#t
#t
#t
#t
#f
#f
#f
#f
#t
rnso
źródło
Myślę, że nazwałaś swój dorobek „Ungolfed”
Roman Gräf
Tak. Poprawiłem błąd. Dzięki.
rnso
1

JavaScript (ES6), 139 bajtów

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

Akceptuje dane wejściowe jako tablicę łańcuchów wypełnionych spacją.

Neil
źródło
0

R, 199 znaków

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)}

Dane wejściowe mają postać matrycy znaków.

matchdba o to, który to cukierek (sprawdza także wielkie litery).

Aby sprawdzić, czy litery są sekwencją „rosnącą” lub „malejącą”, musimy tylko sprawdzić, czy lokalizacje pierwszego znaku spacji (jeśli istnieje) w każdym wierszu rośnie lub maleje. Aby to zrobić, my

  • weź pierwszą lokalizację znaku spacji w każdym rzędzie, używając apply
  • weź diff. To może mieć jakieś zero, w przeciwnym razie powinno być albo wszystkie dodatnie, albo wszystkie ujemne
  • nazwij diff zi zabierz ze sobą produkt zewnętrzny. Jeśli diff miał mieszane wpisy dodatnie i ujemne, gdzieś w produkcie zewnętrznym pojawi się wpis ujemny. Jeśli tak, zwróć FAŁSZ.

Pamiętaj, że przypadki takie jak

"    i "
"   w x"
"  T   "

zwróci pusty wektor znaków (w szczególności nie „Twix”), ponieważ matchbędzie próbował dopasować „Twxi”.

JDL
źródło
0

Python 2.7, 254 bajty

Jestem pewien, że można więcej grać w golfa. Dane wejściowe to tablica wierszy 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

Wypróbuj tutaj!

TheInitializer
źródło
Możesz wziąć dane wejściowe jako tablicę / listę łańcuchów, więc nie ma potrzeby dzielenia go w pierwszym wierszu kodu.
Daniel