我们都知道,如果您用谷歌搜索“ google”一词,它将破坏互联网。
您的任务是创建一个接受一个字符串并以最少的Unicode字符返回其长度的函数。
但是,如果给定的字符串为google
(小写),则将导致错误。
例如,g('bing')
将返回4
但g('google')
将导致错误。
请提供用法示例,并尽可能给出错误信息。
我们都知道,如果您用谷歌搜索“ google”一词,它将破坏互联网。
您的任务是创建一个接受一个字符串并以最少的Unicode字符返回其长度的函数。
但是,如果给定的字符串为google
(小写),则将导致错误。
例如,g('bing')
将返回4
但g('google')
将导致错误。
请提供用法示例,并尽可能给出错误信息。
Answers:
lambda x:len(x)/(x!='google')
给出ZeroDivisionError
on "google"
,否则给出长度。这利用了Python的布尔等于0
和的优势1
。
g
为lambda
,或通过输入匿名调用。
Infinity
“谷歌”而不是抛出错误...
return
如果使用的话,您需要一个def
L/lbnb"google
13个字节。
萨拉赫·阿拉米(Salah Alami)的答案有所改善。递归以在提供“ google”时引发堆栈溢出异常
int g(string s)=>s!="google"?s.Length:g(s);
L/lbnb"google
定义一个命名函数 y
。
如果字符串不是google,则将长度除以1,否则将其除以0。这个想法并不新颖,但我是独立提出的。
L Define y(b):
lb Compute len(b).
nb"google Compute (b != "google").
/ Set _ = len(b) / (b != "google").
Return _. (implicit)
;
但显然您不能在这里...
y
。 ”但是y
您的代码中没有!!
L
重新定义功能y
。
@(x)nnz(x(+~strcmp('google',x):end))
与其他更优雅的解决方案不同,在MATLAB中执行零除运算不会产生错误,而是Inf
。此解决方案找到字符串的长度是为了确保相等性检查的输出是数字而不是Boolean / 。省略会产生警告,但由于此挑战的规范不允许发出警告,因此需要…从而完成了代码。nnz
。生成的字符串的方式是您从字符串的开头到结尾(基本上是字符串的副本)建立索引。但是,重要的是通过检查输入是否等于来生成访问字符串的起点'google'
。如果不是,则生成的起始索引为1,而我们通常以字符串的形式索引...当MATLAB从1开始索引时。如果相等,则生成的索引为0,MATLAB将抛出索引错误,指出index必须为正整数。额外的+
logical
+
+
>> f=@(x)nnz(x(+~strcmp('google',x):end)) %// Declare anonymous function
f =
@(x)nnz(x(+~strcmp('google',x):end))
>> f('bing')
ans =
4
>> f('google')
Subscript indices must either be real positive integers or logicals.
Error in @(x)nnz(x(+~strcmp('google',x):end))
@(x)eval('if strcmp(''google'',x),web([x ''.com/i'']);else nnz(x),end');
以上不是官方提交的内容,但是运行起来有点有趣。滥用eval
匿名函数中的代码是:检查输入字符串是否等于'google'
...,如果是,它将打开MATLAB的内置网络浏览器并显示Google的404错误页面试图访问子页面位于i
不存在的时间。如果不是,我们将正常显示字符串的长度。
>> f=@(x)eval('if strcmp(''google'',x),web([x ''.com/i'']);else nnz(x),end'); %// Declare anonymous function
>> f('bing')
ans =
4
>> f('google')
>>
使用的最后一个电话'google'
给我们以下屏幕:
strcmp
代替来保存一个字节isequal
。
strcmp
但isequal
由于某种原因最终使用了...。谢谢!
nnz
比短2个字节numel
。几年前,你有我的投票权:-)
#
JS afaik中的错误,在
哎呀,虽然我们正在讨论,不妨在这里获得TI-BASIC的答案。
输入格式为"string":prgmNAME
。感谢托马斯土瓜湾为先找到它!
length(Ans)+log(Ans≠"GOOGLE
(指南:每个小写字母添加1个字节,以替换大写字母。因此s/GOOGLE/google/g => +6 bytes
。)
"GOGGLE":prgmG
6
"BING":prgmG
4
"GOOGLE":prgmG
Error
length(Ans)/(Ans≠"google
。您也有错的情况;如果允许大写,则为14个字节。顺便说一句,通过Ans传递参数是有效的。
AGOOGLE
应该给7,正确吗?而且您不应该在代码大小中计算程序头,因此请减去10个字节。
length(
是两个字节,这将使您的数字分别为21和15个字节。
(⍴÷'google'∘≢)
说明:
⍴
: 长度÷
: 除以'google∘≢
:参数不等于'google
'。⍴
给人的串,它是由1,如果该字符串不等于划分的长度google
(这给长度背面不变),或者通过0,如果该字符串不等于google
(给出一个错误)。
lambda u:[len][u=='google'](u)
索引1元素函数列表,IndexError
如果u=='google'
谓词为True
(= 1),则引发一个。这样的功能。
多种变体。哇:
lambda u:[len(u)][u=='google']
lambda u:len([u][u=='google'])
如果挑战被取消(不是 “ google”的一切错误),可以保存一个字符:
lambda u:{'google':len}[u](u)
但是您已经知道长度,所以只需对其进行硬编码。
{_,\"google"=!/}
如果字符串不是google,则将长度除以1,0。这个想法并不新颖,但我是独立提出的。
_ Push a copy of the string on the stack.
, Compute the length of the copy.
\ Swap the length and the original string.
"google"= Push 1 if the string is "google", 0 otherwise.
! Apply logical NOT. Maps 1 to 0 and 0 to 1.
/ Divide the length by the Boolean.
q_,\"google"=!/
。在看到这篇文章之前进行了开发。请注意,这将接受整个输入(无论如何您似乎都将其作为函数参数)。不幸的是,您不能使用它,因为这需要一个功能:(
我知道它比Matlab解决方案(也可以在Octave中工作)更长,但是它特别邪恶。我使用包含必须依赖于参数传递的回调函数(本身,因此是递归的,邪恶的)的函数句柄的单元格数组(邪恶)的文字(邪恶)来制作匿名函数(邪恶)。然后创建另一个匿名对象,该匿名对象基本上将函数简化为字符串参数,并将第二个参数固定f
为f
(非常邪恶)。任何理智的人都永远不会这样做,因为它几乎与Perl或regex(或cjam / pyth /任何其他esolang)一样不可读。
因此,如果字符串不是“ google”,则将调用单元格数组的第二个参数,该参数输出字符串的长度。否则,将调用第一个函数,该函数作为回调传递(并且也将自身作为回调传递给自身),而后者随后是函数本身。该错误基本上是一些最大递归深度错误。
f=@(s,f){@()f(s,f),numel(s)}{2-strcmp(s,'google')}();@(s)f(s,f)
eval
在这里想让它真的很邪恶:-)
漂亮又简单的JavaScript示例:
e=>e!='google'?e.length:g
如果输入了“ google”,则它将通过 ReferenceError
例
alert((e=>e!='google'?e.length:g)('test'))
{⍵≡'google':⍟⋄≢⍵}
这是一个未命名的monadic函数,如果输入为,将引发语法错误google
。这可以通过尝试不做任何自然对数来完成。
{
⍵≡'google': ⍝ If the right argument is "google"...
⍟⋄ ⍝ Compute log(<nothing>), which brings only sadness
≢⍵ ⍝ Otherwise compute the length
}
感谢丹尼斯,节省了两个字节!
⍟
被非正式地称为“ splat”。此用法的一个非常合适的名称。
g=function(x)ifelse(x!="google",nchar(x),)
除非我读错了,否则原始帖子永远不会指定代码必须是正确的语法。
例:
> g("bing")
[1] 4
> g("google")
Error in ifelse(x != "google", nchar(x), ) :
argument "no" is missing, with no default
我从未为ifelse语句的“ no”参数添加任何内容,因此如果调用此参数,它将返回错误。
g=function(x)nchar(x)[[x!="google"]]
sub{$_=pop;y///c/!/^google$/}
-2b多亏了manatwork
用法:
sub{$_=pop;y///c/!/^google$/}->("google")
如果我能摆脱程序而不是功能,则以下内容仅使用20个字节(+1字节命令行)才有效
$_=y///c/!/^google$/
误差为零。
说明:
y///c
返回长度,!/^google$/
如果输入匹配“ google” ,则将返回0。
用法:
perl -p entry.pl input.txt
sub{…}
。(然后您就这样称呼它了sub{…}->("google")
。)
$_!=google
而不是!/^google$/
!=
无法比较字符串...
g"google"=error"!";g s=length s
>g "google"
*Exception: !
>g "str"
3
x=x;g"google"=x;g s=length s
,但是由于某些原因,ghci中不会引发<< loop >>异常。
g s|s/="google"=length s
避免了需要error
lambda n:len(n)if n!='google'else d
(lambda n:len(n)*(n!='google')or d)('')
int g(String _){return"google"==_?0/0:_.length();}
上面的代码将ArithmeticException
被除以零或除以String
除google
。值得注意的是,==
比较引用对于String
对象不起作用。
(基于以下评论中的建议)
s->s=="google"?0/0:s.length()
s->(s.equals("google")?null:s).length();
==
Java中的字符串进行比较通常是行不通的(除非您依赖于字符串实习,这很不好)。也许您对JavaScript感到困惑?
好吧,被零除只是不确定的行为,我不会称其为错误。所以我的方法。
#include<ios>
[](std::string s){return s!="google"?s.size():throw;};
用法
[](std::string s){return s!="google"?s.size():throw;}("google");
size()
以保存2个字节。在C ++ 14中,您也可以使用通用lambda并替换std::string
为auto
。您需要将实际值传递std::string
给它,而不是const char*
。
std::string
有size()
方法,谢谢。我知道在C ++ 14 lambda表达式通用的,但我不知道它会怎样帮助我,因为"string"
就是const char*
不std::string
。
std::string
拥有size()
并且,length()
因为它既是容器又是字符串。至于auto
,你会用(std::string("google"))
代替调用lambda ("google")
。该问题仅说“接受1个字符串”,而没有指定“字符串”是什么。
"google"s
构造一个std::string
:)
throw;
地触发std::terminate()
(因为这里没有当前异常)。
漂亮又简单。
编辑:现在符合规则
function f(g){if(g=="google")a;return g.length}
function f(g){if(g=="google")a;return g.length}
alert(f("Hello"))
alert(f("google"))
alert(f("hi"))
function f(g){if(g=="google")a;return g.length}
alert(f("Hello"))
alert(f("bing"))
alert(f("hi"))
undefined
。
C,66 48
原版的:
int l(long*s){return strlen(s)/((*s&~(-1L<<56))!=0x656c676f6f67);}
使用OSX gcc,
l("duck");
返回4
,
l("google");
原因Floating point exception: 8
。
在其他平台上,可能需要调整常量的字节序。
更短:
减少棘手,结果相同。
l(int*s){return strlen(s)/!!strcmp(s,"Google");}
0x656c676f6f67
= elgoog
)。我认为这个答案需要对那些喜欢这种疯狂的低级知识的人做出解释。
int
4个字符来缩短它。
char *
,以的单位8-bits
转换为long *
,以的单位64-bits
,而没有正确地重新分配,则这8个字节的堆空间中的数据将被破坏,并被视为一个数字(8*8 = 64
)。这就是为什么您得到前6个字符+ NUL +垃圾的原因。那很聪明。也很危险。想知道为什么它不分段。那第8个垃圾字节超出范围了,不是吗?
我首先想出的东西与@Borsunho的第一次尝试非常相似,但是我的时间稍长一些,他在我完成之前就发布了他的信息。在他进行30字节编辑之前想到了这个方法:)
->s{s[/^(?!google$).*/].size}
用法示例:
$ irb
2.2.1 :001 > f = ->s{s[/^(?!google$).*/].size}
=> #<Proc:0x007fa0ea03eb60@(irb):1 (lambda)>
2.2.1 :002 > f[""]
=> 0
2.2.1 :003 > f["bing"]
=> 4
2.2.1 :004 > f["google"]
NoMethodError: undefined method `size' for nil:NilClass
from (irb):1:in `block in irb_binding'
from (irb):4:in `[]'
from (irb):4
from /Users/daniel/.rvm/rubies/ruby-2.2.1/bin/irb:11:in `<main>'
->s{+s[/^(?!google$).*/]}
替换String#size
为新的一元加号。在线尝试!
^
使它正常工作(我没有想出要离开比赛组)。
.*
为止:)我认为最后是使它起作用的原因。
/\A(?!google\Z).*/m
修复它(但是要花三个字节)。^
和$
匹配行的开头和结尾,而匹配\A
和\Z
匹配整个字符串的开头和结尾。
i:0(?v
31&l~<v0"google"~~.?%2l
$v?(2l<S?*=2l=6:+={
&<;n
想通了,我会尝试一下,而不是我最好的高尔夫尝试或算法。本身不是一个功能,但是我认为这应该仍然有效。我将查看是否可以编辑更好的版本。
如果允许打印长度然后输入错误,请使用以下46字节的解决方案:
i:0(?v
2lnl~<v0"google";?%
$;?(2l<S?*=2l=6:+={
这种性质的49字节以前的解决方案:
i:0(?v
l0nl~<v;!?=7
:;?(2l<S?*=2l=6:+=@@g3
elgoog
如果您有兴趣,我很乐意提出解释,如果我的回答有任何问题或您有高尔夫球的建议,请告诉我。
嗨,我是打高尔夫球的新手,所以它可能可以打更多的高尔夫球,但是在这里:
_=>_=="google"?a:_.length
g=_=>_=="google"?a:_.length
g=_=>{if("google"==_)throw Error();return _.length}
和一些测试:
(_=>_=="google"?a:_.length)("bing")//4
(_=>_=="google"?a:_.length)("google")// Error: a is not defined
g("bing")// returns 4
g("google")// Error: a is not defined
编辑:已添加?替换if并将Error替换为未定义的对象。
编辑2:我意识到我的字节数是错误的,并删除了g =
{.,\'google'=!/}
像许多其他方法一样,只需将输入与之比较,'google'
然后将长度除以结果的倒数即可。
示例程序:
'bing'
(输出:4
)'google'
(输出:错误:试图除以零。)IF /I "%string%"=="google" exit
echo %string%> string.txt
for %%? in (string.txt) do ( SET /A stringlength=%%~z? - 2 )
输出为%stringlength%。
完整代码:
@echo off
del string.txt
cls
echo Type your string
echo.
set /p string=String:
IF /I "%string%"=="google" goto err
echo %string%> string.txt
for %%? in (string.txt) do ( SET /A stringlength=%%~z? - 2 )
cls
echo %stringlength%
pause
del string.txt
:err
color c
echo There seems to be an error with your input...
pause>nul
根据Joshua Honig的回答在此处进行了修改。