Dizelerin anagram olup olmadığını belirleme


85

Meydan okuma

İki dize verildiğinde, her ikisinde de aynı karakterlere sahip olup olmadıklarını hesaplayın.

Örnek

Giriş

kelime

Bu, trueçünkü onlar aynı ama sadece şifreli oldukları için geri döner .

Giriş

kelime

Bu döner false.

Giriş

tekne

Bu döner true

kurallar

İşte kurallar!

  • Girişin en az 1 karakter uzunluğunda ve 8 karakterden uzun olmayacağını varsayalım.
  • Özel karakter yok, sadece a-z
  • Tüm girişlerin küçük harf olduğu varsayılabilir.

Test Kılıfları

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 görüntüleme sayısı 9 cevap ... vay!
Tom Gullen

@Tom, çünkü herkes 64-bit bir tamsayı kullanma hakkındaki yorumunuzun yanlış yöne işaret ettiğini ispatlamak istedi: P
Peter Taylor

5
Başlık isteği: Cod Elf, Git!

5
İnternethaber.com "Falcon Rage, çıldır!"
Geobits

7
Benim adım öneri: "onlar anagram mı" → "dizileri yönet" "
Esolanging Fruit

Yanıtlar:


39

Python, 32 bayt

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

3
@Debanjan Bu tıpkı aynıdır def f(a,b):return sorted(a)==sorted(b)ticaret kapalı def + yerine herhangi bir ifade kullanmayan karşılığında lambda'da dönmek için elde edilmesi
gnibbler

1
@Debanjan, sanırım sadece bir karakter kazandırıyor. Burada bir varyasyon kullandım, ancak sizinkiyle aynı uzunlukta çalışıyor çünkü virgül için yeni bir satır değiştiriyorum
gnibbler

4
@ Tom, saçma. Sorusu tam programı belirtmez, bu yüzden ya bir işlev ya da tam bir programdır kabul edilebilir.
gnibbler

2
@Tomas, Buradaki cevapların çoğu kriterlerinizi alamadı. Neden bütün bunlara bir nezaket göstermiyorsunuz?
gnibbler

4
@ Tom, bu kural suistimali değil. Bazı sorular kasıtlı olarak açılmış, bunun gibi görünmektedir. Gibi iyi belirlenmiş bir soruyla karşılaştırın bu . Bu yanıtları beğenmezseniz soru şikayet asker
gnibbler

27

Golfscript, 3 karakter?

$$=

kullanımı:

'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
Bu girdilerin nasıl tedarik edildiğine dair ilginç bir yorum :)
gnibbler

