因此管理垃圾


35

PPCG在某种程度上已经成为一种传统,一些用户通过字谜(通过重新排序旧字母而形成的新名称)临时更改其名称。

有时很难找出谁是谁。我可以使用一个程序或函数来判断两个短语是否是彼此的字谜。

挑战

程序或函数应该采用两个字符串,并且如果它们彼此是字谜,则应产生真实的结果,否则应为虚假的。

规则

  • 输入将仅包含字母(ASCII 65至90和97至122),数字(ASCII 48至57)或空格(ASCII 32)。
  • 字谜关系与大小写无关。所以“手臂”和“ RAM”是字谜。
  • 空格也不计算在内。所以“键盘”和“吠叫哟”
  • 允许所有内置
  • 输入格式灵活(两个字符串,两个字符串的数组,包含两个短语的字符串以及合适的分隔符...)

代码高尔夫。最少的字节数获胜。

测试用例

真相:

Lynn, Nyl N
Digital Trauma, Tau Digital Arm
Sp3000, P S 3000
Manage Trash So, Those anagrams

虚假

Calvins Hobbies, Helka Homba
Android, rains odd
In between days, bayed entwine
Code golf, cod elf got

8
相关但有所不同(只有字母,没有大小写,没有空格)
Luis Mendo

4
对于没有喝咖啡的人,这个问题的标题非常令人困惑。+1:D

1
@ DonMuesli我会说这仍然是骗子。细微的变化是微不足道的。
Mego

15
Manage Trash So, Those anagrams。真好
mbomb007 '16

3
So, the anagrams...
Leaky Nun

Answers:



15

视网膜25

