Papierkorb verwalten


35

In PPCG ist es zu einer gewissen Tradition geworden, dass einige Benutzer ihre Namen vorübergehend durch ein Anagramm ändern (ein neuer Name, der durch Umordnen der Buchstaben des alten gebildet wird).

Manchmal ist es schwierig herauszufinden, wer wer ist. Ich könnte ein Programm oder eine Funktion verwenden, um festzustellen, ob zwei Phrasen Anagramme voneinander sind.

Die Herausforderung

Das Programm oder die Funktion sollte zwei Zeichenfolgen verwenden und ein wahres Ergebnis liefern, wenn sie Anagramme voneinander sind, und ansonsten falsch.

Regeln

  • Die Eingabe enthält nur Buchstaben (ASCII 65 bis 90 und 97 bis 122), Ziffern (ASCII 48 bis 57) oder Leerzeichen (ASCII 32).
  • Die Anagrammrelation ist unabhängig vom Einzelfall. "Arm" und "RAM" sind also Anagramme.
  • Leerzeichen zählen auch nicht. "Keyboard" und "Barked Yo" sind also Anagramme
  • Alle eingebauten erlaubt
  • Das Eingabeformat ist flexibel (zwei Zeichenfolgen, ein Array aus zwei Zeichenfolgen, eine Zeichenfolge, die beide Phrasen mit einem geeigneten Trennzeichen enthält ...)

Code Golf. Wenigste Bytes gewinnt.

Testfälle

Wahrheit:

Lynn, Nyl N
Digital Trauma, Tau Digital Arm
Sp3000, P S 3000
Manage Trash So, Those anagrams

Falsch

Calvins Hobbies, Helka Homba
Android, rains odd
In between days, bayed entwine
Code golf, cod elf got

8
Verwandte, aber anders (nur Buchstaben, keine Groß- und Kleinschreibung, keine Leerzeichen)
Luis Mendo

4
Der Titel dieser Frage ist für jemanden, der nicht genug Kaffee getrunken hat, sehr verwirrend. +1: D
Katze

1
@DonMuesli Ich würde argumentieren, dass dies immer noch ein Betrug ist. Die geringfügigen Änderungen sind sehr trivial.
Mego

15
Manage Trash So, Those anagrams. Nett.
mbomb007

3
So, the anagrams...
Undichte Nonne

Antworten:



15

Retina, 25

