Сцена разнообразия Джимми


25

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


объяснение

Есть три разновидности Джиммиса: карлик, акробат и бодибилдер.

This is dwarf Jimmy:               o

This is acrobat Jimmy:            /o\

This is bodybuilder Jimmy:       /-o-\

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

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

Выведите количество гномов, акробатов и культуристов на линии соответственно.

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

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

    1. Входная строка должна быть одной строкой и необязательно содержать три варианта Jimmys и необязательные пробелы.

    2. Строка не обязательно будет содержать все разновидности Jimmy или пробелы.

    3. Строка не будет содержать символы не в o/\ -.

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

    5. Начальные и конечные пробелы являются необязательными и ни в коем случае не требуются - ваша программа должна учитывать строку с или без начальных и / или конечных пробелов.

    6. Строка должна содержать только допустимые Jimmys и пробелы. Например, ---///---это не разрешено, потому что это недопустимая последовательность Jimmy.

  • Выведите три числа: количество гномов, акробатов и культуристов на сцене (в соответствующем порядке).

    1. Это может быть вывод на консоль в виде разделенных пробелом целых чисел, или это может быть возвращаемое значение из функции в качестве некоторого типа контейнера (то есть типа массива).

    2. Вывод в любом формате должен быть упорядочен, как указано в верхнем пуле над этим правилом.

  • Применяются стандартные правила и лазейки.

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

     /-o-\           /-o-\     o/o\  /-o-\       /-o-\                /-o-\
OUTPUT: 1 1 5


      o o               /o\    o o      o                    /o\             /o\
OUTPUT: 5 3 0


 /-o-\     /-o-\            /-o-\/-o-\   o /o\/o\    /-o-\o /-o-\       /o\/-o-\
OUTPUT: 2 3 7


  /-o-\  o                 /-o-\               o/o\
OUTPUT: 2 1 2

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

счет

Это , поэтому выигрывает самая низкая оценка в байтах.

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

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

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

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

<!-- Run the snippet to see the leaderboard. Report any bugs to @xMikee1 on Github. -->    <iframe src="https://ozewski.github.io/ppcg-leaderboard/?id=188391" 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>


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

7
Для @connectyourcharger более стандартным способом было бы требовать ответы для указания порядка.
Просроченные данные

4
Проще говоря, может ли Гном Джимми быть вместе? Я не вижу ничего, предлагающего иначе. Если так, то тестовый пример oo /o\ o oбыл бы хорош
Веска

1
@Veskah: Генератор тестовых примеров способен генерировать последовательность oo.
рекурсивный

8
Там должен быть тег Jimmy .
MilkyWay90

Ответы:


8

Желе , (12?) 13 байтов

ċⱮ“-/o”H1¦ŻIṚ

Монадическая ссылка, принимающая список символов, который выдает список целых чисел [ dwarves, acrobats, and body-builders](сохраните байт, если мы можем указать наш вывод)

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

Как?

Все Джиммис показывают o; все не гномы показывают /; все культуристы показывают два -. Подсчитайте их, уменьшите вдвое количество -и выполните вычитание, чтобы найти число Джимми:

ċⱮ“-/o”H1¦ŻIṚ - Link: list of characters
  “-/o”       - list of characters ['-', '/', 'o']
 Ɱ            - map across right with:
ċ             -   count occurrences   = [n('-'), n('/'), n('o')]
         ¦    - sparse application...
        1     - ...to indices: [1] -- i.e. n('-')
       H      - ...action: halve    = [n('-')/2, n('/'), n('o')]
          Ż   - prepend a zero =   [0, n('-')/2, n('/'), n('o')]
           I  - incremental differences
              -     = [n('-')/2, n('/')-n('-')/2, n('o')-n('/')]
            Ṛ - reverse
              -     = [n('o')-n('/'), n('/')-n('-')/2, n('-')/2]

21

Python 3.8 (предварительная версия) , 51 байт

lambda s:((c:=s.count)('o')-c('/'),c('/o'),c('/-'))

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


Наконец-то Python добавил что-то вроде этого. Я ждал некоторое время, пока Python разрешит присваивания в качестве выражений. Жаль, что требуется дополнительный байт, но я возьму его: P
HyperNeutrino

@HyperNeutrino По сути, это одна из причин, по которой теперь вы можете увидеть "Python 3.8 (предварительная версия)", распространяющийся по всему сайту. Другое ограничение заключается в том, что, если оно не само по себе и не является единственным выражением в выражении (в этом случае вместо этого вы можете предпочесть регулярное присваивание), оно должно быть заключено в скобки (+2 байта).
Эрик Outgolfer

Как рассчитывать на первый звонок ('o')без колла c?
Куинн

@Quinn выражения присваивания правопреемников s.countк , cа затем возвращает его.
Эрик Outgolfer

@ErikTheOutgolfer круто, TIL
Куинн

12

