Может ли Джимми повеситься на веревке?


18

Еще один вызов Джимми его оригинальным отцом. Смотрите эти другие прекрасные проблемы .


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

Один из таких трюков висит на веревках. Вот пример веревки, с которой Джимми мог повесить:

            ||
            ||
            ||
            ||
            ||
            ||

Когда Джимми висит на веревке, это выглядит так:

            ||
            ||
           /o\
            ||
            ||
            ||

Он может висеть слева или справа от веревки, так что это:

            ||
            ||
            ||
            /o\
            ||
            ||

также действует. Но он не может висеть только на одной части тела, так что-нибудь вроде этого:

            ||
            ||
            ||
          /o\|
            ||
            ||

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

Кроме того, Джимми не любит висеть на дне веревки - это пугает его - вот так:

            ||
            ||
            ||
            ||
            ||
            /o\

является недействительным.

Соревнование

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

Специфика

  • Напишите программу, которая принимает данные. Это может быть через функцию или любой другой подходящий метод ввода.

    1. На входе должна быть сцена из одного Джимми и веревки, как показано выше.
  • Программа должна выводить на консоль истинное или ложное значение в зависимости от того, может ли Джимми держаться за веревку или, если он упадет с веревки, соответственно.

  • Критерии, по которым Джимми мог повесить на веревке:

    1. Две его части тела находятся на веревке.

    2. Он не на дне веревки.

    3. Он не парит в воздухе.

  • Вы можете предположить, что веревка будет прямой, состоит из ||сегментов и будет длиннее одного символа в высоту.

  • Вы можете предположить, что в вашей сцене будет присутствовать одна целая веревка и один особенный Джимми, не больше и не меньше.

  • Вы можете предположить, что в нижней части веревки не будет завершающих строк.

  • Вы должны покрыть любое количество начальных или конечных мест до и после веревки.

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

           ||
           ||
           ||                 TRUTHY
           /o\
           ||
           ||


            ||
            ||
          /o\|                FALSY
            ||
            ||


        ||
       /o\                    TRUTHY
        ||


            ||
           /o\                FALSY


         /o\
          ||                  TRUTHY


            ||
            ||
       /o\  ||                FALSY
            ||
            ||

счет

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

Leaderboard

Вы можете просмотреть список лидеров этого поста, развернув виджет / фрагмент ниже. Чтобы ваше сообщение было включено в рейтинг, вам нужен заголовок ( # header text) со следующей информацией:

  • Название языка (заканчивайте его запятой ,или тире -), а затем ...

  • Количество байтов, как последнее число в заголовке.

Например, JavaScript (ES6), 72 bytesдопустимо, но Fortran, 143 bytes (8-bit)недопустимо, потому что число байтов не является последним числом в заголовке (ваш ответ будет распознан как 8 байтов - не используйте это в своих интересах).

<!-- Run the snippet to see the leaderboard. Report any bugs to @ozewski on Github. -->    <iframe src="https://ozewski.github.io/ppcg-leaderboard/?id=187759" width="100%" height="100%" style="border:none;">Oops, your browser is too old to view this content! Please upgrade to a newer version of your browser that supports HTML5.</iframe><style>html,body{margin:0;padding:0;height:100%;overflow:hidden}</style>


1
Всегда ли у веревки будет одинаковое количество пробелов перед ней, или она может варьироваться?
mprogrammer

@ Максвелл Это может варьироваться.
connectyourcharger

Можем ли мы считать входные данные чем-то вроде списка, где каждая строка представляет собой отдельную строку, или это должна быть одна строка?
mprogrammer

19
Джимми должен действительно взять отпуск
Луис Мендо

7
@LuisMendo Джимми посвящен тому, что он делает!
connectyourcharger

Ответы:


13

Japt , 5 байт

Я думаю, что это правильно; Я работаю 16 часов подряд и почти не знаю своего имени, поэтому не удивлюсь, если это не так!

Õø|io

Попытайся

Õø|io     :Implicit input
Õ         :Transpose
 ø        :Contains?
  |io     :  "|" prepended with "o"

2
16 часов? Теперь это посвящение!
connectyourcharger

2
Подожди, чтобы тебе понадобилось 16 часов, чтобы записать 5 байтов? ;-)
Cullub

