Bestimmen Sie, ob Zeichenfolgen Anagramme sind


85

Herausforderung

Berechnen Sie bei zwei gegebenen Zeichenfolgen, ob beide genau die gleichen Zeichen enthalten.

Beispiel

Eingang

Wort, wrdo

Dies kehrt zurück, trueweil sie gleich sind, aber nur verschlüsselt.

Eingang

Wort, wwro

Dies kehrt zurück false.

Eingang

Boot, toba

Dies kehrt zurück true

Regeln

Hier sind die Regeln!

  • Angenommen, die Eingabe ist mindestens 1 Zeichen lang und nicht länger als 8 Zeichen.
  • Nur keine Sonderzeichen a-z
  • Alle Eingaben können als Kleinbuchstaben angenommen werden

Testfälle

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 Antworten in 13 Ansichten ... wow!
Tom Gullen

@ Tom, weil jeder beweisen wollte, dass Ihr Kommentar zur Verwendung einer 64-Bit-Ganzzahl in die falsche Richtung wies: P
Peter Taylor

5
Titelanfrage: Cod Elf, Go!

5
"Falcon Rage, mach dich verrückt!"
Geobits

7
Mein Namensvorschlag: "
Sind das

Antworten:


39

Python, 32 Bytes

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

3
@Debanjan, Dies ist genau das gleiche wie def f(a,b):return sorted(a)==sorted(b)Der Nachteil ist, dass Sie def + return durch Lambda ersetzen müssen, wenn Sie keine Anweisungen verwenden
gnibbler

1
@Debanjan, ich denke es spart dir nur einen Charakter. Ich habe eine Variation hier verwendet, aber es funktioniert auf die gleiche Länge haben wie Sie, weil ich eine neue Zeile für ein Komma tauschen
gnibbler

4
@Tomas, Quatsch. Die Frage gibt kein vollständiges Programm an, daher sind entweder eine Funktion oder ein vollständiges Programm akzeptabel.
Gnibbler

2
@Tomas, Die meisten Antworten hier entsprechen nicht Ihren Kriterien. Warum nicht allen, die es tun, eine positive Stimme geben?
Gnibbler

4
@Tomas, es ist kein Regelmissbrauch. Einige Fragen sind absichtlich offen, wie es scheint. Vergleichen Sie mit einer genau festgelegten Frage wie dieser . Wenn Sie nicht über diese Antworten gerne beschweren auf die Frage Fragesteller
gnibbler

27

Golfscript, 3 Zeichen?

$$=

Verwendungszweck:

'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
Dies ist eine interessante Interpretation der Eingabe :)
gnibbler

4
Erklärung bitte :(
st0le

10
@ st0le, im Ernst? Ich kenne kein Golfscript, aber es ist offensichtlich $ (sortieren), $ (sortieren), = (vergleichen)
Peter Taylor

11
Betrügt das nicht ein bisschen? Ich meine, es ist keine variable Eingabe. Es muss hart codiert werden. In jedem Fall würde ich der Zeichenanzahl für die quote ( ') -Zeichen 4 hinzufügen .
Thomas Eding

6
Dies gilt nicht nach unseren aktuellen Regeln. Sie können es jedoch in die 4-Byte-Funktion von @ JanDvorak ändern, die Eingaben über ein gültiges Eingabeformat akzeptiert .
Türklinke

20

J, 8

-:&(/:~)

Literaly, match ( -:) on ( &) sort up ( /:~)

Beispielgebrauch:

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

Wo kommen die 64-Bit-Ganzzahlen ins Spiel?


Ist es nicht möglich, Funktionen / Unterprogramme in J zu schreiben?

2
@ Tim Nordenfur: Sie heißen "Verben" und nehmen entweder ein Argument rechts von sich v arg(Monaden) oder zwei auf beiden Seiten arg1 v arg2(Dyaden). Das, was ich eingereicht habe, ist offensichtlich eine Dyade. Ich habe mich nicht darum gekümmert, es zu benennen, da es nicht angefordert wurde und auf diese Weise kürzer ist. Solltest du ihm wirklich einen Namen geben wollen, machst du das so: is_anagram_of =: -:&(/:~)und dann benutze als 'a' is_anagram_of 'aa'.
JB

Es fühlte sich ein bisschen billig an, die Argumente in den Code einzufügen, aber ich sehe jetzt, dass es im Wesentlichen eine Dyade ist. Keine Ursache.

29
J sieht immer aus wie die Überreste einer Emoticon-Fabrik-Explosion.
st0le

19

Javascript, 192 157 152 147 125 Bytes

Ok, einige dieser Sprachen sind viel flexibler als ich dachte! Auf jeden Fall ist dies der längere Weg, aber zumindest eine andere Technik.

Komprimiert

Vielen Dank an Peter und David, die mehr Zeichen herausgedrückt haben!

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}

Dann mach:

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

Erweiterter Code

Das komprimierte hat viele Änderungen gehabt, aber das ist die Grundtheorie:

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

Tolle Idee mit Primzahlen.

@ Tim danke! Habe es jetzt auf 157 geschafft.
Tom Gullen

2
Mit dem Sieb können Sie einige Zeichen aus der Wörterbuchinitialisierung entfernen. 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 hängt davon ab, wie gut die Sortierroutinen optimiert sind, da die Eingaben auf 8 Zeichen beschränkt sind: P
Peter Taylor

1
125 Zeichen . Rekursion und 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

Golfscript, 8 Bytes

Dies definiert eine aufgerufene Funktion A

{$\$=}:A

Testfälle

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

Funktion - 31

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

Programm - 81 58 55

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

Verwendungszweck:

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

Ein großes Lob an Lambdabot und seine sinnlose Umgestaltung .


Kann Haskell-Code, der nur das tut, was unter runghc gewünscht wird, aber beim Kompilieren nicht, immer noch "program" genannt werden?
JB

3
@JB: Kann Perl-Code, unter dem nur das, was gewünscht wird, perlnoch als "Programm" bezeichnet werden? :-)
Joey Adams

