Administrar la basura así

35

Se ha convertido en una tradición en PPCG que algunos usuarios cambian temporalmente sus nombres por un anagrama (un nuevo nombre formado reordenando las letras de los antiguos).

A veces se hace difícil descubrir quién es quién. Podría usar un programa o función para saber si dos frases son anagramas entre sí.

El reto

El programa o función debe tomar dos cadenas y producir un resultado verdadero si son anagramas entre sí, y falso de lo contrario.

Reglas

  • La entrada solo contendrá letras (ASCII 65 a 90 y 97 a 122), dígitos (ASCII 48 a 57) o espacio (ASCII 32).
  • La relación anagrama es independiente del caso. Entonces "Brazo" y "RAM" son anagramas.
  • Los espacios tampoco cuentan. Entonces "teclado" y "Yo ladrado" son anagramas
  • Todas las construcciones permitidas
  • El formato de entrada es flexible (dos cadenas, una matriz de dos cadenas, una cadena que contiene ambas frases con un separador adecuado ...)

Código de golf. Pocos bytes ganan.

Casos de prueba

Verdad:

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

Falsa

Calvins Hobbies, Helka Homba
Android, rains odd
In between days, bayed entwine
Code golf, cod elf got
Luis Mendo
fuente
8
Relacionado pero diferente (solo letras, sin mayúsculas, sin espacios)
Luis Mendo
44
El título de esta pregunta es muy desconcertante para alguien que no ha tomado suficiente café. +1: D
gato
1
@DonMuesli Yo diría que esto sigue siendo un engaño. Los ligeros cambios son muy triviales.
Mego
15
Manage Trash So, Those anagrams. Agradable.
mbomb007
3
So, the anagrams...
Leaky Nun

Respuestas:

13

05AB1E , 9 8 bytes

Código:

lvyð-{}Q

Explicación:

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

Pruébalo en línea!

Adnan
fuente
... pero 2 bytes menos! ¡Bien hecho!
Luis Mendo
Es lvyðK{}Qahora
Magic Octopus Urn
15

Retina, 25

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

Pruébalo en línea! Además, puede ejecutar una versión modificada de varias líneas .

Elimine letras de antes de la coma junto con sus coincidencias después de la coma. Si no nos quedan letras, entonces fue un anagrama.

FryAmTheEggman
fuente
Para Retina, si un número positivo se puede considerar un fracaso y cero se considera un éxito, esto podría ser tres bytes más corto al usarlo \wcomo la última etapa.
FryAmTheEggman
@ dev-null "La entrada solo contendrá letras (ASCII 65 a 90 y 97 a 122), dígitos (ASCII 48 a 57) o espacio (ASCII 32)"
FryAmTheEggman
11

Pyth, 11 10 bytes

¡Gracias a @FryAmTheEggman por enseñarme el poder de ;!

qFmSr-d;0Q

Pruébalo aquí!

Toma una lista de dos cadenas como entrada.

Explicación

qFmSr-d; 0Q # Q = entrada

  m Q # mapa Q con d como variable lambda
     -re; # espacios de filtro fuera de la cadena
    r 0 # convertir a minúsculas
   S # ordena todos los caracteres en cadena
qF # Desplegar la lista resultante y verificar la igualdad
Denker
fuente
10

Python 2, 63 61 bytes

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

¡Una función anónima que, de hecho, toma n argumentos y determina si todos n son palíndromos mutuos! f("Lynn", "Nyl N")vuelve True.

Este truco de comprensión es de xnor. Ahorró dos bytes, pero el viejo enfoque parecía muy ordenado:

exec"a=`sorted(input().lower())`[2::5].strip();a"*2;print a==aa
Lynn
fuente
`sorted(input().lower())`.strip(" [',")es la misma duración: /
Sp3000
La execcosa es inteligente pero parece demasiado compleja. Puedes hacerlo mejor con lambda*l:len({`sorted(s.lower())`[2::5].strip()for s in l})<2.
xnor
2
¡Gracias! Estoy un poco decepcionado, se veía muy bien. Manteniéndolo en la publicación de todos modos.
Lynn
7

