Jimmy çeşitliliğinin bir sahne


25

Muhtemelen bildiğiniz gibi, son zamanlarda ortaya çıkan birçok güzel Jimmy mücadelesi var . Bu zorluklarda, sevgili arkadaşımızın akrobasi becerilerine meydan okudun. Şimdi sizin için farklı bir mücadelemiz var. Bugün farklı Jimmys türlerini tanımlayacaksınız!


açıklama

Üç çeşit Jimmys vardır: cüce, akrobat ve vücut geliştiricisi.

This is dwarf Jimmy:               o

This is acrobat Jimmy:            /o\

This is bodybuilder Jimmy:       /-o-\

Bu Jimmy'ler harika arkadaşlar ve birbirleriyle aynı çizgide durmayı severler. Göreviniz, şöyle bir Jimmy sahnesi veriliyorsa:

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

Satırda sırasıyla cüceler, akrobatlar ve vücut geliştiriciler üretin.

Meydan okuma

  • Yukarıdaki örnekte gösterildiği gibi, herhangi bir makul biçimde bir Jimmy sahnesi olarak giriş yapın.

    1. Giriş dizgisi bir satır olmalı ve isteğe bağlı olarak üç çeşit Jimmys ve isteğe bağlı beyazlık içermelidir.

    2. Dize mutlaka tüm Jimmy çeşitlerini veya beyaz alanını içermeyecektir.

    3. Dize, içinde olmayan karakter içermez o/\ -.

    4. Jimmy çeşitlerinin herhangi bir kombinasyonu mümkündür. Bu, aynı veya farklı Jimmy türlerinin yan yana olabileceği anlamına gelir. Bunu hesaba katmalısın.

    5. Lider ve takip eden beyaz boşluk isteğe bağlıdır ve hiçbir şekilde gerekli değildir - programınız, beyaz ve beyaz boşluk içeren veya içermeyen bir dizgiyi hesaba katmalıdır.

    6. Dize sadece geçerli Jimmys ve boşlukları içermelidir. Örneğin, ---///---geçerli bir Jimmy dizisi olmadığı için izin verilmiyor.

  • Üç sayı çıktısı: Sahnedeki cücelerin, akrobatların ve vücut geliştiricilerin sayısı (sırasıyla).

    1. Bu, konsola boşlukla ayrılmış tam sayılar olarak bir çıktı olabilir veya bir tür konteyner gibi bir işlevden (yani bir dizi türü) bir dönüş değeri olabilir.

    2. Her ne şekilde olursa olsun çıktı, bu kuralın üstündeki kurşunta belirtildiği şekilde sipariş edilmelidir.

  • Standart kurallar ve boşluklar geçerlidir.

Test durumları

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

Daha fazla test durumu istiyorsanız, daha fazla rastgele test durumu oluşturmak için bu aracı kullanın.

puanlama

Bu , yani bayt cinsinden en düşük puan kazanır.

Aşağıdaki widget'ı / snippet'ini genişleterek bu yayının lider tablosunu görüntüleyebilirsiniz. Gönderinizin sıralamada yer alması için # header text, aşağıdaki bilgileri içeren bir başlığa ( ) ihtiyacınız vardır :

  • Dilin adını (virgül ,veya kısa çizgi ile bitirin -), ardından ...

  • Başlığınızda görünecek son sayı olan bayt sayısı.

Örneğin JavaScript (ES6), 72 bytes, geçerli ancak Fortran, 143 bytes (8-bit)bayt sayısı başlığındaki son sayı olmadığı için geçersiz (cevabınız 8 bayt olarak kabul edilecek - bundan faydalanmayın).

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


Tüm girdilerin en az bir tane önde gelen ve sondaki alana sahip olacağını varsayabilir miyiz?
Shaggy

7
@ connectyourcharger daha standart bir yolla, emri belirtmek için cevaplar talep etmek olacaktır.
Süresi dolmuş veriler

4
Sadece açık olmak gerekirse, Cüce Jimmy'ler birlikte durabilir mi? Aksini öneren hiçbir şey göremiyorum. Öyleyse, bir test durumu iyi oo /o\ o oolurdu
Veskah

1
@ Veskah: Test durum üreteci diziyi üretme yeteneğine sahiptir oo.
özyinelemeli

8
Jimmy etiketi olmalı .
MilkyWay90

Yanıtlar:


8

Jöle , (12?) 13 bayt

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

Bir tamsayı listesi veren bir karakter listesini kabul eden bir monadik Bağlantı (çıktımızı belirtebilirsek byte değerini [ dwarves, acrobats, and body-builders]kaydedin )

Çevrimiçi deneyin!

Nasıl?

Tüm Jimmy'ler a o; tüm cüceler olmayanları göstermektedir /; tüm vücut geliştiriciler iki tane gösterir -. Bunları sayın, sayıları yarıya indirin -ve Jimmy'nin sayımlarını bulmak için çıkarma işlemi yapın:

ċⱮ“-/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 (yayın öncesi) , 51 bayt

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

Çevrimiçi deneyin!


Nihayet python buna benzer bir şey ekledi. Python'un ifadeler olarak atamalara izin vermesini bir süredir bekliyorum. Bir utanç ekstra bir bayt alır, ama ben alırım: P
HyperNeutrino

@HyperNeutrino Temel olarak, sitenin etrafında "Python 3.8 (yayın öncesi)" ifadesini görmenin bir nedeni budur. Kendi üzerinde olmadığı sürece başka kısıtlama, yani ve açıklamada yalnızca ifadesi (bu durumda bunun yerine düzenli atama tercih edebilirsiniz), parantez içinde yazılmalıdır (2 bayt) değil.
Outgolfer Erik,

('o')Olmadan aranan ilk sayısı nasıl c?
Quinn,

