ジミーの多様性のシーン


25

おそらくご存知のように、最近、ジミーの素敵なチャレンジが何度も登場しています 。これらの課題では、最愛の友人のアクロバットスキルに挑戦しました。今、私たちはあなたのために異なる挑戦をしました。今日は、さまざまなタイプのジミーを識別します!


説明

ジミーには、ドワーフ、アクロバット、ボディービルダーの3種類があります。

This is dwarf Jimmy:               o

This is acrobat Jimmy:            /o\

This is bodybuilder Jimmy:       /-o-\

これらのジミーはすべて素晴らしい友人であり、彼らはお互いに同じ立場に立っているのが好きです。あなたの仕事は、次のようなジミーのシーンが与えられた場合です:

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

ライン上のドワーフ、アクロバット、およびボディービルダーの量をそれぞれ出力します。

チャレンジ

  • 上記の例に示すように、Jimmyシーンとして合理的な形式で入力してください。

    1. 入力文字列は1行で、オプションで3種類のJimmysとオプションの空白を含める必要があります。

    2. 文字列には、必ずしもすべてのジミーの種類または空白が含まれるわけではありません。

    3. 文字列にはにない文字は含まれませんo/\ -

    4. ジミー品種の任意の組み合わせが可能です。これは、同じタイプまたは異なるタイプのジミーが隣り合うことができることを意味します。それを説明する必要があります。

    5. 先頭および末尾の空白はオプションであり、決して必要ではありません。プログラムでは、先頭および/または末尾の空白の有無にかかわらず文字列を考慮する必要があります。

    6. 文字列には、有効なJimmysと空白のみを含める必要があります。たとえば、---///---は、有効なジミーシーケンスではないため許可されません。

  • 3つの数値を出力します。シーン内のドワーフ、アクロバット、ボディービルダーの数(それぞれの順序で)。

    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>


すべての入力に少なくとも1つの先行スペースと後続スペースがあると仮定できますか?
シャギー

7
@connectyourchargerより標準的な方法は、順序を指定するために回答を要求することです。
有効期限が切れたデータ

4
明確にするために、ドワーフジミーは一緒に立つことができますか?そうでないことを示唆するものは何もありません。もしそうなら、テストケースoo /o\ o oがいいだろう
ベスカ

1
@Veskah:テストケースジェネレーターは、シーケンスを生成できますoo
再帰的

8
ジミータグが必要です。
MilkyWay90

回答:


8

ゼリー、(12?)13 バイト

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

整数のリストを生成する文字のリストを受け入れる単項リンク[ dwarves, acrobats, and body-builders]出力を指定できる場合はバイトを保存します)

オンラインでお試しください!

どうやって?

すべてのジミーはo; すべての非ドワーフは/; すべてのボディビルダーは2を表示し-ます。これらをカウントアップし、カウントを半分にし、-減算を実行してジミーカウントを見つけます。

ċⱮ“-/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(プレリリース)」が浮かんでいるのを見る理由の1つです。別の制限は、それがステートメント内の唯一の式ではなく、それ自体はない場合(この場合、代わりに通常の割り当てを好むかもしれません)、括弧で囲む必要があります(+2バイト)。
アウトゴルファーのエリック

('o')なしで呼び出されることの最初のカウントはどうcですか?
クイン

@Quinn割り当て式は、割り当ててs.countからc返します。
エリック・ザ・アウトゴルファー

@ErikTheOutgolferクール、TIL
クイン



5

J36 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 Hah、よくあることですが、そのパターンは見られませんでした。ありがとうございました!
ガレンイワノフ

残念ながら、その説明を編集しているときにしか見ていませんでした。説明の労力を失うのは常に残念です。
コール

@coleだから、私の失態の説明を表示したままにしておきます:)
ガレン・イワノフ

5

CSVとしてExcel、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で開きます。Dwarfs、Acrobats、およびBodybuilders をそれぞれB1B2およびに出力し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

Kotlin 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)

オンラインでお試しください!

編集-すごい、100以下になった!私はそれをもっと縮めることができるとは思わないが、時間だけがわかる...

編集-スポークが早すぎます。文字列の代わりにリストを使用して、もう1バイト削除しました

編集-拡張機能の使用を提案するAsoLeoのおかげでマイナス8バイト


1
私の友人である拡張メソッドについて教えてください:fun String.j(b:Int=count{'-'==it}/2,a:Int=count{'/'==it})=listOf(count{'o'==it}-a,a-b,b)88バイト。
麻生レオ

@AsoLeoいいね、私は実際に元々拡張関数として書いていましたが、もっとバイト数が多かったので何か他のものを台無しにしたに違いありません
Quinn

3

網膜39 35バイト

編集:@FryAmTheEggManのおかげで-4バイト

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

オンラインでお試しください!

説明:

簡単な交換ステージ。正規表現のすべての一致^((o)|(/o.)|(/-o-.)| )*(1つの一致-文字列全体)を検出し、グループ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番目のキャプチャグループを参照し、修飾子#は一致した数をカウントします。


文字列はジミーのみであることが保証されているため、エスケープを少なくすることでいくつかのバイトを節約できます。オンラインで試してください!
FryAmTheEggman

3

JavaScript、55バイト

正規表現パターンマッチングを使用して文字列を検索しoo-またはo-\、各一致の長さを使用してインデックスを決定し、配列内の対応するカウントをインクリメントします。

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

オンラインでお試しください!


1
@JonathanAllan私は答えを書き直しました。
darrylyeo






1

Perl 5、41 -pバイト

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

オンラインでお試しください!

oその後に、\または-ドワーフを見つけることなく表示される回数をカウントし、それらを文字列から削除します。次に、/o出現回数をカウントして、アクロバットを見つけ、文字列から削除します。次に、o残りの数をカウントして、ボディービルダーを決定します。数字の間にスペースを挿入し、結果を暗黙的に出力します。



@NahuelFouilleul行の終わりに小人がいる場合は機能しません。それはボディビルダーとして数えます。
Xcali

true、それ以外の場合は-4バイトだけ削除1*
Nahuel Fouilleul

@NahuelFouilleulそれも機能しません。これらのタイプの例がない場合は、のundef代わりに何も出力しません()0
Xcali




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、文字数からAcrobatおよびBodybuilderの数を引いたものです

コードの説明

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.