Gerenciar lixo assim

35

Tornou-se uma tradição no PPCG que alguns usuários alterem temporariamente seus nomes por um anagrama (um novo nome formado por reordenar as letras do antigo).

Às vezes fica difícil descobrir quem é quem. Eu poderia usar um programa ou função para dizer se duas frases são anagramas uma da outra.

O desafio

O programa ou função deve pegar duas strings e produzir um resultado verdadeiro, se forem anagramas uma da outra, e falsificar o contrário.

Regras

  • A entrada conterá apenas letras (ASCII 65 a 90 e 97 a 122), dígitos (ASCII 48 a 57) ou espaço (ASCII 32).
  • A relação do anagrama é independente do caso. Então "Arm" e "RAM" são anagramas.
  • Os espaços também não contam. Então "teclado" e "Barked Yo" são anagramas
  • Todos os embutidos permitidos
  • O formato de entrada é flexível (duas strings, uma matriz de duas strings, uma string contendo as duas frases com um separador adequado ...)

Código de golfe. Menos bytes ganha.

Casos de teste

Verdade:

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

Falsy

Calvins Hobbies, Helka Homba
Android, rains odd
In between days, bayed entwine
Code golf, cod elf got
Luis Mendo
fonte
8
Relacionado , mas diferente (apenas letras, nenhum caso, sem espaços)
Luis Mendo
4
O título desta pergunta é muito desconcertante para alguém que não tomou café suficiente. 1: D
cat
11
@ DonMuesli Eu diria que isso ainda é uma bobagem. As pequenas mudanças são muito triviais.
Mego
15
Manage Trash So, Those anagrams. Agradável.
mbomb007
3
So, the anagrams...
Freira vazando

Respostas:

13

05AB1E , 9 8 bytes

Código:

lvyð-{}Q

Explicação:

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

Experimente online!

Adnan
fonte
... mas 2 bytes a menos! Bem feito!
Luis Mendo
É lvyðK{}Qagora.
Magic Octopus Urn
15

Retina, 25

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

Experimente Online! Além disso, você pode executar uma versão multilinha modificada .

Exclua as letras anteriores à vírgula e suas correspondências após a vírgula. Se não temos mais letras, era um anagrama.

FryAmTheEggman
fonte
Para Retina, se um número positivo puder ser considerado uma falha e zero for considerado um sucesso, isso poderá ser três bytes mais curto usando \wcomo o último estágio.
FryAmTheEggman
@ dev-null "A entrada conterá apenas letras (ASCII 65 a 90 e 97 a 122), dígitos (ASCII 48 a 57) ou espaço (ASCII 32)"
FryAmTheEggman
11

Pitão, 11 10 bytes

Obrigado a @FryAmTheEggman por me ensinar o poder de ;!

qFmSr-d;0Q

Experimente aqui!

Leva uma lista de duas seqüências de caracteres como entrada.

Explicação

qFmSr-d; 0Q # Q = entrada

  m Q # map Q com d como variável lambda
     -d; # filtrar espaços fora da string
    r 0 # converter para minúsculas
   S # classifica todos os caracteres na string
qF # Desdobre a lista resultante e verifique a igualdade
Denker
fonte
10

Python 2, 63 61 bytes

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

Uma função anônima que, de fato, toma n argumentos e determina se todos n deles são palíndromos mútuos! f("Lynn", "Nyl N")retorna True.

Esse truque de compreensão de conjunto é do xnor. Ele salvou dois bytes, mas a abordagem antiga parecia muito elegante:

exec"a=`sorted(input().lower())`[2::5].strip();a"*2;print a==aa
Lynn
fonte
`sorted(input().lower())`.strip(" [',")tem o mesmo comprimento: /
Sp3000 25/02
A execcoisa é inteligente, mas parece muito complexa. Você pode fazer melhor com lambda*l:len({`sorted(s.lower())`[2::5].strip()for s in l})<2.
xnor
2
Obrigado! Estou um pouco decepcionado - parecia muito legal. Mantê-lo no post de qualquer maneira.
Lynn
7

Gelatina, 12 bytes

ḟ€⁶O&95Ṣ€QLḂ

Experimente online!

Como 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).

Versão alternativa, não concorrente (9 bytes)

O átomo maiúsculo de Jelly tinha um bug, e Jelly ainda não tinha construído para testar listas de igualdade ...

ḟ⁶ŒuṢµ€⁼/

Experimente online!

Como 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
fonte
6

CJam, 11 12 14 bytes

3 2 bytes removidos graças a @FryAmTheEggman

{lelS-$}2*=

Experimente online!

{      }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
fonte
@FryAmTheEggman Thank you!
Luis Mendo
@FryAmTheEggman Thanks again! Eu ainda tenho muito a aprender sobre CJam :-)
Luis Mendo
3
Seu código está secretamente rindo. lel.
Cyoce 27/02
Ou é esse? lel==> 1e1Ninguém sabe. É um mistério.
user48538
6

Javascript, 69 61 60 59 bytes

1 byte de desconto, obrigado @ ӍѲꝆΛҐӍΛПҒЦꝆ . 1 byte com curry ( apontado por @apsillers )

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

