回答生命,宇宙和一切


46

任务

给定一个String作为输入,您的任务是42 在输入String恰好符合以下条件时才输出:

abbcccddddeeeeeffffffggggggghhhhhhhhiiiiiiiiijjjjjjjjjjkkkkkkkkkkkllllllllllllmmmmmmmmmmmmmnnnnnnnnnnnnnnoooooooooooooooppppppppppppppppqqqqqqqqqqqqqqqqqrrrrrrrrrrrrrrrrrrsssssssssssssssssssttttttttttttttttttttuuuuuuuuuuuuuuuuuuuuuvvvvvvvvvvvvvvvvvvvvvvwwwwwwwwwwwwwwwwwwwwwwwxxxxxxxxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyyyyyyyyyyyzzzzzzzzzzzzzzzzzzzzzzzzzz

如果输入不等于上述字符串,则它可能会输出任何其他值,产生错误或完全不输出。


获胜标准

这是,因此以字节为单位的最短代码胜出!


此处提供的许多解决方案都是错误的,因为当字符串比所需的字符串长且前缀与所需的字符串匹配时,它们会打印42。
fR0DDY 2011年

@froddy:如果只有字符怎么办?在字符串之后(是|是换行符)吗?我通常的输入机制并不关心输入是否以换行符终止,但是在两种情况下都产生相同的结果。
乔伊

@ fR0DDY:对于其余的输入应如何处理尚无明确的定义,因此这里没有“错误”。
PatrickvL 2011年

3
@PatrickvL如果输入是给定的字符串,它确实提到了“仅”。因此abbcccddddeeeee...zzabc,我不满足我的设想,我可以看到一些程序在该输入中给出了“是”。
fR0DDY 2011年

2
@ fR0DDY:让我换一种说法:没有关于如何分隔输入的规范,因此可以解释。也没有提到字符编码(我想我们大多数人都假设使用默认的环境-ANSI,UTF8和UTF16LE将是最受欢迎的)。也没有提及输入的显示方式-是通过标准输入通过命令行参数输入的吗?因此,您看到-拥有所有这些自由,可以让您将某些解释标记为“不正确”,而其他人则将其判断为“符合”。NOFI,但这是我们中某些人的日常做法。
PatrickvL 2011年

Answers:


20

Golfscript,20岁

26,{.97+\{.}*}%=42`*

换行了21个字符(由Nabb撰写)

26,{).[96+]*}%n+=42`*

其实是Nabb打败了我,这是换行22字符的原始解决方案

26,{.97+\{.}*}%n+=42`*

这只是生成源字符串,并将其与stdin中的字符串进行比较。


3
26,{).[96+]*}%n+=42`*为21(inc换行符)。
2011年

嘿,没有n+数组就无法工作,因为数组不是平坦的。您必须保留原始的20个字符或添加一个~以使数组的内部术语变平。
2011年

@Nabb,嘿,我没意识到换行符使它与众不同。

13

Ruby 1.9, 46 42 39个字符

p (?a..?z).map{|a|a*$.+=1}*""==gets&&42

假设输入未以换行符终止。


从得到的换行符呢?
steenslag 2011年

2
@steenslag:规范没有说明输入由换行符终止的任何内容,因此此解决方案假定没有输入。
Ventero 2011年

11

C程序-78 89

编辑:当有多余字符时不要打印42。

假设输入没有尾随换行符。

main(i,j){for(i=1;i<27;i++)for(j=i;j--;getchar()==96+i?0:exit(1));puts("42"+!!gets(&i));}

如果前缀不匹配,则程序退出。如果前缀匹配,但是有1-3个左右的额外字符,则打印2。否则,产生未定义的行为。

通过更改exit(1)为,可以缩短一个字符fork()。哦,不重要的一点是,请记住保存所有打开的文档,以防万一由于某种原因您的系统被锁定。


1
如果字符串比所需的字符串长且前缀与所需的字符串匹配,则会打印42。
fR0DDY 2011-03-10

8

PHP(60)

假设在命令行中提供了输入:

for(;$i<702;)$s.=chr(96.5+sqrt($i+=2));echo$s!=$argv[1]?:42;

说明:您可以将字符串视为三角形结构。

j     i   val
0     0   a
1   1-2   bb
2   3-5   ccc
3   6-9   dddd
4 10-14   eeeee
5 15-20   ffffff
      ...

j从索引i = j*(j+1)/2(这是三角数公式)开始。求解二次方程会导致索引i在线j = int((sqrt(8*i+1)-1)/2)并因此包含字符97 + int((sqrt(8*i+1)-1)/2)。该0-350指数系列使我们能够简化到96.5 + sqrt(2*(i+1)),但不再适用于较大的值如此。