JB: Die heutigen funktionalen Sprachen verzerren die Bedeutung eines Programms und machen es zu einer Abstraktion höherer Ordnung. Anstatt nur eine Liste der auszuführenden Befehle, kann das haskell-Programm auch dann als Sammlung von Funktionen angesehen werden, wenn sie nicht aufgerufen werden.
Callum Rogers

@ Callum Rogers: Mein Punkt ist: Sein Code verhält sich unterschiedlich, egal ob er unter runghc ausgeführt oder kompiliert wird, in einem problemempfindlichen Bereich. Die "Funktion" ist in Ordnung. Das "Programm" löst das Problem nur unter runghc, und runghc ist nicht die einzige legitime Möglichkeit, Haskell-Programme auszuführen. In diesem Zusammenhang macht dies das Snippet zu einem "runghc-Skript" und nicht zu einem "Haskell-Programm". --nicht, dass ich das Thema für wichtig halte, wie gesagt, die Funktion ist trotzdem in Ordnung und sie ist kürzer.
JB

2
x#y=sort x==sort yist 1 Zeichen kürzer
Rotsor

10

129 Zeichen

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

Lesbar:

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

Ich denke, Sie könnten ein paar Bytes mit Golf spielen, using System.Linq;anstatt es mit einem Namensraum zu versehen?
Stackstuck

10

Ruby, 34 Bytes

Verwenden des IO-Schemas der Peter Taylors Perl-Lösung:

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

Wirft einen Fehler:-e:1:in '<main>': undefined method 'chars' for nil:NilClass (NoMethodError)
Tomas

9

C-Programm, 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
Haben Sie schon einmal darüber nachgedacht, sich für IOCCC zu bewerben ?
Mateen Ulhaq

9
@muntoo: hast du irgendwas im IOCCC gesehen? Dafür ist das viel zu lesbar.
R. Martinho Fernandes

@Martinho Ja, die IOCCC-Quellcodes sind so schön. Symphonien. Aber er sollte wenigstens versuchen, ein kleines Stück zu komponieren. :)
Mateen Ulhaq

@muntoo: Ich wusste nicht einmal, dass sie noch aktiv sind.
Joey Adams

1
Habe gerade diesen gesehen ... Sehr schön. Kann aber kürzer sein: 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");}- das sind 108 Zeichen. Sehr wichtig ist, dass Ihr cInitialisierungstrick immer noch angewendet wird.
Ugoren

7

Perl, 58 Bytes

(komplettes Programm, im Gegensatz zu der anderen Perl-Antwort, die nur eine Funktion ist)

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

49 als Funktion

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

Natürlich können Sie 4 Zeichen im Programm speichern, indem Sie das "Umgeben von true und false entfernen , da ein Bareword ohne Verwendung von strict / warnings eine Zeichenfolge ist.
Joel Berger


