Mari bersiap-siap untuk Halloween

15

Saya tidak tahu tentang Anda semua, tetapi saya tidak mempersiapkan untuk Halloween - tidak pernah akan pernah - tetapi tetangga saya, jadi kami akan membantunya.

Dia butuh bantuan untuk mencari tahu merek permen mana yang dia miliki, tetapi dia memiliki banyak permen yang tidak akan bisa dia selesaikan sebelum Halloween.

Dia memiliki:

  • Snickers
  • Kit Kat
  • Starburst
  • GummyBears
  • Twix

Memasukkan

String multiline (atau bentuk wajar lainnya) yang hanya berisi huruf dan spasi.

Keluaran

Nilai palsu jika bukan permen yang valid, atau permen mana yang jika itu adalah permen.

Cara menentukan permen mana yang ada

Permen valid jika dikatakan salah satu merek di atas. Namun, ini tidak sesederhana itu, karena ini adalah permen yang valid:

K i t
       K a
           t

Permen yang valid adalah yang mengandung:

  • surat-surat itu disusun dari kiri ke kanan
  • huruf ditulis dengan benar
  • surat-surat, pergi dari kiri ke kanan, tidak baik naik dan turun
  • surat-surat dengan spasi dihapus dari salah satu merek di atas

Ini adalah , jadi kode terpendek dalam byte menang!

Contohnya

Kebenaran:

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
sumber
Bisakah input diisi dengan spasi?
Loovjo
Juga, apakah melempar kesalahan dianggap sebagai mengembalikan nilai palsu?
Loovjo
@ Loojo, ya dan ya
Daniel
Bisakah kita menganggap tidak ada garis kosong?
anonymous2
@ anonim2, input tidak akan kosong
Daniel

Jawaban:

0

Pyth - 72 byte

Saya harap saya menangkap semua kasus tepi. Akan mendasarkan kompres daftar permen.

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

Test Suite .

Maltysen
sumber
1

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

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)

Coba di sini.

sbisit
sumber
Selamat datang di PPCG, dan jawaban pertama yang bagus! Sayangnya, saya tidak percaya ini valid; ia mengembalikan nilai truthy untuk Snick, ears|T, dll saya pikir Anda dapat memperbaiki ini dengan menambahkan .split('|')sebelum .indexOf.
ETHproduk
Ini valid sekarang.
Oliver Ni
@ ETHproductions. Ini ears|Tbukan masalah karena hanya surat yang diizinkan dalam kasus uji. Namun, Anda benar, untuk Snick.
sbisit
Anda juga dapat menggunakan trik ini untuk menyimpan beberapa byte.
ETHproduk
1

Racket 446 byte

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

Tidak Disatukan:

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

Pengujian:

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

Keluaran:

#t
#t
#t
#t
#t
#f
#f
#f
#f
#t
juga
sumber
Saya pikir Anda memberi nama keluaran Anda "Tidak Diubah"
Roman Gräf
Iya. Saya telah memperbaiki kesalahan. Terima kasih.
rnso
1

JavaScript (ES6), 139 byte

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

Menerima input sebagai array string berlapis ruang.

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

Input dalam bentuk matriks karakter.

matchmengurus permen yang mana (itu memeriksa kapitalisasi juga).

Untuk memeriksa apakah huruf-huruf tersebut merupakan urutan "naik" atau "turun", kita hanya perlu memeriksa bahwa lokasi karakter non-spasi pertama (jika ada) di setiap baris meningkat atau menurun. Untuk melakukan ini, kita

  • ambil lokasi pertama karakter nonspace di setiap baris, menggunakan apply
  • ambil diff . Ini mungkin memiliki beberapa nol di dalamnya, jika tidak semuanya positif atau negatif
  • beri nama diff z, dan ambil produk luarnya dengan sendirinya. Jika diff memiliki entri campuran positif dan negatif, akan ada entri negatif di suatu tempat di produk luarnya. Jika demikian, kembalikan FALSE.

Perhatikan bahwa kasus suka

"    i "
"   w x"
"  T   "

akan mengembalikan vektor karakter kosong (khususnya bukan "Twix"), karena matchakan mencoba mencocokkan "Twxi".

JDL
sumber
0

Python 2.7, 254 byte

Saya yakin ini bisa bermain golf lebih banyak. Input adalah array garis 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

Coba di sini!

Penginisialisasi
sumber
Anda dapat mengambil input sebagai array string / daftar, sehingga tidak perlu membaginya di baris pertama kode Anda.
Daniel