确定字符串是否为字谜


85

挑战

给定两个字符串,算出它们中是否都具有完全相同的字符。

输入值

单词,wrdo

true之所以返回,是因为它们相同,但只是被打乱了。

输入值

单词,写

这返回false

输入值

船,鸟羽

这返回 true

规则

这是规则!

  • 假设输入将至少为1个字符长,并且不超过8个字符。
  • 没有特殊字符,只有az
  • 所有输入都可以假定为小写

测试用例

boat, boat = true
toab, boat = true
oabt, toab = true
a, aa = false
zzz, zzzzzzzz = false
zyyyzzzz, yyzzzzzy = true
sleepy, pyels = false
p,p = true

10
13个视图中有9个答案...哇!
汤姆·古伦

@Tom,因为每个人都想证明您对使用64位整数的评论指向了错误的方向:P
Peter Taylor

5
标题要求:鳕鱼精灵,去吧!

5
“猎鹰之怒,发疯!”
Geobits

7
我的名字建议:“它们是字谜”→“管理数组”
Esolanging Fruit

Answers:


39

Python,32个字节

f=lambda a,b,S=sorted:S(a)==S(b)

3
@Debanjan,这仅仅是一样def f(a,b):return sorted(a)==sorted(b)的权衡是,你能代替高清+与拉姆达换来回报不使用任何语句
gnibbler

1
@Debanjan,我认为它只会为您节省一个字符。我在这里使用了一个变体,但是它的长度与您的变体相同,因为我将换行符换成逗号
gnibbler 2011年

4
@Tomas,胡说八道。该问题未指定完整程序,因此可以接受功能或完整程序。
gnibbler

2
@Tomas,此处的大多数答案均未通过您的标准。为什么不对所有这样做的人投赞成票呢?
gnibbler

4
@Tomas,这不是滥用规则。像这个问题一样,有些问题是故意开放的。与像一个明确指定的问题比较。如果您不喜欢这些答案,请向提问
gnibbler 2014年

27

Golfscript,3个字符?

$$=

用法:

'boat'$'baot'$=
1

'toab'$'boat'$=
1

'oabt'$'toab'$=
1

'a'$'aa'$=
0

'zzz'$'zzzzzzzz'$=
0

'zyyyzzzz'$'yyzzzzzy'$=
1

'sleepy'$'pyels'$=
0

'p'$'p'$=
1

23
这是关于如何提供输入的有趣解释:)
gnibbler,2011年