i+`(\w)(.*,.*)\1
$2
^\W*$

Probieren Sie es online! Darüber hinaus können Sie eine geänderte mehrzeilige Version ausführen .

Löschen Sie Buchstaben vor dem Komma und die Übereinstimmungen nach dem Komma. Wenn wir keine Buchstaben mehr haben, war es ein Anagramm.


Wenn für Retina eine positive Zahl als Fehler und eine Null als Erfolg gewertet werden kann, kann dies durch die Verwendung \wals letzte Stufe um drei Byte kürzer sein .
FryAmTheEggman


@ dev-null "Die Eingabe enthält nur Buchstaben (ASCII 65 bis 90 und 97 bis 122), Ziffern (ASCII 48 bis 57) oder Leerzeichen (ASCII 32)"
FryAmTheEggman

11

Pyth, 11 10 Bytes

Vielen Dank an @FryAmTheEggman für das Erlernen der Macht von ;!

qFmSr-d;0Q

Probieren Sie es hier aus!

Nimmt eine Liste von zwei Zeichenfolgen als Eingabe.

Erläuterung

qFmSr-d; 0Q # Q = Eingang

  m Q # map Q mit d als Lambda-Variable
     -d; # filtert Leerzeichen aus der Zeichenkette heraus
    r 0 # in Kleinbuchstaben konvertieren
   S # sortiere alle Zeichen in einer Zeichenkette
qF # Entfalte die resultierende Liste und überprüfe sie auf Gleichheit

10

Python 2, 63 61 Bytes

lambda*l:len({`sorted(s.lower())`[2::5].strip()for s in l})<2

Eine anonyme Funktion, die n Argumente akzeptiert und bestimmt, ob alle n gegenseitige Palindrome sind! f("Lynn", "Nyl N")kehrt zurück True.

Dieser Set-Verständnis-Trick stammt von xnor. Es wurden zwei Bytes gespart, aber der alte Ansatz sah sehr ordentlich aus:

exec"a=`sorted(input().lower())`[2::5].strip();a"*2;print a==aa

`sorted(input().lower())`.strip(" [',")ist die gleiche Länge: /
Sp3000

Das execDing ist schlau, scheint aber zu komplex. Mit können Sie es besser machen lambda*l:len({`sorted(s.lower())`[2::5].strip()for s in l})<2.
Xnor

2
Vielen Dank! Ich bin ein bisschen enttäuscht - es sah sehr cool aus. Behalten Sie es trotzdem in der Post.
Lynn

7

Gelee, 12 Bytes

ḟ€⁶O&95Ṣ€QLḂ

Probieren Sie es online!

Wie es funktioniert

ḟ€⁶O&95Ṣ€QLḂ  Main link. Input: A (list of strings)

  ⁶           Yield ' '.
ḟ€            Filter it from each string.
   O          Apply ordinal to all characters.
    &95       Take bitwise AND with 95 to make the ordinals case-insensitive.
       Ṣ€     Sort each list of ordinals.
         Q    Deduplicate the list.
          L   Get the length.
           Ḃ  Compute the length's parity (1 -> 1, 2 -> 0).

Alternative Version, nicht konkurrierend (9 Bytes)

Jellys Atom in Großbuchstaben hatte einen Fehler und Jelly hatte noch keine eingebauten Testlisten für Gleichheit ...

ḟ⁶ŒuṢµ€⁼/

Probieren Sie es online!

Wie es funktioniert

ḟ⁶ŒuṢµ€⁼/     Main link. Input: A (list of strings)

     µ€       Map the chain to the left over A.
 ⁶            Yield ' '.
ḟ             Filter it from the string.
  Œu          Cast to uppercase.
    Ṣ         Sort.
       ⁼/     Reduce by equality.

6

CJam, 11 12 14 Bytes

3 2 Bytes entfernt dank @FryAmTheEggman

{lelS-$}2*=

Probieren Sie es online!

{      }2*       e# do this twice
 l               e# read line as a string
  el             e# make lowercase
    S-           e# remove spaces from string
      $          e# sort
          =      e# compare strings

@FryAmTheEggman Vielen Dank!
Luis Mendo

@FryAmTheEggman Nochmals vielen Dank! Ich muss noch viel über CJam lernen :-)
Luis Mendo

3
Dein Code lacht heimlich. lel.
Cyoce

Oder ist es eine? lel==> 1e1Niemand weiß es. Es ist ein Mysterium.
User48538

6

Javascript, 69 61 60 59 Bytes

1 Byte aus danke @ ӍѲꝆΛҐӍΛПӍѲꝆΛҐӍΛ . 1 - Byte - off mit currying ( wies darauf hin , durch @apsillers )

n=>m=>(G=s=>[]+s.toLowerCase().split(/ */).sort())(n)==G(m)


2
Very nice, filtering out spaces and converting to an array at the same time!
Neil

2
Very nice. You can save one byte using currying, which the community has decided is an acceptable form of arguments: n=>m=>...
apsillers

Try n=>m=>(G=s=>[]+s.toLowerCase().split(/\S/).sort())(n)==G(m). Using split instead of match should save you a byte.
Mama Fun Roll

@ӍѲꝆΛҐӍΛПҒЦꝆ. No, because suppose s='db cz'... Now s.match(/\S/g).sort() results in ['b','c','d','z']... and s.split(/\s/).sort() results in ['cz','db']
entfernt

@ӍѲꝆΛҐӍΛПҒЦꝆ. But... looking into your idea, I changed it a bit and saved one byte... thanks!
removed

6

MATL, 11 bytes

2:"jkXvS]X=

EDIT (May 20, 2016) The code in the link uses Xz instead of Xv, owing to recent changes in the language.

Try it online!

2:"     ]       % do this twice
   j            % read input line as a string
    k           % convert to lowercase
     Xv         % remove spaces
       S        % sort
         X=     % are they equal?

3
Did you just change your name for that challenge?
Denker

3
@DenkerAffe I had been thinking about it for some time. I just made it coincide with the challenge :-)
Luis Mendo

1
Don Muesli lol. So you are the Lord of Muesli Luis!? Is this how you keep your healthy complexion?
rayryeng - Reinstate Monica

@rayryeng Heyyy! Good to see you here, Ray! Get back to golfing!
Luis Mendo

I promise I will :) once this course ends... I see you are learning CJam now too. Very nice!
rayryeng - Reinstate Monica

4

Seriously, 11 9 bytes

2`,ùSô`n=

Try It Online!

Everyone seems to be using the same algorithm. Here it is yet again.

2`    `n          Do it twice
  ,               Read a string
   ù              Make it lowercase
    S             Sort
     ô            Strip spaces.
        =         Check equality.

Bearbeiten: Die realisierte Sortierung funktioniert korrekt für Zeichenfolgen und sortiert Leerzeichen nach vorne, sodass strip () funktioniert.


4

C 165 Bytes

#define d(x) int x(char*a,char*b){
d(q)return*a&224-*b&224;}
#define n(x) for(qsort(x,strlen(x),1,(__compar_fn_t)q);*x<33;x++);
d(s)n(a)n(b)return strcasecmp(a,b);}

Lesbar und im Arbeitskontext

#include <stdlib.h>
#include <string.h>
#include <stdio.h>

// start of comparison
int q(char *a, char *b){
     return ((*a)&0xdf)-((*b)&0xdf); // case-insensitive
}
int s(char *a, char *b){
    for(qsort(a,strlen(a),1,(__compar_fn_t)q); *a<33; a++) /**/;
    for(qsort(b,strlen(b),1,(__compar_fn_t)q); *b<33; b++) /**/;
    return strcasecmp(a,b);
}
// end of comparison

int main(int i, char **v){
    printf("'%s' '%s'", v[1], v[2]);
    printf("=> %d\n", s(v[1], v[2])); // 0 if equalish
    return 0;
}

3

zsh, 85 Bytes

[ $(for x in $@;{tr -d \ <<<$x|tr A-Z a-z|fold -1|sort|paste -sd x}|uniq|wc -l) = 1 ]

Eingabe als Kommandozeilenargumente, Ausgabe als Returncode.

Die forSyntax macht diese Bash-inkompatibel.

[               # test...
$(for x in $@;  # map over arguments
{tr -d \ <<<$x  # remove spaces
|tr A-Z a-z     # lowercase
|fold -1        # put each character on its own line
|sort           # sort lines
|paste -sd x    # remove all newlines except last
}|uniq          # take only unique lines
|wc -l          # how many lines remain?
) = 1 ]         # if only 1 line left, it must have been an anagram

3

Japt, 12 Bytes

N®v ¬n ¬xÃä¥

Online testen!

Wie es funktioniert

        // Implicit: N = array of input strings
N®    Ã // Take N, and map each item Z to:
v ¬n    //  Take Z.toLowerCase(), split into chars, and sort.
¬x      //  Join and trim off whitespace.
ä¥      // Reduce each pair of items (that's exactly one pair) X and Y to X == Y.


3

Perl, 34 33 + 1 = 34 Bytes

s/(.)(.*,.*)\1/$2/i?redo:say!/\w/

Benötigt die -nFlagge und die freie -M5.010| -E:

$ perl -M5.010 -ne's/(.)(.*,.*)\1/$2/i?redo:say!/\w/' <<< 'hello, lloeh'
1

Wie es funktioniert:

                                   # '-n' make a implicit while loop around the code
 s/(.)(.*,.*)\1/$2/i               # Remove a letter that occurs on both sides of the comma.
                    ?
                     redo:         # Redo is a glorified goto statement that goes to the top of the while loop
                          say!/\w/ # Check to see if any letter is left

Vielen Dank an msh210 für den Vorschlag, mit ternären Operatoren ein Byte zu sparen


3

Baloch Gyr , 9 Bytes

{ṇ₁cḷ}ᵐpᵈ

Probieren Sie es online!

Wahrheits- / Falschausgabe wird durch Prädikat Erfolg / Misserfolg erreicht, dies ist Brachylog.

Zuvor wurde ein Byte mit gespeichert, cṇ₁cḷḍanstatt {ṇ₁cḷ}ᵐunter der Annahme, dass die beiden Eingabezeichenfolgen die gleiche Länge minus Leerzeichen haben, aber ich erkannte, dass es dort erfolgreich sein würde, wo es fehlschlagen sollte Ah Hass, haha.

{    }ᵐ      For both strings in the input,
 ṇ₁          split on spaces,
   c         concatenate,
    ḷ        and lowercase.
       pᵈ    The strings are permutations of each other.

2

PHP, 109 94 Bytes

function f($x){return str_split((trim($x));}function g($x,$y){return array_diff(f($x),f($y));}

Blech, die beiden bringen function/returnmich hier um.

Gibt die Differenz zwischen zwei stringEingaben als arrayZeichen zurück. PHP hält es für []falsch, die returnAnforderungen zu erfüllen.


3
function($x,$y){$S=str_split;return array_diff($S(trim($x)),$S(trim($y)));}-> 75 Bytes. Erstellt eine anonyme Funktion, die das Ergebnis zurückgibt. Ich habe diese lange Funktion entfernt und die Aufrufe an str_splitdurch eine zugewiesene Variable ersetzt, um sie zu verkürzen.
Ismael Miguel

Nett. Ich habe es optimiert, um es auf die eine Funktion zu reduzieren. Das ist zwei Schritte voraus, gut gemacht.
Ricdesi

2

Bash + GNU-Dienstprogramme, 51

f()(fold -1<<<${@^^}|sort)
f $1|diff -qBw - <(f $2)
  • Definieren Sie eine Funktion, f()die:
    • ${@^^} wandelt alle Parameter in Großbuchstaben um
    • fold -1 Teilt Zeichen auf - eines pro Zeile
    • sorts Zeilen
  • Rufen Sie diffmit -qauf, um die vollständige Diff-Ausgabe zu unterdrücken und -BwLeerraumänderungen zu ignorieren

2

Pyke (Commit 30, nicht konkurrenzfähig), 9 Bytes

Fl1dk:S)q

Erläuterung:

F      )  -  for _ in eval_or_not(input())
 l1       -     ^.lower()
   dk:    -    ^.replace(" ", "")
      S   -   sorted(^)
        q - ^==^

2

Mathematica, 77 76 Bytes

StringMatchQ[##,IgnoreCase->1>0]&@@(""<>Sort[Characters@#/." "->""]&/@{##})&

Der erste Teil ist eigentlich eine meiner Antworten auf eine andere Frage!


2

Pike, 54 112 109 109 96 Bytes

#define a(x) sort((array)replace(lower_case(x)," ",""))
int s(mixed i){return a(i[0])==a(i[1]);}

mixedzufällig kürzer als array(string).

sGibt zurück, 1ob es sich bei den Argumenten um Anagramme handelt.


2

Q, 25 Bytes

f:{~/{x@<x:x@&~^x:_x}'x}

ANMERKUNG: Zählen Sie den Funktionsnamen f, um die Tests zu erleichtern (als Lambda können 2 Bytes dekrementiert werden).

Lesbare Version

Übereinstimmung über {aufsteigend nicht null niedriger x} jedes x

{.. x ..} is an anonymous function with arg x
_x        lowers string x
&~^x      where not null x (space is considered null)
x@..      selects elements of x according to indexes .. 
<x        ascending indexes of x (not values). Ex <"cab" is 1 2 0
x@<x      ascending values of x (x at ascending indexes of x)
~         match (diad function). Ex "one"~"one" is true
f'..      applies function f for each argument ..
f/..      applies function f over elements of sequence (fold)

Prüfung

f("Lynn";"Nyl N")                       
f("Digital Trauma";"Tau Digital Arm")   
f("Sp3000";"P S 3000")                  
f("Manage Trash So";"Those anagrams")   
f("Calvins Hobbies";"Helka Homba")      
f("Android";"rains odd")                
f("In between days";"bayed entwine")    
f("Code golf";"cod elf got")    

erzeugt (1b = wahr, 0b = falsch)

1b
1b
1b
1b
0b
0b
0b
0b

Über Q

Von kx.com entwickelte Allzwecksprache (APL-Derivat, spezialisiert auf Datenverarbeitung). Kostenlose voll funktionsfähige Testversion für Windows / Linux / MacOS.


Was meinst du, andere Sprachen sind nicht seriös? :-P
Luis Mendo

Wenn der fCode ordnungsgemäß ausgewertet werden soll, muss er gezählt werden. Ansonsten lassen Sie es einfach in Ihrem Einreichungscode weg und verwenden Sie es nur in Beispielen, um zu zeigen, wie Sie die Funktion zuweisen.
Mego

Natürlich sind andere Sprachen so ernst wie Q. Ich bitte um mein schlechtes Englisch. Einige Sprachen beeinträchtigen jedoch die Lesbarkeit oder sind ad-hoc mit Bibliotheken für diese Art von Wettbewerben ausgestattet. Q ist eine Allzwecksprache, obwohl der Code nicht gut lesbar ist.
J. Sendra

Sie müssen x nur einmal zuweisen, wenn Sie später senken k)~/{x@<x:_x@&~^x}' für 17 Bytes. Aber ich würde sagen, es ist 19, da Sie die k)Klammer benötigen , da dies Keher Code ist als Q...
streetster

2

APL, 31 Zeichen

{≡/{x[⍋x←('.'⎕R'\u0')⍵~' ']}¨⍵}

So verwendet werden:

    {≡/{x[⍋x←('.'⎕R'\u0')⍵~' ']}¨⍵}'Sp3000' 'P S 3000' 
1

Auf Englisch:

  • { ... }¨⍵: für jedes der beiden Elemente des Arguments
  • x←('.'⎕R'\u0')⍵~' ': transformiere den String ohne Leerzeichen in Großbuchstaben (unter Verwendung einer Regex ...) und weise das temporäre Ergebnis zu x
  • x[⍋x]: sortiere x
  • ≡/: Vergleichen Sie die beiden Ergebnisse der Sortierung: Wenn sie übereinstimmen, geben Sie 1 zurück.

Kann ich es online ausprobieren? Ich habe versucht , mit diesem aber ich weiß wirklich nicht , wie es zu benutzen
Luis Mendo

Sicher. Hier: Definition, nach der Sie einfach f 'first avatar' 'second avatar'
eingeben

Vielen Dank! Vielleicht das zur Antwort hinzufügen? Damit die Leute es versuchen können
Luis Mendo

–9:≡/{x[⍋x←0~⍨32|⎕UCS⍵]}¨
Adám

@ Adám: das geht nicht, da ≡/{x[⍋x←0~⍨32|⎕UCS⍵]}¨'pp' '00'gibt 1.
lstefano

2

Java, 218 Bytes

Zum ersten Mal habe ich Java geschrieben ...

Golf gespielt:

import java.util.Arrays;boolean M(String a,String b){char[]A=a.toUpperCase().replace(" ","").toCharArray();char[]B=b.toUpperCase().replace(" ","").toCharArray();Arrays.sort(A);Arrays.sort(B);return Arrays.equals(A,B);}

Ungolfed:

import java.util.Arrays;
public class ManageTrashSo {
    public boolean M(String a, String b) {
    char[] A = a.toUpperCase().replace(" ", "").toCharArray();
    char[] B = b.toUpperCase().replace(" ", "").toCharArray();
    Arrays.sort(A);
    Arrays.sort(B);
    return Arrays.equals(A, B);
   }
}

Testen:

    ManageTrashSo manageTrashSo = new ManageTrashSo();

    //True
    System.out.println(manageTrashSo.M("Lynn", "Nyl N"));
    System.out.println(manageTrashSo.M("Digital Trauma", "Tau Digital Arm"));

    //False
    System.out.println(manageTrashSo.M("Android", "rains odd"));
    System.out.println(manageTrashSo.M("In between days", "bayed entwine"));

Ich weiß, dass es fast ein Jahr her ist, aber Sie können es mit 32 Bytes wie folgt golfen : boolean f(String...a){java.util.Arrays x=null;String[]A=g(a[0]),B=g(a[1]);x.sort(A);x.sort(B);return x.equals(A,B);}String[]g(String a){return a.replace(" ","").toUpperCase().split("");}( 186 Bytes ) Oder wenn Sie es in ein Java 8 Lambda konvertieren, kann es sein: a->b->{java.util.Arrays x=null;String[]A=g(a),B=g(b);x.sort(A);x.sort(B);return x.equals(A,B);};String[]g(String a){return a.replace(" ","").toUpperCase().split("");}( 167 Bytes ). Hier ist ein TIO mit Testcode.
Kevin Cruijssen


1

Ruby, 50 Bytes

def f;gets.upcase.chars.sort.join.strip;end
p f==f

Schreiben f=->{...}und f[]==f[]ist genauso lang. :(


1

PowerShell, 81 Byte

param([char[]]$a,[char[]]$b)-join($a-replace' '|sort)-eq-join($b-replace' '|sort)

Eine leichte Umschreibung von meiner Antwort auf die verknüpfte Anagram-Herausforderung.

Übernimmt Eingaben als Zeichen-Arrays, führt eine -replaceOperation zum Entfernen von Leerzeichen aus, sortsortiert sie (alphabetisch, nicht nach ASCII-Wert) und setzt sie dann -joinwieder in eine Zeichenfolge um. In -eqPowerShell wird standardmäßig nicht zwischen Groß- und Kleinschreibung unterschieden, aber hier muss dies für Zeichenfolgen durchgeführt werden, da dies [char]'a'nicht gleich ist [char]'A', daher der Grund für -join.


1

Perl, 35 Bytes

Fügen Sie +1 für -p

Etwas missbräuchlich, da es davon abhängt, welches Programm auf der Kommandozeile angegeben wird.

perl -pe'<>=~s%\S%*_=s/$&//i?_:0%reg;$_=!//'

Geben Sie dann die Zeichenfolgen als 2 aufeinanderfolgende Zeilen auf STDIN

Eine sehr missbräuchliche Lösung sind 30 Bytes:

perl -ne'<>=~s%\w%1/!s/$&//i%reg;1/!//'

Dies stürzt ab, wenn die Zeichenfolgen keine Anagramme sind, und gibt daher aus Sicht der Shell einen falschen Exit-Code aus. Es gibt auch Müll auf STDERR für diesen Fall. Wenn es sich bei den Zeichenfolgen um Anagramme handelt, ist das Programm still und gibt einen "wahren" Exit-Code aus



1

Excel VBA, 122 Bytes

Anonymes VBE-Sofortfenster Funktion, die Eingaben aus dem Bereich [A1:B1]und Ausgaben in das VBE-Sofortfenster übernimmt

a=Replace([A1]," ",""):b=Replace([B1]," ",""):For i=1To Len(a):b=Replace(b,Mid(a,i,1),"|",,1,1):Next:?b=String(len(a),"|")

0

C #, 378 Bytes

Ich brauche ein Handicap !!

https://dotnetfiddle.net/FNDt0E

using System;
using System.Linq;
using System.Text;

public class Program
{

    public static void Main()
    {
        var l = "Hello World";

        var r = "Red Who Loll";

        var y = new Func<string,string>(s => new String(s.ToLower().Replace(" ","").OrderBy(v => v).ToArray()));
        var z = new Func<string,string,Func<string,string>,bool>((w,x,f) => f(w) == f(x));
        var o = z(l, r, y);


        Console.WriteLine("{0} & {1} are anagram: {2}",l, r, o);


                Console.WriteLine("C#, {0} bytes", Encoding.Unicode.GetByteCount(@"var y = new Func<string,string>(s => new String(s.ToLower().Replace("" "","""").OrderBy(v => v).ToArray()));
    var z = new Func<string,string,Func<string,string>,bool>((w,x,f) => f(w) == f(x));"));

    }

}

4
Willkommen bei Programming Puzzles & Code Golf! In der Regel wird Ihre Sprache zusammen mit der Anzahl der Bytes in die Überschrift Ihres Beitrags eingefügt. Sie können dies tun, indem Sie #in die erste Zeile ein Anführungszeichen einfügen. Auch für Code-Golf-Fragen ist es erforderlich, Ihr Programm zu golfen. Zu Beginn sollten Sie nicht benötigte Leerzeichen entfernen und Variablen mit einem Zeichen verwenden. Sie können auch immer eine Funktion anstelle eines vollständigen Programms verwenden (sofern dies nicht ausdrücklich verboten ist), um weitere Bytes zu speichern.
Denker

@DenkerAffe du hast mich ninja'd :)
Katze

1
Warum all das Leerzeichen?
CalculatorFeline
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.