Jalea, 12 bytes

ḟ€⁶O&95Ṣ€QLḂ

Pruébalo en línea!

Cómo funciona

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

Versión alternativa, no competitiva (9 bytes)

El átomo en mayúscula de Jelly tenía un error, y Jelly todavía no tenía incorporado para probar las listas de igualdad ...

ḟ⁶ŒuṢµ€⁼/

Pruébalo en línea!

Cómo funciona

ḟ⁶Œ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
fuente
6

CJam, 11 12 14 bytes

3 2 bytes eliminados gracias a @FryAmTheEggman

{lelS-$}2*=

Pruébalo en línea!

{      }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
fuente
@FryAmTheEggman ¡Gracias!
Luis Mendo
@FryAmTheEggman Gracias de nuevo! Todavía tengo mucho que aprender sobre CJam :-)
Luis Mendo
3
Tu código se está riendo en secreto. lel.
Cyoce
¿O es uno? lel==> 1e1Nadie lo sabe. Es un misterio.
user48538
6

Javascript, 69 61 60 59 bytes

1 byte off gracias @ ӍѲꝆΛҐӍΛПҒЦꝆ . 1 byte apagado con curry ( señalado por @apsillers )

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

remoto
fuente
2
¡Muy agradable, filtrando espacios y convirtiéndolos en una matriz al mismo tiempo!
Neil
2
Muy agradable. Puede guardar un byte usando curry, que la comunidad ha decidido que es una forma aceptable de argumentos :n=>m=>...
apsillers
Tratar n=>m=>(G=s=>[]+s.toLowerCase().split(/\S/).sort())(n)==G(m). Usar la división en lugar de la coincidencia debería ahorrarle un byte.
Mama Fun Roll
@ ӍѲꝆΛҐӍΛПҒЦꝆ. No, porque supongamos que s='db cz'... Ahora da como resultado ... y da como resultados.match(/\S/g).sort()['b','c','d','z']s.split(/\s/).sort()['cz','db']
eliminado
@ ӍѲꝆΛҐӍΛПҒЦꝆ. Pero ... investigando su idea, la cambié un poco y guardé un byte ... ¡gracias!
eliminado
6

MATL , 11 bytes

2:"jkXvS]X=

EDITAR (20 de mayo de 2016) El código en el enlace se usa en Xzlugar de Xv, debido a cambios recientes en el idioma.

Pruébalo en línea!

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
fuente
3
¿Acabas de cambiar tu nombre para ese desafío?
Denker
3
@DenkerAffe Lo había estado pensando por algún tiempo. Lo acabo de hacer coincidir con el desafío :-)
Luis Mendo
1
Don Muesli jajaja. ¿Entonces eres el Señor de Muesli Luis? ¿Es así como mantienes tu complexión saludable?
rayryeng - Restablece a Monica
@rayryeng Heyyy! ¡Qué bueno verte aquí, Ray! ¡Vuelve al golf!
Luis Mendo
Prometo que lo haré :) una vez que termine este curso ... Veo que ahora también estás aprendiendo CJam. ¡Muy agradable!
rayryeng - Restablece a Monica
4

En serio, 11 9 bytes

2`,ùSô`n=

¡Pruébelo en línea!

Todos parecen estar usando el mismo algoritmo. Aquí está de nuevo.

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

Editar: la clasificación realizada funciona correctamente en las cadenas y ordena los espacios al frente para que la tira () funcione.

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

Legible y en contexto de trabajo,

#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
fuente
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 ]

Entrada como argumentos de línea de comando, salida como código de retorno.

La forsintaxis hace que este Bash sea 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
Pomo de la puerta
fuente
3

Japt, 12 bytes

N®v ¬n ¬xÃä¥

¡Pruébelo en línea!

Cómo funciona

        // 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
fuente
3

GNU Sed, 33

