吉米多样性的场景


25

您可能知道,最近出现了多个 可爱的 吉米 挑战 。在这些挑战中,您受到了我们挚爱的朋友的杂技技巧的挑战。现在,我们为您带来了另一个挑战。今天,您将确定吉米斯的不同类型!


说明

吉米斯有三种变体:矮人,杂技演员和健美运动员。

This is dwarf Jimmy:               o

This is acrobat Jimmy:            /o\

This is bodybuilder Jimmy:       /-o-\

这些吉米人都是好朋友,他们喜欢彼此站在同一条线上。给定一个Jimmy场景,您的任务是:

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

分别输出线上的矮人,杂技演员和健美运动员的数量。

挑战

  • 如上例所示,以任何合理的形式将输入作为Jimmy场景。

    1. 输入字符串应为一行,并且可以包含三种类型的Jimmys和可选的空格。

    2. 该字符串不一定包含所有Jimmy变体或空白。

    3. 该字符串将不包含任何不在中的字符o/\ -

    4. 吉米品种的任何组合都是可能的。这意味着相同或不同类型的吉米可以彼此相邻。您必须考虑到这一点。

    5. 前导和尾随空格是可选的,并且绝不是必需的-您的程序应考虑带有或不带有前导和/或尾随空格的字符串。

    6. 该字符串应仅包含有效的Jimmys和空格。例如,---///---不允许使用,因为它不是有效的Jimmy序列。

  • 输出三个数字:场景中的矮人,杂技演员和健美运动员的数量(按顺序排列)。

    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很好的测试案例将很不错
Veskah

1
@Veskah:测试用例生成器能够生成序列oo
递归

8
必须有一个吉米标签。
MilkyWay90

Answers:


8

果冻((12?)13 字节

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

一个接受字符列表的单子链接,该字符列表产生一个整数列表[ dwarves, acrobats, and body-builders]如果可以指定输出,则保存字节)

在线尝试!

怎么样?

所有吉米人都表现出一个o; 所有非矮人都显示/; 所有健美运动员都表现出两个-。将这些计数,将的计数减半-,然后进行减法以找到吉米计数:

ċⱮ“-/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(预发行版)”的一个原因。另一个限制是,除非它自己不是语句中的唯一表达式(在这种情况下,您可能更喜欢常规赋值),否则必须将其括起来(+2个字节)。
暴民埃里克

('o')没有呼叫的第一次计数是怎样的c
奎因

@Quinn分配表达式分配s.countc它,然后返回它。
暴民埃里克

@ErikTheOutgolfer很酷,TIL
奎因


8

PowerShell59 55字节

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

在线尝试!

展开:

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

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,就像我经常遇到的那样,我没有看到这种模式。谢谢!
Galen Ivanov

不幸的是,当您在解释中进行编辑时,我只是看对了它-丢掉这么多的解释总是很可惜。
科尔

@cole这就是为什么我将使我的失误的解释保持可见的原因:)
Galen Ivanov

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中打开。输出小矮人,杂技和健美的B1B2B3分别。


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)

在线尝试!

编辑-哇,低于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个字节。
Aso Leo

@AsoLeo很好,我最初实际上是将其编写为扩展函数,但由于我的字节更多,我一定搞砸了其他东西
Quinn

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个字节

使用一个正则表达式模式匹配搜索字符串oo-o-\; 使用每个匹配项的长度来确定索引,从而增加数组中的相应计数。

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

在线尝试!


1
@JonathanAllan我重写了我的答案。
darrylyeo




2

R,63字节

使用正则表达式匹配来查找和计数吉米人。

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

在线尝试!



1

Perl -p 5,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/oo,并每次都增加相应的计数器。留下大量的胳膊和腿(/-\,,\什么也没有)。


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角色数量减去Acrobat和健美运动员的数量

代码说明

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.