文字列がアナグラムかどうかを判別


85

チャレンジ

2つの文字列が与えられた場合、両方にまったく同じ文字が含まれている場合は解決します。

入力

word、wrdo

trueそれらは同じであるがスクランブルされているため、これは戻ります。

入力

単語、wwro

これはを返します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
ピーター・テイラー

5
タイトルリクエスト:タラエルフ、ゴー!

5
「ファルコンレイジ、怒って!」
ジオビット

7
私の名前の提案:→「アレイを管理」「彼らはアナグラムされている」
フルーツEsolanging

回答:


39

Python、32バイト

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

3
@Debanjan、これはまったく同じですdef f(a,b):return sorted(a)==sorted(b)。トレードオフは、ステートメントを使用しないことと引き換えにdef + returnをラムダに置き換えることです。
gnibbler

1
@Debanjan、それはあなたに1つのキャラクターしか救わないと思う。ここでバリエーションを使用しましたが、改行をコンマと交換するため、あなたと同じ長さになります
ニブラー

4
@トーマス、ナンセンス。質問は完全なプログラムを指定しないため、関数または完全なプログラムのどちらでもかまいません。
ニブラー14

2
@Tomas、ここでの回答の大半はあなたの基準に合格しません。するすべての人に賛成票を投じてみませんか?
ニブラー14

4
@Tomas、それはルールの乱用ではありません。この質問のように、いくつかの質問は意図的に開かれています。このような明確に指定された質問と比較してください。あなたはこれらの答えが気に入らない場合は、質問に文句を言うアスカー
gnibbler

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
これは、入力を提供する方法の興味深い解釈です:)
ニブラー

4
説明してください

10
@ st0le、真剣に?私はgolfscriptを知りませんが、明らかに$(ソート)、$(ソート)、=(比較)
ピーターテイラー

11
これは少し浮気じゃないですか?つまり、可変入力ではありません。ハードコーディングする必要があります。いずれにせよ、引用符(')文字の文字カウントに4を追加します。
トーマスエディング

6
これは現在の規則では無効です。ただし、これを@JanDvorakの4バイト関数に変更することもできます。この関数は、有効な入力形式を介して入力を受け入れます
ドアノブ

20

J、8

-:&(/:~)

Literaly、一致(-:上)( &)ソートアップ(/:~

使用例:

   '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:それらは「動詞」と呼ばれ、右側にある1つの引数v arg(monads)または両側にある2 つの引数arg1 v arg2(dyads)のいずれかを取ります。私が提出したのは、明らかにダイアドです。それは要求されず、このように短くなっているので、私はそれに名前を付けることを気にしませんでした。あなたがする必要があり、実際に、名前を付けたい、あなたはこのようにそれを行うだろう。is_anagram_of =: -:&(/:~)その後、として使用します'a' is_anagram_of 'aa'
JB

引数をコードに代入するのは少し安っぽい感じがしましたが、今では本質的には二者択一であることがわかりました。気にしないで。

29
Jは常に絵文字の工場爆発の跡のように見えます。
st0le

19

ジャバスクリプト、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になりました。
トムGullen

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}
デビッドマードック

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とそのpointfreeリファクタリング


runghcの下で必要なことだけを行い、コンパイル時にはそうではないHaskellコードは、「プログラム」と呼ばれますか?
JB

3
@JB:望んでperlいることだけを行うPerlコードは、まだ「プログラム」と呼ばれますか?:-)
ジョーイアダムス

JB:今日の関数型言語は、プログラムの意味をゆがめ、それをより高次の抽象化にしています。haskellプログラムは、実行される命令のリストではなく、関数が呼び出されていなくても、関数のコレクションと見なすことができます。
カラムロジャース

@Callum Rogers:私のポイントは、問題に敏感な領域でrunghcの下で実行するかコンパイルするかによって、彼のコードの動作が異なることです。「機能」は問題ありません。「プログラム」はrunghc以外では問題を解決しません。また、runghcはHaskellプログラムを実行する唯一の正当な方法ではありません。そのコンテキストでは、スニペットが「Haskellプログラム」ではなく「runghcスクリプト」になります。-私が言ったように、私は問題を重要だと考えているわけではありません、とにかく機能は問題なく、より短いです。
JB

2
x#y=sort x==sort y1文字短くなりました
ローター

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;名前空間の代わりに数バイトゴルフできると思いますか?
22:36にスタックスタック

10

ルビー、34バイト

Peter Taylors PerlソリューションのIOスキームを使用します。

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

エラーがスローされます:-e:1:in '<main>': undefined method 'chars' for nil:NilClass (NoMethodError)
トマス

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

9
@muntoo:IOCCCで何か見ましたか?これはあまりにも読みやすいです。
R.マルティーニョフェルナンデス