Atama sentezleme atar @Quinn s.countiçin cve daha sonra geri döner.
Outgolfer Erik,

@ErikTheOutgolfer harika, TIL
Quinn



5

J , 36 bayt

-11 cole sayesinde bayt!

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

Çevrimiçi deneyin!

Orijinal çözüm

J , 36 bayt

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

Çevrimiçi deneyin!

Açıklama:

                            '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

Örnek bir J oturumu:

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


Hata! Artık yorumumu düzenleyemiyorum - bu da 25 bayt , doğru ise, 0 eklemenin farklı bir yolunu yapar.
cole

1
@ cole Hah, sık sık bana olduğu gibi, deseni görmedim. Teşekkür ederim!
Galen Ivanov

talihsiz bir şey, sadece bu açıklamada düzenleme yaparken doğru gördüm - her zaman açıklamak için bu kadar çaba harcamaktan çok utanç verici.
cole

@cole Bu yüzden yıldırımımın açıklamalarını açık tutacağım :)
Galen Ivanov

5

CSV olarak Excel, 130 bayt

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

Önce boşluğa giriş yapın, ,.csv olarak kaydedin, Excel'de açın. Çıkışlar Cüceler, akrobatları ve Bodybuilders B1, B2ve B3sırasıyla.


Excel, 244 bayt

=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

Kotlin 131 130 129 121 117 97 96 88 bayt

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

Çevrimiçi deneyin!

Düzenleme - Vay, 100 altında! Daha fazla küçültebileceğimden şüpheliyim, ama sadece zaman söyleyecek ...

Düzenleme - Çok erken konuştu, dize yerine bir liste kullanarak bir bayt daha düştü

Düzenleme - Bir uzatma işlevi kullanılmasını öneren AsoLeo sayesinde eksi 8 bayt


1
Size uzatma yöntemlerinden bahsedeyim arkadaşım: fun String.j(b:Int=count{'-'==it}/2,a:Int=count{'/'==it})=listOf(count{'o'==it}-a,a-b,b)88 bytes.
Aso Leo,

@AsoLeo güzel, aslında aslında bir uzatma işlevi olarak yazmıştım ama benimkiler daha çok bayt olduğu için başka bir şeyi mahvetmiş olmalıyım
Quinn

3

Retina , 39 35 bayt

Düzenleme: @FryAmTheEggMan sayesinde -4 bayt

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

Çevrimiçi deneyin!

Açıklama:

Basit bir değiştirme aşaması. Tüm regex eşleşmelerini bulur ^((o)|(/o.)|(/-o-.)| )*(bu bir eşleşmeyle sonuçlanır - dizenin tamamı) ve onu 2, 3 ve 4 gruplarının yakalama sayısıyla değiştirir. İşte regex bozuldu:

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

^Girdi sayımlarıyla da başlamalıyız ya da eşleşme olarak saymalıyız. Retina'nın ikame sözdiziminde, ilk $nyakalama grubuna atıfta bulunur ve değiştirici #, kaç tane eşleşme yaptığını sayar.


Bazı baytları daha az kaçarak kaydedebilirsiniz, çünkü dizginin yalnızca jimmy olması garantilidir: Çevrimiçi deneyin!
FryAmTheEggman

3

JavaScript, 55 bayt

Regex desen eşleştirme kullanarak dizeyi arar o, o-ya o-\; Dizini belirlemek için her eşleşmenin uzunluğunu kullanarak bir dizideki karşılık gelen sayıyı artırır.

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

Çevrimiçi deneyin!


1
@ JonathanAllan Cevabımı yeniden yazdım.
darrylyeo






1

Perl 5 -p , 41 bayt

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

Çevrimiçi deneyin!

Onları otakip etmeden \ya -da cüceleri bulmadan görünen süreleri sayar ve bunları dizeden kaldırır. Daha sonra /oakrobatları bulmak için görünen süreyi sayar ve bunları dizeden kaldırır. Daha sonra ovücut geliştiriciler belirlemek için kalan sayısını sayar . Sayılar arasına boşluk ekler ve sonucu kesin olarak verir.



@ NuuelFouilleul Satır sonunda bir cüce varsa işe yaramaz. Vücut geliştiricisi olarak sayar.
Xcali

doğru, aksi takdirde -4 bayt sadece çıkarmadan1*
Nahuel Fouilleul

@NahuelFouilleul Bu da işe yaramıyor. Bu türden örnekler yoksa, bunun undefyerine hiçbir şey ( ) çıkarmaz 0.
Xcali

Tamam, ben sadece test durumları baktı
Nahuel Fouilleul


1

SNOBOL4 (CSNOBOL4) , 135 bayt

	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

Çevrimiçi deneyin!

Kaldırır -o, /ove odize ve artışlarla uygun sayaçlar her seferinde gelen. Kol ve bacak bir sürü arkasında Yapraklar ( /-\, \ve hiçbir şey).


0

İleri (gforth) , 118 bayt

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

Çevrimiçi deneyin!

açıklama

  • Kontu alın /, -ve okarakterler
  • Vücut geliştirmeci -2'ye bölünmüş karakter sayısıdır.
  • Acrobat sayısı / vücut geliştiricilerin sayısını eksi karakter sayısıdır
  • Cüce, oAcrobat ve Bodybuilders eksi karakter sayısıdır.

Kod Açıklaması

\ 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 bayt

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

Bu , bir çıkış sırasına izin verilip verilmediğini kaldırarak 12 bayt olabilir .R[bodybuilder, acrobat, dwarf]

Çevrimiçi deneyin veya tüm test durumlarını doğrulayın .

Küçük eşit baytlık alternatif:

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

Çevrimiçi deneyin veya tüm test durumlarını doğrulayın .

Açıklama:

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.