Gérer la corbeille

35

C'est devenu une sorte de tradition dans PPCG que certains utilisateurs changent temporairement leurs noms par un anagramme (un nouveau nom formé en réorganisant les lettres de l'ancien).

Parfois, il est difficile de savoir qui est qui. Je pourrais utiliser un programme ou une fonction pour dire si deux phrases sont des anagrammes l'une de l'autre.

Le défi

Le programme ou la fonction doit prendre deux chaînes et produire un résultat véridique s’il s’agit d’anagrammes, et fausser autrement.

Règles

  • Les entrées ne contiendront que des lettres (ASCII 65 à 90 et 97 à 122), des chiffres (ASCII 48 à 57) ou des espaces (ASCII 32).
  • La relation anagramme est indépendante du cas. Donc, "Arm" et "RAM" sont des anagrammes.
  • Les espaces ne comptent pas non plus. Donc, "clavier" et "Barked Yo" sont des anagrammes
  • Toutes les tâches autorisées
  • Le format de saisie est flexible (deux chaînes, un tableau de deux chaînes, une chaîne contenant les deux phrases avec un séparateur approprié ...)

Code de golf. Le moins d'octets gagne.

Cas de test

Vérité

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

Fausseté

Calvins Hobbies, Helka Homba
Android, rains odd
In between days, bayed entwine
Code golf, cod elf got
Luis Mendo
la source
8
Connexes mais différentes (seulement des lettres, pas de casse, pas d'espaces)
Luis Mendo
4
Le titre de cette question est très déroutant pour quelqu'un qui n'a pas assez bu de café. +1: D
chat
1
@ DonMuesli Je dirais que c'est toujours une dupe. Les légers changements sont très triviaux.
Mego
15
Manage Trash So, Those anagrams. Agréable.
mbomb007
3
So, the anagrams...
Leaky Nun

Réponses:

13

05AB1E , 9 à 8 octets

Code:

lvyð-{}Q

Explication:

l         # Lowercase the strings
 vy   }   # Map over the list, for each...
   ð-     #   remove spaces
     {    #   and sort
       Q  # Check equality

Essayez-le en ligne!

Adnan
la source
... mais 2 octets de moins! Bien joué!
Luis Mendo
C'est lvyðK{}Qmaintenant.
Urne Magique Octopus
15

Rétine, 25

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

Essayez-le en ligne! De plus, vous pouvez exécuter une version multiligne modifiée .

Supprimez les lettres d'avant la virgule et leurs correspondances après la virgule. S'il ne restait plus de lettres, il s'agissait d'un anagramme.

FryAmTheEggman
la source
Pour Retina, si un nombre positif pouvait être considéré comme un échec et que zéro était considéré comme un succès, il pourrait être plus court de trois octets en utilisant \wla dernière étape.
FryAmTheEggman
@ dev-null "L'entrée ne contiendra que des lettres (ASCII 65 à 90 et 97 à 122), des chiffres (ASCII 48 à 57) ou des espaces (ASCII 32)"
FryAmTheEggman le
11

Pyth, 11 à 10 octets

Merci à @FryAmTheEggman de m'avoir appris le pouvoir de ;!

qFmSr-d;0Q

Essayez-le ici!

Prend une liste de deux chaînes en entrée.

Explication

qFmSr-d; 0Q # Q = entrée

  m Q # carte Q avec d comme variable lambda
     -ré; # filtre les espaces en dehors de la chaîne
    r 0 # convertir en minuscule
   S # trier tous les caractères de la chaîne
qF # Déplier la liste résultante et vérifier l’égalité
Denker
la source
10

Python 2, 63 61 octets

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

Une fonction anonyme qui, en fait, prend n arguments et détermine si tous n d'entre eux sont des palindromes mutuels! f("Lynn", "Nyl N")retourne True.

Cette astuce de compréhension d'ensemble est de xnor. Cela économise deux octets, mais l'ancienne approche semblait très nette:

exec"a=`sorted(input().lower())`[2::5].strip();a"*2;print a==aa
Lynn
la source
`sorted(input().lower())`.strip(" [',")est la même longueur: /
Sp3000
La execchose est intelligente mais semble trop complexe. Vous pouvez faire mieux avec lambda*l:len({`sorted(s.lower())`[2::5].strip()for s in l})<2.
xnor
2
Merci! Je suis un peu déçu - ça avait l'air très cool. Le garder dans le post quand même.
Lynn
7

Gelée, 12 octets

ḟ€⁶O&95Ṣ€QLḂ

Essayez-le en ligne!

Comment ça marche

ḟ€⁶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).