Похоже, вам нужен перерыв (тот же совет касается маленького Джимми!).
ihavenoidea

@connectyourcharger, нет, это моя жизнь! Посвящение будет делать это без перерыва. Что я и сделал!
Лохматый

1
@ihavenoidea, Пффф! Высплюсь на том свете!
Лохматый

22

Python 2 или 3 ,  33  30 байт

-3 благодаря Максвеллу

lambda l:'o'in map(max,l[:-1])

Безымянная функция, принимающая список строк

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

Как?

Джимми должен скрывать участок веревки, который не является нижним.

lambda l:'o'in map(max,l[:-1])
lambda l:                      # a function taking l (the lines as strings)
                       l[:-1]  # strip off the last line
               map(max,      ) # maximum of each line (where '|'>'o'>'\'>'/'>' ')
         'o'in                 # was 'o' one of them? (hence Jimmy obscured all the rope)

Сохраните три байта:lambda l:'o'in map(max,l[:-1])
mprogrammer

О, очень проницательный - спасибо!
Джонатан Аллан

Это очень умное использование значений ASCII. Ницца.
Фонд Моника иск

16

Python 2, 28 байт

lambda x:"o', '|"in`zip(*x)`

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

Как это работает? Он принимает входные данные в виде списка строк, и zip объединяет строку. Джимми остается на веревке, если есть "|" ниже "o", поэтому этот код объединяет все строки и проверяет, есть ли "o", за которым следует "|".

Аннотированный код:

lambda x: # Creates an anonymous function that takes one argument
  "o', '|" # If this substring is in the zip object, then Jimmy's "o" is above a "|"
    in
    `    # Back quotes change the object into its string representation
    zip(*x)` # Joins the lines together

(Старый ответ) Python 2 или 3, 39 байт

lambda x:1-all("|"in i for i in x[:-1])

Функция, которая принимает входные данные в виде списка строк, каждая строка представляет собой отдельную строку.

-11 байт благодаря xnor! -2 байта благодаря Джонатану Аллану!

Попробуйте онлайн! (Если вы хотите попробовать больше тестовых случаев, просто поставьте «.» После каждого набора строк в поле ввода.)

Как это работает? Хорошо, если Джимми полностью на веревке, то в этой строке не будет "|" персонажи. Поэтому мы можем проверить каждую строку, и если мы найдем любую без "|" персонажи, тогда мы знаем, что Джимми может остаться на веревке. Однако Джимми не может висеть на дне веревки; поэтому мы не включаем последнюю строку в наш чек. Если последняя строка - это просто другая часть веревки, то это не имеет значения, потому что мы все равно найдем верную строку выше, но если последняя строка с Джимми, то она не найдет строку без "|" в любом месте, и вернет Ложь.


Можете ли вы сделать это без проверки, что в строке есть «/»?
xnor

@xnor Да! -11 байт
mprogrammer

1
Спасти пару вот так:lambda x:1-all("|"in i for i in x[:-1])
Джонатан Аллан

1
Ой, ты был быстрее :)
Даниил Тутубалин

1
@KlaymenDK Функция перебирает x [: - 1], а не x. x [: - 1] - это все элементы списка, кроме последнего, потому что в Python вы можете использовать отрицательные индексы. Следовательно, он (правильно) возвращает ложный результат, если Джимми находится у основания веревки.
mprogrammer

8

Желе ,  9 7  6 байт

Ṗ<”|ṀẠ

Монадическая ссылка, принимающая список строк

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

Как?

Джимми должен скрывать участок веревки, который не является нижним.

Ṗ<”|ṀẠ - Main Link: list of lines of characters
Ṗ      - remove last line
  ”|   - pipe character
 <     - less than? (vectorises) - Note that all other characters are
    Ṁ  - maximum
     Ạ - all?

