Determinar si las cadenas son anagramas


85

Desafío

Dadas dos cadenas, averigua si ambas tienen exactamente los mismos caracteres.

Ejemplo

Entrada

word, wrdo

Esto regresa trueporque son iguales pero simplemente revueltos.

Entrada

palabra, wwro

Esto vuelve false.

Entrada

barco, toba

Esto vuelve true

Reglas

¡Estas son las reglas!

  • Suponga que la entrada tendrá al menos 1 char de largo y no más de 8 caracteres.
  • Sin caracteres especiales, solo a-z
  • Se puede suponer que todas las entradas son minúsculas

Casos de prueba

boat, boat = true
toab, boat = true
oabt, toab = true
a, aa = false
zzz, zzzzzzzz = false
zyyyzzzz, yyzzzzzy = true
sleepy, pyels = false
p,p = true

10
9 respuestas en 13 vistas ... ¡guau!
Tom Gullen

@Tom, porque todos querían demostrar que tu comentario sobre el uso de un número entero de 64 bits apuntaba en la dirección incorrecta: P
Peter Taylor

55
Solicitud de título: Cod Elf, Go!

55
"Falcon Rage, enloquece!"
Geobits

77
Mi sugerencia de nombre: "¿son anagramas?" → "administrar los arreglos"
Esolanging Fruit

Respuestas:


39

Python, 32 bytes

f=lambda a,b,S=sorted:S(a)==S(b)

3
@Debanjan, esto es lo mismo que def f(a,b):return sorted(a)==sorted(b)La compensación es que puedes reemplazar def + return con lambda a cambio de no usar ninguna declaración
gnibbler

1
@Debanjan, creo que solo te ahorra un personaje. He usado una variación aquí, pero tiene la misma longitud que la tuya porque cambio una nueva línea por una coma
gnibbler

44
@Tomas, tonterías. La pregunta no especifica el programa completo, por lo que una función o un programa completo son aceptables.
gnibbler

2
@Tomas, la mayoría de las respuestas aquí no pasan tus criterios. ¿Por qué no dar un voto a todos los que lo hacen?
gnibbler

44
@ Tomás, no es abuso de reglas. Algunas preguntas se abren deliberadamente como parece ser esta. Compare con una pregunta bien especificada como esta . Si no le gustan estas respuestas, quejarse al autor de
gnibbler

27

Golfscript, 3 caracteres?

$$=

uso:

'boat'$'baot'$=
1

'toab'$'boat'$=
1

'oabt'$'toab'$=
1

'a'$'aa'$=
0

'zzz'$'zzzzzzzz'$=
0

'zyyyzzzz'$'yyzzzzzy'$=
1

'sleepy'$'pyels'$=
0

'p'$'p'$=
1

23
Esta es una interpretación interesante de cómo suministrar la entrada :)
gnibbler

