Tentukan apakah string adalah anagram

85

Tantangan

Diberikan dua string, tentukan jika mereka berdua memiliki karakter yang persis sama di dalamnya.

Contoh

Memasukkan

kata, wrdo

Ini kembali truekarena mereka sama tetapi hanya diacak.

Memasukkan

kata, wwro

Ini kembali false.

Memasukkan

perahu, toba

Ini kembali true

Aturan

Ini peraturannya!

  • Asumsikan input akan setidaknya 1 karakter, dan tidak lebih dari 8 karakter.
  • Tidak ada karakter khusus, hanya a-z
  • Semua input dapat dianggap huruf kecil

Uji Kasus

boat, boat = true
toab, boat = true
oabt, toab = true
a, aa = false
zzz, zzzzzzzz = false
zyyyzzzz, yyzzzzzy = true
sleepy, pyels = false
p,p = true
Tom Gullen
sumber
10
9 jawaban dalam 13 kali dilihat ... wow!
Tom Gullen
@ Tom, karena semua orang ingin membuktikan bahwa komentar Anda tentang menggunakan bilangan bulat 64-bit menunjuk ke arah yang salah: P
Peter Taylor
5
Permintaan judul: Cod Elf, Go!
5
"Falcon Rage, gila!"
Geobits,
7
Saran nama saya: "apakah mereka anagram" → "kelola array"
Esolanging Fruit

Jawaban:

39

Python, 32 byte

f=lambda a,b,S=sorted:S(a)==S(b)
gnibbler
sumber
3
@ Debanjan, Ini sama dengan def f(a,b):return sorted(a)==sorted(b)trade offnya yaitu Anda bisa mengganti def + return dengan lambda dengan imbalan tidak menggunakan pernyataan
gnibbler
1
@ Debanjan, saya pikir itu hanya menghemat satu karakter. Saya telah menggunakan variasi di sini, tetapi berhasil dengan panjang yang sama dengan milik Anda karena saya menukar baris baru dengan koma
gnibbler
4
@ Thomas, omong kosong. Pertanyaannya tidak menentukan program yang lengkap, sehingga baik fungsi atau program yang lengkap dapat diterima.
gnibbler
2
@ Thomas, Mayoritas jawaban di sini gagal memenuhi kriteria Anda. Mengapa tidak memberikan dukungan kepada semua yang melakukannya?
gnibbler
4
@ Thomas, ini bukan aturan pelecehan. Beberapa pertanyaan sengaja dibuka seperti ini tampaknya. Bandingkan dengan pertanyaan yang ditentukan seperti ini . Jika Anda tidak menyukai jawaban ini, komplainlah ke penanya
gnibbler
27

Golfscript, 3 karakter?

$$=

pemakaian:

'boat'$'baot'$=
1

'toab'$'boat'$=
1

'oabt'$'toab'$=
1

'a'$'aa'$=
0

'zzz'$'zzzzzzzz'$=
0

'zyyyzzzz'$'yyzzzzzy'$=
1

'sleepy'$'pyels'$=
0

'p'$'p'$=
1
KAMU
sumber
23
Ini adalah interpretasi yang menarik tentang bagaimana menyediakan input :)
gnibbler
4
Penjelasan tolong :(
st0le
10
@ st0le, serius? Saya tidak tahu skrip golf, tapi jelas $ (sort), $ (sort), = (bandingkan)
Peter Taylor
11
Bukankah ini sedikit curang? Maksud saya, ini bukan input variabel. Itu harus hard-coded. Bagaimanapun, saya akan menambahkan 4 ke jumlah karakter untuk karakter quote ( ').
Thomas Eding
6
Ini tidak sah menurut aturan kami saat ini. Namun, Anda dapat mengubahnya ke fungsi 4-byte @ JanDvorak, yang akan menerima input melalui format input yang valid .
Gagang pintu
20

J, 8

-:&(/:~)

Literaly, cocokkan ( -:) di ( &) sortir ( /:~)

Penggunaan sampel:

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

Di mana integer 64-bit ikut bermain?

JB
sumber
Apakah tidak mungkin untuk menulis fungsi / subrutin dalam J?
2
@Tim Nordenfur: mereka disebut "kata kerja", dan mengambil salah satu argumen di kanan mereka seperti di v arg(monads) atau dua di kedua sisi seperti di arg1 v arg2(diad). Yang saya kirimkan jelas angka dua. Saya tidak repot-repot menyebutkannya, karena tidak diminta dan lebih pendek dengan cara ini. Jika Anda benar - benar ingin memberi nama, Anda akan melakukannya seperti ini: is_anagram_of =: -:&(/:~)dan kemudian gunakan sebagai 'a' is_anagram_of 'aa'.
JB
Rasanya agak murah untuk mengganti argumen ke dalam kode, tetapi saya melihat sekarang bahwa pada dasarnya angka dua. Lupakan.
29
J selalu terlihat seperti sisa-sisa ledakan pabrik emoticon.
st0le
19

Javascript, 192 157 152 147 125 byte

Ok beberapa bahasa ini jauh lebih fleksibel daripada yang saya kira! Bagaimanapun ini adalah cara yang lebih panjang saya kira, tetapi teknik yang berbeda setidaknya.

Terkompresi

Terima kasih kepada Peter dan David karena telah memeras lebih banyak karakter!

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}

Lalu lakukan:

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

Kode yang Diperluas

Terkompresi telah memiliki banyak perubahan, tetapi ini adalah teori dasar:

// 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"));
Tom Gullen
sumber
Ide bagus menggunakan bilangan prima.
@Tim, terima kasih! Sekarang turun menjadi 157.
Tom Gullen
2
Anda dapat mencukur beberapa karakter dari inisialisasi kamus menggunakan ayakan. 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}
Peter Taylor
1
@ Tom, tergantung pada seberapa baik dioptimalkan rutinitas penyortiran, mengingat bahwa Anda telah membatasi input hingga 8 karakter: P
Peter Taylor
1
125 karakter . Rekursi dan terner 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 byte

