Określ, czy ciągi znaków są anagramami

85

Wyzwanie

Biorąc pod uwagę dwa ciągi, sprawdź, czy oba zawierają dokładnie te same znaki.

Przykład

Wejście

słowo wrdo

Zwraca, trueponieważ są takie same, ale tylko zakodowane.

Wejście

słowo, wwro

To zwraca false.

Wejście

łódź, toba

To zwraca true

Zasady

Oto zasady!

  • Załóżmy, że dane wejściowe będą miały co najmniej 1 znak i nie będą dłuższe niż 8 znaków.
  • Bez znaków specjalnych, tylko a-z
  • Wszystkie dane wejściowe można przyjmować małymi literami

Przypadki testowe

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
źródło
10
9 odpowiedzi w 13 widokach ... wow!
Tom Gullen,
@Tom, ponieważ wszyscy chcieli udowodnić, że Twój komentarz dotyczący używania 64-bitowej liczby całkowitej wskazywał niewłaściwy kierunek: P
Peter Taylor
5
Prośba o tytuł: Cod Elf, Go!
5
„Falcon Rage, oszalej!”
Geobits,
7
Moja sugestia imienia: „czy to anagramy” → „zarządzaj tablicami”
Esolanging Fruit

Odpowiedzi:

39

Python, 32 bajty

f=lambda a,b,S=sorted:S(a)==S(b)
gnibbler
źródło
3
@Danjan, To jest tak samo jak Zamiana polega na tym, def f(a,b):return sorted(a)==sorted(b)że możesz zastąpić def + return przez lambda w zamian za nieużywanie żadnych instrukcji
gnibbler
1
@Debanjan, myślę, że ratuje tylko jedną postać. Użyłem odmianę tutaj, ale działa z taką samą długość jak ty, bo zamienić przełamane przez przecinek
gnibbler
4
@Tomas, nonsens. Pytanie nie określa kompletny program, więc albo funkcja lub kompletny program, są dopuszczalne.
gnibbler
2
@Tomas, Większość odpowiedzi tutaj nie spełnia Twoich kryteriów. Dlaczego nie oddać głosu wszystkim, którzy to robią?
gnibbler
4
@Tomas, to nie jest nadużycie zasady. Niektóre pytania są celowo otwarte, jak na przykład to. Porównaj z dokładnie określonym pytaniem takim jak to . Jeśli nie lubisz te odpowiedzi narzekać na pytanie pytającego
gnibbler
27

Golfscript, 3 znaki?

$$=

stosowanie:

'boat'$'baot'$=
1

'toab'$'boat'$=
1

'oabt'$'toab'$=
1

'a'$'aa'$=
0

'zzz'$'zzzzzzzz'$=
0

'zyyyzzzz'$'yyzzzzzy'$=
1

'sleepy'$'pyels'$=
0

