Berapa banyak Jimmys yang bisa muat?

29

Dalam tantangan yang sederhana namun menyenangkan ini , Anda diminta menentukan apakah Jimmy akan jatuh dari platform mereka. Jimmy memiliki tiga bagian tubuh /, odan \diatur seperti ini

/o\

Platform diwakili dengan -. Jimmy akan jatuh dari platform mereka jika mereka memiliki dua atau lebih bagian tubuh yang tidak langsung di atas platform.

Beberapa contoh:

   /o\
- -------

Jimmy akan menyeimbangkan karena semua bagian tubuh mereka di atas a -.

   /o\
    ------   ---

Jimmy akan seimbang karena dua bagian tubuh berada di atas -s.

 /o\
-- ----  --

Jimmy akan menyeimbangkan meskipun mereka terbagi antara dua platform

  /o\
   -

Jimmy tidak akan seimbang karena dua bagian tubuh tidak berada di atas platform.


Tugas Anda adalah menulis sebuah program yang menggunakan platform sebagai wadah panjang yang hanya berisi -s dan s (misalnya string) dan menampilkan jumlah Jimmy yang dapat ditempatkan pada platform sehingga tidak ada yang akan jatuh dan tidak ada yang akan tumpang tindih. Seorang Jimmy mungkin memiliki salah satu bagian tubuh mereka di sebelah kiri awal senar atau kanan ujung senar.

Ini adalah sehingga jawaban diberi skor dalam byte dengan tujuan lebih sedikit.

Uji kasus

Input

-  -  -

- -
--
-- --
----
- -- --
------- -

Output masing-masing

0
0
1
1
2
2
2
3
Wisaya Gandum
sumber

Jawaban:

15

JavaScript (ES6),  45 41  40 byte

Disimpan 4 byte berkat @Shaggy

s=>(0+s+0).split(/.--|-.-|--./).length-1

Cobalah online!

Arnauld
sumber
1
41 byte
Shaggy
7
@Shaggy Terima kasih! Saya tahu ada sesuatu yang salah di sana, tetapi saya harus membantu istri saya pada tingkat Super Mario Galaxy sementara itu ... dan itu juga masalah tentang platform yang rusak. : p
Arnauld
2
mereka ---juga tidak cocok dengan saya, sampai saya mengerjakan port saya dan menyadari mereka tidak diperlukan. Pikir saya akan menyebutnya sehari di sini, ambil sekantong kaleng dan melemparkan pada SMG sendiri - belum memainkannya dalam usia.
Shaggy
Dan sekarang semua jawaban lainnya menggunakan regex yang sama.
Cœur
8

Python 2 , 53 byte

lambda s:len(re.findall('.--|-.-|--.',`s`))
import re

Cobalah online!

Berdasarkan regex Arnauld . Dengan rakus mencari semua substring-3 panjang non-tumpang tindih dengan dua atau lebih -. Trik yang harus dilakukan `s`untuk melampirkan string input dalam tanda kutip sebagai padding untuk meninggalkan ruang bagi Jimmys untuk menggantung di kedua ujung seperti

/o\/o\
'----'

Python 2 , 57 byte

f=lambda s:'--'in s[:3]*2and-~f(s[3:])or s>''and f(s[1:])

Cobalah online!

Membutuhkan format I / O murahan dari input yang sudah ada dalam tanda kutip. Output Falseuntuk 0.

Fungsi rekursif yang menempatkan masing-masing Jimmy pada posisi paling kiri diizinkan, dengan menempatkan Jimmy pada tiga karakter pertama jika mereka dapat menahan Jimmy, atau menghapus karakter pertama. Trik lucu adalah memeriksa apakah s[:3]mengandung dua atau lebih -dengan melakukan '--'in s[:3]*2, yang terdiri dari dua salinan s[:3]dan memeriksa dua yang berdekatan -.

Tidak
sumber
3

Perl 5 -p , 28 byte

Menggunakan metode yang sama dengan JavaScript @ Arnauld.

$_=@a=" $_ "=~/.--|-.-|--./g

Cobalah online!

Xcali
sumber
3

Japt , 16 byte

Berdasarkan solusi JS asli Arnauld. Saya mencoba beberapa metode berbeda untuk mendapatkan bantalan yang diperlukan di kedua sisi input tetapi semuanya masuk dengan panjang yang sama - masih mencari cara yang lebih pendek ...

