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

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:



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.


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

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

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

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

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


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?

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.


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

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

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.


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


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.

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.


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

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

2

Mathematica, 77 76 bytes

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

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


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.


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.


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

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

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


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.


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"



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

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

    }

}

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.