44
Explicación por favor :(
st0le

10
@ st0le, en serio? No sé golfscript, pero obviamente es $ (sort), $ (sort), = (compare)
Peter Taylor

11
¿No es esto un poco de trampa? Quiero decir, no es entrada variable. Tiene que estar codificado. En cualquier caso, agregaría 4 al recuento de caracteres para los caracteres de comillas ( ').
Thomas Eding

66
Esto no es válido según nuestras reglas actuales. Sin embargo, podría cambiarlo a la función de 4 bytes de @ JanDvorak, que aceptaría la entrada a través de un formato de entrada válido .
Pomo de la puerta

20

J, 8

-:&(/:~)

Literalmente, match ( -:) en ( &) sort up ( /:~)

Uso de la muestra:

   'boat' -:&(/:~) 'boat'
1
   'toab' -:&(/:~) 'boat'
1
   'oabt' -:&(/:~) 'toab'
1
   'a' -:&(/:~) 'aa'
0
   'zzz' -:&(/:~) 'zzzzzzzz'
0
   'zyyyzzzz' -:&(/:~) 'yyzzzzzy'
1
   'sleepy' -:&(/:~) 'pyels'
0
   'p' -:&(/:~) 'p'
1

¿Dónde entran en juego los enteros de 64 bits?


¿No es posible escribir funciones / subrutinas en J?

2
@Tim Nordenfur: se llaman "verbos" y toman un argumento a la derecha como en v arg(mónadas) o dos en ambos lados como en arg1 v arg2(díadas). El que presenté es obviamente una diada. No me molesté en nombrarlo, ya que no fue solicitado y es más corto de esta manera. Si realmente quieres darle un nombre, lo harías así: is_anagram_of =: -:&(/:~)y luego usarlo como 'a' is_anagram_of 'aa'.
JB

Se sintió un poco barato sustituir los argumentos en el código, pero ahora veo que es esencialmente una diada. No importa.

29
J siempre se parece a los restos de una explosión en una fábrica de emoticones.
st0le

19

Javascript, 192 157 152 147 125 bytes

Ok, ¡algunos de estos idiomas son mucho más flexibles de lo que pensaba! De todos modos, esta es la forma más larga, supongo, pero al menos una técnica diferente.

Comprimido

¡Gracias a Peter y David por exprimir más caracteres!

for(a=[j=p=2];j<123;)a[j]?p%a[++j]<1&&p++&&(j=0):(a[j]=p,j=0);function b(c,i){return c[i=i||0]?a[c.charCodeAt(i)]*b(c,++i):1}

Entonces hazlo:

alert(b("hello")==b("elloh"));

Código expandido

El comprimido ha tenido muchos cambios, pero esta es la teoría básica:

// Define dictionary of primes
a = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101];

// Returns the unique ID of the word (order irrelevant)
function b(c) {
    r = 1;
    for (i = 0; i < c.length; i++)
        r *= a[c[i].charCodeAt(0) - 97];
    return r
}

alert(b("hello") == b("hlleo"));

Gran idea usando primos.

@Tim gracias! Lo bajé a 157 ahora.
Tom Gullen

2
Puede eliminar un par de caracteres de la inicialización del diccionario utilizando el tamiz. a=[2];for(p=3,j=0;j<26;)if(a[j]){if(p%a[j++]==0){p++;j=0}}else{a[j]=p;j=0}
Peter Taylor

1
@Tom, depende de qué tan optimizadas estén las rutinas de clasificación, dado que ha limitado las entradas a 8 caracteres: P
Peter Taylor

1
125 caracteres . Recursion y ternaries FTW:for(a=[j=p=2];j<123;)a[j]?p%a[++j]<1&&p++&&(j=0):(a[j]=p,j=0);function b(c,i){return c[i=i||0]?a[c.charCodeAt(i)]*b(c,++i):1}
David Murdoch

15

Golfscript, 8 bytes

Esto define una función llamada A

{$\$=}:A

Casos de prueba

;
'boat' 'boat' A
'toab' 'boat' A
'oabt' 'toab' A
'a' 'aa' A
'zzz' 'zzzzzzzz' A
'zyyyzzzz' 'yyzzzzzy' A
'sleepy' 'pyels' A
'p' 'p' A

11

Haskell, 31 bytes

función - 31

import List
f=(.sort).(==).sort

programa - 81 58 55

import List
g=sort`fmap`getLine
main=(`fmap`g).(==)=<<g

Uso:

$ runghc anagram.hs
boat
boat
True
$ runghc anagram.hs
toab
boat
True
$ runghc anagram.hs
a
aa
False

Felicitaciones a lambdabot y su refactorización sin puntos .


¿Puede el código de Haskell que solo hace lo que se quiere bajo runghc, pero no cuando se compila, todavía se llama "programa"?
JB

3
@JB: ¿Puede el código de Perl que solo hace lo que se quiere bajo perltodavía se llama "programa"? :-)
Joey Adams

JB: Los lenguajes funcionales de hoy distorsionan el significado de un programa, lo que lo convierte en una abstracción de orden superior. En lugar de solo una lista de instrucciones para ejecutar, el programa haskell puede verse como una colección de funciones, incluso si no se llaman.
Callum Rogers

@Callum Rogers: mi punto es: su código se comporta de manera diferente si se ejecuta bajo runghc o compilado, en un área sensible al problema. La "función" está bien. El "programa" no resuelve el problema bajo otra cosa que no sea runghc, y runghc no es la única forma legítima de ejecutar programas Haskell. En ese contexto, eso hace que el fragmento sea un "script runghc", no un "programa Haskell". --no creo que considere el problema importante, como dije, la función está bien de todos modos y es más corta.
JB

2
x#y=sort x==sort yes 1 carácter más corto
Rotsor

10

C #, 129 caracteres