编辑:根据注释中的建议切换到命令行输入。
编辑:使用条件运算符保存字符


+1,有效;)嗯,请您详细说明一下如何进行的$s.=chr(96.5+sqrt($i+=2));
克莱德·罗伯

编辑。我希望这是有道理的:-)
sam hocevar 2011年

for(; $ i <702;)$ s。= chr(96.5 + sqrt($ i + = 2)); echo($ s == $ argv [1])* 42; 假设输入标准输入,仅61个字符
Viper_Sb 2011年

@Viper_Sb:感谢您的提示;我不确定规则,所以模仿了克莱德的解决方案。我同意你的建议。
sam hocevar 2011年

1
@powtac语言语法在这里不需要空格
sam hocevar 2011年

7

Perl,35 43岁

map$s.=$_ x++$a,a..z;say 42if<>~~$s

需要Perl 5.10或更高版本(使用运行-E),输入中没有换行符。

我比较喜欢我的副作用正则表达式,但是简短的代码讲了出来。这里是纪念品。也用于Perl 5.10或更高版本,但仅用于高级/实验性正则表达式功能,因此仅需要p命令行选项。

$a=a;$_=/^(??{$b++;$a++."{$b}"}){26}$/&&42

优秀的。我尽力击败了此W /递归正则表达式,但未能低于43c。:-((
胶靴,

为什么需要说$a++."{$b}"而不是仅仅说$a++.$b
Timwi

@Timwi,因为我确实需要那些花括号出现在结果字符串中。我不想匹配文字“ d4”,我想要“ dddd”,用正则表达式“ d {4}”表示
JB

当然。感谢您的解释!
Timwi

为此提出了一个33字节的解决方案!在线尝试!
Dom Hastings

7

05AB1E,7个字节(非竞争)

AƶJQi42

在线尝试!

说明

A       push lowercase alphabet
 ƶ      lift every letter, push it and multiply it by its index
  J     join the list
   Qi   does it equal the input?
     42 push 42 and output implicitly

刚经历一些挑战以学习05AB1E(以及一般的高尔夫运动)。昨天,这个挑战被标记为是主动的,我找到了一个简短的解决方案,那么为什么不分享呢?:)


3
欢迎来到PPCG!
Steadybox

6

Haskell程序-71 67 64 57

假定没有尾随换行符,并且也不输出任何换行符。

f x|x==[c|c<-['a'..'z'],_<-['a'..c]]="42"
main=interact f

用法:

$ echo -n 'abbcccddddeeeeeffffffggggggghhhhhhhhiiiiiiiiijjjjjjjjjjkkkkkkkkkkkllllllllllllmmmmmmmmmmmmmnnnnnnnnnnnnnnoooooooooooooooppppppppppppppppqqqqqqqqqqqqqqqqqrrrrrrrrrrrrrrrrrrsssssssssssssssssssttttttttttttttttttttuuuuuuuuuuuuuuuuuuuuuvvvvvvvvvvvvvvvvvvvvvvwwwwwwwwwwwwwwwwwwwwwwwxxxxxxxxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyyyyyyyyyyyzzzzzzzzzzzzzzzzzzzzzzzzzz' | { ./42; echo; }
42
$ echo -n 'something else' | { ./42; echo; }
42: 42.hs:1:0-54: Non-exhaustive patterns in function f


$

1
之前的代码仍然很可读。
丹·伯顿

1
由于zipWith到达较短列表的末尾时会停止,因此您可以替换['a'..'z']['a'..]并保存3个字符。
hammar 2011年

@hammar:谢谢。我使用>> =(concatMap)代替concat和zipWith保存了另外1个字符。
乔伊·亚当斯

@hammar:使用do表示法代替>> =和lambda节省了更多:-)
Joey Adams

2
@Joey:甚至更好:[c|c<-['a'..'z'],_<-['a'..c]]
hammar 2011年

4

J,29岁

f=:42#~((>:#a.{~97+])i.26)-:]

例:

f 'oasijfiojasef'

f 23841235

f 'abbccc...'
42

我喜欢J。而且我觉得它丑陋而可怕。我喜欢它。
seequ 2014年

4

D:94个字符

void f(S)(S s){S t;foreach(i;0..26)t~=array(repeat(cast(char)(i+'a'),i+1));s==t&&writeln(42);}

更清晰:

void f(S)(S s)
{
    S t;

    foreach(i; 0 .. 26)
        t ~= array(repeat(cast(char)(i + 'a'), i + 1));

    s == t && writeln(42);
}

3

Delphi中,164 132