Ini mendefinisikan fungsi yang disebut A

{$\$=}:A

Uji kasus

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

Haskell, 31 byte

fungsi - 31

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

program - 81 58 55

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

Pemakaian:

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

Kudos to lambdabot dan refactoring pointfree -nya .

Joey Adams
sumber
Bisakah kode Haskell yang hanya melakukan apa yang diinginkan di bawah runghc, tetapi tidak ketika dikompilasi, masih bisa disebut "program"?
JB
3
@ JK: Bisakah kode Perl yang hanya melakukan apa yang diinginkan perlmasih disebut "program"? :-)
Joey Adams
JB: Bahasa fungsional Todays condong arti program membuat abstraksi urutan yang lebih tinggi. Daripada hanya daftar instruksi yang akan dieksekusi, program haskell hanya dapat dilihat sebagai kumpulan fungsi, bahkan jika mereka tidak dipanggil.
Callum Rogers
@Callum Rogers: maksud saya adalah: kodenya berperilaku berbeda baik dijalankan di bawah runghc atau dikompilasi, di area yang peka masalah. "Fungsi" baik-baik saja. "Program" tidak menyelesaikan masalah di bawah apa pun selain runghc, dan runghc bukan satu-satunya cara yang sah untuk menjalankan program Haskell. Dalam konteks itu, itu menjadikan cuplikan "skrip runghc", bukan "program Haskell". --bukankah saya menganggap masalah ini penting, seperti yang saya katakan, fungsinya baik-baik saja dan lebih pendek.
JB
2
x#y=sort x==sort ylebih pendek 1 karakter
Rotsor
10

C #, 129 karakter

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

Dapat dibaca:

namespace System.Linq
{
    class X
    {
        static void Main(string[] a)
        {
            Console.Write(a[0].OrderBy(_ => _)
                  .SequenceEqual(a[1].OrderBy(_ => _)));
        }
    }
}
Timwi
sumber
Saya pikir Anda bisa bermain golf beberapa byte dengan using System.Linq;bukannya menamainya?
Stackstuck
10

Ruby, 34 byte

Menggunakan skema IO solusi Peter Taylors Perl:

p gets.chars.sort==gets.chars.sort
steenslag
sumber
Melempar kesalahan:-e:1:in '<main>': undefined method 'chars' for nil:NilClass (NoMethodError)
Tomas
9

Program 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");}
Joey Adams
sumber
1
Pernah mempertimbangkan untuk melamar IOCCC ?
Mateen Ulhaq
9
@muntoo: apakah Anda melihat sesuatu di IOCCC? Ini terlalu mudah dibaca untuk itu.
R. Martinho Fernandes
@ Martinho Ya, kode sumber IOCCC sangat indah. Simfoni. Tapi dia setidaknya harus mencoba menyusun sepotong kecil. :)
Mateen Ulhaq
@muntoo: Saya bahkan tidak tahu mereka masih aktif.
Joey Adams
1
Baru saja melihat yang ini ... Sangat bagus. Tetapi bisa lebih pendek: 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");}- itu 108 karakter. Sangat penting, ctrik inisialisasi Anda masih digunakan.
ugoren
7

Perl, 58 byte

(program lengkap, tidak seperti jawaban Perl lainnya yang hanya berfungsi)

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

49 sebagai fungsi