namespace System.Linq{class X{static void Main(string[]a){Console.Write(a[0].OrderBy(_=>_).SequenceEqual(a[1].OrderBy(_=>_)));}}}

Legible:

namespace System.Linq
{
    class X
    {
        static void Main(string[] a)
        {
            Console.Write(a[0].OrderBy(_ => _)
                  .SequenceEqual(a[1].OrderBy(_ => _)));
        }
    }
}

¿Creo que podrías jugar unos pocos bytes en using System.Linq;lugar de espacios de nombres?
Stackstuck

10

Ruby, 34 bytes

Usando el esquema IO de la solución Peter Taylors Perl:

p gets.chars.sort==gets.chars.sort

Lanza un error:-e:1:in '<main>': undefined method 'chars' for nil:NilClass (NoMethodError)
Tomás

9

Programa C, 118

t[52],i;main(c){for(;i<52;)(c=getchar())<11?i+=26:t[i+c-97]++;
for(i=27;--i&&t[i-1]==t[i+25];);puts(i?"false":"true");}

1
¿Alguna vez consideró solicitar IOCCC ?
Mateen Ulhaq

99
@muntoo: ¿has visto algo en el IOCCC? Esto es demasiado legible para eso.
R. Martinho Fernandes

@Martinho Sí, los códigos fuente de IOCCC son tan hermosos. Sinfonías Pero al menos debería intentar componer una pequeña pieza. :)
Mateen Ulhaq

@muntoo: Ni siquiera sabía que todavía estaban activos.
Joey Adams

1
Acabo de ver este ... Muy agradable. Pero puede ser más corto: t[256],i;main(c){for(;c+3;)(i=getchar())>10?t[i]+=c:(c-=2);for(i=257;--i&&!t[i-1];);puts(i?"false":"true");}eso son 108 caracteres. Muy importante, su ctruco de inicialización todavía está empleado.
ugoren

7

Perl, 58 bytes

(programa completo, a diferencia de la otra respuesta de Perl que es solo una función)

