Scena różnorodności Jimmy'ego

25

Jak zapewne wiecie, nie było wiele piękne Jimmy wyzwania niedawno pojawiały się. Podczas tych wyzwań stanąłeś przed wyzwaniem umiejętności akrobatycznych naszego ukochanego przyjaciela. Teraz mamy dla Ciebie inne wyzwanie. Dzisiaj będziesz identyfikować różne typy Jimmys!


Wyjaśnienie

Istnieją trzy odmiany Jimmys: karzeł, akrobata i kulturysta.

This is dwarf Jimmy:               o

This is acrobat Jimmy:            /o\

This is bodybuilder Jimmy:       /-o-\

Ci Jimmys są świetnymi przyjaciółmi i lubią stać na tej samej linii. Twoim zadaniem jest, biorąc pod uwagę scenę Jimmy'ego:

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

Wydaj odpowiednio liczbę krasnoludów, akrobatów i kulturystów na linii.

Wyzwanie

  • Weź udział w dowolnej rozsądnej formie jako scena Jimmy'ego, jak pokazano w powyższym przykładzie.

    1. Łańcuch wejściowy powinien składać się z jednej linii i opcjonalnie zawierać trzy odmiany Jimmys oraz opcjonalne białe znaki.

    2. Ciąg nie musi zawierać wszystkich odmian Jimmy ani białych znaków.

    3. Ciąg nie będzie zawierał żadnych znaków, których nie ma w o/\ -.

    4. Możliwe jest dowolne połączenie odmian Jimmy'ego. Oznacza to, że ten sam lub inny typ Jimmy'ego może znajdować się obok siebie. Musisz to uwzględnić.

    5. Wiodące i końcowe białe znaki są opcjonalne i w żadnym wypadku nie są wymagane - program powinien uwzględniać ciąg znaków z lub bez początkowych i / lub końcowych białych znaków.

    6. Ciąg powinien zawierać tylko prawidłowe Jimmys i białe znaki. Na przykład ---///---jest niedozwolony, ponieważ nie jest prawidłową sekwencją Jimmy'ego.

  • Wyjmij trzy liczby: Liczba krasnoludów, akrobatów i kulturystów w scenie (w odpowiedniej kolejności).

    1. Może to być wyjście do konsoli jako liczby całkowite oddzielone spacjami lub może być wartością zwracaną z funkcji jako pewnego rodzaju kontenera (tj. Typu tablicy).

    2. Dane wyjściowe, niezależnie od formatu, należy zamówić zgodnie z powyższym punktem w górnej części.

  • Obowiązują standardowe zasady i luki.

Przypadki testowe

     /-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

Jeśli chcesz uzyskać więcej przypadków testowych, użyj tego narzędzia, aby wygenerować więcej przypadkowych przypadków testowych.

Punktacja

To jest , więc wygrywa najniższy wynik w bajtach.

Możesz wyświetlić tabelę wyników dla tego postu, rozwijając widżet / fragment kodu poniżej. Aby Twój post znalazł się w rankingu, potrzebujesz nagłówka ( # header text) z następującymi informacjami:

  • Nazwa języka (zakończ go przecinkiem ,lub myślnikiem -), a następnie ...

  • Liczba bajtów, jako ostatnia liczba wyświetlana w nagłówku.

Na przykład JavaScript (ES6), 72 bytesjest poprawny, ale Fortran, 143 bytes (8-bit)jest nieprawidłowy, ponieważ liczba bajtów nie jest ostatnią liczbą w nagłówku (twoja odpowiedź zostanie rozpoznana jako 8 bajtów - nie wykorzystuj tego).

<!-- 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>

podłącz ładowarkę
źródło
Czy możemy założyć, że wszystkie dane wejściowe będą miały co najmniej jedno miejsce początkowe i końcowe?
Kudłaty
7
@connectyourcharger bardziej standardowym sposobem byłoby wymaganie odpowiedzi w celu określenia zamówienia.
Data wygasła
4
Mówiąc wprost, czy Dwarf Jimmys może stać razem? Nic nie sugeruje inaczej. Jeśli tak, test testowy oo /o\ o obyłby miły
Veskah
1
@Veskah: Generator przypadków testowych jest w stanie wygenerować sekwencję oo.
rekurencyjne
8
Musi być tag Jimmy .
MilkyWay90

Odpowiedzi:

8

Galaretka (12?) 13 bajtów

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

Monadyczny link akceptujący listę znaków, który daje listę liczb całkowitych [ dwarves, acrobats, and body-builders](zachowaj bajt, jeśli możemy określić nasze dane wyjściowe)

Wypróbuj online!

W jaki sposób?

Wszystkie Jimmys pokazują o; wszystkie nie-krasnoludy wykazują /; wszyscy kulturyści pokazują dwa -. Policz je, zmniejsz o połowę liczbę -i wykonaj odejmowanie, aby znaleźć liczby Jimmy'ego:

ċⱮ“-/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]
Jonathan Allan
źródło
21

