挑战
编写一个程序,给定一个x
长度为10个字符的字符串和一个字符y
,该程序输出y
string中出现字符的次数x
。
以字节为单位的最短程序为准。
例
Input: tttggloyoi, t
Output: 3
Input: onomatopoe, o
Output: 4
编写一个程序,给定一个x
长度为10个字符的字符串和一个字符y
,该程序输出y
string中出现字符的次数x
。
以字节为单位的最短程序为准。
Input: tttggloyoi, t
Output: 3
Input: onomatopoe, o
Output: 4
Answers:
/ww
示例运行:
$ pyth -c '/ww'
sdhkfhjkkj
k
3
当然,用户在第一次输入时可以输入少于或少于10个字母,但是我们不必担心用户违反规范时会发生什么。
),}{)-
@ , +);__
!-`{:}
这首先读取单个字符,然后读取要计数的字符串,并假定该字符串中没有空字节。
该代码以开头),}
,它将堆栈的底部设置为1
,读取第一个字符并将其移至辅助堆栈以备将来使用。这1
将是我们的计数器(偏移量1稍后将被取消,并且IP进行所需的转弯是必需的)。
IP现在将向下移动以使用读取搜索字符串的第一个字符,
。`
再次将值取反,以获取正确的转弯行为。当我们从STDIN读取字符时,IP现在将遵循以下循环:
}{)-
, +);__
`{:}
{:}
复制存储的字符代码+
并将其添加到当前值。如果结果是0
(即当前字符是我们正在寻找的字符),则IP直接向前移动:-
简单地摆脱0
,)
增加计数器,{}
就没有操作。
但是,如果之后的结果+
为非零,则我们不希望计算当前字符。因此,IP右转。那是一个死胡同,所以在那里的代码被执行两次,一次执行一次,一次执行一次。也就是说,这种情况下的实际代码变为);___;)+-){}
。);
只是摆脱了这个非零的差异,___
推了三个零,但;
丢弃了其中一个。)
将剩下的两个零之一+
增加,将它们加到一个中1
,-
从计数器中减去它,然后)
递增计数器。换句话说,我们创建了一个非常详尽的无操作。
当我们按下EOF时,,
按下-1
,它`
变成1
,并且IP右转。从计数器中-
减去1
(取消初始偏移量)。!
打印计数器并@
终止程序。
print(input().count(input()))
嗯,这很容易。假设输入是一个十个字母的字符串。
f=lambda x,y:x.count(y)
更短?(很抱歉,如果无法使用,我正在移动设备上并且无法检查)
print input().count(input())
或a,b=input();print a.count(b)
~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
只为傻笑。
感谢前投手打高尔夫球!
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个字节(我认为)。
bool
对int
转换的含义。
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检查。
+/⍷
这将创建一个功能序列。它通过创建零和一的矢量来工作,该矢量对应于字符在字符串(⍷
)中出现的索引。然后将向量相加(+/
)。
感谢kirbyfan64sos和NBZ,节省了4个字节!
+/⍷
那时那样做(我不知道APL,所以我可能是错的)。
(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
<>
!
-l
并确保您的输入没有尾随换行符来保存字节:echo -en 'onomatopoe\no' | perl -pe '$_=eval"y/".<>."//"'
perl -pe '$_+=s/${\<>}//g'
+=
需要?=
似乎也一样有效(当输入碰巧以某些数字开头时,它应该仍然有效)。
<?=substr_count($argv[1],$argv[2]);
用法:
使用两个参数调用脚本。
php script.php qwertzqwertz q
如果注册全局变量(仅在PHP 5.3及更低版本中可用),则可以保存12个字节(感谢Martijn)
<?=substr_count($a,$b);
用法:
调用脚本并声明全局变量php script.php?a=qwertzqwertz&b=q
script.php?a=qwertzqwertz&b=q
,则可以做,也可以做<?=substr_count($a,$b);
,23个字符
+/=
即“相等字节的总和”。例如:
f ← +/=
'onomatopoe' f 'o'
4
要不就
'onomatopoe'(+/=)'o'
4
K这次没有击败APL。
SELECT 11-LEN(REPLACE(s,c,'')+'x')FROM t
只需在输入字符串和除去字符的字符串之间进行区别即可。从表t中获取输入
编辑已更改,以消除计数空间方面的问题,并考虑了当前可接受的SQL输入。感谢@BradC所做的所有更改和节省
A B C D
以空格结尾的字符串(如果要求您计算空格)给出了错误的答案,因为它LEN
忽略了尾随空格。
space
问题的方法
SELECT 11-LEN(REPLACE(s,c,'')+'x')FROM t
因为我是受虐狂...
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
,检查它是否与第二个输入字符串匹配%2
,c
如果为true则递增,然后将第一个字符剪掉t
。我们的循环结束条件将检查t
我们的字符串结束划分,如果没有,则循环返回。然后echo
,我们计算出柜台的价值。
可能可以使用 FOR
循环,但这将需要启用DelayedExpansion,我认为实际上比这更长。对此的验证留给读者练习。
四对一!它们的长度都一样!:)
($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,因为我们要比第二个参数的出现多返回一个数组项。
这个很好玩...
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
p gets.count(gets)-1
的-1
原因是gets
检索输入以及换行符。Ruby会String#count
计算参数中任何字符出现在字符串中的次数。
例如,对于输入[ test\n
,t\n
],t
发生两次,而\n
发生一次,需要减去。
$><<
和减少4个字节。
p gets.count(gets)-1