1
Мне так странно писать эти задания о Джимми. Это начинает заставлять вас чувствовать себя странно, когда вы представляете, как несколько Джимми свисают с одной веревки.
connectyourcharger

1
@connectyourcharger Предвещает?
отрицательное семь

@negativeseven Возможно. Я уже рассмотрел мета-сообщество вики, чтобы проиндексировать все сообщения Джимми.
connectyourcharger

1
Девять байтов, и еще раз, мы все еще узнаем, как кто-то может умереть.
IMustBeSomeone

1
" Note that all other characters are [less than '|']"?
Эрик Outgolfer


5

мозговой трах, 79 64 байта

>>+<<,[----------[<]>>[.-]+<[>-]+[---------<-->]<[<]>>[-]<[>]<,]

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

Выводит байт 0x01 для правды и ничего для фальши.

Z: 0
A: input
B: 0
C: has no | been found on this line?

>>+<<                       initialize C to 1
,[                          loop over each char

  ----------                set A to 0 if input was \n
  [<]>>                     move to C if input was \n; B otherwise
  [                         if input was \n and C is true
    .-                      output 1
  ]

  +                         this will reinitialize C to 1 if input was \n
                            but also clobber B with 1 if it wasn't
                            now we have { 0   0   0  (1)} if input was \n;
                                        { 0   _  (1)  _ } otherwise
  <[>-]                     clear own cell if the one to the left is positive
                            this yields { 0   0  (0)  1 } and
                                        { 0   _  (0)  _ } as desired

  +[---------<-->]          set A to 0 if input was |
  <[<]>>                    move to C if input was |; B otherwise
  [-]                       zero out current cell: clears C if input was |
  <[>]<                     realign pointer onto A

,]                          break on end of input


4

05AB1E , 5 байтов

Çü%àθ

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

Ç         # convert the input to a 2D array of codepoints
 ü%       # pairwise modulo (vectorized)
   à      # maximum (*not* vectorized, returns a single number)
    θ     # tail (last digit)

Единственные символы, которые могут появиться во вводе \o/ |, с соответствующими кодовыми точками 92, 111, 47, 32, 124 (нет новых строк, поскольку мы решили принять ввод как массив строк). Возможные результаты при модуляции двух из этих чисел: 0, 13, 15, 17, 19, 28, 30, 32, 45, 47, 92, 111. 111 является самым большим из них, а также единственным, который заканчивается на 1 таким образом, код будет выводить правдиво, если и только если в списке присутствует 111 (только 1 верен в 05AB1E). 111 - это 111 ( o)% 124 ( |), и это происходит только в том случае, если на входе есть знак « oа» |.


1
Очень хорошо с попарно по модулю.
Кевин Круйссен



2

JavaScript, 39 33 байта

Спасибо @Daniil Tutubalin за игру в 2 байта

x=>!!x.match(/^( *)\/[^|]*\n/m)

Это соответствует любой линии, которая не является линией, где появляется его левая рука, и ни одна из веревок не показывает.

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


Похоже, что он потерпит неудачу, если он окажется у подножия веревки
fəˈnɛtɪk

Он должен потерпеть неудачу, если он внизу, верно? Потому что Джимми падает, если он находится внизу веревки
mprogrammer

Я имею в виду, что когда я положил его на дно веревки, твоя функция по какой-то причине вернулась 1
fəˈnɛtɪk

Хм, тогда неважно.
mprogrammer

1
Как насчет /^ *.o. *\n/?
Чт

2

/// , 53 50 байт

/~/\/\~/\/o\\/1~1 /1~ 1/1~|1~/1|~/|~/1.~/ ~/.~/
~.

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

Поскольку нет другого способа получить ввод в ///, он жестко запрограммирован:

/~/\/\~/\/o\\/1~1 /1~ 1/1~|1~/1|~/|~/1.~/ ~/.~/
~<INPUT HERE>.

Объяснение:

Общий подход состоит в том, чтобы заменить Джимми унарной единицей, а затем удалить его из всех ситуаций, где он находится в опасности. Если он выживет, его выводят. Если он этого не делает, то ничего не происходит. Символ ~в коде является заменой //, которая позволяет сократить код на 3 байта. Они опущены в объяснении.