Python 2 , 50 байт

x,y,z=map(input().count,'o/-')
print x-y,y-z/2,z/2

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

-10 байт путем преобразования лямбда-выражения в полную программу благодаря @xnor (удаляет вложенную вещь с двойным лямбда и вместо нее использует присваивание)


3
Это хороший метод, и он короче как программа .
xnor


5

J , 36 25 байт

-11 байт благодаря Коул!

2-/\0,~1 1 2%~1#.'o/-'=/]

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

Оригинальное решение

J , 36 байт

[:(-/@}:,-/@}.,{:)1 1 2%~1#.'o/-'=/]

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

Объяснение:

                            'o/-'=/] compare the input with each one of "o/-" characters
                                     / the result is a 3-row matrix /
                         1#.         add up each row to find the number of occurences
                                     of each character, the result is a vector of 3 items
                  1 1 2%~            divide the last item by 2 to find the number of 
                                     bodybuilder Jimmys
[:(              )                   use the result to construct the following vector:
               {:                    the last item
              ,                      appended to
         -/@}.                       the difference of the second and the third items
        ,                            appended to
   -/@}:                             the difference of the first and the second items

Пример J сессии:

a=:'  /-o-\  o                 /-o-\               o/o\'
   'o/-'=/a
0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0
0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
   1#.'o/-'=/a
5 3 4  
   1 1 2%~1#.'o/-'=/a
5 3 2
   (-/@}:,-/@}.,{:)1 1 2%~1#.'o/-'=/a
2 1 2


Ой, больше не могу редактировать мой комментарий - это также 25 байтов, если это правильно, делает другой способ добавления 0.
Коул

1
@ Коул Ха, как это часто случается со мной, я не видел образец. Спасибо!
Гален Иванов

К сожалению, я понял это правильно, когда вы редактировали это объяснение - всегда стыдно терять столько усилий, чтобы объяснить.
Коул

@cole Вот почему я буду держать объяснение моей ошибки видимым :)
Гален Иванов

5

Excel как CSV, 130 байт

,=LEN(A3)-LEN(A4)
=SUBSTITUTE(A1,"-o",""),=(LEN(A2)-LEN(A3))/2
=SUBSTITUTE(A2,"/o",""),=(LEN(A1)-LEN(A2))/2
=SUBSTITUTE(A3,"o","")

Вставьте ввод в пробел перед первым ,, сохраните как .csv, откройте в Excel. Выходы Гнома, акробаты и культуристы в B1, B2и B3соответственно.


Excel, 244 байта

=LEN(SUBSTITUTE(SUBSTITUTE(A1,"-o",""),"/o",""))-LEN(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(A1,"-o",""),"/o",""),"o",""))&" "&(LEN(SUBSTITUTE(A1,"-o",""))-LEN(SUBSTITUTE(SUBSTITUTE(A1,"-o",""),"/o","")))/2&" "&(LEN(A1)-LEN(SUBSTITUTE(A1,"-o","")))/2


4

Котлин 131 130 129 121 117 97 96 88 байт

fun String.j(b:Int=count{'-'==it}/2,a:Int=count{'/'==it})=listOf(count{'o'==it}-a,a-b,b)

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

Редактировать - Wew, получил его под 100! Я сомневаюсь, что могу уменьшить это больше, но только время покажет ...

Edit - говорил слишком рано, отбросил еще один байт, используя список вместо строки

Редактировать - минус 8 байт благодаря AsoLeo, предлагающему использовать функцию расширения


1
Позвольте мне рассказать вам о методах расширения, мой друг: fun String.j(b:Int=count{'-'==it}/2,a:Int=count{'/'==it})=listOf(count{'o'==it}-a,a-b,b)88 байт.
Асо Лео

@AsoLeo хорошо, я изначально написал это как функцию расширения, но я, должно быть, испортил что-то еще, потому что у меня было больше байтов
Куинн

3

Сетчатка , 39 35 байт

Изменить: -4 байта благодаря @FryAmTheEggMan

^((o)|(/o.)|(/-o-.)| )*
$#2 $#3 $#4

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

Объяснение:

Простой этап замены. Он находит все совпадения регулярного выражения ^((o)|(/o.)|(/-o-.)| )*(что должно привести к одному совпадению - целой строке) и заменяет его числом захватов групп 2, 3 и 4. Вот это регулярное выражение с разбивкой:

^((o)|(/o.)|(/-o-.)| )*
^                               start at the beginning of the string
 (                       )*     have any amount of Jimmy / spaces
     |       |         |        select one of:
  (o)                           capturing group 2 - dwarf
      (/o.)                   capturing group 3 - acrobat
              (/-o-.)         capturing group 4 - bodybuilder

Мы должны начинать с ^или конец ввода также считается совпадением. В синтаксисе замещения Retina $nссылается на n-ую группу захвата, а модификатор #подсчитывает, сколько совпадений было сделано.


