Сцена різноманітності Джиммі


25

Як ви, напевно, знаєте, нещодавно з'явилися численні чудові виклики Джиммі . У цих викликах ви зіткнулися з навичками акробатики нашого улюбленого друга. Тепер у вас є інший виклик для вас. Сьогодні ви будете визначати різні типи Джимміса!


Пояснення

Існує три різновиди Джимміса: карлик, акробат та бодібілдер.

This is dwarf Jimmy:               o

This is acrobat Jimmy:            /o\

This is bodybuilder Jimmy:       /-o-\

Ці Джиммі - всі чудові друзі, і вони люблять стояти на одній лінії, як один з одним. Ваше завдання полягає в такій сцені Джиммі:

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

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

Змагання

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

    1. Вхідний рядок повинен бути одним рядком і необов'язково містить три різновиди Джимміса та необов'язковий пробіл.

    2. Рядок не обов'язково містить усі сорти Джиммі або пробіли.

    3. Рядок не буде містити жодних символів, які не входять o/\ -.

    4. Можливе будь-яке поєднання сортів Джиммі. Це означає, що один і той же або різний тип Джиммі може бути поруч. Ви повинні це врахувати.

    5. Простір провідних та кінцевих пробілів не є обов'язковим і ні в якому разі не потрібно - ваша програма повинна враховувати рядок з провідним та / або проміжним пробілом.

    6. Рядок повинен містити лише дійсні Jimmys та пробіли. Наприклад, ---///---не дозволено, оскільки це не є дійсною послідовністю Джиммі.

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

    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
Там повинен бути тег Джиммі .
MilkyWay90

Відповіді:


8

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

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

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

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

Як?

Усі Джиммі показують а o; всі некарлики показують a /; всі культуристи показують два -. Підрахуйте їх, вдвічі зменшіть кількість -і виконайте віднімання, щоб знайти підрахунки Джиммі:

ċⱮ“-/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 дозволить призначити як вирази. Прикро, це зайвий байт, але я візьму: P
HyperNeutrino

@HyperNeutrino В основному це одна з причин того, що зараз ви можете побачити "Python 3.8 (передвипуск)", що плаває по сайту. Ще одне обмеження полягає в тому, що, якщо воно не є власним і не єдиним виразом у виписці (у такому випадку ви можете скористатися звичайним призначенням замість цього), воно повинно бути закреслене в дужках (+2 байти).
Ерік Аутгольфер

Як по-перше розраховують на те, ('o')щоб викликати без c?
Квін

@Quinn вираження привласнення правонаступників s.countдо , cа потім повертає його.
Ерік Аутгольфер

@ErikTheOutgolfer cool, TIL
Квін



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.
cole

1
@cole Hah, як це часто трапляється у мене, я не бачив цього шаблону. Дякую!
Гален Іванов

прикро, що я бачив це правильно лише тоді, коли ви редагували це пояснення - завжди прикро втратити стільки зусиль, щоб пояснити.
Коул

@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! Сумніваюсь, я можу це більше скоротити, але лише час покаже ...

Редагувати - говорити занадто рано, випустив ще один байт, використовуючи список, а не рядок

Редагування - мінус 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 я переписав свою відповідь.
darrylyeo






1

Perl 5 -p , 41 байт

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

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

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



@NahuelFouilleul Це не працює, якщо в кінці рядка є карлик. Він вважає це будівельником тіла.
Xcali

правда, інакше -4 байти просто видаляються1*
Nahuel Fouilleul

@NahuelFouilleul Це також не працює. Якщо прикладів цих типів немає, він не виводить нічого ( undef) замість0 .
Xcali

гаразд, я просто переглянув тестові справи
Nahuel Fouilleul


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

Четвертий (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.