($c,$d)=map{[sort split//]}<>;print"@$c"eq"@$d"?true:false

49 como una función

sub f{($c,$d)=map{[sort split//]}<>;"@$c"eq"@$d"}

por supuesto, puede guardar 4 caracteres en el programa eliminando el "verdadero y falso, ya que sin usar estricto / advertencias, una palabra sin formato es una cadena.
Joel Berger


Prefiero esto como ($c,$d)=map{[sort split//]}@ARGV;exit("@$c"ne"@$d")(51 caracteres) para que pueda tomar argumentos de la línea de comando y usar los códigos de salida de la línea de comando. Sería 48 caracteres retenidos <>con una entrada de varias líneas.
Adam Katz

6

Clojure - 23 caracteres

Como una función anónima:

#(apply = (map sort %))

Ejemplo de caso de prueba:

(#(apply = (map sort %)) ["boat" "boat"])
=> true

Genial, me gusta.
Quirón

1
Buena respuesta. Me gustan especialmente las cadenas de prueba que elegiste ;-)
coredump

6

JavaScript

Basado en la solución de @ zzzzBov.

Comparación, 65 caracteres (40 sin función)

function f(a,b){return a.split('').sort()==b.split('').sort()+""}

Comparador, 43 caracteres

function f(a){return a.split('').sort()+""}

Inteligente usando el +""para coaccionar a la cadena.
Casey Chu

6

C ++ (104 caracteres no ws)


De acuerdo con el tipo de conteo. Nota: Asume cadenas de la misma longitud, lo que parece estar implícito (aunque no declarado) en la pregunta.

int u[123], i;

int a(char **c) {
    for(; c[0][i]; ) {
        u[c[0][i]]++;
        u[c[1][i++]]--;
    }

    i=123;
    while(i && !u[--i]);
    return !i;
}

En C, si declara una variable en el ámbito global, se inicializa a cero. Supongo que esto también es cierto para C ++.
Joey Adams

Las variables locales, por otro lado, no se inicializan a cero automáticamente.
Joey Adams

OK, eliminé mi advertencia ya que encontré formas de prescindir de ella.
Matthew leyó el

1
Bzzzt. Pasa los casos de prueba, pero "helle" y "hollo" son aparentemente lo mismo. Solución fácil: cambie uno de los ++ a a -. Entonces solo si (u [i ++]) devuelve 0;
Dave Gamble

1
No he probado esto, pero las últimas tres líneas se pueden escribir comoi=123;while(i&&u[--i]);return!i;
st0le

4

PHP (línea de comando, 87 caracteres)

function d($s){
    return array_count_values(str_split($s));
}

echo d($argv[1]) == d($argv[2]);

4

Javascript

Una versión (muy) un poco más corta de la solución de @ zzzzBov, que usa en .join()lugar del boxeo String:

function a(b,c){return b.split('').sort().join()==c.split('').sort().join()}
alert(a('abc','bca')); //true

Similar:

function a(b){return b.split('').sort().join()}
alert(a('abc')==a('bca')); //true

3
esta es la respuesta ID 1337. congratz
TheDoctor

4

Clojure REPL 41 caracteres

(= (sort (read-line)) (sort (read-line)))

Bienvenido a la red de Stack Exchange. Ayuda de formato aquí .
dmckee

4

Java

(¡el idioma favorito de todos aparentemente!)

173 caracteres:

import java.util.*;class g{public static void main(String[]p){String[]a=p[0].split(""),b=p[1].split("");Arrays.sort(a);Arrays.sort(b);System.out.print(Arrays.equals(a,b));}}

(No imprime char de nueva línea para guardar 2 caracteres de println)

Compilar y ejecutar:

javac g.java
java -cp . g abcdef fedcba
true

Me encanta ver uno más corto ...


Sé que han pasado más de 6.5 años (risas), pero puedes jugarlo en 10 bytes agregando java.util.Arrays x=null;y usando en x.lugar de Arrays.: class g{public static void main(String[]p){java.util.Arrays x=null;String[]a=p[0].split(""),b=p[1].split("");x.sort(a);x.sort(b);System.out.print(x.equals(a,b));}}( 163 bytes ) Y al convertirlo a Java 8, class g{public static void mainpodría serlo interface g{static void maintambién, pero supongo que Java 8 no fue Aún no ha llegado en 2011, por lo que mantener classtambién está bien. ; p
Kevin Cruijssen

4

sed, 45 caracteres

¡Incluso es posible en mi favorito sed! ¡Solo una expresión regular para resolver el anagrama ! Solo sigue quitando las letras correspondientes:

:
s/(.)(.*,.*)\1/\2/
t
/\w/{i\false
d}
i\true

(para ser invocado con -nE)

Perl, 48

1while s/(.)(.*,.*)\1/\2/;$_=/\w/?"false":"true"

Para ser invocado con -p.

Función Perl, 39

sub f{$,while s/(.)(.*,.*)\1/\2/;!/\w/}

4

APL, 2 caracteres

≡⍦

Esta es la función Multiset Match de Nars2000 , una de las implementaciones de APL de vanguardia. Cuando se aplica a cadenas, calcula exactamente la función requerida:

      'elvis' ≡⍦ 'lives'
1
      'alec guinness' ≡⍦ 'genuine class'
1

Por curiosidad, ¿cuántos bytes es esto? 4? 6?
Maltysen

Depende de la codificación. 6 bytes en UTF-8, 4 bytes en UCS-2, 2 bytes si alguno de los caracteres APL heredados de un solo byte tiene el símbolo, lo cual dudo.
Tobia

4

05AB1E , 6 4 bytes (no competitivos)

{I{Q

Pruébalo en línea!

Esto tomó un tiempo debido a las dificultades de entrada. Golfed down debido al pop.

Explicación:

{I{Q    Original code

{       Takes first input e.g. word and sorts -> 'dorw'
 I      Takes second input e.g. 'wrdo'
  {     Sorts second input -> 'dorw'
   Q    Compare if sorted 1 = sorted 2, then print result. 'dorw' = 'dorw', so prints 1.

1
Como 05AB1E es más nuevo que este desafío, esta respuesta no es competitiva.
Loovjo

Lo siento, no me di cuenta.
Geno Racklin Asher

4

Perl, 77 75 caracteres

La E / S del problema no está bien especificada; esto lee dos líneas de stdin y genera verdadero o falso en stdout.

sub p{join'',sort split'',$a}$a=<>;$x=p;$a=<>;print$x eq p()?"true":"false"

(Gracias a Tim por 77 -> 75)


Algo está mal. $a=;? Además, puede omitir los parens sorty el espacio después print.

@Tim, el genio que desarrolló esta plataforma para compartir código a través de la red decidió que en los bloques de código las personas deberían escapar menos que los personajes. Pero bueno, no es gran cosa: no es como si alguien los usara en código, ¿verdad? Sigue atrapándome.
Peter Taylor

2
Ok, eliminé el voto negativo. Es posible que desee utilizar el formato de código en el futuro, es decir, sangrar código con cuatro espacios.

1
Ok, existen tres formas de formatear el código (una en línea y dos en bloque), y ambas son inconvenientes de diferentes maneras. Suspiro.
Peter Taylor

4

Perl, 62 bytes

Esta función toma las cadenas como argumentos y devuelve verdadero o falso.

sub f{my@a;for$.(1,-1){$a[ord]+=$.for split//,pop}!grep{$_}@a}

Almacena los valores ASCII en una matriz y comprueba si se iguala. Incrementos para la primera palabra y decrementos para la segunda palabra.


4

Python 3, 107 97 76 64

s=sorted;a,b=input().split(', ')
print(str(s(a)==s(b)).lower())

Obviamente, esto puede acortarse si no tomamos las palabras del OP literalmente y en minúsculas "verdadero" y "falso" ...


Puede eliminar algunos caracteres si agrega ;s=sorteda la primera línea y luego reemplaza las dos instancias de sortedcon sen la segunda línea. Debería guardar ... 3 caracteres?
Alex Van Liew

1
En efecto. Python 3 también ahorra un poco de espacio, y probablemente sea razonable usarlo ahora, 5 años después de que se publique esta respuesta. Además, .strip () era redundante, dadas las entradas especificadas.
Wooble

Si lo siento No me di cuenta de la antigüedad de esta pregunta cuando comenté, solo que estaba en la portada. ^^;
Alex Van Liew

4

Python, 32 bytes

p=sorted
f=lambda a,b:p(a)==p(b)

No hace nada en python. ¿Estás seguro de que es un programa completo que toma la entrada y produce la salida según lo solicitado?
Tomás

1
@Tomas Es una función
TuxCrafting

4

Bash, 88 caracteres

diff <(grep -o .<<<$1|sort) <(grep -o .<<<$2|sort)>/dev/null && echo true || echo false


3

Scala en REPL (32)

readLine.sorted==readLine.sorted

Función Scala (43)

def f(a:String,b:String)=a.sorted==b.sorted

Programa Scala (61)

object A extends App{println(args(0).sorted==args(1).sorted)}

Estos aprovechan una característica ordenada de Scala por la cual una Cadena también se puede tratar como una secuencia de caracteres ( Seq), con todas las operaciones Seqdisponibles.


3

APL - 13 caracteres

{(⍺[⍋⍺])≡⍵[⍋⍵]}

Llame así:

      'boat' {(⍺[⍋⍺])≡⍵[⍋⍵]} 'baot'
1
      'baot' {(⍺[⍋⍺])≡⍵[⍋⍵]} 'boat'
1
      (,'a') {(⍺[⍋⍺])≡⍵[⍋⍵]} 'aa'
0

En el último ejemplo, 'a'representa un solo carácter, y el prefijo ,lo convertirá en una cadena.


3

Java (134 bytes)

int[][]c=new int[2][26];
for(int i=0;i<2;i++)for(byte a:args[i].getBytes())c[i][a-97]++;
System.out.print(Arrays.equals(c[0],c[1]));`

Esto hace una matriz para contar la cantidad de veces que aparece cada letra, y luego compara las matrices para verificar si son iguales.


1
Bienvenido a PPCG! Bonito primer post! Hay 2 espacios que puede eliminar, (c[0], c[1])y for (int i=0;.
Rɪᴋᴇʀ

3

JavaScript, 41

Función de comparación (41) :

a=b=>''+[...b].sort()
b=(c,d)=>a(c)==a(d)
alert(b('abc', 'cba')) // true

Función de comparación (21) :

a=b=>''+[...b].sort()
alert(a('abc') == a('bca')); //true

Función de comparación (48):

function a(b){return String(b.split('').sort())}
alert(a('abc')==a('bca')); //true

Función de comparación (78):

function a(b,c){return String(b.split('').sort())==String(c.split('').sort())}
alert(a('abc','bca')); //true

Asume Stringtiene splity Arraytiene sort.


38 bytes:c=>d=>(a=b=>''+[...b].sort())(c)==a(d)
Shieru Asakoto
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.