Cadılar Bayramı için hazırlanalım


15

Hepinizi bilmiyorum ama Cadılar Bayramı için hazırlık yapmıyorum –– asla yapmayacak –– ama komşum öyle, ona yardım edeceğiz.

Hangi şeker markasına sahip olduğunu bulmak için yardıma ihtiyacı var, ancak Cadılar Bayramı'ndan önce bitiremeyeceği çok şeker var.

Onun:

  • Snickers
  • Kit Kat
  • Yıldız patlaması
  • GummyBears
  • Twix

Giriş

Yalnızca harf ve boşluk içeren çok satırlı bir dize (veya başka bir makul biçim).

Çıktı

Geçerli bir şeker değilse ya da şekerse hangi şeker olduğu yanlış bir değer.

Hangi şekere nasıl karar verilir

Bir şeker, yukarıdaki markalardan birinde söylerse geçerlidir. Ancak, o kadar basit değil, çünkü bu geçerli bir şeker:

K i t
       K a
           t

Geçerli bir şeker:

  • harfler soldan sağa doğru
  • harfler doğru şekilde büyük yazılır
  • soldan sağa doğru giden harfler hem yükselip hem de alçalmaz
  • boşluk kaldırılmış harfler yukarıdaki markalardan birini oluşturur

Bu , bayt kazanır çok kısa kod kazanır!

Örnekler

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

Giriş boşluklarla doldurulabilir mi?
Loovjo

Ayrıca, hata atmak hatalı bir değer döndürmek olarak sayılır mı?
Loovjo

@Loovjo, evet ve evet
Daniel

Boş satır olmadığını varsayabilir miyiz?
Anonim2

@ anonymous2, giriş boş olmayacak
Daniel

Yanıtlar:


0

Pyth - 72 bayt

Umarım tüm uç davaları yakalarım. Şeker listesini sıkıştırır.

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

Test Takımı .


1

JavaScript (ES6), 221 218 216 212 208 205 201 bayt

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)

Burada deneyin.


PPCG'ye hoş geldiniz ve harika ilk cevap! Ne yazık ki, bunun geçerli olduğuna inanmıyorum; bunun için bir truthy değeri döndürür Snick, ears|Tvb sana ekleyerek bu sorunu giderebilirsiniz düşünüyorum .split('|')önce.indexOf .
ETHproductions 23:16

Bu şimdi geçerlidir.
Oliver Ni

@ETHproductions. Bu ears|Tsorun değildir, çünkü test durumlarında yalnızca harflere izin verilir. Ancak haklısın, çünküSnick .
sbisit


Bu numarayı birkaç bayt kaydetmek için de kullanabilirsiniz .
ETHproductions

1

Raket 446 bayt

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

Test yapmak:

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

Çıktı:

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

Sanırım çıktısını "Ungolfed" olarak adlandırdın
Roman Gräf

Evet. Hatayı düzelttim. Teşekkürler.
rnso

1

JavaScript (ES6), 139 bayt

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

Girişi boşluk dolgulu dizeler dizisi olarak kabul eder.


0

R, 199 karakter

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

Girdi bir karakter matrisi biçimindedir.

matchhangi şekere dikkat eder (büyük harf kullanımını da kontrol eder).

Harflerin "artan" veya "azalan" bir sıra olup olmadığını kontrol etmek için, her satırdaki ilk boşluk olmayan karakterin (varsa) konumlarının arttığını veya azaldığını kontrol etmemiz gerekir. Bunu yapmak için, bu biz

  • her satırda boşluk olmayan bir karakterin ilk konumunu kullanarak apply
  • al diff . Bunun içinde sıfır olabilir, aksi takdirde hepsi pozitif veya negatif olmalıdır
  • adını verin diff zve dış ürünü kendisiyle birlikte alın. Farkın pozitif ve negatif girdileri karışık olsaydı, dış ürününde bir yerde negatif bir giriş olacaktır. Öyleyse, FALSE değerini döndürün.

Aşağıdaki gibi durumlarda

"    i "
"   w x"
"  T   "

match"Twxi" ile eşleşmeye çalışacağından boş bir karakter vektörü (özellikle "Twix" değil) döndürür.


0

Python 2.7, 254 bayt

Eminim bu daha çok golf edilebilir. Girdi, bir satır dizisidir 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

Burada deneyin!


Girişi dize dizisi / listesi olarak alabilirsiniz, böylece kodunuzun ilk satırına bölmeye gerek yoktur.
Daniel
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.