Adegan keragaman Jimmy

25

Seperti yang mungkin Anda ketahui, ada beberapa tantangan Jimmy yang indah baru - baru ini muncul. Dalam tantangan ini, Anda ditantang dengan keterampilan akrobat teman tercinta kita. Sekarang kami punya tantangan berbeda untuk Anda. Hari ini Anda akan mengidentifikasi berbagai jenis Jimmy!


Penjelasan

Ada tiga jenis Jimmys: kerdil, akrobat, dan binaragawan.

This is dwarf Jimmy:               o

This is acrobat Jimmy:            /o\

This is bodybuilder Jimmy:       /-o-\

Jimmys ini semua adalah teman baik dan mereka suka berdiri di jalur yang sama satu sama lain. Tugas Anda adalah, diberikan adegan Jimmy seperti ini:

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

Keluarkan jumlah kurcaci, akrobat, dan binaragawan masing-masing di telepon.

Tantangan

  • Ambil input dalam bentuk apa pun sebagai adegan Jimmy, seperti yang ditunjukkan dalam contoh di atas.

    1. String input harus satu baris dan secara opsional berisi tiga jenis Jimmys dan spasi putih opsional.

    2. String tidak harus berisi semua varietas Jimmy atau spasi putih.

    3. String tidak akan mengandung karakter apa pun yang tidak ada di o/\ -.

    4. Kombinasi varietas Jimmy dimungkinkan. Ini berarti bahwa tipe Jimmy yang sama atau berbeda dapat bersebelahan. Anda harus menjelaskannya.

    5. Memimpin dan membuntuti spasi putih adalah opsional dan tidak diperlukan - program Anda harus menjelaskan string dengan atau tanpa memimpin dan / atau membuntuti spasi putih.

    6. String hanya boleh berisi Jimmys dan spasi putih yang valid. Misalnya, ---///---tidak diperbolehkan karena itu bukan urutan Jimmy yang valid.

  • Keluarkan tiga angka: Hitungan kurcaci, akrobat, dan binaragawan dalam adegan (sesuai urutannya).

    1. Ini dapat berupa output ke konsol sebagai bilangan bulat yang dipisahkan oleh ruang, atau mungkin berupa nilai balik dari fungsi sebagai semacam wadah (yaitu jenis array).

    2. Output, dalam format apa pun, harus dipesan sebagaimana disebutkan dalam bullet teratas di atas aturan ini.

  • Aturan dan celah standar berlaku.

Uji kasus

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

Jika Anda ingin lebih banyak kasus uji, gunakan alat ini untuk menghasilkan lebih banyak kasus uji acak.

Mencetak gol

Ini adalah , sehingga skor terendah dalam byte menang.