'p'$'p'$=
1
TY
źródło
23
To ciekawa interpretacja sposobu wprowadzania danych wejściowych :)
gnibbler
4
Wyjaśnienie proszę :(
st0le,
10
@ st0le, poważnie? Nie znam golfa, ale oczywiście jest to $ (sort), $ (sort), = (porównaj)
Peter Taylor
11
Czy to nie jest trochę oszustwo? Mam na myśli, że to nie jest zmienna wejściowa. Musi być zakodowany na stałe. W każdym razie dodam 4 do liczby znaków dla znaków quote ( ').
Thomas Eding
6
Nie dotyczy to naszych obecnych zasad. Możesz jednak zmienić go na 4-bajtową funkcję @ JanDvorak, która akceptowałaby dane wejściowe w prawidłowym formacie wejściowym .
Klamka
20

J, 8

-:&(/:~)

Dosłownie, match ( -:) on ( &) sortuj w górę ( /:~)

Przykładowe użycie:

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

Gdzie w grę wchodzą 64-bitowe liczby całkowite?

JB
źródło
Czy nie jest możliwe pisanie funkcji / podprogramów w J?
2
@Tim Nordenfur: nazywane są „czasownikami” i biorą jeden argument po prawej stronie jak w v arg(monady) lub dwa po obu stronach jak w arg1 v arg2(dyady). Ten, który przedstawiłem, jest oczywiście diadem. Nie zawracałem sobie głowy nazwaniem go, ponieważ nie było to wymagane i jest w ten sposób krótsze. Jeśli naprawdę chcesz nadać jej nazwę, zrób tak: is_anagram_of =: -:&(/:~)a następnie użyj jako 'a' is_anagram_of 'aa'.
JB
Zastąpienie argumentów kodem było trochę tanie, ale teraz widzę, że jest to w zasadzie diada. Nieważne.
29
J zawsze wygląda jak resztki eksplozji fabryki emotikonów.
st0le,
19

Javascript, 192 157 152 147 147 125 bajtów

Ok, niektóre z tych języków są znacznie bardziej elastyczne niż myślałem! W każdym razie jest to dłuższy sposób, ale przynajmniej inna technika.

Sprężony

Dzięki Peter i David za wyciskanie kolejnych znaków!

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}

Następnie wykonaj:

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

Rozszerzony kod

Skompresowany miał wiele zmian, ale jest to podstawowa teoria:

// 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
źródło
Świetny pomysł na liczby pierwsze.
@ Tym razem dzięki! Zredukowałem teraz do 157.
Tom Gullen,
2
Za pomocą sita możesz ogolić kilka znaków z inicjalizacji słownika. 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, zależy od tego, jak dobrze zoptymalizowane są procedury sortowania, biorąc pod uwagę, że masz ograniczone dane wejściowe do 8 znaków: P
Peter Taylor
1
125 znaków . Rekurencja i trójskładniki 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 bajtów

Definiuje funkcję o nazwie A

{$\$=}:A

Przypadki testowe

;
'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
źródło
11

Haskell, 31 bajtów

funkcja - 31

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

program - 81 58 55

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

Stosowanie:

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

Uznanie dla lambdabota i jego bezcelowe refaktoryzacja .

Joey Adams
źródło
Czy kod Haskell, który robi tylko to, co jest potrzebne w runghc, ale nie po kompilacji, może nadal być nazywany „programem”?
JB
3
@JB: Czy kod Perla, który tylko chce tego, co jest potrzebne, perlnadal można nazwać „programem”? :-)
Joey Adams,
JB: Dzisiejsze języki funkcjonalne wypaczają znaczenie programu, czyniąc go abstrakcją wyższego rzędu. Zamiast listy instrukcji do wykonania, program haskell może być postrzegany jako zbiór funkcji, nawet jeśli nie są one wywoływane.
Callum Rogers,
@Callum Rogers: chodzi mi o to, że jego kod zachowuje się inaczej, niezależnie od tego, czy jest uruchamiany w trybie runghc czy kompilowany, w obszarze wrażliwym na problemy. „Funkcja” jest w porządku. „Program” nie rozwiązuje problemu w niczym innym niż runghc, a runghc nie jest jedynym uzasadnionym sposobem uruchamiania programów Haskell. W tym kontekście fragment ten jest „skryptem runghc”, a nie „programem Haskell”. - nie dlatego, że uważam ten problem za ważny, jak powiedziałem, funkcja i tak jest w porządku i jest krótsza.
JB
2
x#y=sort x==sort yjest 1 postać krótsza
Rotsor
10

C #, 129 znaków

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

Czytelny:

namespace System.Linq
{
    class X
    {
        static void Main(string[] a)
        {
            Console.Write(a[0].OrderBy(_ => _)
                  .SequenceEqual(a[1].OrderBy(_ => _)));
        }
    }
}
Timwi
źródło
Myślę, że mógłbyś zagrać w kilka bajtów using System.Linq;zamiast w przestrzeń nazw?
Stackstuck
10

Rubinowy, 34 bajty

Korzystanie ze schematu IO rozwiązania Peter Taylors Perl:

p gets.chars.sort==gets.chars.sort
steenslag
źródło
Zgłasza błąd:-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
źródło
1
Czy zastanawiałeś się kiedyś nad wnioskiem o IOCCC ?
Mateen Ulhaq,
9
@muntoo: widziałeś coś w IOCCC? Jest to na to zbyt czytelne.
R. Martinho Fernandes,
@Martinho Tak, kody źródłowe IOCCC są takie piękne. Symfonie Ale powinien przynajmniej spróbować skomponować mały kawałek. :)
Mateen Ulhaq,
@muntoo: Nawet nie wiedziałem, że nadal są aktywni.
Joey Adams,
1
Właśnie to widziałem ... Bardzo miło. Ale może być krótszy: 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");}- to 108 znaków. Bardzo ważne jest, że Twoja csztuczka inicjalizacyjna jest nadal stosowana.
ugoren
7

Perl, 58 bajtów

(kompletny program, w przeciwieństwie do innych odpowiedzi Perla, które są tylko funkcją)

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

49 jako funkcja