La puntuación incluye +2 para las -rnopciones de sed.

Esto es casi un puerto directo de la respuesta de Retina de @ FryAmTheEggman :

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

Ideona

Trauma digital
fuente
3

Perl, 34 33 + 1 = 34 bytes

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

Requiere la -nbandera y la libre -M5.010| -E:

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

Cómo funciona:

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

Gracias a msh210 por sugerir el uso de operadores ternarios para guardar un byte

andlrc
fuente
3

Baloch Gyr , 9 bytes

{ṇ₁cḷ}ᵐpᵈ

Pruébalo en línea!

La salida de verdad / falsedad se logra a través del éxito / fracaso del predicado, siendo Brachylog.

Anteriormente guardé un byte usando en cṇ₁cḷḍlugar de {ṇ₁cḷ}ᵐbajo el supuesto de que las dos cadenas de entrada tendrían la misma longitud menos el espacio en blanco, pero me di cuenta de que tendría éxito donde debería fallar Ah Hass, haha.

{    }ᵐ      For both strings in the input,
 ṇ₁          split on spaces,
   c         concatenate,
    ḷ        and lowercase.
       pᵈ    The strings are permutations of each other.
Cadena no relacionada
fuente
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, los dos function/returns me están matando aquí.

Devuelve la diferencia entre dos stringentradas como un arrayde caracteres. PHP considera []falsa, satisfaciendo los returnrequisitos.

ricdesi
fuente
3
function($x,$y){$S=str_split;return array_diff($S(trim($x)),$S(trim($y)));}-> 75 bytes. Crea una función anónima que devuelve el resultado. Eliminé esa función larga y reemplacé las llamadas str_splitcon una variable asignada, para acortarla.
Ismael Miguel
Agradable. Lo estaba ajustando para reducirlo a la única función, esto está dos pasos por delante de eso, bien hecho.
ricdesi
2

Bash + utilidades GNU, 51

f()(fold -1<<<${@^^}|sort)
f $1|diff -qBw - <(f $2)
  • Defina una función f()que:
    • ${@^^} convierte todos los parámetros a mayúsculas
    • fold -1 divide caracteres - uno por línea
    • sortlíneas s
  • llame diffcon -qpara suprimir la salida de diferencias completas e -Bwignorar los cambios de espacios en blanco
Trauma digital
fuente
2

Pyke (commit 30, no competitivo), 9 bytes

Fl1dk:S)q

Explicación:

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

Mathematica, 77 76 bytes

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

¡La primera parte es en realidad una de mis respuestas a otra pregunta!

CalculadoraFeline
fuente
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]);}

mixedpasa a ser más corto que array(string).

sdevuelve 1si sus argumentos son anagramas.

gato
fuente
2

Q, 25 bytes

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

NOTA.- el conteo incluye el nombre de la función f: para facilitar las pruebas (como lambda podemos disminuir 2 Bytes)

Versión legible

coincidir sobre {ascendente no nulo inferior x} cada 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)

Prueba

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

genera (1b = verdadero, 0b = falso)

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

Acerca de Q

Lenguaje de propósito general (derivado de APL, especializado en procesamiento de datos) desarrollado por kx.com. Versión gratuita de evaluación funcional completa para Windows / Linux / MacOS.

J. Sendra
fuente
¿Qué quieres decir con que otros idiomas no son serios? :-P
Luis Mendo
Si fse requiere que el código se evalúe correctamente, entonces debe contarse. De lo contrario, simplemente déjelo fuera de su código de envío y úselo solo en ejemplos para mostrar cómo asignar la función.
Mego
Por supuesto, otros idiomas son tan serios como Q. Ruego a mi pobre inglés. Pero algunos lenguajes sacrifican la legibilidad o están equipados con bibliotecas ad-hoc para este tipo de concursos. Q es un 'lenguaje de propósito general', a pesar de que el código no es muy legible.
J. Sendra
Sólo es necesario asignar x una vez si se baja más tarde, de este modo k)~/{x@<x:_x@&~^x}'durante 17 bytes .. pero yo diría que es 19, como se necesita el k)soporte, ya que es Kcódigo en lugar de Q...
streetster
2