Anda dapat melihat leaderboard untuk posting ini dengan memperluas widget / snippet di bawah ini. Agar posting Anda dimasukkan dalam peringkat, Anda perlu tajuk ( # header text) dengan info berikut:

  • Nama bahasa (akhiri dengan tanda koma ,atau tanda hubung -), diikuti oleh ...

  • Jumlah byte, sebagai angka terakhir yang muncul di header Anda.

Misalnya, JavaScript (ES6), 72 bytesvalid, tetapi Fortran, 143 bytes (8-bit)tidak valid karena jumlah byte bukan nomor terakhir di header (jawaban Anda akan dikenali sebagai 8 byte - jangan memanfaatkan ini).

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

hubungkan charger Anda
sumber
Bisakah kita mengasumsikan semua input akan memiliki setidaknya satu ruang memimpin dan tertinggal?
Shaggy
7
@connectyourcharger cara yang lebih standar adalah meminta jawaban untuk menentukan pesanan.
Data Kedaluwarsa
4
Hanya untuk menjadi eksplisit, bisakah Dwarf Jimmys berdiri bersama? Saya melihat tidak ada yang menyarankan sebaliknya. Jika demikian, uji kasus oo /o\ o oakan menyenangkan
Veskah
1
@ Veskah: Generator test case mampu menghasilkan urutan oo.
Rekursif
8
Harus ada tag jimmy .
MilkyWay90

Jawaban:

8

Jelly , (12?) 13 byte

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

Tautan monadik yang menerima daftar karakter yang menghasilkan daftar bilangan bulat, [ dwarves, acrobats, and body-builders](simpan byte jika kami dapat menentukan output kami)

Cobalah online!

Bagaimana?

Semua Jimmys menunjukkan o; semua non-kurcaci menunjukkan a /; semua binaragawan menunjukkan dua -. Hitung ini, membagi dua hitungan -, dan lakukan pengurangan untuk menemukan jumlah Jimmy:

ċⱮ“-/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
sumber
21

Python 3.8 (pra-rilis) , 51 byte

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

Cobalah online!

Erik the Outgolfer
sumber
FINALLY python menambahkan sesuatu seperti ini. Saya sudah menunggu beberapa saat agar Python mengizinkan tugas sebagai ekspresi. Sayang butuh byte ekstra, tapi saya akan menerimanya: P
HyperNeutrino
@HyperNeutrino Pada dasarnya itu satu-satunya alasan Anda sekarang mungkin melihat "Python 3.8 (pra-rilis)" mengambang di sekitar situs. Pembatasan lain adalah bahwa, kecuali jika itu sendiri dan bukan satu-satunya ekspresi dalam pernyataan (dalam hal ini Anda mungkin lebih suka tugas reguler sebagai gantinya), itu harus di kurung (+2 byte).
Erik the Outgolfer
Bagaimana perhitungan pertama tentang ('o')dipanggil tanpa a c?
Quinn
@Quinn Ekspresi penugasan ditugaskan s.countke cdan kemudian mengembalikannya.
Erik the Outgolfer
@ErikTheOutgolfer keren, TIL
Quinn
12

Python 2 , 50 byte

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

Cobalah online!

-10 byte dengan mengonversi ekspresi lambda ke program lengkap berkat @xnor (menghapus hal tersarang double-lambda dan menggunakan penugasan sebagai gantinya)

HyperNeutrino
sumber
3
Ini adalah metode yang bagus, dan lebih pendek sebagai sebuah program .
xnor
8

PowerShell , 59 55 byte

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

Cobalah online!

Belum dibuka:

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

J , 36 25 byte

-11 byte berkat cole!

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

Cobalah online!

Solusi asli

J , 36 byte

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

Cobalah online!

Penjelasan:

                            '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

Sesi sampel 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 Ivanov
sumber
1
25 byte ?
cole
Ups, tidak dapat lagi mengedit komentar saya - ini juga 25 byte jika itu benar, melakukan cara yang berbeda untuk menambahkan 0.
cole
1
@cole Hah, seperti yang sering terjadi pada saya, saya tidak melihat polanya. Terima kasih!
Galen Ivanov
sangat disayangkan saya hanya melihatnya dengan benar ketika Anda mengedit dalam penjelasan itu - selalu memalukan kehilangan banyak upaya menjelaskan.
cole
@cole Itulah sebabnya saya akan membuat penjelasan kesalahan saya terlihat :)
Galen Ivanov
5

Unggul sebagai CSV, 130 byte

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

Masukkan input dalam ruang sebelum pertama ,, simpan sebagai .csv, buka di Excel. Keluaran Kurcaci, Akrobat dan Binaragawan B1, B2dan B3masing - masing.


Excel, 244 byte

=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
sumber
4

Kotlin 131 130 129 121 121 117 97 96 88 byte

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

Cobalah online!

Sunting - Wew, dapatkan di bawah 100! Saya ragu saya bisa menyusut lebih banyak, tetapi hanya waktu yang akan mengatakan ...

Sunting - Berbicara terlalu cepat, menjatuhkan satu byte lagi dengan menggunakan daftar, bukan string

Sunting - minus 8 byte berkat AsoLeo yang menyarankan penggunaan fungsi ekstensi

Quinn
sumber
1
Biarkan saya memberi tahu Anda tentang metode ekstensi, teman saya: fun String.j(b:Int=count{'-'==it}/2,a:Int=count{'/'==it})=listOf(count{'o'==it}-a,a-b,b)88 byte.
Aso Leo
@ AsoLeo bagus, saya sebenarnya menulisnya sebagai fungsi ekstensi pada awalnya, tetapi saya pasti mengacaukan sesuatu yang lain karena milik saya lebih banyak byte
Quinn
3