sub f{($c,$d)=map{[sort split//]}<>;"@$c"eq"@$d"}
Timwi
sumber
tentu saja Anda dapat menyimpan 4 karakter dalam program dengan menghapus "sekitar benar dan salah, karena tanpa menggunakan ketat / peringatan sebuah kata kunci adalah string.
Joel Berger
Saya lebih suka ini sebagai ($c,$d)=map{[sort split//]}@ARGV;exit("@$c"ne"@$d")(51 karakter) sehingga dapat mengambil argumen baris perintah dan menggunakan kode keluar baris perintah. Ini akan menjadi 48 karakter yang dipertahankan <>dengan input multi-line.
Adam Katz
6

Clojure - 23 karakter

Sebagai fungsi anonim:

#(apply = (map sort %))

Contoh kasus uji:

(#(apply = (map sort %)) ["boat" "boat"])
=> true
mikera
sumber
Keren, aku suka itu.
Chiron
1
Jawaban bagus. Saya terutama menyukai string tes yang Anda pilih ;-)
coredump
6

JavaScript

Berdasarkan solusi @ zzzzBov.

Perbandingan, 65 karakter (40 tanpa fungsi)

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

Pembanding, 43 karakter

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

sumber
Pintar menggunakan +""untuk memaksa ke string.
Casey Chu
6

C ++ (104 karakter non-ws)


Berdasarkan jenis penghitungan. Catatan: Menganggap string dengan panjang yang sama, yang tampaknya tersirat (meskipun tidak dinyatakan) oleh pertanyaan.

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;
}
Matius Baca
sumber
Dalam C, jika Anda mendeklarasikan variabel dalam cakupan global, ia diinisialisasi ke nol. Saya kira ini juga berlaku untuk C ++.
Joey Adams
Variabel lokal, di sisi lain, tidak diinisialisasi ke nol secara otomatis.
Joey Adams
OK, saya menghapus peringatan saya karena saya menemukan cara untuk melakukannya tanpa itu.
Matius Baca
1
Bzzzt. Anda lulus ujian, tetapi "helle" dan "hollo" tampaknya sama. Perbaikan mudah: ubah salah satu ++ ke -. Maka hanya jika (u [i ++]) mengembalikan 0;
Dave Gamble
1
Saya belum menguji ini, tetapi tiga baris terakhir dapat ditulis sebagaii=123;while(i&&u[--i]);return!i;
st0le
4

PHP (baris perintah, 87 karakter)

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

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

Javascript

Versi (sangat) sedikit lebih singkat dari solusi @ zzzzBov, yang menggunakan .join()alih-alih String boxing:

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

Demikian pula:

function a(b){return b.split('').sort().join()}
alert(a('abc')==a('bca')); //true
Blair Mitchelmore
sumber
3
ini adalah jawaban ID 1337. congratz
TheDoctor
4

Clojure REPL 41 karakter

(= (sort (read-line)) (sort (read-line)))
Cumi-cumi
sumber
Selamat datang di jaringan Stack Exchange. Memformat bantuan di sini .
dmckee
4

Jawa

(Bahasa favorit semua orang rupanya!)

173 karakter:

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

(Tidak mencetak char baris baru untuk menyimpan 2 karakter dari println)

Kompilasi dan jalankan:

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

Senang melihat yang lebih pendek ...

Greg Schueler
sumber
Aku tahu itu sudah lebih dari 6,5 tahun (lol), tetapi Anda dapat golf dengan 10 byte dengan menambahkan java.util.Arrays x=null;dan menggunakan x.bukan 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 bytes ) Dan dengan mengubahnya menjadi Java 8, class g{public static void mainbisa interface g{static void mainjuga, tapi saya kira Java 8 wasn sekitar tahun 2011, jadi menjaga classjuga baik-baik saja. ; p
Kevin Cruijssen
4

sed, 45 karakter

Itu bahkan mungkin di favorit saya - sed! Hanya satu ekspresi reguler untuk menyelesaikan anagram ! Terus keluarkan huruf yang sesuai:

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

(untuk dipanggil -nE)

Perl, 48

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

Untuk dipanggil dengan -p.

Fungsi Perl, 39

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

APL, 2 karakter

≡⍦

Ini adalah fungsi Pencocokan Multiset dari Nars2000 , salah satu implementasi APL terdepan. Ketika diterapkan pada string, ia menghitung persis fungsi yang diperlukan:

      'elvis' ≡⍦ 'lives'
1
      'alec guinness' ≡⍦ 'genuine class'
1
Tobia
sumber
Hanya ingin tahu, berapa byte ini? 4? 6?
Maltysen
Itu tergantung pada encoding. 6 byte dalam UTF-8, 4 byte dalam UCS-2, 2 byte jika salah satu dari rangkaian byte APL byte lama memiliki simbol, yang saya ragu.
Tobia
4

05AB1E , 6 4 byte (tidak bersaing)

{I{Q

Cobalah online!

Ini memakan waktu cukup lama karena kesulitan input. Golf turun karena pop.

Penjelasan:

{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.
Geno Racklin Asher
sumber
1
Karena 05AB1E lebih baru dari tantangan ini, jawaban ini tidak bersaing.
Loovjo
Maaf - tidak sadar.
Geno Racklin Asher
4

Perl, 77 75 karakter

I / O masalah tidak dirinci dengan baik; ini membaca dua baris dari stdin dan menampilkan true atau false ke stdout.

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

(Terima kasih kepada Tim untuk 77 -> 75)

Peter Taylor
sumber
Sesuatu yang salah. $a=;? Anda juga dapat melewati parens sortdan spasi setelahnya print.
@Tim, jenius yang mengembangkan platform ini untuk berbagi kode melalui internet memutuskan bahwa dalam blok kode orang harus melarikan diri kurang dari karakter. Tapi hei, bukan masalah besar: bukan seolah-olah ada yang menggunakannya dalam kode, kan? Terus menangkap saya.
Peter Taylor
2
Ok, saya menghapus downvote. Anda mungkin ingin menggunakan pemformatan kode di masa depan, yaitu kode indentasi dengan empat spasi.
1
Oke, jadi ada tiga cara memformat kode (satu blok inline dan dua), dan kedua blok itu tidak nyaman dengan cara yang berbeda. Mendesah.
Peter Taylor
4

Perl, 62 byte

Fungsi ini mengambil string sebagai argumen dan mengembalikan true atau false.

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

Menyimpan nilai-nilai ASCII dalam sebuah array dan memeriksa apakah nilai tersebut keluar. Peningkatan untuk kata pertama dan penurunan untuk kata kedua.

jrtapsell
sumber
4

Python 3, 107 97 76 64

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

Jelas ini dapat dipersingkat jika kita tidak menggunakan kata-kata OP secara harfiah dan huruf kecil "benar" dan "salah" ...

Wooble
sumber
Anda dapat memangkas beberapa karakter jika Anda menambahkan ;s=sortedke baris pertama dan kemudian mengganti dua contoh sorteddengan sdi baris kedua. Haruskah menyimpan ... 3 karakter?
Alex Van Liew
1
Memang. Python 3 juga menghemat sedikit ruang, dan mungkin masuk akal untuk digunakan sekarang, 5 tahun setelah jawaban ini diposting. Juga, .strip () berlebihan, mengingat input yang ditentukan.
Wooble
Ya maaf Saya tidak memperhatikan berapa umur pertanyaan ini ketika saya berkomentar, hanya saja pertanyaan itu ada di halaman depan. ^^;
Alex Van Liew
4

Python, 32 byte

p=sorted
f=lambda a,b:p(a)==p(b)
Pemurah
sumber
Tidak melakukan apa pun dengan python. Apakah Anda yakin ini adalah program lengkap yang mengambil input dan menghasilkan output seperti yang diminta?
Tomas
1
@ Thomas Ini fungsi
TuxCrafting
4

Bash, 88 karakter

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

R , 54 byte

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

Cobalah online!

J.Apakah
sumber
Saya sangat tertarik dengan penggunaan utf8ToInt Anda, tidak hanya dalam jawaban ini, tetapi dalam banyak hal lain yang telah saya lihat.
Sumner18
1
Pernahkah Anda melihat tips untuk bermain golf di R ? utf8ToIntdan kebalikannya cenderung membuat pemisahan string lebih pendek dari fungsi konvensional.
J.Doe
3

Scala dalam REPL (32)

readLine.sorted==readLine.sorted

Fungsi scala (43)

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

Program scala (61)

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

Ini memanfaatkan fitur rapi Scala dimana String juga dapat diperlakukan sebagai urutan karakter ( Seq), dengan semua operasi Seqyang tersedia.

ebruchez
sumber
3

APL - 13 karakter

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

Panggil seperti ini:

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

Dalam contoh terakhir, 'a'mewakili karakter tunggal, dan awalan ,akan mengubahnya menjadi string.

Elias Mårtenson
sumber
3

Java (134 byte)

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]));`

Ini membuat array untuk menghitung berapa kali setiap huruf muncul, dan kemudian membandingkan array untuk memeriksa apakah mereka sama.

codecubed
sumber
1
Selamat datang di PPCG! Posting pertama yang bagus! Ada 2 ruang yang dapat Anda hapus, (c[0], c[1])dan for (int i=0;.
Rɪᴋᴇʀ
3

JavaScript, 41

Fungsi perbandingan (41) :

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

Fungsi komparator (21) :

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

Fungsi pembanding (48):

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

Fungsi perbandingan (78):

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

Diasumsikan Stringtelah splitdan Arraysudah sort.

zzzzBov
sumber
38 byte:c=>d=>(a=b=>''+[...b].sort())(c)==a(d)
Shieru Asakoto