4
请解释:(
st0le 2011年

10
@ st0le,认真吗?我不知道golfscript,但显然是$(sort),$(sort),=(compare)
Peter Taylor

11
这不是有点作弊吗?我的意思是,它不是可变输入。它必须是硬编码的。无论如何,我都会在引号(')字符的字符数中加4 。
Thomas Eding

6
根据我们当前的规则,这是无效的。但是,您可以将其更改为@JanDvorak的4字节函数,该函数将接受有效输入格式的输入
门把手

20

J,8

-:&(/:~)

从字面上看,将(-:)上的(&)匹配(/:~

样品使用:

   'boat' -:&(/:~) 'boat'
1
   'toab' -:&(/:~) 'boat'
1
   'oabt' -:&(/:~) 'toab'
1
   'a' -:&(/:~) 'aa'
0
   'zzz' -:&(/:~) 'zzzzzzzz'
0
   'zyyyzzzz' -:&(/:~) 'yyzzzzzy'
1
   'sleepy' -:&(/:~) 'pyels'
0
   'p' -:&(/:~) 'p'
1

64位整数在哪里起作用?


无法在J中编写函数/子例程吗?

2
@Tim Nordenfur:它们被称为“动词”,其右边的一个参数如v arg(monads),或两侧的两个参数arg1 v arg2(dyads)。我提交的显然是一双。我没有为它起名字而烦恼,因为它不是必需的,而且用这种方法更短。如果您真的想给它起一个名字,您可以这样做:is_anagram_of =: -:&(/:~)然后使用as 'a' is_anagram_of 'aa'
JB

将参数替换为代码感觉有点便宜,但是我现在看到它实际上是一个双子集。没关系。

29
J始终看起来像是图释工厂爆炸的遗迹。
st0le 2011年

19

的Javascript,192个 157 152 147 125字节

好的,其中一些语言比我想象的要灵活得多!无论如何,这是我猜测的较长方法,但至少是另一种方法。

压缩的

感谢Peter和David挤出更多的字符!

for(a=[j=p=2];j<123;)a[j]?p%a[++j]<1&&p++&&(j=0):(a[j]=p,j=0);function b(c,i){return c[i=i||0]?a[c.charCodeAt(i)]*b(c,++i):1}

然后做:

alert(b("hello")==b("elloh"));

扩展代码

压缩程序已经发生了很多变化,但这是基本理论:

// Define dictionary of primes
a = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101];

// Returns the unique ID of the word (order irrelevant)
function b(c) {
    r = 1;
    for (i = 0; i < c.length; i++)
        r *= a[c[i].charCodeAt(0) - 97];
    return r
}

alert(b("hello") == b("hlleo"));

使用素数的好主意。

@蒂姆,谢谢!现在降至157。
汤姆·古伦

2
您可以使用筛子从字典初始化中删除几个字符。a=[2];for(p=3,j=0;j<26;)if(a[j]){if(p%a[j++]==0){p++;j=0}}else{a[j]=p;j=0}
彼得·泰勒

1
@Tom,取决于排序例程的优化程度,因为您将输入限制为8个字符:P
Peter Taylor,

1
125个字符。递归和三进制FTW:for(a=[j=p=2];j<123;)a[j]?p%a[++j]<1&&p++&&(j=0):(a[j]=p,j=0);function b(c,i){return c[i=i||0]?a[c.charCodeAt(i)]*b(c,++i):1}
David Murdoch

15

Golfscript,8个字节

这定义了一个称为 A

{$\$=}:A

测试用例

;
'boat' 'boat' A
'toab' 'boat' A
'oabt' 'toab' A
'a' 'aa' A
'zzz' 'zzzzzzzz' A
'zyyyzzzz' 'yyzzzzzy' A
'sleepy' 'pyels' A
'p' 'p' A

11

Haskell,31个字节

功能-31

import List
f=(.sort).(==).sort

程序-81 58 55

import List
g=sort`fmap`getLine
main=(`fmap`g).(==)=<<g

用法:

$ runghc anagram.hs
boat
boat
True
$ runghc anagram.hs
toab
boat
True
$ runghc anagram.hs
a
aa
False

Lambdabot的荣誉及其无点重构


能仅在runghc下执行所需功能而不在编译时执行所需功能的Haskell代码是否仍称为“程序”?
JB

3
@JB:只能将仅需要的Perl代码perl仍称为“程序”吗?:-)
Joey Adams

JB:当今的功能语言歪曲了程序的含义,使其成为更高阶的抽象。haskell程序不只是要执行的指令列表,还可以看作是函数的集合,即使未调用它们也是如此。
卡勒姆·罗杰斯

@Callum Rogers:我的意思是:在问题敏感区域,无论是在runghc还是编译下,他的代码的行为都不同。“功能”很好。除了runghc之外,“程序”无法解决任何问题,并且runghc并不是运行Haskell程序的唯一合法方法。在这种情况下,这会使代码段成为“ runghc脚本”,而不是 “ Haskell程序”。-并不是说我认为这个问题很重要,正如我所说的那样,该功能还是不错的,而且更短。
JB

2
x#y=sort x==sort y短1个字符
Rotsor 2011年

10

C#,129个字符

namespace System.Linq{class X{static void Main(string[]a){Console.Write(a[0].OrderBy(_=>_).SequenceEqual(a[1].OrderBy(_=>_)));}}}

可读性:

namespace System.Linq
{
    class X
    {
        static void Main(string[] a)
        {
            Console.Write(a[0].OrderBy(_ => _)
                  .SequenceEqual(a[1].OrderBy(_ => _)));
        }
    }
}

我想您可以用几个字节来打高尔夫球using System.Linq;而不用命名空间呢?
Stackstuck

10

Ruby,34个字节

使用Peter Taylors Perl解决方案的IO方案:

p gets.chars.sort==gets.chars.sort

引发错误:-e:1:in '<main>': undefined method 'chars' for nil:NilClass (NoMethodError)
Tomas

9

C程序,118

t[52],i;main(c){for(;i<52;)(c=getchar())<11?i+=26:t[i+c-97]++;
for(i=27;--i&&t[i-1]==t[i+25];);puts(i?"false":"true");}

1
是否考虑过申请IOCCC
Mateen Ulhaq 2011年

9
@muntoo:您在IOCCC上看到过什么吗?为此,这太可读了。
R. Martinho Fernandes

@Martinho是的,IOCCC的源代码非常漂亮。交响曲。但是他至少应该尝试组成一小块。:)
Mateen Ulhaq 2011年