ûUÊÄÄ è".--|-."ê

Menguji

ûUÊÄÄ è".--|-."ê     :Implicit input of string U
û                    :Centre pad with spaces to length
 UÊ                  :  Length of U
   ÄÄ                :  Add 1, twice
      è              :Count the occurrences of
       ".--|-."ê     :  ".--|-." palindromised, resulting in the RegEx /.--|-.-|--./g
Shaggy
sumber
3

Excel, 96 byte

A1= platform. Dimasukkan sebagai array, Formula Ctrl+ Shift+Enter

=SUM(IF(LEN(TRIM(MID(IF(MOD(LEN(A1),3)=1," ","")&A1,3*ROW(INDIRECT("A1:A"&LEN(A1)))-2,3)))>1,1))
remoel
sumber
3

05AB1E , 16 byte

ðì‚ε3ôʒ'-¢2@}g}à

Pasti bisa bermain golf .. Kadang-kadang menjengkelkan melihat semua jawaban regex ini dalam sebuah tantangan saat menggunakan 05AB1E, yang tidak memiliki regex apa pun. ;)

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

ðì            # Prepend a space before the (implicit) input
             # Pair it with the unmodified (implicit) input
   ε          # Map both to:
    3ô        #  Split them into parts of size 3
      ʒ       #  Filter these parts by:
       '-¢   '#   Where the amount of "-"
          2@  #   Is larger than or equal to 2
      }g      #  After the filter: take the length to get the amount of items left
            # After the map: get the maximum of the two
              # (which is output implicitly as result)
Kevin Cruijssen
sumber
2

Java 8, 41 byte

s->(0+s+10).split(".--|--.|-.-").length-1

Cobalah online.

Pelabuhan @Arnauld 's jawaban JavaScript , kecuali bahwa +0adalah +10untuk menguji memperbaiki kasus-kasus seperti ----. Ini diperlukan karena String#splitbawaan di Java akan menghapus Trailing empty Strings secara default. Ini dapat diubah dengan menambahkan parameter tambahan ke splitbuiltin (yang secara 0default di split-builtin dengan argumen String tunggal). Mengutip penggunaan parameter tambahan ini dari dokumen:


nn-1n
n
ndan membuntuti string kosong akan dibuang .

Karena itu, biasanya .split("...",-1)digunakan untuk mempertahankan SEMUA tertinggal String kosong, dan saya bisa menggunakannya untuk jawaban ini juga ( Coba online ). Dalam hal ini mengubah +0untuk +10menyimpan dua byte di atas ,-1, meskipun. :)

Kevin Cruijssen
sumber
0

Arang , 25 byte

Pθ↖Fθ¿›№KM-¹«⊞υωM³→»→⎚ILυ

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

Pθ↖

Cetak platform tanpa menggerakkan kursor, lalu gerakkan kursor ke atas dan ke kiri karena itu adalah posisi Jimmy potensial pertama.

Fθ

Carilah Jimmies sebanyak ada posisi platform.

¿›№KM-¹

Periksa untuk melihat apakah ada lebih dari satu platform di posisi ini.

«⊞υω

Jika demikian maka catat posisi Jimmy yang valid ...

M³→»

... dan pindahkan tiga karakter ke kanan sehingga Jimmies tidak tumpang tindih.

Kalau tidak, posisi potensial Jimmy berikutnya adalah satu karakter di sebelah kanan.

⎚ILυ

Bersihkan platform dan hasilkan hitungan posisi yang ditemukan.

Neil
sumber
0

Elm 0,19, 108 byte

import Regex as R
f p=List.length<|R.find(Maybe.withDefault R.never<|R.fromString".--|-.-|--.")(" "++p++" ")

Berdasarkan regex dalam jawaban JavaScript Arnauld . Verifikasi semua kasus uji di sini .

Solusi alternatif tanpa regex, lebih lama secara signifikan pada 171 byte :

f p=(String.foldl(\z{x,y,s,c}->let(t,d)=if s<1&&List.length(List.filter((==)'-')[x,y,z])>1 then(2,c+1)else(max 0 s-1,c)in{x=y,y=z,s=t,c=d}){x=' ',y=' ',s=0,c=0}(p++" ")).c

Verifikasi semua kasus uji di sini .

Ketidakseimbangan
sumber