ゴミ箱を管理する


35

PPCGでは、一部のユーザーがアナグラム(古い名前の文字を並べ替えることによって形成された新しい名前)によって一時的に名前を変更するのがやや伝統になっています。

誰が誰であるかを見つけることが困難になる場合があります。プログラムまたは関数を使用して、2つのフレーズが互いにアナグラムであるかどうかを判断できます。

チャレンジ

プログラムまたは関数は、2つの文字列を取り、それらが相互のアナグラムである場合は真実の結果を生成し、そうでない場合は偽の結果を生成する必要があります。

ルール

  • 入力には、文字(ASCII 65〜90および97〜122)、数字(ASCII 48〜57)、またはスペース(ASCII 32)のみが含まれます。
  • アナグラム関係は、ケースに依存しません。したがって、「アーム」と「RAM」はアナグラムです。
  • スペースもカウントされません。「キーボード」と「バークドヨー」はアナグラムです
  • 許可されているすべての組み込み
  • 入力形式は柔軟です(2つの文字列、2つの文字列の配列、適切な区切り文字で両方のフレーズを含む文字列...)

コードゴルフ。最少バイトが勝ちます。

テストケース

真実:

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
関連するが異なる(文字のみ、大文字と小文字、スペースなし)
ルイスメンドー

4
この質問のタイトルは、コーヒーを十分に飲んでいない人にとって非常に困惑しています。+1:D-

1
@DonMuesli私はこれがまだだまされていると主張します。わずかな変更は非常に簡単です。
メゴ

15
Manage Trash So, Those anagrams。いいね
mbomb007

3
So, the anagrams...
リーキー修道女

回答:



15

網膜、25

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

オンラインでお試しください!さらに、変更された複数行バージョンを実行できます。

コンマの前の文字とコンマの後の一致を削除します。文字が残っていない場合、それはアナグラムでした。


Retinaの場合、正の数が失敗と見なされ、ゼロが成功と見なさ\wれる場合、最後のステージとして使用することで3バイト短くなります。
FryAmTheEggman


@ dev-null 「入力には、文字(ASCII
65〜90および97〜122

11

Pyth、11 10バイト

@FryAmTheEggmanの力を教えてくれてありがとう;

qFmSr-d;0Q

ここで試してみてください!

2つの文字列のリストを入力として受け取ります。

説明

qFmSr-d; 0Q#Q =入力

  m Q#ラムダ変数としてdを使用して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によるものです。2バイト節約しましたが、古いアプローチは非常にきれいに見えました。

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

`sorted(input().lower())`.strip(" [',")同じ長さです:/
Sp3000

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ありがとうございます!
ルイスメンドー

@FryAmTheEggmanありがとうございます!私はまだCJamについて学ぶべきことがたくさんあります:-)
ルイスメンドー

3
あなたのコードはひそかに笑っています。lel
チョイス

それともそれですか?lel==> 1e1誰も知らない。それは謎です。
user48538

6

Javascript、69 61 60 59バイト

@ӍѲꝆΛҐӍΛПҒЦꝆに感謝します。(カリー化とオフ1バイト指摘により@apsillers

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


2
非常に素晴らしい、スペースをフィルタリングして同時に配列に変換します!
ニール

2
非常に素晴らしい。あなたはカリー化、使用して1つのバイトを保存することができ、引数の許容される形態であるコミュニティが決定しましたがn=>m=>...
apsillers

試してくださいn=>m=>(G=s=>[]+s.toLowerCase().split(/\S/).sort())(n)==G(m)。matchの代わりにsplitを使用すると、1バイト節約できます。
ママファンロール

@ӍѲꝆΛҐӍΛПҒЦꝆ。いいえ、なぜならs='db cz'... ...という結果になり、結果として...s.match(/\S/g).sort()['b','c','d','z']s.split(/\s/).sort()['cz','db']
削除

@ӍѲꝆΛҐӍΛПҒЦꝆ。しかし... ...あなたのアイデアを見て、私はそれを少し変えて1バイト節約しました...ありがとう!
削除

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
そのチャレンジの名前を変更しただけですか?
デンカー

3
@DenkerAffeしばらくの間考えていました。私はちょうどチャレンジと一致させました:-)
ルイスメンドー

1
ドン・ミューズリー笑 あなたはミューズリー・ルイスの主です!?これはあなたの健康的な顔色を維持する方法ですか?
rayryeng-モニカの復活

@rayryeng Heyyy!ここでお会いできて光栄です!ゴルフに戻りましょう!
ルイスメンドー

:)このコースが終了したら...私もあなたが今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

三項演算子を使用して1バイトを節約することを提案してくれたmsh210に感謝


3

Baloch Gyr、9バイト

{ṇ₁cḷ}ᵐpᵈ

オンラインでお試しください!

真実/偽の出力は、述語の成功/失敗によって実現されます。これはBrachylogです。