Python 3.8 (wersja wstępna) , 51 bajtów

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

Wypróbuj online!

Erik the Outgolfer
źródło
WRESZCIE Python dodał coś takiego. Czekałem chwilę, aż Python zezwoli na przypisania jako wyrażenia. Szkoda, że ​​zajmuje to dodatkowy bajt, ale wezmę go: P
HyperNeutrino
@HyperNeutrino Zasadniczo jest to jeden z powodów, dla których możesz zobaczyć, jak „Python 3.8 (wersja wstępna)” unosi się wokół strony. Kolejnym ograniczeniem jest to, że o ile nie jest ono jedynym i nie jedynym wyrażeniem w instrukcji (w takim przypadku wolisz zamiast tego zwykłe przypisanie), musi ono być nawiasowane (+2 bajty).
Erik the Outgolfer
Jak liczą się pierwsze połączenia ('o')bez połączenia c?
Quinn
@Quinn Wyrażenie przypisania przypisuje s.countje, ca następnie zwraca.
Erik the Outgolfer
@ErikTheOutgolfer cool, TIL
Quinn
12

Python 2 , 50 bajtów

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

Wypróbuj online!

-10 bajtów poprzez konwersję wyrażenia lambda na pełny program dzięki @xnor (usuwa rzecz zagnieżdżoną z podwójną lambda i zamiast tego używa przypisania)

HyperNeutrino
źródło
3
To miła metoda i jest krótsza jako program .
xnor
8

PowerShell , 59 55 bajtów

$c=,0*3
$args|sls '/?-?o'-a|% m*|% le*|%{++$c[$_-1]}
$c

Wypróbuj online!

Rozwinięty:

$counters=,0*3
$args|select-string '/?-?o'-AllMatches|% Matches|% Length|%{++$counters[$_-1]}
$counters
mazzy
źródło
5

J , 36 25 bajtów

-11 bajtów dzięki Cole!

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

Wypróbuj online!

Oryginalne rozwiązanie

J , 36 bajtów

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

Wypróbuj online!

Wyjaśnienie:

                            '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

Przykładowa sesja 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
Galen Iwanow
źródło
1
25 bajtów ?
cole
Ups, nie mogę już edytować mojego komentarza - to również 25 bajtów, jeśli jest poprawne, robi inny sposób dodawania 0.
cole
1
@cole Hah, jak często mi się zdarza, nie widziałem wzoru. Dziękuję Ci!
Galen Iwanow
to niefortunne, że widziałem to tylko tak, jak redagowałeś to wyjaśnienie - zawsze szkoda tracić tyle wysiłku na wyjaśnianie.
cole
@cole Właśnie dlatego wyjaśnienie mojego błędu będzie widoczne :)
Galen Iwanow
5

Excel jako CSV, 130 bajtów

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

Wstaw dane wejściowe w spację przed pierwszym ,, zapisz jako .csv, otwórz w programie Excel. Wyjścia krasnoludków, akrobaci i kulturystów B1, B2i B3odpowiednio.


Excel, 244 bajty

=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
Wernisch
źródło
4

Kotlin 131 130 129 121 117 97 96 88 bajtów

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

Wypróbuj online!

Edytuj - Wew, mam mniej niż 100! Wątpię, czy mógłbym to bardziej zmniejszyć, ale tylko czas pokaże ...

Edytuj - Rozmawiałem zbyt wcześnie, upuściłem jeszcze jeden bajt, używając listy zamiast łańcucha

Edycja - minus 8 bajtów dzięki AsoLeo sugerującemu użycie funkcji rozszerzenia

Quinn
źródło
1
Pozwól, że powiem ci o metodach rozszerzenia, mój przyjacielu: fun String.j(b:Int=count{'-'==it}/2,a:Int=count{'/'==it})=listOf(count{'o'==it}-a,a-b,b)88 bajtów.
Aso Leo
@ AsoLeo miło, napisałem go pierwotnie jako funkcję rozszerzenia, ale musiałem coś zepsuć, bo moje było więcej bajtów
Quinn
3

Siatkówka , 39 35 bajtów