@Martinhoはい、IOCCCソースコードはとても美しいです。交響曲。しかし、彼は少なくとも小さな作品を作ってみるべきです。:)
Mateen Ulhaq

@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"}

もちろん"、strict / warningsを使用しないと裸語は文字列であるため、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

かっこいい。
シロン

1
素敵な答え。私が特に選んだテスト文字列が好きです;
コアダンプ

6

JavaScript

@zzzzBovのソリューションに基づいています。

比較、65文字(機能なしで40文字)

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

コンパレータ、43文字

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

+""to を使用して文字列を強制する賢い。
ケーシーチュウ

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 ++にも当てはまると思います。
ジョーイアダムス

一方、ローカル変数は自動的にゼロに初期化されません
ジョーイアダムス

OK、警告なしで行う方法を見つけたので、警告を削除しました。
マシュー

1
Bzzzt。テストケースに合格しましたが、「helle」と「hollo」は明らかに同じです。簡単な修正:++のいずれかを-に変更します。その後、ちょうど(u [i ++])が0を返す場合。
デイブギャンブル

1
私はこれをテストしていませんが、最後の3行は次のように書くことができますi=123;while(i&&u[--i]);return!i;
st0le

4

PHP(コマンドライン、87文字)

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

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

4

Javascript

.join()文字列ボクシングの代わりに使用する@zzzzBovのソリューションの(非常に)わずかに短いバージョン:

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
これは、回答IDに1337 congratzある
TheDoctor

4

Clojure REPL 41文字

(= (sort (read-line)) (sort (read-line)))

Stack Exchangeネットワークへようこそ。ここでフォーマットのヘルプ。
-dmckee

4

Java

(みんなのお気に入りの言語は明らかに!)

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;して使用することで10バイトでゴルフすることができます:163バイトそしてJava 8に変換することで同様になります2011年にはまだ発売されていないので、保管も問題ありません。; px.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));}}class g{public static void maininterface g{static void mainclass
ケビンクルーイッセン

4

sed、45文字

私のお気に入りでも可能sedです- !アナグラムを解くためのたった1つの正規表現!対応する文字を削除するだけです:

:
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文字

≡⍦

これは、最先端のAPL実装の1つであるNars2000のMultiset Match機能です。文字列に適用されると、必要な関数を正確に計算します。

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

好奇心が強い、これは何バイトですか?4?6?
マルティセン

エンコーディングに依存します。UTF-8で6バイト、UCS-2で4バイト、レガシーシングルバイトAPL文字セットのいずれかにシンボルがある場合は2バイト。
トビア

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

ごめん-気づかなかった。
ジェノラックリンアッシャー

4

Perl、77 75文字

問題のI / Oが十分に指定されていません。これは、stdinから2行を読み取り、trueまたはfalseをstdoutに出力します。

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

(77-> 75のTimに感謝)


何かが間違っている。$a=;?また、の括弧sortとの後のスペースをスキップできますprint

@Tim、ネット上でコードを共有するためのこのプラットフォームを開発した天才は、コードブロックでは文字よりも少ない文字をエスケープする必要があると判断しました。しかし、ちょっと大したことはありません。コードで誰かがそれらを使用しているようではありませんよね?私を捕まえ続けます。
ピーターテイラー

2
さて、私は下票を削除しました。将来、コードの書式設定を使用する場合があります。つまり、4つのスペースでコードをインデントします。

1
さて、コードをフォーマットするには3つの方法(1つのインラインと2つのブロック)があり、両方のブロックは異なる方法で不便です。はぁ。
ピーターテイラー

4

Perl、62バイト

この関数は文字列を引数として受け取り、trueまたはfalseを返します。

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

ASCII値を配列に保存し、偶数かどうかを確認します。最初の単語の増分と2番目の単語の減分。


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最初の行に追加してからの2つのインスタンスを置き換える場合、いくつかの文字を削ることができますsorteds2行目を。保存する必要があります... 3文字ですか?
アレックスヴァンリュー

1
確かに。また、Python 3はスペースを少し節約しますが、この回答が投稿されてから5年後には、おそらく現在使用するのが合理的です。また、指定された入力が与えられると、.strip()は冗長でした。
ウーブル

ええごめん 私がコメントしたとき、この質問がどれほど古いかは気づかなかったが、それはフロントページにあったことだけだった。^^;
アレックスヴァンリュー

4

Python、32バイト

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

Pythonでは何もしません。入力を受け取り、要求どおりに出力を生成する完全なプログラムであると確信していますか?
トマス14

1
@Tomasそれは関数です
-TuxCrafting

4

Bash、88文字

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


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

これらは、文字列を一連の文字(Seq)として扱うこともできるScalaの優れた機能を活用しており、すべての操作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

has およびhasを想定しStringています。splitArraysort


38バイト:c=>d=>(a=b=>''+[...b].sort())(c)==a(d)
麻琴しえる
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.