这将构建一个字符串,并将其与第一个命令行参数进行比较。它比我的其他文章更短,更不复杂:

var s:string;c,i:int8;begin repeat s:=s+Char(c+97);i:=i-1;c:=c+Ord(i<0);if i<0then i:=c;until c=26;Write(42*Ord(s=ParamStr(1)));end.

(请注意,此版本假定cand i变量开始初始化为0,就像我的Delphi(2010)版本一样。)

与我的其他提交一样,如果像我之前所做的那样,在函数中不进行字符串构建,则此脚本需要较少的字符:

德尔斐(181)

program a;{$APPTYPE CONSOLE}function s(c,i:byte):string;begin if(i>0)then Exit(Char(c)+s(c,i-1));if(c<122)then Exit(s(c+1,c-95));end;begin if(s(97,1)=ParamStr(1))then Write(42);end.

请注意,输出不需要换行符,因此WriteLn()变为Write()。


3

PHP-45个字符

令人惊讶的是,没有人发布任何使用哈希的答案。这是一种测试大小确切的字符串的非常有效的方法。

echo md5($argv[1],1)!='¯è a@ÛÚƒ:ïT�p'?:42;

由于代码中间存在一个空字节,因此数据很难复制/粘贴。这是出于测试目的的十六进制转储。

65 63 68 6f 20 6d 64 35 28 24 61 72 67 76 5b 31 5d 2c 31 29 21 3d 27 af e8 a0 61 40 db da 7f 11 0f 83 3a ef 54 00 70 27 3f 3a 34 32 3b


2
聪明!尽管从技术上讲,还有其他输入值会产生相同的哈希值,但当输入为指定格式时,它并不能完全满足输出42的要求。
mellamokb

3

斯卡拉79

 if((for(i <- 1 to 26;j<-1 to i)yield(96+i).toChar).mkString==args(0))print(42)

3

珀斯,14岁

*42qzsm*dhxGdG

只需构造必要的字符串,然后与输入进行比较并乘以42。


“与输入进行比较并乘以42。” 我永远不会想到这一点。您只是帮我从解决方案中删除了1个字符。谢谢。
AndoDaan 2014年

啊,我来不及了。您能解释一下它是如何工作的吗?该功能m给我带来麻烦……
吉姆(Jim)

1
@Jim我们从map函数开始m,它将函数应用于其输入的每个元素。输入的是G字母。在字母中xGd找到d字符在字母中的位置G。将该字符h增加一倍,并*d复制该字符多次。在m函数外部,s将结果字符串列表组合为单个字符串,然后qz检查结果是否等于输入。布尔值表示为0False和1True,因此*42得出的值为42if True和0False。
isaacg

3

Brachylog(2),15个字节,语言日期挑战

⊇Ạ∧?o?ọtᵐ~⟦₁+₁₆

在线尝试!

现在,给出一个答案,该答案所采用的原理与此处所见的完全不同。这是函数提交(问题不指定需要哪种类型的提交,但默认情况下允许使用函数)。

说明

此答案通过定义一种字符串来起作用:a)包含字母的所有小写字母的字符串,b)排序的顺序,以及c)对其取字符串中每个字符的出现次数产生连续序列的字符串从1开始的整数。(应该清楚,有很多这样的字符串,但是我们要特殊情况下使用的是最短的字符串。)然后,如果字符串满足这些条件,则将16中的不同字符数加16串; 如果字符串是问题要求我们特殊输入的字符串,则将产生42,在所有其他情况下,至少将产生43。(如果字符串不符合属于该类别的任何条件,则该函数将以失败结束,这有点像抛出异常。)

以下是解释源代码的方法:

⊇Ạ∧?o?ọtᵐ~⟦₁+₁₆
⊇Ạ               {the input} contains all lowercase letters
  ∧              and
   ?o?           the input sorts to itself
                 {and; implied when two conditions overlap}
     ?ọ          the {character, number of occurrences} pairs for the input
       tᵐ        when the second element of each is taken
         ~       create an output that could have been produced by
          ⟦₁     outputting the list of integers from 1 to some input inclusive;
            +₁₆  add 16 to that input {and output it}

3

R,60 58

if(readline()==paste0(rep(letters,1:26),collapse=""))cat(42)

if(scan(,"")==paste(rep(letters,1:26),collapse=""))cat(42)

感谢@giusppe的建议


我认为这paste很好,您可以使用scan(,"")代替readline()
朱塞佩

2

巨蟒(84)

假定输入末尾有换行符。

导入系统
if''。join(c * chr(c + 96)for c in range(27))+'\ n'== sys.stdin.read():print 42

1
为什么不使用raw_input代替sys.stdin.read
胡安