sub f{($c,$d)=map{[sort split//]}<>;"@$c"eq"@$d"}
Timwi
źródło
oczywiście możesz zapisać 4 znaki w programie, usuwając "dookoła prawdę i fałsz, ponieważ bez użycia ścisłych / ostrzeżeń jedno słowo jest ciągiem.
Joel Berger,
Dzięki!
Timwi
Preferuję to jako ($c,$d)=map{[sort split//]}@ARGV;exit("@$c"ne"@$d")(51 znaków), aby mógł przyjmować argumenty wiersza poleceń i używać kodów wyjścia wiersza poleceń. Będzie to 48 znaków zachowanych <>z wejściem wieloliniowym.
Adam Katz
6

Clojure - 23 znaki

Jako funkcja anonimowa:

#(apply = (map sort %))

Przykład przypadku testowego:

(#(apply = (map sort %)) ["boat" "boat"])
=> true
mikera
źródło
Fajnie, podoba mi się.
Chiron,
1
Niezła odpowiedź. Szczególnie podoba mi się wybrany przez ciebie ciąg testowy ;-)
rdzeń
6

JavaScript

Na podstawie rozwiązania @ zzzzBov.

Porównanie, 65 znaków (40 bez funkcji)

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

Komparator, 43 znaki

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

źródło
Sprytne użycie +""przymusu do łańcucha.
Casey Chu,
6

C ++ (104 znaki spoza ws)


Na podstawie sortowania liczącego. Uwaga: Zakłada ciągi o tej samej długości, co wydaje się sugerowane (choć nie określone) przez pytanie.

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;
}
Matthew Read
źródło
W C, jeśli deklarujesz zmienną w zasięgu globalnym, jest ona inicjowana na zero. Myślę, że dotyczy to również C ++.
Joey Adams,
Z drugiej strony zmienne lokalne nie są inicjowane automatycznie do zera.
Joey Adams,
OK, usunąłem moje zastrzeżenie, ponieważ znalazłem sposoby na obejście się bez niego.
Matthew przeczytał
1
Bzzzt. Zdajesz testy, ale „helle” i „hollo” najwyraźniej są takie same. Łatwa poprawka: zmień jedną z ++ na -. Wtedy tylko jeśli (u [i ++]) zwróci 0;
Dave Gamble,
1
Nie testowałem tego, ale ostatnie trzy wiersze można zapisać jakoi=123;while(i&&u[--i]);return!i;
st0le,
4

PHP (wiersz poleceń, 87 znaków)

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

echo d($argv[1]) == d($argv[2]);
ts01
źródło
4

JavaScript

(Bardzo) nieco krótsza wersja rozwiązania @ zzzzBov, która używa .join()zamiast boksu String:

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

Podobnie:

function a(b){return b.split('').sort().join()}
alert(a('abc')==a('bca')); //true
Blair Mitchelmore
źródło
3
to jest odpowiedź ID 1337. congratz
TheDoctor
4

Clojure REPL 41 znaków

(= (sort (read-line)) (sort (read-line)))
Kałamarnica
źródło
Witamy w sieci Stack Exchange. Pomoc dotycząca formatowania tutaj .
dmckee,
4

Jawa

(najwyraźniej ulubiony język wszystkich!)

173 znaków:

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

(Nie drukuje znaku nowej linii, aby zapisać 2 znaki z println)

Skompiluj i uruchom:

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

Uwielbiam oglądać krótszy ...

Greg Schueler
źródło
Wiem, że minęło ponad 6,5 roku (lol), ale możesz grać w golfa o 10 bajtów, dodając java.util.Arrays x=null;i używając x.zamiast 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 bajtów ) I konwersja do Java 8 class g{public static void mainmoże być interface g{static void mainrównież, ale myślę, że Java 8 nie była jeszcze w 2011 roku, więc utrzymanie classjest w porządku. ; p
Kevin Cruijssen
4

sed, 45 znaków

Jest to nawet możliwe w moim ulubionym - sed! Tylko jedno wyrażenie regularne, aby rozwiązać anagram ! Po prostu usuwaj odpowiednie litery:

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

(do wywołania -nE)

Perl, 48

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

Aby zostać wywołanym z -p.

Funkcja Perla, 39

sub f{$,while s/(.)(.*,.*)\1/\2/;!/\w/}
Tomas
źródło
4

APL, 2 znaki

≡⍦

Jest to funkcja Multiset Match firmy Nars2000 , jedna z wiodących implementacji APL. Po zastosowaniu do ciągów oblicza dokładnie wymaganą funkcję:

      'elvis' ≡⍦ 'lives'
1
      'alec guinness' ≡⍦ 'genuine class'
1
Tobia
źródło
Ciekawe, ile to bajtów? 4? 6?
Maltysen
To zależy od kodowania. 6 bajtów w UTF-8, 4 bajty w UCS-2, 2 bajty, jeśli któryś ze starszych jednobajtowych zestawów znaków APL ma symbol, w co wątpię.
Tobia,
4

05AB1E , 6 4 bajtów (niekonkurencyjny)

{I{Q

Wypróbuj online!

Trwało to trochę z powodu trudności z wprowadzaniem danych. Grał w golfa z powodu popu.

Wyjaśnienie:

{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
źródło
1
Ponieważ 05AB1E jest nowszy niż to wyzwanie, odpowiedź ta nie jest konkurencyjna.
Loovjo,
Przepraszam - nie zdawałem sobie sprawy.
Geno Racklin Asher,
4

Perl, 77 75 znaków

We / wy problemu nie są dobrze określone; to odczytuje dwie linie ze standardowego wejścia i zwraca prawdę lub fałsz na standardowe wyjście.

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

(Podziękowania dla Tima za 77 -> 75)

Peter Taylor
źródło
Coś jest nie tak. $a=;? Możesz także pomijać parens sorti odstęp po print.
@Tim, geniusz, który opracował tę platformę do dzielenia się kodem przez sieć, zdecydował, że w blokach kodu ludzie powinni uciekać mniej niż znaki. Ale hej, nic wielkiego: to nie tak, że ktoś używa ich w kodzie, prawda? Łapie mnie.
Peter Taylor,
2
Ok, usunąłem downvote. W przyszłości możesz chcieć użyć formatowania kodu, tj. Kodu wcięcia z czterema spacjami.
1
Ok, więc istnieją trzy sposoby formatowania kodu (jeden wbudowany i dwa blokowe), a oba blokowe są niewygodne na różne sposoby. Westchnienie.
Peter Taylor
4

Perl, 62 bajty

Ta funkcja przyjmuje ciągi jako argumenty i zwraca wartość true lub false.

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

Przechowuje wartości ASCII w tablicy i sprawdza, czy się wyrówna. Przyrosty dla pierwszego słowa i ubytki dla drugiego słowa.

jrtapsell
źródło
4

Python 3, 107 97 76 64

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

Oczywiście można to skrócić, jeśli nie weźmiemy słowa OP dosłownie i małych liter „prawda” i „fałsz” ...

Wooble
źródło
Można zgolić kilka znaków, jeśli dołączyć ;s=sorteddo pierwszej linii, a następnie wymienić dwie instancje sortedze sw drugiej linii. Czy należy zapisać ... 3 znaki?
Alex Van Liew
1
W rzeczy samej. Python 3 również oszczędza trochę miejsca i prawdopodobnie warto go teraz używać, 5 lat po opublikowaniu tej odpowiedzi. Ponadto .strip () był redundantny, biorąc pod uwagę określone dane wejściowe.
Wooble,
Tak, przepraszam. Nie zauważyłem, ile lat miało to pytanie, kiedy to skomentowałem, tyle że na pierwszej stronie. ^^;
Alex Van Liew
4

Python, 32 bajty

p=sorted
f=lambda a,b:p(a)==p(b)
Donkiszotowski
źródło
Nie robi nic w Pythonie. Czy na pewno jest to kompletny program, który pobiera dane wejściowe i generuje dane wyjściowe zgodnie z żądaniem?
Tomas
1
@Tomas To funkcja
TuxCrafting
4

Bash, 88 znaków

diff <(grep -o .<<<$1|sort) <(grep -o .<<<$2|sort)>/dev/null && echo true || echo false
Jaskółka oknówka
źródło
4

R , 54 bajty

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

Wypróbuj online!

J.Doe
źródło
Jestem bardzo zaintrygowany twoim użyciem utf8ToInt, nie tylko w tej odpowiedzi, ale w wielu innych, które widziałem.
Sumner18,
1
Czy widziałeś wskazówki dotyczące gry w golfa w R ? utf8ToInta jego odwrotność powoduje, że podział łańcucha jest krótszy niż w przypadku konwencjonalnych funkcji.
J.Doe
3

Scala w REPL (32)

readLine.sorted==readLine.sorted

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

Wykorzystują one ciekawą funkcję Scali, dzięki której Łańcuch może być również traktowany jako ciąg znaków ( Seq), a wszystkie operacje Seqsą dostępne.

ebruchez
źródło
3

APL - 13 znaków

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

Zadzwoń tak:

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

W ostatnim przykładzie 'a'reprezentuje pojedynczy znak, a prefiks ,przekształci go w ciąg.

Elias Mårtenson
źródło
3

Java (134 bajty)

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

Powoduje to, że tablica zlicza liczbę wyświetleń każdej litery, a następnie porównuje tablice, aby sprawdzić, czy są one równe.

kodowane
źródło
1
Witamy w PPCG! Miły pierwszy post! Możesz usunąć 2 spacje (c[0], c[1])i for (int i=0;.
Rɪᴋᴇʀ,
3

JavaScript, 41

Funkcja porównania (41) :

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

Funkcja komparatora (21) :

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

Funkcja komparatora (48):

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

Funkcja porównania (78):

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

Zakłada, że Stringma spliti Arrayma sort.

zzzzBov
źródło
38 bajtów:c=>d=>(a=b=>''+[...b].sort())(c)==a(d)
Shieru Asakoto