查找输入字符串中字符的出现


18

挑战

编写一个程序,给定一个x长度为10个字符的字符串和一个字符y,该程序输出ystring中出现字符的次数x

以字节为单位的最短程序为准。

Input: tttggloyoi, t
Output: 3

Input: onomatopoe, o
Output: 4

11
这似乎是一个容易的挑战。还有为什么将输入限制为10个而不是完全没有限制?
致命

7
需要获胜条件。
isaacg 2015年

2
如果不同意,请随时回滚我的编辑
Beta Decay

8
输入格式的灵活性如何?我们可以选择其他分隔符,例如空格或换行符吗?字符串可以用引号引起来吗?我们可以先输入字母,再输入字符串吗?字符将始终为小写字母吗?如果没有,还会出现哪些其他字符?
马丁·恩德

5
这看起来像一个C面试问题,可疑...
Quentin 15'9

Answers:


18

Pyth,3个字节

/ww

示例运行:

$ pyth -c '/ww'
sdhkfhjkkj
k
3

当然,用户在第一次输入时可以输入少于或少于10个字母,但是我们不必担心用户违反规范时会发生什么。


似乎不再是有效的pyth了吗?
2016年

请解释一下?
MilkyWay90

@ MilkyWay90这是您可能会使用的方法:在线尝试!/仅计算第二个输入字符串的第一个输入字符串中的出现次数。w需要一行输入。
isaacg

@isaacg哦,我知道了。谢谢!
MilkyWay90


7

JavaScript,32

(p=prompt)().split(p()).length-1

6

重击,24个字符

x=${1//[^$2]}
echo ${#x}

样品运行:

bash-4.3$ bash letter-count.sh tttggloyoi t
3

bash-4.3$ bash letter-count.sh onomatopoe o
4


4

迷宫32 29 27 24字节

),}{)-
@ ,  +);__
!-`{:}

这首先读取单个字符,然后读取要计数的字符串,并假定该字符串中没有空字节。

说明

该代码以开头),},它将堆栈的底部设置为1,读取第一个字符并将其移至辅助堆栈以备将来使用。这1将是我们的计数器(偏移量1稍后将被取消,并且IP进行所需的转弯是必需的)。

IP现在将向下移动以使用读取搜索字符串的第一个字符,`再次将值取反,以获取正确的转弯行为。当我们从STDIN读取字符时,IP现在将遵循以下循环:

  }{)-
  ,  +);__
  `{:}

{:}复制存储的字符代码+并将其添加到当前值。如果结果是0(即当前字符是我们正在寻找的字符),则IP直接向前移动:-简单地摆脱0)增加计数器,{}就没有操作。

但是,如果之后的结果+为非零,则我们不希望计算当前字符。因此,IP右转。那是一个死胡同,所以在那里的代码被执行两次,一次执行一次,一次执行一次。也就是说,这种情况下的实际代码变为);___;)+-){});只是摆脱了这个非零的差异,___推了三个零,但;丢弃了其中一个。)将剩下的两个零之一+增加,将它们加到一个中1-从计数器中减去它,然后)递增计数器。换句话说,我们创建了一个非常详尽的无操作。

当我们按下EOF时,,按下-1,它`变成1,并且IP右转。从计数器中-减去1(取消初始偏移量)。!打印计数器并@终止程序。


4

Python 3,29个字节

print(input().count(input()))

嗯,这很容易。假设输入是一个十个字母的字符串。


4
你抄了我!:D
isaacg

1
@isaacg伟大的思想有何相似之处?; D
Beta Decay's

如果您不需要阅读输入,会不会f=lambda x,y:x.count(y)更短?(很抱歉,如果无法使用,我正在移动设备上并且无法检查)
科尔

@ mbomb007我的错误,感谢您的澄清。
2015年

1
移去打印周围的括号可以为您节省字符print input().count(input())a,b=input();print a.count(b)
保留

4

雪人1.0.2,16个字符

~vgvgaSaLNdEtSsP

令人惊讶的短。说明:

~      make all vars active (even though we only need two, we don't really care)
vgvg   get two lines of input
aS     split first line on second line
aL     length of the new array
NdE    decrement (because ex. "axbxc""x"aS -> ["a" "b" "c"] which is length 3)
tSsP   to-string and print

干得好!我不会想到,在Snowman中,可能会出现这么短的解决方案。
Alex A.

4

C ++模板的元编程,160个 154 116字节

只为傻笑。

感谢前投手打高尔夫球!

template<int w,int x,int y,int...s>class A:A<w+(x==y),x,s...>{};A<0,'t','t','t','t','g','g','l','o','y','o','i',0>a;

用法:模板实例化中的第一个字符是要搜索的字符。

clang -std = c ++ 11 -c->兼容,结果在错误消息的开头。

Occurences.cpp:1:66: error: too few template arguments for class template 'A'
template<int w,char x,char y,char...s>class A{static const int a=A<w+((x==y)?1:0),x,s...>::a;};
                                                             ^
Occurences.cpp:1:66: note: in instantiation of template class 'A<3, 't', '\x00'>' requested here
template<int w,char x,char y,char...s>class A{static const int a=A<w+((x==y)?1:0),x,s...>::a;};

符合gcc -std = c ++ 11 -c- >结果在错误消息的底部。

Occurences.cpp: In instantiation of ‘const int A<3, 't', '\000'>::a’:
Occurences.cpp:1:64:   recursively required from ‘const int A<1, 't', 't', 't', 'g', 'g', 'l', 'o', 'y', 'o', 'i', '\000'>::a’
Occurences.cpp:1:64:   required from ‘const int A<0, 't', 't', 't', 't', 'g', 'g', 'l', 'o', 'y', 'o', 'i', '\000'>::a’
Occurences.cpp:2:62:   required from here
Occurences.cpp:1:64: error: wrong number of template arguments (2, should be at least 3)

搜索A < 3,'t','\ 000'>和A < 3,'t','\ x00'>

154字节版本

template<int w,char x,char y,char...s>class A{static const int a=A<w+(x==y),x,s...>::a;};                          
int a=A<0,'t','t','t','t','g','g','l','o','y','o','i','\0'>::a;

160字节版本:

template<int w,char x,char y,char...s>class A{static const int a=A<w+((x==y)?1:0),x,s...>::a;};                          
int a=A<0,'t','t','t','t','g','g','l','o','y','o','i','\0'>::a;

您可以缩短((x==y)?1:0)到仅(x==y)节省大约6个字节(我认为)。
kirbyfan64sos

谢谢-想要确定它是定义的行为,因为我不确定标准boolint转换的含义。
Otomo

这是定义的行为。
kirbyfan64sos

是的,现在我也知道了。:) 非常感谢你。(我认为可能取决于实现情况。)
Otomo

1
128个字节:使用enum而不是匿名static const。使用0而不是'\0'终止。使用int代替char。使用稍微不同的声明进行实例化。删除超级换行符。template<int w,int x,int y,int...s>class A{enum{a=A<w+(x==y),x,s...>::a};};A<0,'t','t','t','t','g','g','l','o','y','o','i',0>a;。用g ++和clang检查。
前bart 2015年


3

Javascript(ES6),26个字节

(a,b)=>a.split(b).length-1

这种快速简便的解决方案定义了一个匿名函数。要使用它,请将变量声明添加到开头。试试看:

编辑:哦,我看到已经有一个非常相似的解决方案。我希望可以。



3

C ++,78个字节

int main(int,char**v){int c=0,i=0;while(i<10)v[1][i++]==*v[2]&&++c;return c;}

像这样打电话:

$ g++ -std=c++14 -O2 -Wall -pedantic -pthread main.cpp && ./a.out tttggloyoi t; echo $?
3

3

元素,23字节

__);11'[)\
~="0 1@][+]`

换行符是程序的一部分。我实际上将它用作变量名

该程序的基本工作原理是将目标字符存储在变量中,将当前字符串保留在堆栈的顶部,然后循环执行“将结果切入,比较和移动到下面”过程,最后将结果加起来。

换行符作为变量名来自在输入末尾使用换行符,将其切掉并存储到其中。我从中读取代码中的换行符。

输入是这样的:

qqqqwwweee
q

输出是这样的

4

3

朱莉娅,26 25字节

f(s,c)=endof(findin(s,c))

findin函数返回第一个参数的索引,在该参数处找到第二个参数作为向量。向量的长度是出现的次数。

感谢Glen O,节省了一个字节。


endof将为您节省一个字节length
Glen O

3

APL,7 3个字节

+/⍷

这将创建一个功能序列。它通过创建零和一的矢量来工作,该矢量对应于字符在字符串()中出现的索引。然后将向量相加(+/)。

感谢kirbyfan64sos和NBZ,节省了4个字节!