1
@Juan:raw_input只读一行;我不确定“输入”将始终是一行还是在以后的行中是否存在取消资格的输入。
Hoa Long Tam

2

Python-62个字符

print("".join(x*chr(x+96) for x in range(27))==raw_input())*42

2
在Python 3中可以更短print("".join(x*chr(x+96)for x in range(27))==input())*42
mbomb007'3

2

Perl,49个 46个字符

在程序中使用,而不是在命令行上使用

$..=chr($+96)x$ for 1..26;$.eq(pop)&&print '42'

join('',map$_ x++$x,'a'..'z')eq pop&&print'42'

问候

机器人

编辑:从Ventero撕下的想法


2

PHP 92 88 87个字符

function _($a){for($i=97;$i<123;$i++)for($j=$i-96;$j;$j--)$b.=chr($i);echo($b==$a)*42;}

编辑

更换$j<0$jreturn $b==$a?42:0;echo $b==$a?42:0;

替换echo $b==$a?42:0;echo($b==$a)*42;


2
如果不是因为所有破烂的美元符号,可能是80个字符。
乔伊·亚当斯

另请参阅我的单环解决方案条目。
sam hocevar 2011年

2

ECLiPSe前言-173

c(_,[],_):-!. c(A,M,N):-length(L,N),checklist('='(A),L),append(F,L,M),P is N-1,B is A-1,c(B,F,P). ?- read_string(end_of_file,351,S),string_list(S,L),c(122,L,26),writeln(42).

2

JavaScript(91 93 94 98 102 116

用法:a('string')42如果根据规格有效,则返回,或0

function a(z){for(i=r='';i++<26;)for(j=i;j--;)r+=String.fromCharCode(i+96);return(z==r)*42}

http://jsfiddle.net/g25M3/6/

编辑:删除var并消除了两个空格for (

编辑2:更改j>0j

  1. return (z==r)?42:0;
  2. return z==r?42:0

编辑3:初始化ii='',变化

  1. (z==r)?42:0
  2. (z==r)*42

编辑4:更改

  1. for(;i<27;i++)
  2. while(i++<26)

编辑5:更改

  1. i=r='';while(i++<26)
  2. for(i=r='';i++<26;)
  3. for(j=i;j;j--)
  4. for(j=i;j--;)

好吧,如果您不使用var声明变量,则可以再减少12个字符;)
Clyde Lobo

@克莱德:谢谢!还发现我可以删除之间的空间for (
mellamokb 2011年

是的,也有相同的建议;)哦,我用与您相同的逻辑在PHP中编写了一个解决方案
Clyde Lobo

您可以return(z==r)?42:0;return z==r?42:0
Clyde Lobo

j>0可能只是j我想。
YOU

2

JavaScript 1.8,99个字符

function c(x)(x.replace(/([a-z])\1*/g,function(m)!(a-m.length)*m.charCodeAt(0)-96-a++,a=1)==0)*a+15

我敢让你理解它:)


2

PHP-59

假设在cli上至少提供了1个输入

echo md5($argv[1])!='afe8a06140dbda7f110f833aef540070'?:42;

它或多或少地起作用,除了md5在技术上可以与哈希算法重复。


2

PowerShell v2 +,47个字节

42*(-join(1..26|%{,[char]($_+96)*$_})-ceq$args)

构造一个范围1..26,并通过循环将其馈入|%{...}。每次迭代时,我们都使用逗号运算符来构造当前值[char]乘以当前循环号的数组文字。然后-join,我们将所有这些一起构造出字符串abbcccdddd...,然后-ceq对我们的输入使用区分大小写的比较$args,这将导致$TRUE$FALSE。在PowerShell中,布尔值可以分别隐式转换为10,这就是使用42*42如果输入是abbccc...zzzzzzzzzzzzzzzzzzzzzzzzzz,将打印输出,0否则输出。


您可以保存一个字节:) 在线尝试!
mazzy

2

K,26字节