/{/\//
/}/\/\//

          {The top two lines allow me to leave comments without disturbing the code.}

/\/o\\/1/ {Replace Jimmy with a 1.}
/1 /1/    {Get rid of any spaces in front of Jimmy. This moves Jimmy towards the rope from the left.}
/ 1/1/    {Get rid of any spaces after Jimmy. This moves Jimmy towards the rope from the right.}

/|1//     {If Jimmy is touching the rope, remove him and the rope.}
/1|//     {This is based on the observation that in all cases where Jimmy is safe, there is no visible rope on his line.}


/|//      {Remove any remaining rope. If Jimmy was touching a rope, it's already too late for him.}
/1.//     {This handles the case where Jimmy is at the bottom of the rope (hence the period at the end).}


/ //      {The remaining lines clean up the output.}
/.//
/
//

           ||
           ||
           ||
           /o\
           ||.

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


2

Ruby 2.5.5, 22 байта

->x{x.pop;!x.all? /\|/}

Ожидается массив строк. Требуется минимум версии 2.5.5, потому что это когда Array#all?(pattern)было добавлено.

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




1

Сетчатка , 9 байт

m`^[^|]+^

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

Я никогда раньше не программировал в Retina, но насколько я могу судить, это работает. Это регулярное выражение, которое находит строку, содержащую (1) начало ввода, (2) нет «|» символы и (3) перевод строки.

Людям, более знакомым с регулярными выражениями или Retina, рекомендуется предлагать свои предложения. -2 байта благодаря Нейлу!


Две альтернативы: 1) Удалите, \nпотому что новая строка не является |и поэтому будет совпадать в любом случае, а финальной будет ^достаточно, чтобы убедиться, что вы действительно нашли новую строку . 2) Используйте вместо того, чтобы \nубрать след, и удалите трейлинг ^(потому что это всегда верно после новой строки в многострочном режиме).
Нил


1

Befunge-98 (PyFunge) , 26 24 байта

]~:a-!#v_' `+
^_-3q#$<
@

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

Выход с кодом возврата 3, если \n встречается, а последняя строка содержит 3 непробельных символа, в противном случае завершается с кодом возврата 0 в EOF. Таким образом, это зависит от последней строки, не содержащей завершающий перевод строки.

расчлененный

]~                     :a-!#v_                ' `+
 Read character,      Branch downwards if   Increment counter on 
 branch up (and        equal to 10 ('\n')   the stack if greater
 loop around) if                            than 32 (' ') and
 end of stream                              implicitly loop

^_-3q#$<                    <
 Return with code 3
 if counter is equal to 3,
 otherwise reset counter
 and return to beginning

@
 Return with exit
 code 0

1

05AB1E (наследие) , 6 байтов

ζJ„o|å

Порт @Shaggy 's Japt ответа .

Ввод в виде списка строк.

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

Объяснение:

ζ       # Zip/transpose the (implicit) strings in the input-list, with space as filler
        # (NOTE: zip/transpose doesn't work on string-list in the new version of 05AB1E,
        #  which is why we use the legacy version)
 J      # Join these zipped/transposed lines together to a single string
  o  # And check if it contains the string "o|"
        # (after which the result is output implicitly)


1

Вяз 0,19, 68 байт

f r=List.any(not<<String.contains"|")(List.take((List.length r)-1)r)

Принимает ввод в виде списка строк. Независимо от последней строки, он проверяет, есть ли'|' в которых подразумевая, что веревка полностью покрыта Джимми.

Проверьте все контрольные примеры здесь .




0

Пирет, 79 байт

{(l):all2({(r,n):string-char-at(n,string-index-of(r,"o") == "|")},l,link(0,l))}

Ожидает массив строк в виде строк. Делает копию, link(0,l)где все строки сдвинуты вниз на одну. Проходит через каждую строку rи nгде n - строка ниже r. Проверяет, что если тело Джимми "o"находится в каком-то положении, то в ряду под ним есть труба (то есть Джимми висит на веревке, а не внизу).

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.