APL像K一样咖喱吗?我认为您可以像+/⍷那时那样做(我不知道APL,所以我可能是错的)。
kirbyfan64sos

@ kirbyfan64sos我知道的唯一咖喱是食物,所以我不确定。但我会调查一下。谢谢你的建议!
Alex A.

@ kirbyfan64sos是的,它被称为功能训练,因此+ /⍷确实可以工作,但是由于我们正在寻找单个字符,因此不妨使用=代替⍷。
2015年

3

Perl,21个16个字符

(13个字符的代码+ 3个字符的命令行选项。)

$_=0+s/$^I//g

样品运行:

bash-4.3$ perl -it -pe '$_=0+s/$^I//g' <<< tttggloyoi
3

bash-4.3$ perl -io -pe '$_=0+s/$^I//g' <<< onomatopoe
4

bash-4.3$ perl -i5 -pe '$_=0+s/$^I//g' <<< 1234
0

整洁的把戏<>
ThisSuitIsBlackNotNot'9

您可以通过删除-l并确保您的输入没有尾随换行符来保存字节:echo -en 'onomatopoe\no' | perl -pe '$_=eval"y/".<>."//"'
ThisSuitIsBlackNotNot 15'9

1
你可以敲你的总下降到16perl -pe '$_+=s/${\<>}//g'
ThisSuitIsBlackNot

该引用技巧是不可思议的。谢谢@ThisSuitIsBlackNot。
manatwork's

为什么+=需要?=似乎也一样有效(当输入碰巧以某些数字开头时,它应该仍然有效)。
前bart 2015年

3

PHP,36 35字节

<?=substr_count($argv[1],$argv[2]);


用法:
使用两个参数调用脚本。
php script.php qwertzqwertz q

PHP,23字节

