Чи може Джиммі повісити на мотузку?


18

Ще один виклик Джиммі від його оригінального батька. Дивіться інші чудові виклики .


Як ви всі знаєте, останнім часом ми спостерігаємо виклики, пов’язані з Джиммі на платформах. Тепер Джиммі є акробатом, про який я вже згадував, і він має інші трюки в рукаві.

Один з таких трюків - підвішування мотузок. Ось приклад мотузки, на яку Джиммі міг повісити:

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

Коли Джиммі висить на мотузці, це виглядає приблизно так:

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

Він може висіти ліворуч або праворуч від мотузки, так що:

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

також діє. Але він не може звисати лише однією частиною тіла, тому щось подібне:

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

недійсний. Зауважте, що коли він висить на одній частині тіла, видно другу половину мотузки, оскільки Джиммі не прикриває її.

Також Джиммі не любить висіти на дні мотузки - це його лякає - ось так:

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

недійсний.

Змагання

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

Специфіка

  • Напишіть програму, яка бере введення. Це може бути через функцію або будь-який інший відповідний метод введення.

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

  • Критерії, за якими Джиммі може повісити на мотузку:

    1. Дві його частини тіла знаходяться на мотузці.

    2. Він не на дні мотузки.

    3. Він не плаває в повітрі.

  • Ви можете припустити, що мотузка буде прямою, складеною з ||сегментів, і буде довшою, ніж один символ.

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

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

  • Ви повинні покрити будь-яку кількість провідних або кінцевих проміжків до і після мотузки.

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

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


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


        ||
       /o\                    TRUTHY
        ||


            ||
           /o\                FALSY


         /o\
          ||                  TRUTHY


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

Оцінка балів

Це , тому найнижчий бал у байтах виграє приблизно через тиждень.

Таблиця лідерів

Ви можете переглянути таблицю лідерів цієї публікації, розгорнувши віджет / фрагмент нижче. Для того, щоб ваша публікація була включена до рейтингу, вам потрібен заголовок ( # 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

@Maxwell Це може змінюватися.
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, ні, це моє життя! Посвята буде робити це без перерви. Що я зробив!
Shaggy

1
@ihavenoidea, Pfft! Я спатиму, коли помру!
Shaggy

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 Yup! -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 '|']"?
Erik the Outgolfer


5

мозковий ебать, 79 64 байт

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

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

Виводить 0x01 байт для truthy і нічого для хибного.

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 , таким чином код виводить truthy тоді і лише тоді, коли в списку присутній 111 (лише 1 є truthy в 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/?
TSH

2

/// , 53 50 байт

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

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

Оскільки іншого способу взяти вхід у /// немає, він жорстко кодується:

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

Пояснення:

Загальний підхід полягає в тому, щоб замінити Джиммі на одинарний 1, а потім усунути його з усіх ситуацій, де він загрожує небезпекою. Якщо він виживе, його виводять. Якщо він цього не робить, то нічого. У ~коді є заміною //, яка дозволяє скоротити код на 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

Рубін 2,5,5, 22 байти

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

Очікує масив рядків. Потрібен мінімум версії 2.5.5, оскільки це колиArray#all?(pattern) було додано.

Через обмеження того, що вхід завжди буде дійсною сценою Джиммі та мотузки, воно зводиться до того, чи є в будь-якому з рядків, що передують останньому рядку, мотузка закрита.




1

Сітківка , 9 байт

m`^[^|]+^

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

Зараз я ніколи раніше не програмував на Retina, але наскільки я можу сказати, це працює. Це регулярний вираз, який знаходить рядок, що містить (1) початок введення, (2) немає "|" символів та (3) новий рядок.

Людям, більш знайомим як з регулярними виразами, так і з сітківкою, рекомендується пропонувати пропозиції. -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|å

Порт відповіді Japt @Shaggy .

Введіть як список рядків.

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

Пояснення:

ζ       # 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.