APL, 31 caracteres

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

Para ser utilizado así:

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

En inglés:

  • { ... }¨⍵: para cada uno de los dos elementos del argumento
  • x←('.'⎕R'\u0')⍵~' ': transforma a mayúsculas (usando una expresión regular ...) la cadena sin espacios y asigna el resultado temporal a x
  • x[⍋x]: ordenar x
  • ≡/: compara los dos resultados de la clasificación: si coinciden, devuelve 1.
lstefano
fuente
¿Es posible probarlo en línea? Lo intenté con esto pero realmente no sé cómo usarlo
Luis Mendo
Seguro. Aquí: definición después de la cual puede escribirf 'first avatar' 'second avatar'
lstefano
¡Gracias! ¿Quizás agregar eso a la respuesta? Para que la gente pueda intentarlo
Luis Mendo
–9:≡/{x[⍋x←0~⍨32|⎕UCS⍵]}¨
Adám
@ Adám: eso no funcionará porque ≡/{x[⍋x←0~⍨32|⎕UCS⍵]}¨'pp' '00'da 1.
lstefano
2

Java, 218 bytes

Primera vez que escribo Java ...

Golfizado:

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

Sin golf:

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

Pruebas:

    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
fuente
Sé que ha pasado casi un año, pero puede jugarlo en 32 bytes de esta manera: 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 ) O si lo convierte a un Java 8 lambda, puede ser: 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 ). Aquí hay un TIO con código de prueba.
Kevin Cruijssen
1

Ruby, 50 bytes.

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

Escribir f=->{...}y f[]==f[]es igual de largo. :(

Lynn
fuente
1

PowerShell, 81 bytes

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

Una ligera reescritura de mi respuesta sobre el desafío Anagrama vinculado.

Toma datos como matrices de caracteres, realiza una -replaceoperación para eliminar espacios, sortlos ordena (que se ordena alfabéticamente, no por valor ASCII), luego -joinlos vuelve a formar una cadena. En -eqPowerShell, por defecto, no distingue entre mayúsculas y minúsculas, pero aquí debe realizarse en cadenas, ya [char]'a'que no es igual [char]'A', de ahí la razón -join.

AdmBorkBork
fuente
1

Perl, 35 bytes

Incluye +1 para -p

Algo abusivo ya que depende del programa que se da en la línea de comandos.

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

Luego dé las cuerdas como 2 líneas consecutivas en STDIN

Una solución muy abusiva es de 30 bytes:

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

Esto se bloquea si las cadenas no son anagramas y, por lo tanto, proporciona un código de salida falso desde el punto de vista del shell. También da basura en STDERR para ese caso. Si las cadenas son anagramas, el programa es silencioso y proporciona un código de salida "verdadero"

Ton Hospel
fuente
1

PHP , 89 bytes

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

Pruébalo en línea!

PHP , 94 bytes

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

Pruébalo en línea!

Jörg Hülsermann
fuente
1

Excel VBA, 122 bytes

Ventana inmediata anónima de VBE Función que toma la entrada del rango [A1:B1]y las salidas a la ventana inmediata de 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
fuente
0

C #, 378 bytes

Necesito una discapacidad!

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
fuente
44
¡Bienvenido a Programming Puzzles & Code Golf! La regla general es poner su idioma junto con su recuento de bytes en el título de su publicación. Puede hacerlo agregando un líder #a la primera línea. También para preguntas sobre códigos de golf es necesario jugar golf en su programa. Para empezar, debe eliminar espacios en blanco innecesarios y usar nombres de variables de un solo carácter. Además, siempre puede usar una función en lugar de un programa completo (a menos que esté explícitamente prohibido) para guardar algunos bytes más.
Denker
@DenkerAffe me ninja'd :)
gato
1
¿Por qué todo el espacio en blanco?
CalculatorFeline