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

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:



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.


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é

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

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

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

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


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?

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.


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

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

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.


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


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.

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.


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

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 - ^==^

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!


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.


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.


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.

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

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


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.


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



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

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

    }

}

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.