4
Açıklama lütfen :(
st0le

10
@ st0le, cidden? Golf senaryosunu bilmiyorum, ama açıkçası $ (sıralama), $ (sıralama), = (karşılaştırma)
Peter Taylor

11
Bu biraz hile yapmıyor mu? Yani, değişken giriş değil. Zor kodlanmış olması gerekir. Her durumda, quote ( ') karakterleri için karakter sayımına 4 eklerdim.
Thomas Eding

6
Bu, mevcut kurallarımız tarafından geçerli değildir. Bununla birlikte, bunu @ JanDvorak'ın 4-byte fonksiyonu ile değiştirebilirsiniz; bu, geçerli bir giriş formatı ile girişi kabul eder .
Doorknob

20

J, 8

-:&(/:~)

Kelimenin tam anlamıyla, match ( -:) on ( &) sort up ( /:~)

Örnek kullanım:

   '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-bit tamsayılar nerede devreye giriyor?


J fonksiyonlarını / alt yordamları yazmak mümkün değil mi?

2
@Tim Nordenfur: "fiiller" olarak adlandırılırlar ve haklarında (monadlar) v argolduğu gibi bir ya da her iki tarafta da arg1 v arg2(dyads) olduğu gibi iki argüman alırlar. Benim gönderdiğim açıkça belli ki bir dyad. Talep edilmediği ve bu şekilde daha kısa olduğu için onu isimlendirmedim. Eğer mıyım gerçekten bir ad vermek istiyorum, böyle yapardım: is_anagram_of =: -:&(/:~)ve sonra olarak kullanmak 'a' is_anagram_of 'aa'.
JB

Argümanları kodun yerine koymak biraz ucuz hissettirdi, ama şimdi bunun esasen bir dyad olduğunu görüyorum. Boşver.

29
J her zaman bir ifade fabrikası patlaması kalıntılarına benziyor.
st0le

19

Javascript, 192 157 152 147 125 bayt

Tamam, bu dillerden bazıları düşündüğümden daha esnek! Her neyse, sanırım daha uzun yol bu ama en azından farklı bir teknik.

Sıkıştırılmış

Peter ve David'e daha fazla karakter çıkardığı için teşekkürler!

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}

O zaman yapın:

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

Genişletilmiş Kod

Sıkıştırılmış birçok değişiklik oldu, ancak bu temel teoridir:

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

Asalları kullanarak harika bir fikir.

@Tim teşekkürler! Şimdi 157'ya indirdim.
Tom Gullen

2
Elek kullanarak birkaç karakter sözlüğü başlatarak tıraş edebilirsiniz. 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, girişleri 8 karakterle sınırladığın göz önüne alındığında, sıralama rutinlerinin ne kadar iyi optimize edildiğine bağlı olarak değişir: P
Peter Taylor

1
125 karakter . Özyineleme ve ternaries 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

Golf Betiği, 8 bayt

Bu denilen bir işlevi tanımlar. A

{$\$=}:A

Test durumları

;
'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 bayt

İşlev - 31

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

program - 81 58 55

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

Kullanımı:

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

Lambdabot ve puansız refactoring için Kudos .


Haskell, yalnızca runghc altında arananı yapan, ancak derlendiğinde hala "program" olarak adlandırılan kod olabilir mi?
JB

3
@JB: Perl, sadece altında arananlara perlhala "program" denilen kodu koyabilir mi? :-)
Joey Adams

JB: Günümüzün işlevsel dilleri, bir programın anlamını daha üst düzey bir soyutlama yaparak çarpıtmaktadır. Haskell programı çağrılmasa bile, sadece bir fonksiyonlar topluluğu olarak görülebildiğinden, yürütülecek talimatların bir listesi yerine.
Callum Rogers

@Callum Rogers: Benim açımdan: onun kodu runghc altında çalışan veya derlenmiş, soruna duyarlı bir alanda farklı davranır. "İşlev" iyi. “Program” sorunu runghc dışında bir şey altında çözmez ve runghc Haskell programlarını yürütmenin tek meşru yolu değildir. Bu bağlamda, bu, snippet'i bir "Haskell programı" değil "runghc betiği" yapar . - Dediğim gibi, konunun önemli olduğunu düşünmüyorum, işlev yine de iyi ve daha kısa.
JB

2
x#y=sort x==sort y1 karakter daha kısa
Rotsor

10

C #, 129 karakter

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

Okunabilir:

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

Bence onu isimlendirmek using System.Linq;yerine birkaç byte'lık golf oynayabilirsin ?
Stackstuck

10

Ruby, 34 bayt

Peter Taylors Perl çözümünün IO şemasını kullanarak:

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

Hata atar:-e:1:in '<main>': undefined method 'chars' for nil:NilClass (NoMethodError)
Tomas

9

C programı, 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'ye başvurmayı hiç düşündünüz mü?
Mateen Ulhaq

9
@muntoo: IOCCC'de bir şey gördün mü? Bu, bunun için çok okunaklı.
R. Martinho Fernandes

@Martinho Evet, IOCCC kaynak kodları çok güzel. Senfoni. Ama en azından küçük bir parça bestelemeyi denemeli. :)
Mateen Ulhaq

@muntoo: Hala aktif olduklarını bile bilmiyordum.
Joey Adams

1
Sadece bunu gördüm ... Çok hoş. Ancak daha kısa olabilir: 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");}- Bu 108 karakterdir. Çok önemlisi, cbaşlangıç ​​numaranız hala kullanılıyor.
ugoren

7

Perl, 58 bayt

(Tamamen program, sadece bir fonksiyon olan diğer Perl cevabının aksine)

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

49 bir işlev olarak

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

Elbette programda 4 karakterden tasarruf edebilirsiniz, "etrafta doğru ve yanlışı kaldırarak , çünkü katı / uyarılar kullanmadan bir korkak bir dizedir.
Joel Berger