Ich bevorzuge dies als ($c,$d)=map{[sort split//]}@ARGV;exit("@$c"ne"@$d")(51 Zeichen), damit es Befehlszeilenargumente annehmen und die Befehlszeilen-Exit-Codes verwenden kann. <>Bei einem mehrzeiligen Eingang bleiben 48 Zeichen erhalten .
Adam Katz

6

Clojure - 23 Zeichen

Als anonyme Funktion:

#(apply = (map sort %))

Testfallbeispiel:

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

Toll, das gefällt mir.
Chiron

1
Gute Antwort. Mir gefallen besonders die von Ihnen
coredump

6

JavaScript

Basierend auf der @ zzzzBov-Lösung.

Vergleich, 65 Zeichen (40 ohne Funktion)

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

Komparator, 43 Zeichen

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

Clever mit dem +""zum Schnüren zwingen.
Casey Chu

6

C ++ (104 Nicht-WS-Zeichen)


Basierend auf der Zählart. Hinweis: Es wird von Zeichenfolgen gleicher Länge ausgegangen, was von der Frage impliziert (wenn auch nicht angegeben) zu sein scheint.

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

Wenn Sie in C eine Variable im globalen Bereich deklarieren, wird sie auf Null initialisiert. Ich denke, das gilt auch für C ++.
Joey Adams

Lokale Variablen werden dagegen nicht automatisch auf Null gesetzt.
Joey Adams

OK, ich habe meine Einschränkung aufgehoben, da ich Wege gefunden habe, darauf zu verzichten.
Matthew Read

1
Bzzzt. Sie bestehen die Testfälle, aber "helle" und "hollo" sind anscheinend gleich. Einfache Lösung: Ändern Sie eines der ++ in ein -. Dann nur, wenn (u [i ++]) 0 zurückgeben;
Dave Gamble

1
Ich habe das noch nicht getestet, aber die letzten drei Zeilen können alsi=123;while(i&&u[--i]);return!i;
st0le

4

PHP (Befehlszeile, 87 Zeichen)

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

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

4

Javascript

Eine (sehr) etwas kürzere Version der @ zzzzBov-Lösung, die .join()anstelle von String-Boxing verwendet:

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

Ähnlich:

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

3
Das ist die Antwort-ID 1337. congratz
TheDoctor

4

Clojure REPL 41 Zeichen

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

Willkommen im Stack Exchange-Netzwerk. Formatierungshilfe hier .
dmckee

4

Java

(Offenbar die Lieblingssprache aller!)

173 Zeichen:

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

(Gibt kein Zeilenumbruchzeichen aus, um 2 Zeichen von println zu sparen.)

Kompilieren und ausführen:

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

Ich liebe es, einen kürzeren zu sehen ...


Ich weiß , es ist schon mehr als 6,5 Jahre (lol), aber Sie können Golf spielen sie um 10 Bytes , die durch das Hinzufügen java.util.Arrays x=null;und verwenden x.statt 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 ) Und es Java Umwandlung 8, class g{public static void mainkönnte interface g{static void mainals gut, aber ich denke , Java 8 wasn gibt es noch nicht im Jahr 2011, also classist auch die Aufbewahrung in Ordnung. ; p
Kevin Cruijssen

4

sed, 45 Zeichen

Es ist sogar in meinem Favoriten möglich - sed! Nur ein regulärer Ausdruck, um das Anagramm zu lösen ! Entferne einfach die entsprechenden Buchstaben:

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

(aufzurufen mit -nE)

Perl, 48

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

Aufruf mit -p.

Perl-Funktion, 39

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

4

APL, 2 Zeichen

≡⍦

Dies ist die Multiset Match- Funktion von Nars2000 , einer der führenden APL-Implementierungen. Wenn es auf Zeichenfolgen angewendet wird, berechnet es genau die erforderliche Funktion:

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

Nur neugierig, wie viele Bytes ist das? 4? 6?
Maltysen

Das hängt von der Kodierung ab. 6 Bytes in UTF-8, 4 Bytes in UCS-2, 2 Bytes, wenn einer der älteren Einzelbyte-APL-Zeichensätze das Symbol hat, was ich bezweifle.
Tobia

4

05AB1E , 6 4 Bytes (nicht konkurrierend)

{I{Q

Probieren Sie es online!

Dies dauerte aufgrund von Eingabeschwierigkeiten eine Weile. Golf wegen Pop.

Erläuterung:

{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
Da 05AB1E neuer als diese Herausforderung ist, ist diese Antwort nicht konkurrierend.
Loovjo

Entschuldigung - habe es nicht gemerkt.
Geno Racklin Asher

4

Perl, 77 75 Zeichen

Die E / A des Problems sind nicht genau angegeben. Dies liest zwei Zeilen von stdin und gibt true oder false an stdout aus.

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

(Danke an Tim für 77 -> 75)


Irgendwas stimmt nicht. $a=;? Sie können auch die Parens von sortund das Leerzeichen danach überspringen print.

@Tim, das Genie, das diese Plattform für die gemeinsame Nutzung von Code über das Internet entwickelt hat, hat entschieden, dass in Codeblöcken weniger als Zeichen vermieden werden müssen. Aber hey, keine große Sache: Es ist nicht so, als ob jemand sie im Code benutzt, oder? Fängt mich immer wieder auf.
Peter Taylor

2
Ok, ich habe die Ablehnung entfernt. Möglicherweise möchten Sie in Zukunft die Code-Formatierung verwenden, dh Code mit vier Leerzeichen einrücken.

1
Ok, es gibt drei Möglichkeiten, Code zu formatieren (einen Inline- und zwei Block-Formatierungen), und beide Block-Formatierungen sind auf unterschiedliche Weise unpraktisch. Seufzer.
Peter Taylor

4

Perl, 62 Bytes

Diese Funktion nimmt die Zeichenfolgen als Argumente und gibt true oder false zurück.

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

Speichert die ASCII-Werte in einem Array und prüft, ob sie ausgeglichen sind. Inkremente für das erste Wort und Dekremente für das zweite Wort.


4

Python 3, 107 97 76 64

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

Offensichtlich kann dies verkürzt werden, wenn wir den Wortlaut des OP nicht wörtlich und in Kleinbuchstaben "wahr" und "falsch" nehmen ...


Sie können einige Zeichen abschneiden, wenn Sie ;s=sortedan die erste Zeile anhängen und dann die beiden Instanzen von sortedmit sin der zweiten Zeile ersetzen . Sollte speichern ... 3 Zeichen?
Alex Van Liew

1
Tatsächlich. Python 3 spart auch ein bisschen Platz und ist wahrscheinlich jetzt, 5 Jahre nachdem diese Antwort gepostet wurde, vernünftig zu verwenden. Auch die .strip () war angesichts der angegebenen Eingaben redundant.
Wooble

Ja entschuldigung. Ich habe nicht bemerkt, wie alt diese Frage war, als ich sie kommentierte, nur dass sie auf der Titelseite war. ^^;
Alex Van Liew

4

Python, 32 Bytes

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

Tut nichts in Python. Sind Sie sicher, dass es sich um ein vollständiges Programm handelt, das die Eingabe übernimmt und die Ausgabe wie gewünscht erzeugt?
Tomas

1
@Tomas Es ist eine Funktion
TuxCrafting

4

Bash, 88 Zeichen

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

4

R , 54 Bytes

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

Probieren Sie es online!


Ich bin sehr fasziniert von Ihrer Verwendung von utf8ToInt, nicht nur in dieser Antwort, sondern auch in vielen anderen, die ich gesehen habe.
Sumner18

1
Haben Sie Tipps zum Golfen in R gesehen ? utf8ToIntund seine Umkehrung führt tendenziell zu einer kürzeren Aufteilung der Saiten als die herkömmlichen Funktionen.
J.Doe

3

Scala in REPL (32)

readLine.sorted==readLine.sorted

Skalafunktion (43)

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

Scala-Programm (61)

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

Diese nutzen eine nette Funktion von Scala, mit der ein String auch als Folge von Zeichen ( Seq) behandelt werden kann, wobei alle Operationen Seqverfügbar sind.


3

APL - 13 Zeichen

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

Rufen Sie wie folgt an:

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

Im letzten Beispiel wird 'a'ein einzelnes Zeichen dargestellt, und das Präfix ,konvertiert es in eine Zeichenfolge.


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

Dadurch wird in einem Array die Häufigkeit gezählt, mit der jeder Buchstabe angezeigt wird. Anschließend werden die Arrays verglichen, um zu überprüfen, ob sie gleich sind.


1
Willkommen bei PPCG! Schöner erster Beitrag! Sie können 2 Leerzeichen entfernen (c[0], c[1])und for (int i=0;.
6.

3

JavaScript, 41

Vergleichsfunktion (41) :

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

Komparatorfunktion (21) :

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

Komparatorfunktion (48):

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

Vergleichsfunktion (78):

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

Angenommen Stringhat splitund Arrayhat sort.


38 Bytes:c=>d=>(a=b=>''+[...b].sort())(c)==a(d)
Shieru Asakoto
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.