Скільки Джиммі може вмістити?


29

У цьому простому, але веселому виклику вас попросили визначити, чи потрапить Джиммі з їх платформи. Джиммі має три частини тіла /, oі \розташовані , як це

/o\

Платформи представлені за допомогою -. Джиммі впаде зі своєї платформи, якщо у них дві або більше частин кузова, які не знаходяться безпосередньо над платформою.

Деякі приклади:

   /o\
- -------

Джиммі врівноважить, оскільки всі їх частини тіла вище а -.

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

Джиммі буде врівноваженим, оскільки дві частини тіла вище -s.

 /o\
-- ----  --

Джиммі врівноважить, хоча вони розділені між двома платформами

  /o\
   -

Джиммі не врівноважує, оскільки дві частини кузова не знаходяться вище платформи.


Ваше завдання - написати програму, яка сприймає платформу як подовжений контейнер, що містить тільки -s і s (наприклад, рядок) і виводить кількість Джимміс, які можуть бути розміщені на платформі, так що жоден з них не впаде, і жоден з них не стане перекриття. Джиммі може мати одну з частин тіла зліва від початку струни або праворуч від кінця струни.

Це тому відповіді набираються у байтах, меншою метою яких є байт.

Тестові справи

Вхідні дані

-  -  -

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

Відповідні виходи

0
0
1
1
2
2
2
3

Відповіді:


15

JavaScript (ES6),  45 41  40 байт

Збережено 4 байти завдяки @Shaggy

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

Спробуйте в Інтернеті!



7
@Shaggy Дякую! Я знав, що там щось не так, але я тим часом повинен був допомогти дружині на якомусь рівні Super Mario Galaxy ... і це також було проблемою щодо зламаних платформ. : p
Арнольд

2
теж ---не сиділа зі мною добре, поки я не працював на своєму порту і зрозумів, що вони не потрібні. Подумайте, я зателефоную це день, візьміть мішечок з банками і накиньте на SMG - я ще не грав у нього.
Кудлатий

А тепер усі інші відповіді використовують той самий регулярний вираз.
Cœur

8

Python 2 , 53 байти

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

Спробуйте в Інтернеті!

На основі регексу Арнольда . Жадібно шукає всі підрядки, що не перетинаються, довжиною-3 з двома або більше -. Хитрість полягає в тому, `s`щоб укласти рядок введення в лапки як підкладку, щоб залишити місце для того, щоб Джимміс звисав на будь-якому кінці, як

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

Python 2 , 57 байт

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

Спробуйте в Інтернеті!

Потрібен сирний формат вводу / виводу вводу, який уже є в лапках. Виходи Falseдля 0.

Рекурсивна функція, яка розміщує кожного Джиммі на лівому лівому дозволеному положенні, або розміщуючи Джиммі над першими трьома символами, якщо вони можуть утримувати Джиммі, або іншим чином видаляючи перший символ. Милий трюк - перевірити, чи s[:3]містить два чи більше -, виконуючи дії '--'in s[:3]*2, що поєднує дві копії s[:3]та перевіряє наявність двох сусідніх -.



3

Japt , 16 байт

На основі оригінального рішення JS від Arnauld. Я спробував декілька різних методів, щоб отримати необхідну підкладку з будь-якої сторони вводу, але всі вийшли однаковою довжиною - все ще шукаючи коротший шлях ...

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

Перевірте це

û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 байт

A1= платформа. Введено як масив Формули 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))

3

05AB1E , 16 байт

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

Однозначно можна пограти в гольф. Іноді прикро бачити всі ці відповіді на регулярні виклики як виклик при використанні 05AB1E, якому не вистачає регулярного вираження. ;)

Спробуйте в Інтернеті або перевірте всі тестові випадки .

Пояснення:

ðì            # 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 байт

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

Спробуйте в Інтернеті.

Порт відповіді JavaScript @Arnauld , за винятком того +0, +10щоб виправити тестові випадки ----. Це необхідно, тому що String#splitвбудований на Java за замовчуванням видалить порожні рядки. Це можна змінити, додавши до splitвбудованого додаткового параметра (який 0за замовчуванням в split-builtin з одним аргументом String). Щоб процитувати використання цього додаткового параметра в документах:


nn1n
n
nі порожні рядки будуть відкинуті .

Через це, як правило .split("...",-1), використовується для збереження ВСІХ кінцевих порожніх рядків, і я міг би використовувати його і для цієї відповіді ( Спробуйте в Інтернеті ). В цьому випадку , змінюють , +0щоб +10заощадити два байта на протязі багатьох ,-1, хоча. :)



0

Вугілля деревне , 25 байт

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

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Пояснення:

Pθ↖

Роздрукуйте платформу, не переміщуючи курсор, потім перемістіть курсор вгору та вліво, оскільки це перша потенційна позиція Джиммі.

Fθ

Шукайте стільки ж Jimmies, скільки є позицій платформи.

¿›№KM-¹

Перевірте, чи є в цій позиції більше однієї частини платформи.

«⊞υω

Якщо так, то зазначайте дійсну позицію Джиммі ...

M³→»

... і перемістіть три символи праворуч, щоб Джиммі не перетиналися.

Інакше наступна потенційна позиція Джиммі - це один символ праворуч.

⎚ILυ

Очистіть платформу та виведіть кількість виявлених позицій.



0

В'яз 0,19, 108 байт

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

На основі виразів у відповіді JavaScript Арнольда . Перевірте всі тестові випадки тут .

Альтернативне рішення без регулярного вираження, значно довше на 171 байт :

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

Перевірте всі тестові випадки тут .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.