以前は、2つの入力文字列が同じ長さから空白文字を引いたものであるという仮定では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));}

Blech、2人function/returnがここで私を殺している。

2つのstring入力の差arrayを文字として返します。PHPは[]偽装を考慮し、return要件を満たします。


3
function($x,$y){$S=str_split;return array_diff($S(trim($x)),$S(trim($y)));}-> 75バイト。結果を返す匿名関数を作成します。長い関数を削除し、への呼び出しをstr_split割り当てられた変数に置き換えて短縮しました。
イスマエルミゲル

いいね 私はそれを1つの機能に減らすために微調整していました。これは2段階先のことで、よくできています。
-ricdesi

2

Bash + GNUユーティリティ、51

f()(fold -1<<<${@^^}|sort)
f $1|diff -qBw - <(f $2)
  • 次の機能f()を定義します。
    • ${@^^} すべてのパラメーターを大文字に変換します
    • fold -1 文字を分割-1行に1つ
    • sorts行
  • diffwith -qを呼び出して、完全なdiff出力を抑制し、-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 bytes

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

最初の部分は、実際には別の質問に対する私の答えの1つです!


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が含まれます:テストを容易にするため (as lambda we can decrement 2 Bytes)

読みやすいバージョン

{null lower 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について

General-purpose language (APL derivative, specialized in data processing) developed by kx.com. Free full functional evaluation version for Windows/Linux/MacOS.


What do you mean, other languages are not serious? :-P
Luis Mendo

If the f is required for the code to evaluate properly, then it must be counted. Otherwise, just leave it off of your submission code, and only use it in examples to show how to assign the function.
Mego

Of course, other languages are as serious as Q. I beg my poor english. But some languages sacrifices readability or are equiped with libraries ad-hoc for this type of contests. Q is a 'general purpose language', in spite of the fact that code is not very readable.
J. Sendra

You only need to assign x once if you lower later, thus k)~/{x@<x:_x@&~^x}' for 17 bytes.. but I'd say it's 19 as you need the k) bracket as this is K code rather than Q...
streetster

2

APL, 31 chars

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

To be used so:

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

In English:

  • { ... }¨⍵: for each of the two elements of the argument
  • x←('.'⎕R'\u0')⍵~' ': transform to uppercase (using a regex...) the string without the spaces and assign the temporary result to x
  • x[⍋x]: sort x
  • ≡/: compare the two results of the sorting: if they match, return 1.

Is it possible to try it online? I tried with this but I don't really know how to use it
Luis Mendo

Sure. Here: definition after which you can just type f 'first avatar' 'second avatar'
lstefano

Thanks! Maybe add that to the answer? So that people can try
Luis Mendo

–9: ≡/{x[⍋x←0~⍨32|⎕UCS⍵]}¨
Adám

@Adám: that won't work because ≡/{x[⍋x←0~⍨32|⎕UCS⍵]}¨'pp' '00' gives 1.
lstefano

2

Java, 218 Bytes

First time I've ever written Java...

Golfed:

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);}

Ungolfed:

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);
   }
}

Testing:

    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"));

I know it's been almost a year, but you can golf it by 32 bytes like this: 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 bytes) Or if you convert it to a Java 8 lambda, it can be: 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 bytes). Here is a TIO with test code.
Kevin Cruijssen


1

Ruby, 50 bytes

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

Writing f=->{...} and f[]==f[] is just as long. :(


1

PowerShell, 81 bytes

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

A slight rewrite of my answer on the linked Anagram challenge.

Takes input as char-arrays, performs a -replace operation to remove spaces, sorts them (which sorts alphabetically, not by ASCII value), then -joins them back into a string. The -eq in PowerShell is by default case-insensitive, but here it must be performed on strings, as [char]'a' is not equal to [char]'A', hence the reason for -join.


1

Perl, 35 bytes

Include +1 for -p

Somewhat abusive since it depends on the program being given on the commandline.

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

Then give the strings as 2 consecutive lines on STDIN

A very abusive solution is 30 bytes:

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

This crashes if the strings are not anagrams and therefore gives a false exit code from the point of view of the shell. It also gives garbage on STDERR for that case. If the strings are anagrams the program is silent and gives a "true" exit code



1

Excel VBA, 122 Bytes

Anonymous VBE immediate window Function that takes input from range [A1:B1] and outputs to the VBE immediate window

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 bytes

I need a handicap!!

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
Welcome to Programming Puzzles & Code Golf! General rule is to put your language together with your byte count in the headline of your post. You can do that by adding a leading # to the first line. Also for code-golf questions it is required to golf your program. For the start you should remove unecessary whitespaces and use single-character variable names. Also you can always use a function instead of a full program (unless explicitly forbidden) to save some more bytes.
Denker

@DenkerAffe you ninja'd me :)
cat

1
Why all the whitespace??
CalculatorFeline
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.