Вы можете сэкономить несколько байтов, избегая меньше, так как гарантированно, что строка будет только jimmys: Попробуйте онлайн!
FryAmTheEggman

3

JavaScript, 55 байт

Поиск строки с использованием сопоставления с регулярным выражением o, o-или o-\; увеличивает соответствующий счетчик в массиве, используя длину каждого совпадения для определения индекса.

s=>s.replace(/o-?\\?/g,m=>a[m.length-1]++,a=[0,0,0])&&a

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


1
@JonathanAllan Я переписал свой ответ.
Даррильо






1

Perl 5 -p , 41 байт

$_=1*s/o(?!\\|-)//g.$".1*s|/o||g.$".y/o//

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

Подсчитывает, сколько раз oпоявляется без сопровождения \или -для поиска гномов и удаляет их из строки. Затем подсчитывает, сколько раз /oпоявляется поиск акробатов и удаляет их из строки. Затем подсчитывает количество oоставшихся, чтобы определить культуристов. Вставляет пробелы между числами и неявно выводит результат.



@NahuelFouilleul Это не работает, если в конце строки есть гном. Это считается как культурист.
Чкали

правда, в противном случае -4 байта просто 1*
удаляются

@NahuelFouilleul Это тоже не работает. Если нет примеров этих типов, он ничего не выводит ( undef) вместо 0.
Xcali

хорошо, я только что посмотрел на тестовые случаи
Науэль Фуйе


1

SNOBOL4 (CSNOBOL4) , 135 байт

	I =INPUT
B	I '-o' =	:F(A)
	B =B + 1	:(B)
A	I '/o' =	:F(D)
	A =A + 1	:(A)
D	I 'o' =	:F(O)
	D =D + 1	:(D)
O	OUTPUT =+D ' ' +A ' ' +B
END

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

Удаляет -o, /oи oиз строки и увеличивает каждый раз соответствующие счетчики. Листья за много рук и ног ( /-\, \и ничего).


0

Forth (gforth) , 118 байтов

: c -rot 0 tuck do over i + c@ 3 pick = - loop nip nip ;
: f 2dup '/ c >r 2dup '- c 2/ -rot 'o c i - . r> over - . . ;

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

объяснение

  • Получить граф /, -и oсимволы
  • Культурист - это количество -символов, разделенное на 2
  • Acrobat - это количество /символов минус количество строителей
  • Гном это количество oперсонажей за вычетом количества акробатов и бодибилдеров

Код Объяснение

\ c counts the number of occurrences of the given character in a string
\ stack usage is ( c-addr u1 w1 - u )
: c                 \ start a new word definition
  -rot 0 tuck       \ sets up parameters for a counted loop
  do                \ loop from 0 to string-length - 1 (inclusive)
    over i +        \ get the address of the current character in the string
    c@              \ get the ascii value of the current character              
    3 pick =        \ compare it to the character we're counting
    -               \ subtract result from the accumulator (subtract because -1 = true in forth)
  loop              \ end the loop
  nip nip           \ remove extra values from the stack
;                   \ end the word definition

\ Main function 
: f                 \ start a new word definition
  2dup              \ duplicate the string address and length
  '/ c >r           \ count the number of '/' characters and stick the result on the return stack
  2dup '- c 2/      \ count the number of '-' characters and divide by 2
  -rot 'o c         \ move the string to the top of the stack and count the number of 'o characters
  i - .             \ calculate number of dwarf jimmy's and print
  r> over - .       \ calculate number of acrobat jimmy's and print (drop '/' count from return stack)
  .                 \ print number of body-builder jimmy's
;                   \ end word definition

0

05AB1E , 13 байтов

…-/oS¢ć;š0š¥R

Это может быть 12 байтов путем удаления, Rесли [bodybuilder, acrobat, dwarf]бы был разрешен порядок вывода .

Попробуйте онлайн или проверьте все контрольные примеры .

Незначительная равноправная альтернатива:

…-/oS¢R`;0)üα

Попробуйте онлайн или проверьте все контрольные примеры .

Объяснение:

…-/o           # Push string "-/o"
    S          # Split to a list of characters: ["-","/","o"]
     ¢         # Count the occurrence of each character in the (implicit) input-string
      ć        # Extract the head; pop and push head and remainder-list
       ;       # Halve this head
        š      # And prepend it back in front of the remainder-list
         0š    # Then also prepend a 0
           ¥   # Get the deltas (forward differences)
            R  # And reverse the list to get the required order of output-counts
               # (after which the result is output implicitly)

…-/oS¢         # Same as above
      R        # Reverse this list
       `       # Pop the list and push its values separately to the stack
        ;      # Halve the top value on the stack
         0     # Push a 0
          )    # Wrap all values on the stack into a list
           ü   # For each overlapping pair of values:
            α  #  Get the absolute difference between the two values
               # (after which the result is output implicitly)

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