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

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)

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

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?


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

Ś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

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 .


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(_ => _)));
        }
    }
}

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

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

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

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,


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

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()+""}

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

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

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

3
to jest odpowiedź ID 1337. congratz
TheDoctor


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 ...


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

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

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.

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)


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.


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” ...


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)

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



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.


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.


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.


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.


38 bajtów:c=>d=>(a=b=>''+[...b].sort())(c)==a(d)
Shieru Asakoto
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.