Edycja: -4 bajty dzięki @FryAmTheEggMan

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

Wypróbuj online!

Wyjaśnienie:

Prosty etap wymiany. Znajduje wszystkie dopasowania wyrażenia regularnego ^((o)|(/o.)|(/-o-.)| )*(co powinno dać jedno dopasowanie - cały ciąg znaków) i zastępuje je liczbą przechwyceń grup 2, 3 i 4. Oto wyrażenie regularne w podziale:

^((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

Musimy zacząć od ^lub koniec danych wejściowych również się liczy. W składni podstawienia Retina $nodwołuje się do n-tej grupy przechwytywania, a modyfikator #liczy, ile dopasowań wykonał.

lolad
źródło
Możesz zaoszczędzić trochę bajtów, uciekając mniej, ponieważ gwarantujemy, że ciąg znaków to tylko żarty: Wypróbuj online!
FryAmTheEggman
3

JavaScript, 55 bajtów

Przeszukuje ciąg znaków za pomocą regex dopasowywania wzoru o, o-lub o-\; inkrementuje odpowiednią liczbę w tablicy, wykorzystując długość każdego dopasowania do ustalenia indeksu.

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

Wypróbuj online!

darrylyeo
źródło
1
@JonathanAllan Przepisałem swoją odpowiedź.
darrylyeo
2

Wolfram Language (Mathematica) , 63 bajty

Reverse@{a=(m=CharacterCounts@#)["-"]/2,b=m["/"]-a,m["o"]-a-b}&

Wypróbuj online!

55 bajtów, jeśli zostanie odrzucony niepotrzebny porządek ...

Wygasły dane
źródło
@Xcali powinien teraz ponownie policzyć krasnale na skrajnie lewej stronie
Data wygasła
2

Python 3 , 69 66 60 56 bajtów

-4 bajty dzięki @Maarten Fabré

g=input().count
b,c=g('/'),g('/-')
print(g('o')-b,b-c,c)

Wypróbuj online!

Daniil Tutubalin
źródło
1
Nie ma potrzeby używania x. Możesz zrobić g=input().countnatychmiast
Maarten Fabré
2

R , 63 bajty

Używa dopasowania Regex, aby znaleźć i policzyć Jimmys.

library(stringr)
str_count(scan(,''),c('(?<![/-])o','/o','/-'))

Wypróbuj online!

CT Hall
źródło
1

Perl 5 -p , 41 bajtów

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

Wypróbuj online!

Liczy, ile razy opojawia się bez śledzenia \lub -znalezienia krasnoludów i usuwa je z sznurka. Następnie liczy, ile razy /opojawia się, aby znaleźć akrobatów i usuwa je z łańcucha. Następnie zlicza liczbę opozostałych do ustalenia producentów nadwozia. Wstawia spacje między liczbami i domyślnie wyprowadza wynik.

Xcali
źródło
-1 bajt
Nahuel Fouilleul
@NahuelFouilleul To nie działa, jeśli na końcu linii jest karzeł. Liczy się to jako kulturysta.
Xcali
prawda, w przeciwnym razie -4 bajty po prostu usuwamy1*
Nahuel Fouilleul
@NahuelFouilleul To też nie działa. Jeśli nie ma przykładów takich typów, undefzamiast tego wyprowadza nic ( ) 0.
Xcali
ok, właśnie spojrzałem na przypadki testowe
Nahuel Fouilleul
1

SNOBOL4 (CSNOBOL4) , 135 bajtów

	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

Wypróbuj online!

Usuwa -o, /ooraz oz ciągu i zwiększa za każdym razem odpowiednie liczniki. Pozostawia wiele rąk i nóg ( /-\, \i nic).

Giuseppe
źródło
0

Dalej (gforth) , 118 bajtów

: 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 - . . ;

Wypróbuj online!

Wyjaśnienie

  • Uzyskaj hrabiego /, -io znaków
  • Kulturysta to liczba - znaków podzielona przez 2
  • Acrobat to liczba / znaków minus liczba producentów nadwozia
  • Krasnolud to liczba oznaków minus liczba Acrobat i kulturystów

Objaśnienie kodu

\ 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
reffu
źródło
0

05AB1E , 13 bajtów

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

Ten może mieć 12 bajtów przez usunięcie Rdopuszczalnej kolejności wyjściowej [bodybuilder, acrobat, dwarf].

Wypróbuj online lub sprawdź wszystkie przypadki testowe .

Drobna alternatywa dla bajtów równych:

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

Wypróbuj online lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie:

…-/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)
Kevin Cruijssen
źródło