Сколько Jimmys может соответствовать?


29

В этом простом, но забавном задании вас попросили определить, упадет ли Джимми с их платформы. Джимми имеет три части тела /, oи \расположены , как это

/o\

Платформы представлены с -. Джимми упадет со своей платформы, если у него есть две или более части тела, которые не находятся прямо над платформой.

Некоторые примеры:

   /o\
- -------

Джимми будет балансировать, так как все их части тела выше -.

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

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

 /o\
-- ----  --

Джимми будет балансировать, даже если они разделены между двумя платформами

  /o\
   -

Джимми не будет сбалансирован, так как две части тела не находятся над платформой.


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

Это поэтому ответы оцениваются в байтах, а целью является меньшее количество байтов.

Контрольные примеры

входные

-  -  -

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

Соответствующие выводы

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
---не сидит хорошо со мной тоже, пока я не работал над портом и понял , что они были не нужны. Думаю, я позвоню здесь один день, возьму пакет с банками и сам добавлю СМГ - не играл в те времена.
Лохматый

И теперь все остальные ответы используют одно и то же регулярное выражение.
Кер

8

Python 2 , 53 байта

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

Попробуйте онлайн!

Основано на регулярном выражении Арно . Жадно ищет все неперекрывающиеся подстроки длины-3 с двумя или более -. Хитрость заключается в том, `s`чтобы заключить входную строку в кавычки как заполнитель, чтобы оставить место для Jimmys, чтобы зависать на любом конце, как

/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-решении Арно. Я попробовал несколько разных методов, чтобы получить необходимые отступы по обе стороны от ввода, но все пришли одинаковой длины - все еще в поисках более короткого пути ...

û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

Попробуйте онлайн.

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


NN-1N
N
Nи завершающие пустые строки будут отброшены .

Из-за этого обычно .split("...",-1)используется, чтобы сохранить ВСЕ завершающие пустые строки, и я мог бы использовать его также и для этого ответа ( Попробуйте онлайн ). В этом случае, если изменить значение на, +0можно +10сэкономить два байта ,-1. :)



0

Древесный уголь , 25 байт

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

Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:

Pθ↖

Напечатайте платформу, не перемещая курсор, затем переместите курсор вверх и влево, так как это первая потенциальная позиция Джимми.

Fθ

Ищите столько Джимми, сколько есть платформ.

¿›№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.