Version alternative, non concurrente (9 octets)

L'atome majuscule de Jelly avait un bug, et Jelly n'avait toujours pas de fonction intégrée pour tester l'égalité des listes ...

ḟ⁶ŒuṢµ€⁼/

Essayez-le en ligne!

Comment ça marche

ḟ⁶Œ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.
Dennis
la source
6

CJam, 11 12 14 octets

3 2 octets supprimés grâce à @FryAmTheEggman

{lelS-$}2*=

Essayez-le en ligne!

{      }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
Luis Mendo
la source
@FryAmTheEggman Merci!
Luis Mendo
@FryAmTheEggman Merci encore! Il me reste encore beaucoup à apprendre sur CJam :-)
Luis Mendo
3
Votre code rit secrètement. lel.
Cyoce
Ou est-ce un? lel==> 1e1Personne ne sait. C'est un mystère.
user48538
6

Javascript, 69 61 60 59 octets

1 octet off grâce @ ӍѲꝆΛҐӍΛПҒЦꝆ . 1 octet avec currying ( signalé par @apsillers )

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

enlevé
la source
2
Très sympa, filtrer les espaces et convertir en tableau en même temps!
Neil
2
Très agréable. Vous pouvez économiser un octet en utilisant currying, ce qui, selon la communauté, est une forme d'argument acceptable :n=>m=>...
apsillers
Essayez n=>m=>(G=s=>[]+s.toLowerCase().split(/\S/).sort())(n)==G(m). Utiliser split au lieu de match devrait vous faire économiser un octet.
Mama Fun Roll
@ ӍѲꝆΛҐӍΛПҒЦꝆ. Non, parce que suppose s='db cz'... Maintenant résultats en ... et les résultats ens.match(/\S/g).sort()['b','c','d','z']s.split(/\s/).sort()['cz','db']
enlevés
@ ӍѲꝆΛҐӍΛПҒЦꝆ. Mais ... en examinant votre idée, je l'ai un peu modifiée et j'ai économisé un octet ... merci!
enlevé le
6

MATL , 11 octets

2:"jkXvS]X=

EDIT (20 mai 2016) Le code dans le lien utilise à la Xzplace de Xv, en raison de changements récents dans la langue.

Essayez-le en ligne!

2:"     ]       % do this twice
   j            % read input line as a string
    k           % convert to lowercase
     Xv         % remove spaces
       S        % sort
         X=     % are they equal?
Luis Mendo
la source
3
Vous venez de changer votre nom pour ce défi?
Denker
3
@ DenkerAffe J'y pensais depuis quelque temps. Je viens de le faire coïncider avec le défi :-)
Luis Mendo
1
Don Muesli lol. Donc, vous êtes le Seigneur du Muesli Luis!? Est-ce ainsi que vous gardez votre teint sain?
rayryeng - Réintégrer Monica le
@rayryeng Heyyy! Ravi de vous voir ici, Ray! Revenez au golf!
Luis Mendo
Je promets de le faire :) une fois ce cours terminé ... Je vois que vous apprenez maintenant CJam. Très agréable!
rayryeng - Réintégrer Monica le
4

Sérieusement, 11 9 octets

2`,ùSô`n=

Essayez-le en ligne!

Tout le monde semble utiliser le même algorithme. La voici encore une fois.

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

Edit: le tri réalisé fonctionne correctement sur les chaînes et trie les espaces au début afin que strip () fonctionne.

quintopie
la source
4

C, 165 octets

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

Lisible et en contexte de travail,

#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;
}
tucuxi
la source
3

zsh, 85 octets

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

Saisie en tant qu'argument de ligne de commande, sortie en tant que code retour.

La forsyntaxe rend ce Bash incompatible.