@muntoo:我什至不知道他们仍然活跃。
乔伊·亚当斯

1
刚看到这个...很好。但可以更短:t[256],i;main(c){for(;c+3;)(i=getchar())>10?t[i]+=c:(c-=2);for(i=257;--i&&!t[i-1];);puts(i?"false":"true");}-这是108个字符。非常重要的是,您的c初始化技巧仍然有效。
ugoren

7

Perl,58个字节

(完整的程序,不同于其他Perl答案,后者只是一个功能)

($c,$d)=map{[sort split//]}<>;print"@$c"eq"@$d"?true:false

49个功能

sub f{($c,$d)=map{[sort split//]}<>;"@$c"eq"@$d"}

当然,您可以通过删除"周围的true和false 来在程序中保存4个字符,因为无需使用严格/警告,裸字就是一个字符串。
乔尔·伯杰


我更喜欢这样($c,$d)=map{[sort split//]}@ARGV;exit("@$c"ne"@$d")(51个字符),因此它可以接受命令行参数并使用命令行退出代码。<>多行输入将保留48个字符。
亚当·卡兹

6

Clojure-23个字符

作为匿名函数:

#(apply = (map sort %))

测试用例示例:

(#(apply = (map sort %)) ["boat" "boat"])
=> true

酷,我喜欢。
Chiron

1
好答案。我特别喜欢您选择的测试字符串;-)
coredump 2015年

6

的JavaScript

基于@zzzzBov的解决方案。

比较,65个字符(40个不带功能)

function f(a,b){return a.split('').sort()==b.split('').sort()+""}

比较器,43个字符

function f(a){return a.split('').sort()+""}

巧妙地使用+""强制转换为字符串。
Casey Chu

6

C ++(104个非ws字符)


基于计数排序。注意:假定长度相同的字符串,该字符串似乎由问题暗示(尽管未说明)。

int u[123], i;

int a(char **c) {
    for(; c[0][i]; ) {
        u[c[0][i]]++;
        u[c[1][i++]]--;
    }

    i=123;
    while(i && !u[--i]);
    return !i;
}

在C中,如果在全局范围内声明变量,则该变量将初始化为零。我想对于C ++也是如此。
乔伊·亚当斯

另一方面,局部变量不会自动初始化为零。
乔伊·亚当斯

好的,我删除了警告,因为我找到了不用此警告的方法。
马修(Matthew)

1
Bzzzt。您通过了测试用例,但是“ helle”和“ hollo”显然是相同的。轻松解决:将++之一更改为-。然后就好像(u [i ++])返回0;
Dave Gamble

1
我还没有测试过,但是最后三行可以写成i=123;while(i&&u[--i]);return!i;
st0le 2011年

4

PHP(命令行,87个字符)

function d($s){
    return array_count_values(str_split($s));
}

echo d($argv[1]) == d($argv[2]);

4

Java脚本

@zzzzBov解决方案的(非常)短一点的版本,它使用.join()而不是String boxing:

function a(b,c){return b.split('').sort().join()==c.split('').sort().join()}
alert(a('abc','bca')); //true

类似地:

function a(b){return b.split('').sort().join()}
alert(a('abc')==a('bca')); //true

3
这是答案ID1337。congratz
TheDoctor


4

爪哇

(显然每个人都喜欢的语言!)

173个字符:

import java.util.*;class g{public static void main(String[]p){String[]a=p[0].split(""),b=p[1].split("");Arrays.sort(a);Arrays.sort(b);System.out.print(Arrays.equals(a,b));}}

(不打印换行符以从println中保存2个字符)

编译并运行:

javac g.java
java -cp . g abcdef fedcba
true

喜欢看一个较短的...


我知道它已经超过6.5年(大声笑),但是您可以通过添加java.util.Arrays x=null;和使用x.而不是Arrays.class g{public static void main(String[]p){java.util.Arrays x=null;String[]a=p[0].split(""),b=p[1].split("");x.sort(a);x.sort(b);System.out.print(x.equals(a,b));}}163字节将其打10字节,然后将其转换为Java 8 class g{public static void main也可以interface g{static void main,但是我想Java 8不是还没到2011年,所以保持class还可以。; p
Kevin Cruijssen

4

sed,45个字符

在我最喜欢的地方-甚至有可能sed只需一个正则表达式即可解决字谜!只需继续删除相应的字母:

:
s/(.)(.*,.*)\1/\2/
t
/\w/{i\false
d}
i\true

(由调用-nE

Perl,48岁

1while s/(.)(.*,.*)\1/\2/;$_=/\w/?"false":"true"

与一起调用-p

Perl函数,39

sub f{$,while s/(.)(.*,.*)\1/\2/;!/\w/}

4

APL,2个字符

≡⍦

这是Nars2000的Multiset Match函数,它是最先进的APL实现之一。当应用于字符串时,它将精确计算所需的函数:

      'elvis' ≡⍦ 'lives'
1
      'alec guinness' ≡⍦ 'genuine class'
1

只是好奇,这是多少个字节?4?6吗
Maltysen

这取决于编码。UTF-8中为6个字节,UCS-2中为4个字节,如果有任何旧式单字节APL字符集带有符号,则为2个字节,我对此表示怀疑。
Tobia

4

05AB1E6 4个字节(非竞争)

{I{Q

在线尝试!

由于输入困难,花了一段时间。由于流行而打高尔夫球。

说明:

{I{Q    Original code

{       Takes first input e.g. word and sorts -> 'dorw'
 I      Takes second input e.g. 'wrdo'
  {     Sorts second input -> 'dorw'
   Q    Compare if sorted 1 = sorted 2, then print result. 'dorw' = 'dorw', so prints 1.

1
由于05AB1E比此挑战要新,因此此答案无可匹敌。
Loovjo

抱歉-没意识到。
Geno Racklin Asher 2016年

4

Perl,77个 75个字符

问题的I / O指定不充分;这将从stdin读取两行,并将truefalse输出到stdout。

sub p{join'',sort split'',$a}$a=<>;$x=p;$a=<>;print$x eq p()?"true":"false"

(感谢Tim的77-> 75)


出了点问题。$a=;?另外,您可以跳过的括号sort和后面的空格print

@Tim是开发此平台以通过网络共享代码的天才,他决定在代码块中人们必须转义少于字符。但是,嘿,没什么大不了的:这并不是好像有人在代码中使用它们,对吗?一直抓我。
彼得·泰勒

2
好的,我删除了downvote。您将来可能希望使用代码格式,即缩进代码并带有四个空格。

1
好的,所以有三种格式化代码的方式(一个内联代码和两个代码块),并且这两个代码块都以不同的方式带来不便。叹。
彼得·泰勒

4

Perl,62个字节

此函数将字符串作为参数,并返回true或false。

sub f{my@a;for$.(1,-1){$a[ord]+=$.for split//,pop}!grep{$_}@a}

将ASCII值存储在数组中,并检查其是否均匀。第一个单词递增,第二个单词递减。


4

Python 3、107 97 76 64

s=sorted;a,b=input().split(', ')
print(str(s(a)==s(b)).lower())

显然,如果我们不按字面意思采用OP的措词,而将小写的“ true”和“ false”小写,则可以缩短此时间...


如果追加的是,您可以剃掉几个大字;s=sorted的第一线,然后更换的两个实例sorteds第二行。应该保存... 3个字符?
Alex Van Liew

1
确实。Python 3还节省了一些空间,并且在发布此答案5年后,现在可以合理使用。同样,给定指定的输入,.strip()是冗余的。
Wooble

是的,对不起。当我发表评论时,我没有注意到这个问题有多大,只是它在首页上。^^;
Alex Van Liew

4

Python,32个字节

p=sorted
f=lambda a,b:p(a)==p(b)

在python中什么都不做。您确定它是一个完整的程序,可以接受输入并按要求生成输出吗?
Tomas

1
@Tomas这是一个功能
TuxCrafting,2016年

4

重击,88个字符

diff <(grep -o .<<<$1|sort) <(grep -o .<<<$2|sort)>/dev/null && echo true || echo false

4

R,54个字节

function(x,y,`~`=sort,`+`=utf8ToInt)identical(~+x,~+y)

在线尝试!


您对utf8ToInt的使用令我非常感兴趣,不仅在此答案中,而且在我看到的许多其他答案中也是如此。
Sumner18 '18

1
您是否看到过在R打高尔夫球的技巧utf8ToInt与传统功能相比,它的反向趋向于使字符串拆分更短。
J.Doe

3

REPL中的Scala(32)

readLine.sorted==readLine.sorted

Scala功能(43)

def f(a:String,b:String)=a.sorted==b.sorted

Scala程序(61)

object A extends App{println(args(0).sorted==args(1).sorted)}

它们利用了Scala的简洁功能,即字符串也可以被视为字符序列(Seq),并且所有操作Seq都可用。


3

APL-13个字符

{(⍺[⍋⍺])≡⍵[⍋⍵]}

像这样打电话:

      'boat' {(⍺[⍋⍺])≡⍵[⍋⍵]} 'baot'
1
      'baot' {(⍺[⍋⍺])≡⍵[⍋⍵]} 'boat'
1
      (,'a') {(⍺[⍋⍺])≡⍵[⍋⍵]} 'aa'
0

在最后一个示例中,'a'代表一个字符,前缀,会将其转换为字符串。


3

Java(134字节)

int[][]c=new int[2][26];
for(int i=0;i<2;i++)for(byte a:args[i].getBytes())c[i][a-97]++;
System.out.print(Arrays.equals(c[0],c[1]));`

这使数组可以计算每个字母出现的次数,然后比较数组以检查它们是否相等。


1
欢迎来到PPCG!不错的第一篇文章!您可以删除2个空格,(c[0], c[1])for (int i=0;
Rɪᴋᴇʀ

3

JavaScript,41

比较功能(41)

a=b=>''+[...b].sort()
b=(c,d)=>a(c)==a(d)
alert(b('abc', 'cba')) // true

比较器功能(21)

a=b=>''+[...b].sort()
alert(a('abc') == a('bca')); //true

比较器功能(48):

function a(b){return String(b.split('').sort())}
alert(a('abc')==a('bca')); //true

比较功能(78):

function a(b,c){return String(b.split('').sort())==String(c.split('').sort())}
alert(a('abc','bca')); //true

假设StringsplitArraysort


38个字节:c=>d=>(a=b=>''+[...b].sort())(c)==a(d)
Shieru Asakoto
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.