Bunu ($c,$d)=map{[sort split//]}@ARGV;exit("@$c"ne"@$d")(51 karakter) tercih ederim, böylece komut satırı argümanlarını alabilir ve komut satırı çıkış kodlarını kullanabilir. Çok <>hatlı girişi koruyan 48 karakter olabilir .
Adam Katz

6

Clojure - 23 karakter

Anonim bir işlev olarak:

#(apply = (map sort %))

Test durumu örneği:

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

Harika, hoşuma gitti.
Chiron

1
Güzel cevap Özellikle seçtiğiniz test dizilerini seviyorum ;-)
coredump

6

JavaScript

@ ZzzzBov'un çözümüne dayanıyor.

Karşılaştırma, 65 karakter (işlevsiz 40)

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

Karşılaştırıcı, 43 karakter

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

Zeki kullanarak +""dizeye baskı yapmak için.
Casey Chu

6

C ++ (104 karakter dışı karakter)


Sıralama sayma dayalı. Not: Aynı uzunlukta dizeleri varsayalım (bununla birlikte belirtilmemiş).

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 de, global kapsamda bir değişken bildirirseniz, sıfır olarak başlatılır. Sanırım bu C ++ için de geçerli.
Joey Adams

Yerel değişkenler, diğer taraftan, olan olmayan otomatik sıfır başlatıldı.
Joey Adams

Tamam, ihmali kaldırdım çünkü onsuz yapmanın yollarını buldum.
Matthew

1
Bzzzt. Test senaryolarını geçersiniz, ancak "helle" ve "hollo" görünüşte aynıdır. Kolay düzeltme: ++ 'dan birini a ile değiştirin. Sonra sadece (u [i ++]) 0 döndürürse;
Dave Gamble

1
Bunu test etmedim, ancak son üç satır 4i=123;while(i&&u[--i]);return!i;
38'de st0le

4

PHP (komut satırı, 87 karakter)

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

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

4

JavaScript

.join()String boks yerine kullanılan @ zzzzBov'un çözümünün (çok) biraz daha kısa bir sürümü :

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

Benzer şekilde:

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

3
Bu cevap numarası 1337 Congratz olduğunu
TheDoctor

4

Clojure REPL 41 karakter

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

Stack Exchange ağına hoş geldiniz. Burada yardımın biçimlendirilmesi .
dmckee

4

Java

(görünüşe göre herkesin favori dili!)

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

(Println'den 2 karakter kaydetmek için newline char'ı yazdırmaz)

Derleyin ve çalıştırın:

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

Daha kısa bir tane görmeyi seviyorum ...


6,5 yıldan (lol) fazla olduğunu biliyorum, ancak bunun yerine ekleyerek java.util.Arrays x=null;ve kullanarak 10 baytla golf oynayabilirsiniz : ( 163 bayt ) Ve Java 8'e dönüştürerek de olabilir , ama sanırım Java 8 değildi. 2011'de henüz yok, bu yüzden tutma da iyidir. ; 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
Kevin Cruijssen

4

sed, 45 karakter

Benim favorimde bile mümkün - sed! Anagramı çözmek için sadece bir düzenli ifade ! Sadece ilgili harfleri kaldırmaya devam edin:

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

(ile çağrılacak -nE)

Perl, 48

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

İle çağrılacak -p.

Perl işlevi, 39

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

4

APL, 2 karakter

≡⍦

Bu, önde gelen APL uygulamalarından biri olan Nars2000'in Multiset Eşleştirme işlevidir . Dizelere uygulandığında, gereken işlevi tam olarak hesaplar:

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

Sadece merak ediyorum, bu kaç bayt? 4? 6?
Maltysen,

Kodlamaya bağlı. UTF-8'de 6 bayt, eski tek baytlık APL karakter karakterlerinden herhangi birinin şüphesi olan sembolü varsa, UCS-2'de 4 bayt, 2 bayt .
Tobia,

4

05AB1E , 6 4 bayt (rekabet etmeyen)

{I{Q

Çevrimiçi deneyin!

Bu girdi zorlukları nedeniyle biraz zaman aldı. Pop yüzünden golf oynadım.

Açıklama:

{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 bu zorluktan daha yeni olduğundan, bu cevap rekabet edici değildir.
Loovjo

Üzgünüm - fark etmedim.
Geno Racklin Asher

4

Perl, 77 75 karakter

Sorunun G / Ç'si tam olarak belirtilmemiştir; bu stdin'den iki satır okur ve stdout'a doğru veya yanlış verir.

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

(77 için Tim'e teşekkürler -> 75)


Bir şey yanlış. $a=;? Ayrıca, paren sortve sonraki boşluğu atlayabilirsiniz print.

@Tim, bu platformu ağ üzerinden paylaşmak için geliştiren dahi, kod bloklarında insanların karakterlerden daha az kaçması gerektiğine karar verdi. Ama hey, çok önemli değil: sanki herhangi biri kodda kullanıyormuş gibi değil, değil mi? Beni yakaladı.
Peter Taylor

2
Tamam, aşağı oyu kaldırdım. Kod biçimlendirmesini ileride kullanmak isteyebilirsiniz, örneğin dört boşluklu girinti kodu.

1
Tamam, bu yüzden kod biçimlendirmenin üç yolu vardır (bir satır içi ve iki satır) ve her iki satır da farklı şekillerde sakıncalıdır. İç çekmek.
Peter Taylor

4

Perl, 62 bayt

Bu işlev dizeleri argüman olarak alır ve doğru ya da yanlış döndürür.

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

ASCII değerlerini bir dizide saklar ve eşit olup olmadığını kontrol eder. İlk kelimenin artışları ve ikinci kelimenin azalmaları.


4

Python 3, 107 97 76 64

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

Açıkçası, OP'nin kelimelerini kelimenin tam anlamıyla ve küçük harfleri "doğru" ve "yanlış" olarak almazsak, bu kısaltılabilir.


Eğer eklemek eğer birkaç karakter kapalı tıraş edebilirsiniz ;s=sortedilk satırına ve ardından iki örneklerini değiştirmek sortedile sikinci satırında. Kaydetmelisiniz ... 3 karakter?
Alex Van Liew

1
Aslında. Python 3 de az yer kaplar ve bu cevabın gönderilmesinden 5 yıl sonra muhtemelen şimdi kullanılması makul olur. Ayrıca, belirtilen girdiler göz önüne alındığında, .strip () işlevi gereksizdi.
Wooble,

Evet üzgünüm. Bu sorunun yorumunu yaparken kaç yaşında olduğumu fark etmedim, yalnızca ön sayfada olduğunu gördüm. ^^;
Alex Van Liew

4

Python, 32 bayt

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

Python'da hiçbir şey yapmaz. Girdiyi alan ve çıktıyı istenen şekilde üreten tam bir program olduğundan emin misiniz?
Tomas

1
@Tomas Bu bir fonksiyon
TuxCrafting

4

Bash, 88 karakter

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


3

REPL'de ölçeklendirme (32)

readLine.sorted==readLine.sorted

Ölçek işlevi (43)

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

Scala programı (61)

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

Bunlar, bir String'in ayrıca mevcut Seqtüm işlemler ile birlikte bir karakter dizisi ( ) olarak da ele alınabileceği düzgün bir Scala özelliğini kullanır Seq.


3

APL - 13 karakter

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

Böyle ara:

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

Son örnekte, 'a'tek bir karakteri temsil eder ve önek ,onu bir dizgeye dönüştürür.


3

Java (134 bayt)

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

Bu, her harfin kaç kez göründüğünü saymak için bir dizi yapar ve eşit olup olmadığını kontrol etmek için dizileri karşılaştırır.


1
PPCG'ye Hoşgeldiniz! Güzel ilk mesaj! Kaldırabileceğiniz 2 boşluk var (c[0], c[1])ve for (int i=0;.
Rɪᴋᴇʀ 6'16

3

JavaScript, 41

Karşılaştırma fonksiyonu (41) :

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

Karşılaştırma işlevi (21) :

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

Karşılaştırma işlevi (48):

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

Karşılaştırma fonksiyonu (78):

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

Devraldı Stringvardır splitve Arrayvar sort.


38 bayt:c=>d=>(a=b=>''+[...b].sort())(c)==a(d)
Shieru Asakoto
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.