[               # 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
Poignée de porte
la source
3

Japt, 12 octets

N®v ¬n ¬xÃä¥

Testez-le en ligne!

Comment ça marche

        // 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.
ETHbot
la source
3

GNU Sed, 33

Le score inclut +2 pour les -rnoptions à sed.

Ceci est presque un port direct de la réponse de la rétine de @ FryAmTheEggman :

:
s/(\w)(.*,.*)\1/\2/i
t
/\w/Q1

Idéone.

Trauma numérique
la source
3

Perl, 34 33 + 1 = 34 octets

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

Nécessite le -ndrapeau et la gratuité -M5.010| -E:

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

Comment ça marche:

                                   # '-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

Merci à msh210 d’ avoir suggéré d’utiliser des opérateurs ternaires pour économiser un octet

andlrc
la source
3

Baloch Gyr , 9 octets

{ṇ₁cḷ}ᵐpᵈ

Essayez-le en ligne!

Le résultat de la vérité / de la fausseté est obtenu par le succès / l’échec d’un prédicat, c’est le Brachylog.

Auparavant enregistré un octet en utilisant cṇ₁cḷḍau lieu de {ṇ₁cḷ}ᵐsous l'hypothèse que les deux chaînes d'entrée auraient la même longueur moins les espaces, mais je me suis rendu compte que cela réussirait là où il échouerait Ah Hass, haha.

{    }ᵐ      For both strings in the input,
 ṇ₁          split on spaces,
   c         concatenate,
    ḷ        and lowercase.
       pᵈ    The strings are permutations of each other.
Chaîne non liée
la source
2

PHP, 109 94 octets

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

Blech, les deux function/returns me tuent ici.

Renvoie la différence entre deux stringentrées sous forme arrayde caractères. PHP considère la []fausseté, satisfaisant les returnexigences.

ricdesi
la source
3
function($x,$y){$S=str_split;return array_diff($S(trim($x)),$S(trim($y)));}-> 75 octets. Crée une fonction anonyme qui renvoie le résultat. J'ai supprimé cette fonction longue et remplacé les appels à str_splitpar une variable assignmed, pour la raccourcir.
Ismael Miguel
Agréable. J'étais en train de le peaufiner pour le réduire à une seule fonction, c'est deux pas en avant, bravo.
ricdesi
2

Utilitaires Bash + GNU, 51

f()(fold -1<<<${@^^}|sort)
f $1|diff -qBw - <(f $2)
  • Définir une fonction f()qui:
    • ${@^^} convertit tous les paramètres en majuscules
    • fold -1 divise les caractères - un par ligne
    • sortlignes s
  • appelez diffavec -qpour supprimer la sortie diff complète et -Bwpour ignorer les changements d'espaces
Trauma numérique
la source
2

Pyke (commit 30, non compétitif), 9 octets

Fl1dk:S)q

Explication:

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

Mathematica, 77 76 octets

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

La première partie est en fait une de mes réponses à une autre question!

CalculatriceFeline
la source
2

Pike, 54 112 109 109 96 octets

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

mixedse trouve être plus court que array(string).

sretourne 1si ses arguments sont des anagrammes.

chat
la source
2

Q, 25 octets

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

NOTE.- compte compter le nom de la fonction f: pour faciliter les tests (comme lambda nous pouvons décrémenter 2 octets)

Version lisible

correspondance sur {ascendant non nul inférieur x} chaque 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)

Tester

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

génère (1b = vrai, 0b = faux)

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

À propos de Q

Langage polyvalent (dérivé APL, spécialisé dans le traitement de données) développé par kx.com. Version d'évaluation fonctionnelle complète gratuite pour Windows / Linux / MacOS.

J. Sendra
la source
Que voulez-vous dire, les autres langues ne sont pas sérieuses? :-P
Luis Mendo
Si le fest requis pour que le code soit évalué correctement, il doit être compté. Sinon, laissez simplement votre code de soumission et ne l'utilisez que dans des exemples pour montrer comment attribuer la fonction.
Mego
Bien sûr, d'autres langues sont aussi sérieuses que Q. Je vous supplie de parler un anglais médiocre. Mais certaines langues sacrifient la lisibilité ou sont équipées de bibliothèques ad-hoc pour ce type de concours. Q est un 'langage à usage général', malgré le fait que le code soit peu lisible.
J. Sendra
Vous ne devez affecter x qu'une seule fois si vous réduisez plus tard, donc k)~/{x@<x:_x@&~^x}'pour 17 octets .. mais je dirais qu'il est 19 car vous avez besoin du k)support, car il s'agit d'un Kcode plutôt que Q...
streetster
2

