Kaç tane Jimmys sığabilir?


29

Gelen bu basit ama eğlenceli meydan , Jimmy'in onların platform düşeceği olmadığını belirlemek istendi. Jimmy üç gövde parçaları vardır /, ove \bu şekilde düzenlenmiş

/o\

Platformlar ile temsil edilir -. Jimmy doğrudan platformun üstünde olmayan iki veya daha fazla vücut parçasına sahipse platformlarından düşecektir.

Bazı örnekler:

   /o\
- -------

Tüm vücut kısımları a'nın üstünde olduğu için Jimmy dengeler -.

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

İki vücut kısmı -s'nin üstünde olduğu için Jimmy dengede kalacak .

 /o\
-- ----  --

İki platform arasında bölünmüş olsalar bile Jimmy dengeler

  /o\
   -

İki vücut parçası bir platformun üstünde olmadığından Jimmy dengesini almayacak


Göreviniz, sadece -s ve s (örneğin bir dize) içeren ve bir platformun içine yerleştirilmiş bir konteyner olarak alan ve hiçbirinin düşmeyeceği ve hiçbirinin düşmeyeceği şekilde platforma yerleştirilebilecek Jimmys sayısını veren bir program yazmaktır. üst üste gelmek. Bir Jimmy vücut bölümlerinden birini ipin başlangıcının solunda veya ipin ucunun sağında olabilir.

Bu olduğundan cevaplar bayt cinsinden daha az bayt ile hedeflenir.

Test durumları

Girdiler

-  -  -

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

İlgili çıkışlar

0
0
1
1
2
2
2
3

Yanıtlar:


15

JavaScript (ES6),  45 41  40 bayt

@Shaggy sayesinde 4 bayt kaydedildi

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

Çevrimiçi deneyin!



7
@Shaggy Teşekkürler! Orada bir şeylerin yanlış olduğunu biliyordum, ama bu arada karıma bazı Super Mario Galaxy seviyelerinde yardım etmek zorunda kaldım ... ve bu aynı zamanda kırık platformlarla ilgili bir problemdi. : p
Arnauld,

2
---Benim port üzerinde çalışan ve onlar gerekli gerçekleşmiştir kadar ya benimle iyi oturan değildi. Burada bir gün arayacağım, bir kutu teneke kutu alacağım ve SMG'yi kendim fırlatacağımı düşünüyorum.
Shaggy,

Ve şimdi diğer tüm cevaplar aynı regex kullanıyor.
Julur

8

Python 2 , 53 bayt

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

Çevrimiçi deneyin!

Arnauld'un regexine dayanarak . Açgözlülükle, örtüşmeyen tüm uzunluk-3 alt dizgilerini iki veya daha fazla ile arar -. Bir `s`giriş, Jimmys gibi iki tarafta takılmak için yer bırakmak için giriş dizesini tırnak içine doldurmak için yapmaktır .

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

Python 2 , 57 bayt

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

Çevrimiçi deneyin!

Zaten tırnak içinde girişin peynirli bir G / Ç formatı gerektirir. False0 için çıkışlar .

Her Jimmy'yi izin verilen en sol konuma yerleştiren, Jimmy'yi tutabilirlerse ilk üç karakterin üzerine yerleştirerek veya ilk karakteri başka şekilde silerek tekrarlayan bir işlev. Bir şirin hile olmadığını kontrol etmektir s[:3]iki veya daha fazlasını ihtiva -yaparak '--'in s[:3]*2, iki kopya birleştirir olan s[:3]iki bitişik ve kontroller -.



3

Japt , 16 bayt

Arnauld'un orijinal JS çözümüne dayanarak. Girişin her iki tarafındaki gerekli dolguyu elde etmek için birkaç farklı yöntem denedim ama hepsi aynı uzunlukta geldi - yine de daha kısa bir yol aradılar ...

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

Dene

û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

3

Excel, 96 bayt

A1= platform. Dizi formülü Ctrl+ Shift+ olarak girildiEnter

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

3

05AB1E , 16 bayt

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

Kesinlikle golf oynayabilir .. Bazen, her türlü regex eksik olan 05AB1E kullanırken tüm bu regex cevaplarını zorlukla görmek can sıkıcıdır. ;)

Çevrimiçi deneyin veya tüm test durumlarını doğrulayın .

Açıklama:

ðì            # 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)



2

Java 8, 41 bayt

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

Çevrimiçi deneyin.

Port @Arnauld 'ın JavaScript cevap dışında +0olduğu +10gibi düzeltme test durumlarda ----. Bu gereklidir, çünkü String#splitJava'daki yerleşik öntanımlı boş Dizeleri varsayılan olarak kaldıracaktır. Bu, ilave edilerek değiştirilebilir için ek bir parametre splityerleşiği (olup 0, varsayılan olarak split, tek bir String bağımsız değişken ile -builtin). Bu ek parametrenin kullanımını dökümanlardan alıntılamak için:


nn-1n
n
nve sondaki boş dizeler atılır .

Bu nedenle, genellikle TÜM izleyen boş Dizeleri .split("...",-1)korumak için kullanılır ve bu cevabı da kullanabilirdim ( Çevrimiçi deneyin ). Değişen Bu durumda etmek üzerine iki bayt kaydeder olsa. :)+0+10,-1



0

Kömür , 25 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Açıklama:

Pθ↖

İmleci hareket ettirmeden platformu yazdırın, ardından imleci yukarı hareket ettirin ve ilk potansiyel Jimmy konumu olarak sola hareket ettirin.

Fθ

Platform pozisyonları olduğu kadar çok Jimmy arayın.

¿›№KM-¹

Bu konumda birden fazla platform parçası olup olmadığını kontrol edin.

«⊞υω

Öyleyse geçerli bir Jimmy pozisyonuna dikkat edin ...

M³→»

... ve Jimmy'lerin üst üste gelmemesi için üç karakteri sağa hareket ettirin.

Aksi halde bir sonraki potansiyel Jimmy pozisyonu sağdaki bir karakterdir.

⎚ILυ

Platformu temizleyin ve bulunan konumların sayısını belirtin.



0

Elm 0.19, 108 bayt

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

Arnauld 'un JavaScript cevabındaki regex ' e dayanarak . Tüm test durumlarını burada doğrulayın .

Düzenli olmayan alternatif çözüm, 171 baytta önemli ölçüde daha uzun :

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

Tüm test durumlarını burada doğrulayın .

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.