Retina , 39 35 byte

Edit: -4 byte terima kasih kepada @FryAmTheEggMan

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

Cobalah online!

Penjelasan:

Tahap ganti yang sederhana. Ia menemukan semua kecocokan regex ^((o)|(/o.)|(/-o-.)| )*(yang harus menghasilkan satu kecocokan - seluruh string) dan menggantinya dengan jumlah tangkapan grup 2, 3, dan 4. Berikut adalah regex yang dipecah:

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

Kita harus mulai dengan ^atau akhir dari input juga dianggap sebagai kecocokan. Dalam sintaks substitusi Retina, $nreferensi grup penangkap ke-n, dan pengubah #menghitung berapa banyak kecocokan yang dibuatnya.

lolad
sumber
Anda dapat menyimpan beberapa byte dengan melarikan diri lebih sedikit, karena string dijamin hanya jimmys: Cobalah online!
FryAmTheEggman
3

JavaScript, 55 byte

Mencari string menggunakan pencocokan pola regex o, o-atau o-\; menambah hitungan terkait dalam array, menggunakan panjang setiap pertandingan untuk menentukan indeks.

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

Cobalah online!

Darrylyeo
sumber
1
@JonathanAllan saya menulis ulang jawaban saya.
darrylyeo
2

Bahasa Wolfram (Mathematica) , 63 byte

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

Cobalah online!

55 byte jika persyaratan pesanan tidak berguna dijatuhkan ...

Data Kedaluwarsa
sumber
@Xcali sekarang harus menghitung kurcaci di paling kiri lagi
Data Kedaluwarsa
2

Python 3 , 69 66 60 56 byte

-4 byte berkat @Maarten Fabré

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

Cobalah online!

Daniil Tutubalin
sumber
1
Tidak perlu untuk x. Anda dapat melakukannya g=input().countsegera
Maarten Fabré
2

R , 63 byte

Menggunakan pencocokan Regex untuk menemukan dan menghitung Jimny.

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

Cobalah online!

CT Hall
sumber
1

Perl 5 -p , 41 byte

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

Cobalah online!

Hitungan berapa kali omuncul tanpa diikuti oleh \atau -untuk menemukan kurcaci dan menghapusnya dari string. Kemudian menghitung berapa kali /omuncul untuk menemukan akrobat dan menghapusnya dari string. Lalu hitung jumlah yang otersisa untuk menentukan binaragawan. Menyisipkan spasi di antara angka-angka dan secara implisit menampilkan hasilnya.

Xcali
sumber
-1 byte
Nahuel Fouilleul
@NahuelFouilleul Itu tidak berfungsi jika ada katai di akhir baris. Itu dihitung sebagai pembangun tubuh.
Xcali
benar, jika tidak -4 byte cukup menghapus1*
Nahuel Fouilleul
@NahuelFouilleul Itu juga tidak berhasil. Jika tidak ada contoh dari tipe-tipe itu, itu menghasilkan apa-apa ( undef) bukan 0.
Xcali
ok, saya hanya melihat test case
Nahuel Fouilleul
1

SNOBOL4 (CSNOBOL4) , 135 byte

	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

Cobalah online!

Menghapus -o,, /odan odari string dan menambah penghitung yang sesuai setiap waktu. Daun di belakang banyak lengan dan kaki ( /-\, \, dan tidak ada).

Giuseppe
sumber
0

Keempat (gforth) , 118 byte

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

Cobalah online!

Penjelasan

  • Dapatkan Hitungan /,- dan okarakter
  • Binaragawan adalah sejumlah - karakter dibagi 2
  • Acrobat adalah jumlah / karakter dikurangi jumlah binaragawan
  • Dwarf adalah jumlah okarakter dikurangi jumlah Acrobat dan Binaragawan

Penjelasan Kode

\ 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
sumber
0

05AB1E , 13 byte

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

Yang ini bisa 12 byte dengan menghapus Rjika urutan output [bodybuilder, acrobat, dwarf]akan diizinkan.

Cobalah secara online atau verifikasi semua kasus uji .

Alternatif minor sama dengan byte:

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

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

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