APL, 31 caractères

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

A utiliser ainsi:

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

En anglais:

  • { ... }¨⍵: pour chacun des deux éléments de l'argument
  • x←('.'⎕R'\u0')⍵~' ': transformer en majuscule (en utilisant une expression rationnelle ...) la chaîne sans les espaces et assigner le résultat temporaire à x
  • x[⍋x]: trier x
  • ≡/: comparez les deux résultats du tri: s'ils correspondent, retournez 1.
lefefano
la source
Est-il possible de l'essayer en ligne? J'ai essayé avec ça mais je ne sais pas trop comment m'en servir
Luis Mendo
Sûr. Ici: définition après laquelle vous pouvez simplement taperf 'first avatar' 'second avatar'
lstefano
Merci! Peut-être ajouter cela à la réponse? Pour que les gens puissent essayer
Luis Mendo
–9:≡/{x[⍋x←0~⍨32|⎕UCS⍵]}¨
Adám le
@ Adám: ça ne marchera pas parce que ≡/{x[⍋x←0~⍨32|⎕UCS⍵]}¨'pp' '00'
ça
2

Java, 218 octets

La première fois que j'ai écrit Java ...

Golfé:

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

Essai:

    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"));
Pete Arden
la source
Je sais que cela fait presque un an, mais vous pouvez jouer au golf avec 32 octets comme ceci: 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 octets ). Ou, si vous le convertissez en Java 8 lambda, cela peut être: 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 octets ). Voici un TIO avec code de test.
Kevin Cruijssen
1

Ruby, 50 octets

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

L'écriture f=->{...}et f[]==f[]est tout aussi longue. :(

Lynn
la source
1

PowerShell, 81 octets

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

Une légère réécriture de ma réponse sur le défi lié Anagram.

Prend les entrées sous forme de tableaux de caractères, effectue une -replaceopération pour supprimer les espaces sort(les trie par ordre alphabétique et non par valeur ASCII), puis -joinles reconstitue en chaîne. Dans -eqPowerShell, la casse est respectée par défaut, mais ici, elle doit être effectuée sur des chaînes, car elle [char]'a'n’est pas égale à [char]'A', d’où la raison -join.

AdmBorkBork
la source
1

Perl, 35 octets

Inclure +1 pour -p

Un peu abusif car cela dépend du programme donné sur la ligne de commande.

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

Puis donnez les chaînes comme 2 lignes consécutives sur STDIN

Une solution très abusive est 30 octets:

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

Cela se bloque si les chaînes ne sont pas des anagrammes et donne donc un faux code de sortie du point de vue du shell. Il donne également des ordures sur STDERR pour ce cas. Si les chaînes sont des anagrammes, le programme est muet et donne un "vrai" code de sortie

Ton Hospel
la source
1

PHP , 89 octets

for(;$i++<2;)$r[]=count_chars(join(explode(" ",strtolower($argv[$i]))));echo$r[0]==$r[1];

Essayez-le en ligne!

PHP , 94 octets

for(;$i++<2;sort($x),$r[]=trim(join($x)))$x=str_split(strtolower($argv[$i]));echo$r[0]==$r[1];

Essayez-le en ligne!

Jörg Hülsermann
la source
1

Excel VBA, 122 octets

Fenêtre immédiate VBE anonyme Fonction qui prend des entrées de la plage [A1:B1]et les envoie à la fenêtre immédiate VBE

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),"|")
Taylor Scott
la source
0

C #, 378 octets

J'ai besoin d'un 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));"));

    }

}
Chris Hayes
la source
4
Bienvenue dans Programming Puzzles & Code Golf! La règle générale est de mettre votre langue avec le nombre d'octets dans le titre de votre message. Vous pouvez le faire en ajoutant un interligne #à la première ligne. De même, pour les questions de code-golf, il est nécessaire de jouer au golf dans votre programme. Pour commencer, vous devez supprimer les espaces inutiles et utiliser des noms de variable à un caractère. En outre, vous pouvez toujours utiliser une fonction au lieu d'un programme complet (sauf interdiction explicite) pour enregistrer davantage d'octets.
Denker
@ DenkerAffe vous ninja m'avait :)
chat
1
Pourquoi tous les espaces ??
CalculatorFeline