{(::;42)x~,/(1+!26)#'.Q.a}
{(::;42)x~,/(1+!26)#'.Q.a}"hello"
{(::;42)x~,/(1+!26)#'.Q.a}"abbcccddddeeeeeffffffggggggghhhhhhhhiiiiiiiiijjjjjjjjjjkkkkkkkkkkkllllllllllllmmmmmmmmmmmmmnnnnnnnnnnnnnnoooooooooooooooppppppppppppppppqqqqqqqqqqqqqqqqqrrrrrrrrrrrrrrrrrrsssssssssssssssssssttttttttttttttttttttuuuuuuuuuuuuuuuuuuuuuvvvvvvvvvvvvvvvvvvvvvvwwwwwwwwwwwwwwwwwwwwwwwxxxxxxxxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyyyyyyyyyyyzzzzzzzzzzzzzzzzzzzzzzzzzz"
42

谢谢


{$[x~.Q.a@&1+!26;42;]}22个字节。
streetster

1
42*(&!27)~-96+"j"$18个字节(移植我确定的答案)。
streetster

2

VBA 91

没有任何VBA答案,但这可行:

Function f(t)
    For i = 1 To 26
        o = o & String(i, Chr(i + 96))
    Next
    f = -42 * (t = o)
End Function

真的不可能从中删除任何空格吗?
硕果累累

1
精简版,61个字节-o="":For i=1To 26:o=o &String(i,Chr(i+96)):Next:?-42*([A1]=o)
泰勒斯科特

@ Challenger5不,这不是不可能。泰勒的斯科特评论正是这样。它在立即窗口中运行,并从单元格中获取值A1作为输入。
Engineer Toast

2

APL(Dyalog)18 17字节

42/⍨⍞≡819⌶⎕A/⍨⍳26

在线尝试!

如果允许使用大写字母,则可以保存四个明显的字节。

42 42

/⍨ 如果(照亮)

 字符输入

 等同于

819⌶ 小写

⎕A一个 lphabet

/⍨ 复制者

 一通

26 26


1

Clojure -61个字符

(fn[a](if(=(mapcat #(repeat%(char(+% 96)))(range 1 27))a)42))

利用以下事实:

  • Clojure可以将任何字符串自动解释为字符序列
  • 我可以使用1到26之间的数字范围来创建字符,并重复正确的数字或​​次数以生成“正确的”输入

如果Clojure允许嵌套#()s,将节省6个字符。我认为Clojure 1.4的重要功能要求!
mikera 2011年

1

Javascript 144

可能可以得到显着改善,递归对我而言一直遥遥领先。

压缩的

function r(a,b,d,c){c++;if(b<d)a+=r(a,b+1,d,c);for(i=0;i<c;i++)a=String.fromCharCode(b)+a;return a}function q(a){if(q==r(a,97,122,0))return 42};

压缩少

function r(s, c, x, w){        
    w++;
    if(c < x)
        s += r(s, c + 1, x, w);
    for(i = 0; i < w; i++)
        s = String.fromCharCode(c) + s;              
    return s;
}
function q(z){
    if(q==r(z,97, 122, 0))
        return 42;            
}

alert(q("rgrg"));

1

德尔斐127

var b:Char;c,i:Int8;begin repeat if i<0then i:=c;Read(b);if c+97<>Ord(b)then Exit;i:=i-1;c:=c+Ord(i<0)until i=27;Write(42);end.

这个从输入中读取字符串,对其进行比较,当输入匹配到last时写入42 z

德尔斐(157)

var b:pchar;c,i:byte;begin b:=CmdLine+85;c:=97;i:=1;repeat Inc(b);if b^<>Char(c)then Exit;Dec(i);if i>0then Continue;c:=c+1;i:=c-96;until i=27;Write(42);end.

德尔斐(188)

program a;{$APPTYPE CONSOLE}var b:pchar;c,i:byte;begin b:=CmdLine+85;c:=97;i:=1;repeat Inc(b);if(b^<>Char(c))then Exit;Dec(i);if(i>0)then Continue;c:=c+1;i:=c-96;until(i=27);Write(42);end.

此版本不使用函数,与该技术的先前版本相比,该函数节省了很多字符:

德尔斐(213)

program a;{$APPTYPE CONSOLE}function t(b:pchar;c,i:byte):byte;begin repeat Inc(b);if(b^<>Char(c))then Exit(0);Dec(i);if(i>0)then Continue;c:=c+1;i:=c-96;until(i=27);t:=42;end;begin WriteLn(t(CmdLine+77,97,1));end.

有点长,主要是因为Delphi的long关键字,并且需要初始化控制台应用程序才能写入输出。

还要注意,我将CmdLine增加了77个字符,因为这是我跳过本地可执行路径所需的偏移量(Delphi没有直接参数指针)。进行调整以匹配您自己的设置(当偏移量<10时,字符减少1个)。


您可以在ProjectOptions / DelphiCompiler / Linking / GenerateConsoleApplication下设置应用程序类型。另外,您可以省略该program a;行。和方括号周围b^<>Char(c)i>0并且i=27可以将其删除。
Wouter van Nifterick 2011年

@Wouter van Nifterick:感谢您的建议,我也会将其应用于其他提交的内容。(我什至都​​不知道if i>0then会编译!)
PatrickvL 2011年
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.