removido
fonte
2
Muito bom, filtrando espaços e convertendo para uma matriz ao mesmo tempo!
Neil
2
Muito agradável. Você pode salvar um byte usando currying, que a comunidade decidiu ser uma forma aceitável de argumento :n=>m=>...
apsillers
Tente n=>m=>(G=s=>[]+s.toLowerCase().split(/\S/).sort())(n)==G(m). Usar divisão em vez de correspondência deve economizar um byte.
Mama Fun Roll
@ ӍѲꝆΛҐӍΛПҒЦꝆ. Não, porque suponha s='db cz'... Agora resulta em ... e resulta ems.match(/\S/g).sort()['b','c','d','z']s.split(/\s/).sort()['cz','db']
removido
@ ӍѲꝆΛҐӍΛПҒЦꝆ. Mas ... olhando para a sua ideia, mudei um pouco e salvei um byte ... obrigado!
removido
6

MATL , 11 bytes

2:"jkXvS]X=

EDIT (20 de maio de 2016) O código no link usa, em Xzvez de Xv, devido a alterações recentes no idioma.

Experimente online!

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
fonte
3
Você acabou de mudar seu nome para esse desafio?
Denker
3
@ DenkerAffe Eu já pensava nisso há algum tempo. Eu só fiz isso coincidir com o desafio :-)
Luis Mendo
11
Don Muesli lol. Então você é o senhor de Muesli Luis !? É assim que você mantém sua pele saudável?
rayryeng - Restabelece Monica
@rayryeng Heyyy! Bom te ver aqui, Ray! Volte para o golfe!
Luis Mendo
Eu prometo que vou :) quando o curso terminar ... Vejo que você também está aprendendo CJam agora. Muito agradável!
rayryeng - Restabelece Monica
4

Sério, 11 9 bytes

2`,ùSô`n=

Experimente Online!

Todo mundo parece estar usando o mesmo algoritmo. Aqui está mais uma vez.

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

Edit: a classificação realizada funciona corretamente nas strings e classifica os espaços à frente, para que strip () funcione.

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

Legível e no contexto de trabalho,

#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
fonte
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 linha de comando, saída como código de retorno.

A forsintaxe torna esse Bash incompatível.

[               # 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
Maçaneta da porta
fonte
3

Japonês, 12 bytes

N®v ¬n ¬xÃä¥

Teste online!

Como 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
fonte
3

GNU Sed, 33

A pontuação inclui +2 para -rnopções para sed.

Esta é quase uma porta direta da resposta Retina de @ FryAmTheEggman :

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

Ideone.

Trauma Digital
fonte
3

Perl, 34 33 + 1 = 34 bytes

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

Requer a -nbandeira e o livre -M5.010| -E:

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

Como 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

Obrigado ao msh210 por sugerir o uso de operadores ternários para economizar um byte

andlrc
fonte
3

Baloch Gyr , 9 bytes

{ṇ₁cḷ}ᵐpᵈ

Experimente online!

A saída de verdade / falsidade é alcançada através do sucesso / fracasso do predicado, sendo este Brachylog.

Anteriormente, salvei um byte usando, em cṇ₁cḷḍvez de, {ṇ₁cḷ}ᵐsob a suposição de que as duas seqüências de entrada teriam o mesmo comprimento, menos espaço em branco, mas percebi que seria bem-sucedido onde deveria falhar Ah Hass, haha.

{    }ᵐ      For both strings in the input,
 ṇ₁          split on spaces,
   c         concatenate,
    ḷ        and lowercase.
       pᵈ    The strings are permutations of each other.
String não relacionada
fonte
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, os dois function/returnestão me matando aqui.

Retorna a diferença entre duas stringentradas como um arraydos caracteres. O PHP considera []falso, satisfazendo os returnrequisitos.

ricdesi
fonte
3
function($x,$y){$S=str_split;return array_diff($S(trim($x)),$S(trim($y)));}-> 75 bytes. Cria uma função anônima que retorna o resultado. Eu removi essa função longa e substituí as chamadas str_splitpor uma variável atribuída, para encurtá-la.
Ismael Miguel
Agradável. Eu estava ajustando-o para reduzi-lo à única função, este é dois passos à frente disso, bem feito.
Ricdesi
2

Utilitários Bash + GNU, 51

f()(fold -1<<<${@^^}|sort)
f $1|diff -qBw - <(f $2)
  • Defina uma função f()que:
    • ${@^^} converte todos os parâmetros em maiúsculas
    • fold -1 divide caracteres - um por linha
    • sorts linhas
  • chame diffcom -qpara suprimir a saída diff completa e -Bwignorar alterações de espaço em branco
Trauma Digital
fonte
2

Pyke (commit 30, não competitivo), 9 bytes

Fl1dk:S)q

Explicação:

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

Mathematica, 77 76 bytes

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

A primeira parte é na verdade uma das minhas respostas para outra pergunta!

CalculatorFeline
fonte
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]);}

mixedpassa a ser mais curto que array(string).

sretorna 1se seus argumentos são anagramas.

gato
fonte
2

Q, 25 bytes

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