i+`(\w)(.*,.*)\1
$2
^\W*$

在线尝试!此外,您可以运行修改后的多行版本

删除逗号前的字母及其后的匹配项。如果我们没有剩下的字母,那就是七巧板。


对于Retina,如果将正数视为失败,将零视为成功,则可以将其\w用作最后一个阶段,使其短三字节。
FryAmTheEggman '16


@ dev-null “输入将仅包含字母(ASCII 65至90和97至122),数字(ASCII 48至57)或空格(ASCII 32)”
FryAmTheEggman

11

Pyth,11个10字节

感谢@FryAmTheEggman教给我的力量;

qFmSr-d;0Q

在这里尝试!

将两个字符串的列表作为输入。

说明

qFmSr-d; 0Q#Q =输入

  m Q#将d作为lambda变量映射Q
     -d; #过滤掉字符串中的空格
    r 0#转换为小写
   S#对字符串中的所有字符进行排序
qF#展开结果列表并检查是否相等

10

Python 2,63 61字节

lambda*l:len({`sorted(s.lower())`[2::5].strip()for s in l})<2

一个匿名函数,实际上,它接受n个参数并确定所有n是否都是相互回文!f("Lynn", "Nyl N")返回True

集合理解技巧是xnor编写的。它节省了两个字节,但是旧方法看起来很整洁:

exec"a=`sorted(input().lower())`[2::5].strip();a"*2;print a==aa

`sorted(input().lower())`.strip(" [',")长度相同:/
Sp3000 '16

exec事是聪明的,但似乎过于复杂。您可以用做得更好lambda*l:len({`sorted(s.lower())`[2::5].strip()for s in l})<2
xnor

2
谢谢!我有点失望-看起来很酷。无论如何都要保留它。
林恩

7

果冻,12个字节

ḟ€⁶O&95Ṣ€QLḂ

在线尝试!

怎么运行的

ḟ€⁶O&95Ṣ€QLḂ  Main link. Input: A (list of strings)

  ⁶           Yield ' '.
ḟ€            Filter it from each string.
   O          Apply ordinal to all characters.
    &95       Take bitwise AND with 95 to make the ordinals case-insensitive.
       Ṣ€     Sort each list of ordinals.
         Q    Deduplicate the list.
          L   Get the length.
           Ḃ  Compute the length's parity (1 -> 1, 2 -> 0).

替代版本,无竞争(9字节)

Jelly的大写原子有一个错误,Jelly仍然没有内置的功能可以测试列表是否相等...

ḟ⁶ŒuṢµ€⁼/

在线尝试!

怎么运行的

ḟ⁶ŒuṢµ€⁼/     Main link. Input: A (list of strings)

     µ€       Map the chain to the left over A.
 ⁶            Yield ' '.
ḟ             Filter it from the string.
  Œu          Cast to uppercase.
    Ṣ         Sort.
       ⁼/     Reduce by equality.

6

CJam,11 12 14字节

3 @ @ FryAmTheEggman删除了2个字节

{lelS-$}2*=

在线尝试!

{      }2*       e# do this twice
 l               e# read line as a string
  el             e# make lowercase
    S-           e# remove spaces from string
      $          e# sort
          =      e# compare strings

@FryAmTheEggman谢谢!
Luis Mendo

@FryAmTheEggman再次感谢!关于CJam,我还有很多要学习的知识:-)
Luis

3
您的代码在偷偷地笑。lel
Cyoce '16

还是一个?lel==> 1e1没有人知道。这是一个谜。
user48538 '16

6

Javascript,69 61 60 59字节

感谢@ӍѲꝆΛҐӍΛПҒЦꝆ1个字节。1字节关闭与currying(由@apsillers 指出

n=>m=>(G=s=>[]+s.toLowerCase().split(/ */).sort())(n)==G(m)


2
非常好,可以过滤出空间并同时转换为数组!
尼尔

2
非常好。您可以使用curring来保存一个字节,社区认为这是可接受的参数形式n=>m=>...
apsillers

尝试n=>m=>(G=s=>[]+s.toLowerCase().split(/\S/).sort())(n)==G(m)。使用split而不是match应该可以节省一个字节。
Mama Fun Roll

@ӍѲꝆΛҐӍΛПҒЦꝆ。否,因为假设s='db cz'...现在会导致...并导致s.match(/\S/g).sort()['b','c','d','z']s.split(/\s/).sort()['cz','db']
删除

@ӍѲꝆΛҐӍΛПҒЦꝆ。但是...调查您的想法,我做了些改动,并保存了一个字节...谢谢!
删除

6

MATL,11个字节

2:"jkXvS]X=

编辑(2016年5月20日)由于语言的最新更改,链接中的代码使用Xz代替Xv

在线尝试!

2:"     ]       % do this twice
   j            % read input line as a string
    k           % convert to lowercase
     Xv         % remove spaces
       S        % sort
         X=     % are they equal?

3
您只是为这个挑战改名了吗?
Denker

3
@DenkerAffe我已经考虑了一段时间。我只是把它与挑战相吻合:-)
路易斯·门多

1
Don Muesli哈哈。因此,您是Muesli Luis的主!这是保持肤色健康的方法吗?
rayryeng-恢复莫妮卡

@rayryeng嘿!雷,很高兴在这里见到你!回到打高尔夫球!
路易斯·门多

我保证我会:)一旦课程结束...我也看到你也在学习CJam。非常好!
rayryeng-恢复莫妮卡

4

严重的是11 9个字节

2`,ùSô`n=

在线尝试!

每个人似乎都在使用相同的算法。这里又来了。

2`    `n          Do it twice
  ,               Read a string
   ù              Make it lowercase
    S             Sort
     ô            Strip spaces.
        =         Check equality.

编辑:意识到排序确实可以在字符串上正常工作,并且将空格排序到最前面,因此strip()可以工作。


4

C,165字节

#define d(x) int x(char*a,char*b){
d(q)return*a&224-*b&224;}
#define n(x) for(qsort(x,strlen(x),1,(__compar_fn_t)q);*x<33;x++);
d(s)n(a)n(b)return strcasecmp(a,b);}

可读且在工作环境中,

#include <stdlib.h>
#include <string.h>
#include <stdio.h>

// start of comparison
int q(char *a, char *b){
     return ((*a)&0xdf)-((*b)&0xdf); // case-insensitive
}
int s(char *a, char *b){
    for(qsort(a,strlen(a),1,(__compar_fn_t)q); *a<33; a++) /**/;
    for(qsort(b,strlen(b),1,(__compar_fn_t)q); *b<33; b++) /**/;
    return strcasecmp(a,b);
}
// end of comparison

int main(int i, char **v){
    printf("'%s' '%s'", v[1], v[2]);
    printf("=> %d\n", s(v[1], v[2])); // 0 if equalish
    return 0;
}

3

zsh,85个字节

[ $(for x in $@;{tr -d \ <<<$x|tr A-Z a-z|fold -1|sort|paste -sd x}|uniq|wc -l) = 1 ]

输入为命令行参数,输出为返回码。

for语法使得这一击不兼容。

[               # test...
$(for x in $@;  # map over arguments
{tr -d \ <<<$x  # remove spaces
|tr A-Z a-z     # lowercase
|fold -1        # put each character on its own line
|sort           # sort lines
|paste -sd x    # remove all newlines except last
}|uniq          # take only unique lines
|wc -l          # how many lines remain?
) = 1 ]         # if only 1 line left, it must have been an anagram

3

Japt,12个字节

N®v ¬n ¬xÃä¥

在线测试!

怎么运行的

        // Implicit: N = array of input strings
N®    Ã // Take N, and map each item Z to:
v ¬n    //  Take Z.toLowerCase(), split into chars, and sort.
¬x      //  Join and trim off whitespace.
ä¥      // Reduce each pair of items (that's exactly one pair) X and Y to X == Y.


3

Perl,34 33 +1 = 34字节

s/(.)(.*,.*)\1/$2/i?redo:say!/\w/

需要-n标志和免费-M5.010| -E

$ perl -M5.010 -ne's/(.)(.*,.*)\1/$2/i?redo:say!/\w/' <<< 'hello, lloeh'
1

怎么运行的:

                                   # '-n' make a implicit while loop around the code
 s/(.)(.*,.*)\1/$2/i               # Remove a letter that occurs on both sides of the comma.
                    ?
                     redo:         # Redo is a glorified goto statement that goes to the top of the while loop
                          say!/\w/ # Check to see if any letter is left

感谢msh210建议使用三元运算符保存一个字节


3

Baloch Gyr,9个字节

{ṇ₁cḷ}ᵐpᵈ

在线尝试!

真实/错误的输出是通过谓词成功/失败来实现的,这就是Brachylog。

以前使用cṇ₁cḷḍ而不是{ṇ₁cḷ}ᵐ假设两个输入字符串的长度等于空白减去空白来保存字节,但是我意识到在失败的地方它将成功Ah Hass, haha

{    }ᵐ      For both strings in the input,
 ṇ₁          split on spaces,
   c         concatenate,
    ḷ        and lowercase.
       pᵈ    The strings are permutations of each other.

2

PHP,109 94字节

function f($x){return str_split((trim($x));}function g($x,$y){return array_diff(f($x),f($y));}

布莱奇,两个人function/return在这里杀了我。

以字符的形式返回两个string输入之间的差array。PHP认为是[]虚假的,可以满足return要求。


3
function($x,$y){$S=str_split;return array_diff($S(trim($x)),$S(trim($y)));}-> 75个字​​节。创建一个返回结果的匿名函数。我删除了那个长函数,并str_split用一个赋值的变量替换了对它的调用,以缩短它。
Ismael Miguel

真好 我正在对其进行调整,以将其简化为一个功能,这比它领先两步,做得很好。
ricdesi

2

Bash + GNU实用程序,51

f()(fold -1<<<${@^^}|sort)
f $1|diff -qBw - <(f $2)
  • 定义一个函数f()
    • ${@^^} 将所有参数转换为大写
    • fold -1 分割字符-每行一个
    • sorts线
  • 打电话diff-q打压完全两种输出,并-Bw忽略空白的变化

2

Pyke(提交30,非竞争),9个字节

Fl1dk:S)q

说明:

F      )  -  for _ in eval_or_not(input())
 l1       -     ^.lower()
   dk:    -    ^.replace(" ", "")
      S   -   sorted(^)
        q - ^==^

2

Mathematica,77 76字节

StringMatchQ[##,IgnoreCase->1>0]&@@(""<>Sort[Characters@#/." "->""]&/@{##})&

第一部分实际上是我对另一个问题的答案之一!


2

派克,54个 112 109 109 96字节

#define a(x) sort((array)replace(lower_case(x)," ",""))
int s(mixed i){return a(i[0])==a(i[1]);}

mixed碰巧比短array(string)

s1如果参数为字谜,则返回。


2

Q,25字节

f:{~/{x@<x:x@&~^x:_x}'x}

注意。-计数包括函数名称f:以方便测试(作为lambda,我们可以减少2个字节)

可读版本

在每个x上匹配{升序,不降序为低x}

{.. x ..} is an anonymous function with arg x
_x        lowers string x
&~^x      where not null x (space is considered null)
x@..      selects elements of x according to indexes .. 
<x        ascending indexes of x (not values). Ex <"cab" is 1 2 0
x@<x      ascending values of x (x at ascending indexes of x)
~         match (diad function). Ex "one"~"one" is true
f'..      applies function f for each argument ..
f/..      applies function f over elements of sequence (fold)

测试

f("Lynn";"Nyl N")                       
f("Digital Trauma";"Tau Digital Arm")   
f("Sp3000";"P S 3000")                  
f("Manage Trash So";"Those anagrams")   
f("Calvins Hobbies";"Helka Homba")      
f("Android";"rains odd")                
f("In between days";"bayed entwine")    
f("Code golf";"cod elf got")    

生成(1b = true,0b = false)

1b
1b
1b
1b
0b
0b
0b
0b

关于Q

kx.com开发的通用语言(APL派生,专门用于数据处理)。适用于Windows / Linux / MacOS的免费完整功能评估版。


你是什​​么意思,其他语言都不认真?:-P
路易斯·门多

如果f要求代码正确评估,则必须将其计算在内。否则,将其保留在提交代码之外,并仅在示例中使用它来显示如何分配功能。
Mego

当然,其他语言也和Q一样严重。我求我可怜的英语。但是有些语言会牺牲可读性,或者为这类比赛配备了临时库。尽管代码不是很可读,但Q是一种“通用语言”。
J. Sendra

如果以后再降低,则只需分配一次x,因此k)~/{x@<x:_x@&~^x}'为17个字节。.但是我想说它是19,因为您需要使用k)括号,因为这是K代码而不是Q...
streetster

2

APL,31个字符

{≡/{x[⍋x←('.'⎕R'\u0')⍵~' ']}¨⍵}

如此使用:

    {≡/{x[⍋x←('.'⎕R'\u0')⍵~' ']}¨⍵}'Sp3000' 'P S 3000' 
1

用英语:

  • { ... }¨⍵:对于参数的两个元素中的每个元素
  • x←('.'⎕R'\u0')⍵~' ':将不带空格的字符串转换为大写(使用正则表达式...),并将临时结果分配给 x
  • x[⍋x]:排序x
  • ≡/:比较排序的两个结果:如果匹配,则返回1。

可以在线尝试吗?我尝试过此方法,但我真的不知道如何使用
Luis Mendo

当然。在这里:您可以在其后键入的定义f 'first avatar' 'second avatar'
lstefano

谢谢!也许将其添加到答案中?让人们可以尝试
Luis Mendo

-9:≡/{x[⍋x←0~⍨32|⎕UCS⍵]}¨
亚当

@Adám:因为 ≡/{x[⍋x←0~⍨32|⎕UCS⍵]}¨'pp' '00'给了1
所以不起作用。– lstefano

2

Java,218字节

我第一次写过Java ...

打高尔夫球:

import java.util.Arrays;boolean M(String a,String b){char[]A=a.toUpperCase().replace(" ","").toCharArray();char[]B=b.toUpperCase().replace(" ","").toCharArray();Arrays.sort(A);Arrays.sort(B);return Arrays.equals(A,B);}

取消高尔夫:

import java.util.Arrays;
public class ManageTrashSo {
    public boolean M(String a, String b) {
    char[] A = a.toUpperCase().replace(" ", "").toCharArray();
    char[] B = b.toUpperCase().replace(" ", "").toCharArray();
    Arrays.sort(A);
    Arrays.sort(B);
    return Arrays.equals(A, B);
   }
}

测试:

    ManageTrashSo manageTrashSo = new ManageTrashSo();

    //True
    System.out.println(manageTrashSo.M("Lynn", "Nyl N"));
    System.out.println(manageTrashSo.M("Digital Trauma", "Tau Digital Arm"));

    //False
    System.out.println(manageTrashSo.M("Android", "rains odd"));
    System.out.println(manageTrashSo.M("In between days", "bayed entwine"));

我知道它已经快一年了,但是你可以通过32个字节这样的高尔夫球它:boolean f(String...a){java.util.Arrays x=null;String[]A=g(a[0]),B=g(a[1]);x.sort(A);x.sort(B);return x.equals(A,B);}String[]g(String a){return a.replace(" ","").toUpperCase().split("");}186个字节),或者如果您将其转换为一个Java 8拉姆达,也可以是:a->b->{java.util.Arrays x=null;String[]A=g(a),B=g(b);x.sort(A);x.sort(B);return x.equals(A,B);};String[]g(String a){return a.replace(" ","").toUpperCase().split("");}167个字节)。这是带有测试代码的TIO。
凯文·克鲁伊森


1

Ruby,50个字节

def f;gets.upcase.chars.sort.join.strip;end
p f==f

写作f=->{...}f[]==f[]一样长。:(


1

PowerShell,81个字节

param([char[]]$a,[char[]]$b)-join($a-replace' '|sort)-eq-join($b-replace' '|sort)

对链接的Anagram挑战的回答略作重写。

将输入作为字符数组,执行-replace删除空格的操作,将sort其(按字母顺序而不是按ASCII值排序),然后将-join其返回字符串。-eq在默认情况下,PowerShell中的in不区分大小写,但此处必须在字符串上执行[char]'a'(不等于)[char]'A',因此是原因-join


1

Perl,35个字节

包括+1 -p

有点辱骂,因为它取决于命令行上给出的程序。

perl -pe'<>=~s%\S%*_=s/$&//i?_:0%reg;$_=!//'

然后在STDIN上将字符串作为2个连续行

一个非常滥用的解决方案是30个字节:

perl -ne'<>=~s%\w%1/!s/$&//i%reg;1/!//'

如果字符串不是anagram,则会崩溃,因此从外壳程序的角度给出错误的退出代码。在这种情况下,它还会在STDERR上产生垃圾。如果字符串是字谜,程序将保持沉默并给出“ true”退出代码



1

Excel VBA,122字节

匿名VBE立即窗口该功能将从范围输入[A1:B1]并输出到VBE立即窗口

a=Replace([A1]," ",""):b=Replace([B1]," ",""):For i=1To Len(a):b=Replace(b,Mid(a,i,1),"|",,1,1):Next:?b=String(len(a),"|")

0

C#,378个字节

我需要让分!

https://dotnetfiddle.net/FNDt0E

using System;
using System.Linq;
using System.Text;

public class Program
{

    public static void Main()
    {
        var l = "Hello World";

        var r = "Red Who Loll";

        var y = new Func<string,string>(s => new String(s.ToLower().Replace(" ","").OrderBy(v => v).ToArray()));
        var z = new Func<string,string,Func<string,string>,bool>((w,x,f) => f(w) == f(x));
        var o = z(l, r, y);


        Console.WriteLine("{0} & {1} are anagram: {2}",l, r, o);


                Console.WriteLine("C#, {0} bytes", Encoding.Unicode.GetByteCount(@"var y = new Func<string,string>(s => new String(s.ToLower().Replace("" "","""").OrderBy(v => v).ToArray()));
    var z = new Func<string,string,Func<string,string>,bool>((w,x,f) => f(w) == f(x));"));

    }

}

4
欢迎来到编程难题和代码高尔夫球!一般规则是将您的语言以及字节数一起放在帖子的标题中。您可以通过#在第一行中添加前导来实现。同样,对于代码高尔夫球问题,也需要打高尔夫球。首先,您应该删除不必要的空格并使用单字符变量名称。另外,您始终可以使用函数而不是完整程序(除非明确禁止)来节省更多字节。
Denker

@DenkerAffe你忍者了我:)

1
为什么所有空白?
CalculatorFeline
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.