如果注册全局变量(仅在PHP 5.3及更低版本中可用),则可以保存12个字节(感谢Martijn

<?=substr_count($a,$b);


用法:
调用脚本并声明全局变量php script.php?a=qwertzqwertz&b=q


1
您可以在逗号后删除空格以减少一个字节
Voitcus

1
如果您有全球注册者script.php?a=qwertzqwertz&b=q,则可以做,也可以做<?=substr_count($a,$b);,23个字符
Martijn 2015年

@Martijn好主意,谢谢!
jrenk 2015年

3

Dyalog APL,3个字节

      +/=

即“相等字节的总和”。例如:

      f ← +/=
      'onomatopoe' f 'o'
4

要不就

      'onomatopoe'(+/=)'o'
4

K这次没有击败APL。

在线尝试。


请不要一次编辑数十篇文章。您已经完全淹没了首页。如果有许多需要编辑的帖子(偶尔会发生,例如,因为添加了新标签),那么通常一次只处理3个帖子,然后等待至少12个小时,这样他们通常就可以离开前台页。
马丁·恩德

@MartinBüttner是的,我当时没有意识到。:-(普通用户没有“次要编辑”选项...我知道为什么无法将其提供给所有人。
Adám16年

不幸的是,根本没有这样的选择,甚至对于主持人也没有。
马丁·恩德

3

T-SQL,99个 40字节

SELECT 11-LEN(REPLACE(s,c,'')+'x')FROM t

只需在输入字符串和除去字符的字符串之间进行区别即可。从表t中获取输入

编辑已更改,以消除计数空间方面的问题,并考虑了当前可接受的SQL输入。感谢@BradC所做的所有更改和节省


您不需要所有的支架,只需要一个预填充的输入表SELECT LEN(s)-LEN(REPLACE(s,c,''))FROM t,其中包含字段和。t sc
BradC

另一个要注意的是,此代码为A B C D 以空格结尾的字符串(如果要求您计算空格)给出了错误的答案,因为它LEN忽略了尾随空格。
BradC

@BradC我认为可以追溯到那时,围绕可接受的规则,尤其是围绕SQL的规则是限制性且不清楚的。我会在一段时间后看一下解决该space问题的方法
MickyT

我通常只填末并减去一个。在这种情况下,保证输入的字符正好是10个字符,您可以将其硬编码为SELECT 11-LEN(REPLACE(s,c,'')+'x')FROM t
BradC

@BradC是的,再次查看此内容,不确定我为什么允许可变长度。进行更改。
MickyT


2

J,5个字节

+/@:=

我觉得J会为此内置一个,但是我找不到一个-也许一个活跃的J用户可以启发我。因此,这首先适用=于输入,1如果每个字符等于请求的字符,则将其转换为其他字符0。然后+/计算该列表的总和。


2

批处理文件,121字节

因为我是受虐狂...

SET c=0
SET e=_
SET t=%1%%e%
:l
SET a=%t:~0,1%
IF "%a%"=="%2" SET /A c+=1
SET t=%t:~1%
IF NOT "%t%"=="%e%" GOTO l
ECHO %c%

警告:假设_在输入字符串中没有发生。如果是这样,则e需要适当调整变量。

这就建立了我们的计数器变量,c和我们结束串划界_,追加,为我们的输入字符串之前%1和串联的字符串设定为t。然后,我们进入循环:l,将一个临时字符变量a设置为的第一个字符t,检查它是否与第二个输入字符串匹配%2c如果为true则递增,然后将第一个字符剪掉t。我们的循环结束条件将检查t我们的字符串结束划分,如果没有,则循环返回。然后echo,我们计算出柜台的价值。

可能可以使用 FOR循环,但这将需要启用DelayedExpansion,我认为实际上比这更长。对此的验证留给读者练习。


2

CJam,5个字节

ll/,(

说明

l      e# read x
 l     e# read y
  /    e# split x by y
   ,   e# count
    (  e# subtract one

2

PowerShell,32字节

四对一!它们的长度都一样!:)

($args[0]-split$args[1]).Count-1

要么

param($a,$b)($a-split$b).Count-1

或者,

$args[0].Split($args[1]).Count-1

要么

param($a,$b)$a.Split($b).Count-1

前两种样式使用inline运算符-split,而后两种样式将第一个参数隐式转换为String并使用.Split()基于字符串的运算符。在所有情况下,都将返回一个数组,其中我们必须将Count减1,因为我们要比第二个参数的出现多返回一个数组项。

这个很好玩...


2

朱莉娅,21个字节

f(s,c)=sum(i->c==i,s)

请注意,它要求c是一个字符,而不是一个单字符字符串。因此,您将其用作f("test me",'e')(返回2)而不是f("test me","e")(返回0,因为'e'!="e")。


2

> <>(鱼),30字节

0&v
=?\ilb
=?\:@=&+&l1
n&/;

取字符串,然后取字符进行计数。输入没有分开(至少在在线解释器中)。在在线解释器上尝试一下:http : //fishlanguage.com我是手工计算字节的,所以如果我错了,请告诉我。

说明

首先,> <>是二维的,并在一行或一列中循环,直到到达 ;或error。这意味着,如果它从左到右进行操作(就像在程序开始时一样),则如果到达末尾并且没有移动或被告知停止程序,它将绕行。每行某些字符将被重复,因为它们根据指针的方向具有不同的功能,而第四行将具有相反的字符,因为指针从右向左移动。

下面提供了该程序的摘要。查看esolangs上为> <>列出说明,以查看每个字符的作用。

第1行: 0&v

0&v -put 0 into the register and change direction to down-up

第2行: =?\ilb

(从第1行将指针移动到的位置,即第三个字符)

\ -reflect the pointer and make it move left-right
i -read input
lb=?\ -reflect downwards if there are 11 values in the stack

第3行: =?\:@=&+&l1

(从第三个字符开始)

:@ -duplicate y and shift the stack e.g. ['x','y','y'] -> ['y','x','y']
=&+& -increment the register if the character popped from x = y
l1=?\ -reflect downwards if there is 1 value in the stack

第4行: n&/;

(从第三个字符开始)

/ -reflect right-left
&n; -print value of the register

2

Ruby,22个 20字节

p gets.count(gets)-1

演示:http//ideone.com/MEeTd2

-1原因是gets检索输入以及换行符。Ruby会String#count计算参数中任何字符出现在字符串中的次数。

例如,对于输入[ test\nt\n],t发生两次,而\n发生一次,需要减去。


您可以删除$><<和减少4个字节。
Vasu Adari 2015年

@VasuAdari,但我需要以某种方式打印结果...
Cristian Lupascu 2015年

你不能这样做吗?->p gets.count(gets)-1
Vasu Adari

@VasuAdari你是对的;目前,我以为可以将qutoes放在输出中,但是它是数字的,所以还可以。谢谢!
Cristian Lupascu 2015年

2

Ruby,18个字节

->s,c{p s.count c}

用法:

->s,c{p s.count c}.call 'tttggloyoi', 't'

->s,c{p s.count c}.call 'onomatopoe', 'o'

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.