NOTA.- a contagem inclui o nome da função f: para facilitar os testes (como lambda, podemos decrementar 2 bytes)

Versão legível

coincidir com {ascendente não 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)

Teste

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

gera (1b = verdadeiro, 0b = falso)

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

Sobre Q

Linguagem de uso geral (derivada da APL, especializada em processamento de dados) desenvolvida pela kx.com. Versão completa gratuita de avaliação funcional para Windows / Linux / MacOS.

J. Sendra
fonte
Como assim, outros idiomas não são sérios? :-P
Luis Mendo
Se ffor necessário que o código seja avaliado adequadamente, ele deverá ser contado. Caso contrário, deixe-o fora do código de envio e use-o apenas em exemplos para mostrar como atribuir a função.
Mego
Claro, outras línguas são tão sérias quanto Q. Eu imploro meu inglês ruim. Porém, alguns idiomas sacrificam a legibilidade ou são equipados com bibliotecas ad-hoc para esse tipo de competição. Q é uma 'linguagem de propósito geral', apesar do código não ser muito legível.
J. Sendra 21/05
Você só precisa atribuir x uma vez se você abaixar mais tarde, assim, k)~/{x@<x:_x@&~^x}'para 17 bytes .. mas eu diria que é 19 que você precisar do k)suporte como este é Ko código em vez de Q...
streetster
2

APL, 31 caracteres

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

Para ser usado assim:

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

Em inglês:

  • { ... }¨⍵: para cada um dos dois elementos do argumento
  • x←('.'⎕R'\u0')⍵~' ': transforme em maiúsculas (usando um regex ...) a sequência sem os espaços e atribua o resultado temporário a x
  • x[⍋x]: classificar x
  • ≡/: compare os dois resultados da classificação: se eles corresponderem, retorne 1.
lstefano
fonte
É possível experimentá-lo online? Eu tentei com este , mas eu realmente não sei como usá-lo
Luis Mendo
Certo. Aqui: definição após a qual você pode digitar #f 'first avatar' 'second avatar'
lstefano
Obrigado! Talvez adicione isso à resposta? Para que as pessoas possam tentar
Luis Mendo
–9:≡/{x[⍋x←0~⍨32|⎕UCS⍵]}¨
Adám 28/06/16
@ Adám: que não vai funcionar, porque ≡/{x[⍋x←0~⍨32|⎕UCS⍵]}¨'pp' '00'dá 1.
lstefano
2

Java, 218 bytes

Primeira vez que escrevi Java ...

Golfe:

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

Teste:

    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
fonte
Eu sei que já faz quase um ano, mas você pode jogar golfe em 32 bytes assim: 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 ) Ou se você o converter em um lambda Java 8, poderá 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 ). Aqui está um TIO com código de teste.
Kevin Cruijssen
1

Ruby, 50 bytes

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

Escrever f=->{...}e f[]==f[]é tão longo. :(

Lynn
fonte
1

PowerShell, 81 bytes

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

Uma leve reescrita da minha resposta no desafio anagrama vinculado.

Pega entrada como matrizes de caracteres, executa uma -replaceoperação para remover espaços, classifica- sortos (que são classificados em ordem alfabética, não pelo valor ASCII) e, em seguida, classifica- -joinos novamente em uma string. O -eqPowerShell, por padrão, não faz distinção entre maiúsculas e minúsculas, mas aqui deve ser executado em cadeias de caracteres, como [char]'a'não é igual a [char]'A', daí o motivo -join.

AdmBorkBork
fonte
1

Perl, 35 bytes

Incluir +1 para -p

Um pouco abusivo, pois depende do programa ser fornecido na linha de comando.

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

Em seguida, forneça as cordas como 2 linhas consecutivas em STDIN

Uma solução muito abusiva é de 30 bytes:

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

Isso trava se as seqüências de caracteres não são anagramas e, portanto, fornece um código de saída falso do ponto de vista do shell. Também fornece lixo no STDERR para esse caso. Se as strings são anagramas, o programa é silencioso e fornece um código de saída "true"

Ton Hospel
fonte
1

PHP , 89 bytes

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

Experimente online!

PHP , 94 bytes

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

Experimente online!

Jörg Hülsermann
fonte
1

Excel VBA, 122 bytes

Janela imediata do VBE anônimo Função que leva as entradas do intervalo [A1:B1]e as saídas para a janela imediata do 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
fonte
0

C #, 378 bytes

Eu preciso de uma desvantagem !!

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
fonte
4
Bem-vindo à programação de quebra-cabeças e código de golfe! A regra geral é colocar seu idioma junto com a contagem de bytes no título da sua postagem. Você pode fazer isso adicionando um líder #à primeira linha. Também para perguntas sobre código de golfe, é necessário jogar seu programa no golfe. Para começar, você deve remover espaços em branco desnecessários e usar nomes de variáveis ​​de um caractere. Além disso, você sempre pode usar uma função em vez de um programa completo (a menos que seja explicitamente proibido) para salvar mais alguns bytes.
Denker 28/02
@DenkerAffe você me ninja'd :)
cat
11
Por que todo o espaço em branco?
CalculatorFeline